Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/GenPoly/Box.cc

    r7b2c0a99 ra0ad7dc  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 13 09:26:38 2017
    13 // Update Count     : 341
     12// Last Modified On : Fri Mar 17 09:06:37 2017
     13// Update Count     : 339
    1414//
    1515
     
    706706                                Type *concrete = env->lookup( typeInst->get_name() );
    707707                                if ( concrete == 0 ) {
    708                                         return typeInst;
    709708                                        // 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 );
    712711                                } // if
    713712                                return concrete;
     
    765764                                        } else {
    766765                                                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() );
    771766                                        }
    772767                                } else {
     
    907902                                } // if
    908903                                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() ) ) );
    910906                                assign->get_args().push_back( deref );
    911907                                addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars );
     
    12211217
    12221218                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
    12231226                        if ( retval && returnStmt->get_expr() ) {
    12241227                                assert( returnStmt->get_expr()->has_result() && ! returnStmt->get_expr()->get_result()->isVoid() );
     
    12991302                        FunctionType * ftype = functionDecl->get_functionType();
    13001303                        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/dtors
     1304                                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
    13021305                                        assert( ftype->get_returnVals().size() == 1 );
    13031306                                        DeclarationWithType * retval = ftype->get_returnVals().front();
     
    15361539                                        Type *declType = objectDecl->get_type();
    15371540                                        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) ) ), 
    15401543                                                true, false, std::list<Attribute*>{ new Attribute( std::string{"aligned"}, std::list<Expression*>{ new ConstantExpr( Constant::from_int(8) ) } ) } ), 0 );
    15411544                                        stmtsToAdd.push_back( new DeclStmt( noLabels, newBuf ) );
     
    15751578                }
    15761579
     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
    15771591                Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) {
    15781592                        // mutate, exiting early if no longer MemberExpr
     
    15811595                        if ( ! memberExpr ) return expr;
    15821596
     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
    15831604                        // only mutate member expressions for polymorphic types
    15841605                        int tyDepth;
    1585                         Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );
     1606                        Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth );
    15861607                        if ( ! objectType ) return memberExpr;
    15871608                        findGeneric( objectType ); // ensure layout for this type is available
     
    16011622                                fieldLoc->get_args().push_back( aggr );
    16021623                                fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
    1603                                 fieldLoc->set_result( memberExpr->get_result()->clone() );
    16041624                                newMemberExpr = fieldLoc;
    16051625                        } 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 );
    16121628                        } else return memberExpr;
    16131629                        assert( newMemberExpr );
     
    16171633                                // 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
    16181634                                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 );
    16201637                                newMemberExpr = derefExpr;
    16211638                        }
Note: See TracChangeset for help on using the changeset viewer.