Changes in / [408d460:4789f44]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r408d460 r4789f44 989 989 } 990 990 991 /// Wraps a function declaration in a new pointer-to-function variable expression992 VariableExpr *wrapFunctionDecl( DeclarationWithType *functionDecl ) {993 // line below cloned from FixFunction.cc994 ObjectDecl *functionObj = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0,995 new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 );996 functionObj->set_mangleName( functionDecl->get_mangleName() );997 return new VariableExpr( functionObj );998 }999 1000 991 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1001 992 if ( retval && returnStmt->get_expr() ) { … … 1013 1004 1014 1005 // find assignment operator for (polymorphic) return type 1015 ApplicationExpr *assignExpr= 0;1006 DeclarationWithType *assignDecl = 0; 1016 1007 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() ) ) { 1017 // find assignment operator for type variable1018 1008 std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() ); 1019 1009 if ( assignIter == assignOps.end() ) { 1020 1010 throw SemanticError( "Attempt to return dtype or ftype object in ", returnStmt->get_expr() ); 1021 1011 } // if 1022 assign Expr = new ApplicationExpr( new VariableExpr( assignIter->second ) );1012 assignDecl = assignIter->second; 1023 1013 } else if ( ReferenceToType *refType = dynamic_cast< ReferenceToType *>( retval->get_type() ) ) { 1024 // find assignment operator for generic type1025 1014 ScopedMap< std::string, DeclarationWithType *>::const_iterator assignIter = scopedAssignOps.find( refType->get_name() ); 1026 1015 if ( assignIter == scopedAssignOps.end() ) { 1027 1016 throw SemanticError( "Attempt to return dtype or ftype generic object in ", returnStmt->get_expr() ); 1028 1017 } 1029 1030 // wrap it up in an application expression1031 1018 DeclarationWithType *functionDecl = assignIter->second; 1032 assignExpr = new ApplicationExpr( wrapFunctionDecl( functionDecl ) ); 1033 assignExpr->set_env( env->clone() ); 1034 1035 // find each of its needed secondary assignment operators 1036 std::list< Expression* > &tyParams = refType->get_parameters(); 1037 std::list< TypeDecl* > &forallParams = functionDecl->get_type()->get_forall(); 1038 std::list< Expression* >::const_iterator tyIt = tyParams.begin(); 1039 std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin(); 1040 for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) { 1041 if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue; // skip types with no assign op (ftype/dtype) 1042 1043 std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions(); 1044 assert( ! asserts.empty() && "Type param needs assignment operator assertion" ); 1045 DeclarationWithType *actualDecl = asserts.front(); 1046 ReferenceToType *actualType = isAssignment( actualDecl ); 1047 assert( actualType && "First assertion of type with assertions should be assignment operator" ); 1048 TypeExpr *formalTypeExpr = dynamic_cast< TypeExpr* >( *tyIt ); 1049 assert( formalTypeExpr && "type parameters must be type expressions" ); 1050 Type *formalType = formalTypeExpr->get_type(); 1051 assignExpr->get_env()->add( actualType->get_name(), formalType ); 1052 1053 DeclarationWithType *assertAssign = 0; 1054 if ( TypeInstType *formalTypeInstType = dynamic_cast< TypeInstType* >( formalType ) ) { 1055 std::map< std::string, DeclarationWithType *>::const_iterator assertAssignIt = assignOps.find( formalTypeInstType->get_name() ); 1056 if ( assertAssignIt == assignOps.end() ) { 1057 throw SemanticError( "No assignment operation found for ", formalTypeInstType ); 1058 } 1059 assertAssign = assertAssignIt->second; 1060 //assignExpr->get_env()->add( formalTypeInstType->get_name(), actualType ); 1061 } else if ( ReferenceToType *formalReferenceType = dynamic_cast< ReferenceToType* >( formalType ) ) { 1062 ScopedMap< std::string, DeclarationWithType *>::const_iterator assertAssignIt = scopedAssignOps.find( formalReferenceType->get_name() ); 1063 if ( assertAssignIt == scopedAssignOps.end() ) { 1064 throw SemanticError( "No assignment operation found for ", formalReferenceType ); 1065 } 1066 assertAssign = assertAssignIt->second; 1067 } else assert( false && "returning polymorphic types with non struct/polymorphic parameters not yet supported" ); 1068 1069 1070 assignExpr->get_inferParams()[ actualDecl->get_uniqueId() ] 1071 = ParamEntry( assertAssign->get_uniqueId(), assertAssign->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertAssign ) ); 1072 } 1019 // line below cloned from FixFunction.cc 1020 assignDecl = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0, 1021 new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 ); 1022 assignDecl->set_mangleName( functionDecl->get_mangleName() ); 1073 1023 } 1074 assert( assign Expr);1024 assert( assignDecl ); 1075 1025 1076 1026 // replace return statement with appropriate assignment to out parameter 1027 ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignDecl ) ); 1077 1028 Expression *retParm = new NameExpr( retval->get_name() ); 1078 1029 retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );
Note:
See TracChangeset
for help on using the changeset viewer.