Changes in / [d7d4702:3ce0c915]


Ignore:
Location:
src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.impl.h

    rd7d4702 r3ce0c915  
    998998template< typename pass_type >
    999999void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
    1000         VISIT_BODY( node );
     1000        VISIT_START( node );
     1001
     1002        maybeAccept_impl( node->block, *this );
     1003
     1004        VISIT_END( node );
    10011005}
    10021006
    10031007template< typename pass_type >
    10041008Statement * PassVisitor< pass_type >::mutate( FinallyStmt * node ) {
    1005         MUTATE_BODY( Statement, node );
     1009        MUTATE_START( node );
     1010
     1011        maybeMutate_impl( node->block, *this );
     1012
     1013        MUTATE_END( Statement, node );
    10061014}
    10071015
  • src/GenPoly/Box.cc

    rd7d4702 r3ce0c915  
    988988
    989989                Expression *Pass1::handleIntrinsics( ApplicationExpr *appExpr ) {
    990                         if ( VariableExpr *varExpr = dynamic_cast< VariableExpr *>( appExpr->get_function() ) ) {
    991                                 if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic ) {
    992                                         if ( varExpr->get_var()->get_name() == "?[?]" ) {
     990                        if ( VariableExpr *varExpr = dynamic_cast< VariableExpr *>( appExpr->function ) ) {
     991                                if ( varExpr->var->linkage == LinkageSpec::Intrinsic ) {
     992                                        if ( varExpr->var->name == "?[?]" ) {
    993993                                                assert( appExpr->result );
    994994                                                assert( appExpr->get_args().size() == 2 );
    995                                                 Type *baseType1 = isPolyPtr( appExpr->get_args().front()->get_result(), scopeTyVars, env );
    996                                                 Type *baseType2 = isPolyPtr( appExpr->get_args().back()->get_result(), scopeTyVars, env );
     995                                                Type *baseType1 = isPolyPtr( appExpr->args.front()->result, scopeTyVars, env );
     996                                                Type *baseType2 = isPolyPtr( appExpr->args.back()->result, scopeTyVars, env );
    997997                                                assert( ! baseType1 || ! baseType2 ); // the arguments cannot both be polymorphic pointers
    998998                                                UntypedExpr *ret = 0;
     
    15551555                        // only mutate member expressions for polymorphic types
    15561556                        int tyDepth;
    1557                         Type *objectType = hasPolyBase( memberExpr->get_aggregate()->get_result(), scopeTyVars, &tyDepth );
     1557                        Type *objectType = hasPolyBase( memberExpr->aggregate->result, scopeTyVars, &tyDepth );
    15581558                        if ( ! objectType ) return memberExpr;
    15591559                        findGeneric( objectType ); // ensure layout for this type is available
    15601560
    15611561                        // replace member expression with dynamically-computed layout expression
    1562                         Expression *newMemberExpr = 0;
     1562                        Expression *newMemberExpr = nullptr;
    15631563                        if ( StructInstType *structType = dynamic_cast< StructInstType* >( objectType ) ) {
    15641564                                // look up offset index
    1565                                 long i = findMember( memberExpr->get_member(), structType->get_baseStruct()->get_members() );
     1565                                long i = findMember( memberExpr->member, structType->baseStruct->members );
    15661566                                if ( i == -1 ) return memberExpr;
    15671567
    15681568                                // replace member expression with pointer to base plus offset
    15691569                                UntypedExpr *fieldLoc = new UntypedExpr( new NameExpr( "?+?" ) );
    1570                                 Expression * aggr = memberExpr->get_aggregate()->clone();
    1571                                 delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
    1572                                 aggr->set_env( nullptr );
     1570                                Expression * aggr = memberExpr->aggregate->clone();
     1571                                delete aggr->env; // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
     1572                                aggr->env = nullptr;
    15731573                                fieldLoc->get_args().push_back( aggr );
    15741574                                fieldLoc->get_args().push_back( makeOffsetIndex( objectType, i ) );
    1575                                 fieldLoc->set_result( memberExpr->get_result()->clone() );
     1575                                fieldLoc->set_result( memberExpr->result->clone() );
    15761576                                newMemberExpr = fieldLoc;
    15771577                        } else if ( dynamic_cast< UnionInstType* >( objectType ) ) {
    15781578                                // union members are all at offset zero, so just use the aggregate expr
    1579                                 Expression * aggr = memberExpr->get_aggregate()->clone();
    1580                                 delete aggr->get_env(); // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
    1581                                 aggr->set_env( nullptr );
     1579                                Expression * aggr = memberExpr->aggregate->clone();
     1580                                delete aggr->env; // xxx - there's a problem with keeping the env for some reason, so for now just get rid of it
     1581                                aggr->env= nullptr;
    15821582                                newMemberExpr = aggr;
    1583                                 newMemberExpr->set_result( memberExpr->get_result()->clone() );
     1583                                newMemberExpr->result = memberExpr->result->clone();
    15841584                        } else return memberExpr;
    15851585                        assert( newMemberExpr );
    15861586
    1587                         Type *memberType = memberExpr->get_member()->get_type();
     1587                        Type *memberType = memberExpr->member->get_type();
    15881588                        if ( ! isPolyType( memberType, scopeTyVars ) ) {
    15891589                                // 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
     
    15981598
    15991599                ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) {
    1600                         ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init );
     1600                        ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, nullptr, type, init );
    16011601                        stmtsToAddBefore.push_back( new DeclStmt( newObj ) );
    16021602                        return newObj;
  • src/GenPoly/InstantiateGeneric.cc

    rd7d4702 r3ce0c915  
    476476                        DeclarationWithType * field = strict_dynamic_cast< DeclarationWithType * >( member );
    477477                        MemberExpr * ret = new MemberExpr( field, memberExpr->aggregate->clone() );
     478                        ResolvExpr::adjustExprType( ret->result ); // pointer decay
    478479                        std::swap( ret->env, memberExpr->env );
    479480                        delete memberExpr;
  • src/ResolvExpr/AdjustExprType.cc

    rd7d4702 r3ce0c915  
    2424        class AdjustExprType : public WithShortCircuiting {
    2525          public:
    26                 AdjustExprType( const TypeEnvironment &env, const SymTab::Indexer &indexer );
     26                AdjustExprType( const TypeEnvironment & env, const SymTab::Indexer & indexer );
    2727                void premutate( VoidType * ) { visit_children = false; }
    2828                void premutate( BasicType * ) { visit_children = false; }
     
    4545
    4646          private:
    47                 const TypeEnvironment &env;
    48                 const SymTab::Indexer &indexer;
     47                const TypeEnvironment & env;
     48                const SymTab::Indexer & indexer;
    4949        };
    5050
     
    5353                Type *newType = type->acceptMutator( adjuster );
    5454                type = newType;
     55        }
     56
     57        void adjustExprType( Type *& type ) {
     58                TypeEnvironment env;
     59                SymTab::Indexer indexer;
     60                adjustExprType( type, env, indexer );
    5561        }
    5662
  • src/ResolvExpr/Resolver.cc

    rd7d4702 r3ce0c915  
    280280                        std::list< Statement * > newStmts;
    281281                        resolveWithExprs( functionDecl->withExprs, newStmts );
    282                         functionDecl->statements->kids.splice( functionDecl->statements->kids.begin(), newStmts );
     282                        if ( functionDecl->statements ) {
     283                                functionDecl->statements->kids.splice( functionDecl->statements->kids.begin(), newStmts );
     284                        } else {
     285                                assertf( functionDecl->withExprs.empty() && newStmts.empty(), "Function %s without a body has with-clause and/or generated with declarations.", functionDecl->name.c_str() );
     286                        }
    283287                }
    284288        }
  • src/ResolvExpr/typeops.h

    rd7d4702 r3ce0c915  
    5555        /// Replaces array types with the equivalent pointer, and function types with a pointer-to-function
    5656        void adjustExprType( Type *&type, const TypeEnvironment &env, const SymTab::Indexer &indexer );
     57
     58        /// Replaces array types with the equivalent pointer, and function types with a pointer-to-function using empty TypeEnvironment and Indexer
     59        void adjustExprType( Type *& type );
    5760
    5861        template< typename ForwardIterator >
Note: See TracChangeset for help on using the changeset viewer.