Changeset 8488c715 for src/GenPoly/Box.cc
- Timestamp:
- Jan 22, 2016, 3:30:43 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 73a28e2
- Parents:
- 6d160d7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r6d160d7 r8488c715 1290 1290 1291 1291 // get declaration for base struct, exiting early if not found 1292 VariableExpr *varExpr = getBaseVar( memberExpr->get_aggregate() ); 1292 int varDepth; 1293 VariableExpr *varExpr = getBaseVar( memberExpr->get_aggregate(), &varDepth ); 1293 1294 if ( ! varExpr ) return memberExpr; 1294 1295 ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() ); … … 1296 1297 1297 1298 // only mutate member expressions for polymorphic types 1298 Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars ); 1299 int tyDepth; 1300 Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth ); 1299 1301 if ( ! objectType ) return memberExpr; 1300 1302 … … 1323 1325 1324 1326 // replace member expression with pointer to base plus offset 1325 // this is in a polymorphic context, so maybe keeping it as a void* is fine?1327 // get offset for field 1326 1328 std::stringstream offset_namer; 1327 1329 offset_namer << i; … … 1330 1332 fieldOffset->get_args().push_back( new NameExpr( offsetofName( objectType ) ) ); 1331 1333 fieldOffset->get_args().push_back( fieldIndex ); 1334 // build appropriately-dereferenced variable 1335 Expression *derefdVar = varExpr->clone(); 1336 for ( int i = 1; i < varDepth; ++i ) { 1337 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 1338 derefExpr->get_args().push_back( derefdVar ); 1339 derefdVar = derefExpr; 1340 } 1341 // add offset to deref'd variable 1332 1342 UntypedExpr *fieldLoc = new UntypedExpr( new NameExpr( "?+?" ) ); 1333 fieldLoc->get_args().push_back( memberExpr->get_aggregate());1343 fieldLoc->get_args().push_back( derefdVar ); 1334 1344 fieldLoc->get_args().push_back( fieldOffset ); 1335 1345 1336 memberExpr->set_aggregate( 0 );1337 1346 delete memberExpr; 1338 1347 return fieldLoc;
Note: See TracChangeset
for help on using the changeset viewer.