Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    rc10ee66 ra0ad7dc  
    765765                                                arg = new AddressExpr( arg );
    766766                                        }
    767                                         if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) {
    768                                                 // silence warnings by casting boxed parameters when the actual type does not match up with the formal type.
    769                                                 arg = new CastExpr( arg, param->clone() );
    770                                         }
    771767                                } else {
    772768                                        // use type computed in unification to declare boxed variables
     
    906902                                } // if
    907903                                UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
    908                                 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() ) ) );
    909906                                assign->get_args().push_back( deref );
    910907                                addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars );
     
    12201217
    12211218                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
    12221226                        if ( retval && returnStmt->get_expr() ) {
    12231227                                assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() );
     
    15351539                                        Type *declType = objectDecl->get_type();
    15361540                                        std::string bufName = bufNamer.newName();
    1537                                         ObjectDecl *newBuf = new ObjectDecl( bufName, Type::StorageClasses(), LinkageSpec::C, 0,
    1538                                                 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) ) ), 
    15391543                                                true, false, std::list<Attribute*>{ new Attribute( std::string{"aligned"}, std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 );
    15401544                                        stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) );
     
    15741578                }
    15751579
     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
    15761591                Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) {
    15771592                        // mutate, exiting early if no longer MemberExpr
     
    15801595                        if ( ! memberExpr ) return expr;
    15811596
     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
    15821604                        // only mutate member expressions for polymorphic types
    15831605                        int tyDepth;
    1584                         Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );
     1606                        Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth );
    15851607                        if ( ! objectType ) return memberExpr;
    15861608                        findGeneric( objectType ); // ensure layout for this type is available
     
    16001622                                fieldLoc->get_args().push_back( aggr );
    16011623                                fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
    1602                                 fieldLoc->set_result( memberExpr->get_result()->clone() );
    16031624                                newMemberExpr = fieldLoc;
    16041625                        } else if ( dynamic_cast< UnionInstType* >( objectType ) ) {
    1605                                 // union members are all at offset zero, so just use the aggregate expr
    1606                                 Expression * aggr = memberExpr->get_aggregate()->clone();
    1607                                 delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
    1608                                 aggr->set_env( nullptr );
    1609                                 newMemberExpr = aggr;
    1610                                 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 );
    16111628                        } else return memberExpr;
    16121629                        assert( newMemberExpr );
     
    16161633                                // 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
    16171634                                CastExpr *ptrCastExpr = new CastExpr( newMemberExpr, new PointerType( Type::Qualifiers(), memberType->clone() ) );
    1618                                 UntypedExpr *derefExpr = UntypedExpr::createDeref( ptrCastExpr );
     1635                                UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
     1636                                derefExpr->get_args().push_back( ptrCastExpr );
    16191637                                newMemberExpr = derefExpr;
    16201638                        }
Note: See TracChangeset for help on using the changeset viewer.