Changes in src/GenPoly/Box.cc [f8b961b:f2b2029]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
rf8b961b rf2b2029 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Nov 26 17:01:55201513 // Update Count : 19112 // Last Modified On : Wed Dec 02 11:52:37 2015 13 // Update Count : 201 14 14 // 15 15 … … 50 50 FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars ); 51 51 52 /// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call53 52 class Pass1 : public PolyMutator { 54 53 public: … … 89 88 }; 90 89 91 /// Moves polymorphic returns in function types to pointer-type parameters, adds type size and assertion parameters to parameter lists as well92 90 class Pass2 : public PolyMutator { 93 91 public: … … 107 105 }; 108 106 109 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable110 107 class Pass3 : public PolyMutator { 111 108 public: … … 186 183 } 187 184 185 // returns true if the given declaration is: (*?=?)(T *, T) for some T (return not checked, but maybe should be) 188 186 bool checkAssignment( DeclarationWithType *decl, std::string &name ) { 189 187 if ( decl->get_name() == "?=?" ) { … … 671 669 TypeInstType *typeInst1 = isPolyPtr( appExpr->get_args().front()->get_results().front(), env, scopeTyVars ); 672 670 TypeInstType *typeInst2 = isPolyPtr( appExpr->get_args().back()->get_results().front(), env, scopeTyVars ); 673 assert( ! typeInst1 || ! typeInst2 ); 671 assert( ! typeInst1 || ! typeInst2 ); // the arguments cannot both be polymorphic pointers 674 672 UntypedExpr *ret = 0; 675 if ( typeInst1 || typeInst2 ) { 673 if ( typeInst1 || typeInst2 ) { // one of the arguments is a polymorphic pointer 676 674 ret = new UntypedExpr( new NameExpr( "?+?" ) ); 677 675 } // if … … 869 867 870 868 Statement * Pass1::mutate(ReturnStmt *retStmt) { 871 // a cast expr on a polymorphic return value is either redundant or invalid869 // by this point, a cast expr on a polymorphic return value is redundant 872 870 while ( CastExpr *castExpr = dynamic_cast< CastExpr *>( retStmt->get_expr() ) ) { 873 871 retStmt->set_expr( castExpr->get_arg() ); … … 1011 1009 std::list< DeclarationWithType *> inferredParams; 1012 1010 ObjectDecl *newObj = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0 ); 1013 // ObjectDecl *newFunPtr = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ), 0 );1011 /// ObjectDecl *newFunPtr = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ), 0 ); 1014 1012 for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) { 1015 1013 ObjectDecl *thisParm; … … 1023 1021 // move all assertions into parameter list 1024 1022 for ( std::list< DeclarationWithType *>::iterator assert = (*tyParm)->get_assertions().begin(); assert != (*tyParm)->get_assertions().end(); ++assert ) { 1025 // *assert = (*assert)->acceptMutator( *this );1023 /// *assert = (*assert)->acceptMutator( *this ); 1026 1024 inferredParams.push_back( *assert ); 1027 1025 } … … 1065 1063 1066 1064 TypeDecl * Pass3::mutate( TypeDecl *typeDecl ) { 1067 // Initializer *init = 0;1068 // std::list< Expression *> designators;1069 // scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind();1070 // if ( typeDecl->get_base() ) {1071 // init = new SimpleInit( new SizeofExpr( handleDecl( typeDecl, typeDecl->get_base() ) ), designators );1072 // }1073 // return new ObjectDecl( typeDecl->get_name(), Declaration::Extern, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::UnsignedInt ), init );1065 /// Initializer *init = 0; 1066 /// std::list< Expression *> designators; 1067 /// scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind(); 1068 /// if ( typeDecl->get_base() ) { 1069 /// init = new SimpleInit( new SizeofExpr( handleDecl( typeDecl, typeDecl->get_base() ) ), designators ); 1070 /// } 1071 /// return new ObjectDecl( typeDecl->get_name(), Declaration::Extern, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::UnsignedInt ), init ); 1074 1072 1075 1073 scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind();
Note:
See TracChangeset
for help on using the changeset viewer.