Changes in src/GenPoly/Box.cc [7b2c0a99:a0ad7dc]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r7b2c0a99 ra0ad7dc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat May 13 09:26:38201713 // Update Count : 3 4112 // Last Modified On : Fri Mar 17 09:06:37 2017 13 // Update Count : 339 14 14 // 15 15 … … 706 706 Type *concrete = env->lookup( typeInst->get_name() ); 707 707 if ( concrete == 0 ) { 708 return typeInst;709 708 // xxx - should this be an assertion? 710 //std::string x = env ? toString( *env ) : "missing env";711 //throw SemanticError( x + "\n" + "Unbound type variable " + typeInst->get_name() + " in ", appExpr );709 std::string x = env ? toString( *env ) : "missing env"; 710 throw SemanticError( x + "\n" + "Unbound type variable " + typeInst->get_name() + " in ", appExpr ); 712 711 } // if 713 712 return concrete; … … 765 764 } else { 766 765 arg = new AddressExpr( arg ); 767 }768 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) {769 // silence warnings by casting boxed parameters when the actual type does not match up with the formal type.770 arg = new CastExpr( arg, param->clone() );771 766 } 772 767 } else { … … 907 902 } // if 908 903 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 909 UntypedExpr *deref = UntypedExpr::createDeref( new CastExpr( new VariableExpr( *param++ ), new PointerType( Type::Qualifiers(), realType->get_returnVals().front()->get_type()->clone() ) ) ); 904 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 905 deref->get_args().push_back( new CastExpr( new VariableExpr( *param++ ), new PointerType( Type::Qualifiers(), realType->get_returnVals().front()->get_type()->clone() ) ) ); 910 906 assign->get_args().push_back( deref ); 911 907 addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars ); … … 1221 1217 1222 1218 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 1219 // maybe need access to the env when mutating the expr 1220 if ( Expression * expr = returnStmt->get_expr() ) { 1221 if ( expr->get_env() ) { 1222 env = expr->get_env(); 1223 } 1224 } 1225 1223 1226 if ( retval && returnStmt->get_expr() ) { 1224 1227 assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() ); … … 1299 1302 FunctionType * ftype = functionDecl->get_functionType(); 1300 1303 if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) { 1301 if ( ! isPrefix( functionDecl->get_name(), "_thunk" ) && ! isPrefix( functionDecl->get_name(), "_adapter" ) ) { // xxx -remove check for prefix once thunks properly use ctor/dtors1304 if ( functionDecl->get_name() != "?=?" && ! isPrefix( functionDecl->get_name(), "_thunk" ) && ! isPrefix( functionDecl->get_name(), "_adapter" ) ) { // xxx - remove check for ?=? once reference types are in; remove check for prefix once thunks properly use ctor/dtors 1302 1305 assert( ftype->get_returnVals().size() == 1 ); 1303 1306 DeclarationWithType * retval = ftype->get_returnVals().front(); … … 1536 1539 Type *declType = objectDecl->get_type(); 1537 1540 std::string bufName = bufNamer.newName(); 1538 ObjectDecl *newBuf = new ObjectDecl( bufName, Type::StorageClasses(), LinkageSpec::C, 0, 1539 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1541 ObjectDecl *newBuf = new ObjectDecl( bufName, Type::StorageClasses(), LinkageSpec::C, 0, 1542 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Kind::Char), new NameExpr( sizeofName( mangleType(declType) ) ), 1540 1543 true, false, std::list<Attribute*>{ new Attribute( std::string{"aligned"}, std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 ); 1541 1544 stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) ); … … 1575 1578 } 1576 1579 1580 /// Returns an expression dereferenced n times 1581 Expression *makeDerefdVar( Expression *derefdVar, long n ) { 1582 for ( int i = 1; i < n; ++i ) { 1583 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 1584 derefExpr->get_args().push_back( derefdVar ); 1585 // xxx - should set results on derefExpr 1586 derefdVar = derefExpr; 1587 } 1588 return derefdVar; 1589 } 1590 1577 1591 Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) { 1578 1592 // mutate, exiting early if no longer MemberExpr … … 1581 1595 if ( ! memberExpr ) return expr; 1582 1596 1597 // get declaration for base struct, exiting early if not found 1598 int varDepth; 1599 VariableExpr *varExpr = getBaseVar( memberExpr->get_aggregate(), &varDepth ); 1600 if ( ! varExpr ) return memberExpr; 1601 ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() ); 1602 if ( ! objectDecl ) return memberExpr; 1603 1583 1604 // only mutate member expressions for polymorphic types 1584 1605 int tyDepth; 1585 Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );1606 Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth ); 1586 1607 if ( ! objectType ) return memberExpr; 1587 1608 findGeneric( objectType ); // ensure layout for this type is available … … 1601 1622 fieldLoc->get_args().push_back( aggr ); 1602 1623 fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) ); 1603 fieldLoc->set_result( memberExpr->get_result()->clone() );1604 1624 newMemberExpr = fieldLoc; 1605 1625 } else if ( dynamic_cast< UnionInstType* >( objectType ) ) { 1606 // union members are all at offset zero, so just use the aggregate expr 1607 Expression * aggr = memberExpr->get_aggregate()->clone(); 1608 delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it 1609 aggr->set_env( nullptr ); 1610 newMemberExpr = aggr; 1611 newMemberExpr->set_result( memberExpr->get_result()->clone() ); 1626 // union members are all at offset zero, so build appropriately-dereferenced variable 1627 newMemberExpr = makeDerefdVar( varExpr->clone(), varDepth ); 1612 1628 } else return memberExpr; 1613 1629 assert( newMemberExpr ); … … 1617 1633 // Not all members of a polymorphic type are themselves of polymorphic type; in this case the member expression should be wrapped and dereferenced to form an lvalue 1618 1634 CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), memberType->clone() ) ); 1619 UntypedExpr *derefExpr = UntypedExpr::createDeref( ptrCastExpr ); 1635 UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) ); 1636 derefExpr->get_args().push_back( ptrCastExpr ); 1620 1637 newMemberExpr = derefExpr; 1621 1638 }
Note:
See TracChangeset
for help on using the changeset viewer.