Changes in src/SymTab/Autogen.cc [fa4805f:49148d5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.cc
rfa4805f r49148d5 125 125 FunctionType * genDefaultType( Type * paramType ) { 126 126 FunctionType *ftype = new FunctionType( Type::Qualifiers(), false ); 127 ObjectDecl *dstParam = new ObjectDecl( "_dst", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new PointerType( Type::Qualifiers(), paramType->clone() ), nullptr );127 ObjectDecl *dstParam = new ObjectDecl( "_dst", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new ReferenceType( Type::Qualifiers(), paramType->clone() ), nullptr ); 128 128 ftype->get_parameters().push_back( dstParam ); 129 129 … … 176 176 FunctionType * ftype = funcDecl->get_functionType(); 177 177 assert( ! ftype->get_parameters().empty() ); 178 Type * t = safe_dynamic_cast< PointerType * >( ftype->get_parameters().front()->get_type() )->get_base(); 178 Type * t = InitTweak::getPointerBase( ftype->get_parameters().front()->get_type() ); 179 assert( t ); 179 180 map.insert( Mangler::mangleType( t ), true ); 180 181 } … … 297 298 /// generates a single struct member operation (constructor call, destructor call, assignment call) 298 299 void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, bool isDynamicLayout, bool forward = true ) { 299 ObjectDecl * returnVal = NULL;300 if ( ! func->get_functionType()->get_returnVals().empty() ) {301 returnVal = dynamic_cast<ObjectDecl*>( func->get_functionType()->get_returnVals().front() );302 }303 304 300 InitTweak::InitExpander srcParam( src ); 305 301 306 // assign to destination (and return value if generic) 307 UntypedExpr *derefExpr = UntypedExpr::createDeref( new VariableExpr( dstParam ) ); 308 Expression *dstselect = new MemberExpr( field, derefExpr ); 302 // assign to destination 303 Expression *dstselect = new MemberExpr( field, new CastExpr( new VariableExpr( dstParam ), safe_dynamic_cast< ReferenceType* >( dstParam->get_type() )->get_base()->clone() ) ); 309 304 genImplicitCall( srcParam, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward ); 310 311 if ( isDynamicLayout && returnVal ) {312 // xxx - there used to be a dereference on returnVal, but this seems to have been wrong?313 Expression *retselect = new MemberExpr( field, new VariableExpr( returnVal ) );314 genImplicitCall( srcParam, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );315 } // if316 305 } 317 306 … … 467 456 // our inheritance model. I think the correct way to handle this is to 468 457 // cast the structure to the type of the member and let the resolver 469 // figure out whether it's valid and have a pass afterwards that fixes 470 // the assignment to use pointer arithmetic with the offset of the 471 // member, much like how generic type members are handled. 458 // figure out whether it's valid/choose the correct unnamed member 472 459 continue; 473 460 } … … 485 472 void makeUnionFieldsAssignment( ObjectDecl * srcParam, ObjectDecl * dstParam, OutputIterator out ) { 486 473 UntypedExpr *copy = new UntypedExpr( new NameExpr( "__builtin_memcpy" ) ); 487 copy->get_args().push_back( new VariableExpr( dstParam) );474 copy->get_args().push_back( new AddressExpr( new VariableExpr( dstParam ) ) ); 488 475 copy->get_args().push_back( new AddressExpr( new VariableExpr( srcParam ) ) ); 489 476 copy->get_args().push_back( new SizeofExpr( srcParam->get_type()->clone() ) ); … … 497 484 ObjectDecl * dstParam = safe_dynamic_cast< ObjectDecl * >( ftype->get_parameters().front() ); 498 485 ObjectDecl * srcParam = safe_dynamic_cast< ObjectDecl * >( ftype->get_parameters().back() ); 499 ObjectDecl * returnVal = nullptr;500 if ( ! ftype->get_returnVals().empty() ) {501 returnVal = safe_dynamic_cast< ObjectDecl * >( ftype->get_returnVals().front() );502 }503 486 504 487 makeUnionFieldsAssignment( srcParam, dstParam, back_inserter( funcDecl->get_statements()->get_kids() ) ); 505 if ( returnVal ) { 488 if ( InitTweak::isAssignment( funcDecl->get_name() ) ) { 489 // also generate return statement in assignment 506 490 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) ); 507 491 } … … 512 496 // Make function polymorphic in same parameters as generic union, if applicable 513 497 const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions 514 498 515 499 // default ctor/dtor need only first parameter 516 500 // void ?{}(T *); void ^?{}(T *);
Note:
See TracChangeset
for help on using the changeset viewer.