Changeset 0f79853


Ignore:
Timestamp:
Jun 7, 2018, 9:55:28 AM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
Children:
61d9b4b
Parents:
2a6c115
Message:

Remove conversion cost for default arguments

Location:
src
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r2a6c115 r0f79853  
    836836                assertf( ! genC, "Deleted expressions should not reach code generation." );
    837837                expr->expr->accept( *visitor );
     838        }
     839
     840        void CodeGenerator::postvisit( DefaultArgExpr * arg ) {
     841                assertf( ! genC, "Default argument expressions should not reach code generation." );
     842                arg->expr->accept( *visitor );
    838843        }
    839844
  • src/CodeGen/CodeGenerator.h

    r2a6c115 r0f79853  
    9494                void postvisit( ConstructorExpr * );
    9595                void postvisit( DeletedExpr * );
     96                void postvisit( DefaultArgExpr * );
    9697                void postvisit( GenericExpr * );
    9798
  • src/Common/PassVisitor.h

    r2a6c115 r0f79853  
    125125        virtual void visit( InitExpr *  initExpr ) override final;
    126126        virtual void visit( DeletedExpr *  delExpr ) override final;
     127        virtual void visit( DefaultArgExpr * argExpr ) override final;
    127128        virtual void visit( GenericExpr * genExpr ) override final;
    128129
     
    224225        virtual Expression * mutate( InitExpr *  initExpr ) override final;
    225226        virtual Expression * mutate( DeletedExpr *  delExpr ) override final;
     227        virtual Expression * mutate( DefaultArgExpr * argExpr ) override final;
    226228        virtual Expression * mutate( GenericExpr * genExpr ) override final;
    227229
  • src/Common/PassVisitor.impl.h

    r2a6c115 r0f79853  
    20842084
    20852085//--------------------------------------------------------------------------
     2086// DefaultArgExpr
     2087template< typename pass_type >
     2088void PassVisitor< pass_type >::visit( DefaultArgExpr * node ) {
     2089        VISIT_START( node );
     2090
     2091        indexerScopedAccept( node->result, *this );
     2092        maybeAccept_impl( node->expr, *this );
     2093
     2094        VISIT_END( node );
     2095}
     2096
     2097template< typename pass_type >
     2098Expression * PassVisitor< pass_type >::mutate( DefaultArgExpr * node ) {
     2099        MUTATE_START( node );
     2100
     2101        indexerScopedMutate( node->env, *this );
     2102        indexerScopedMutate( node->result, *this );
     2103        maybeMutate_impl( node->expr, *this );
     2104
     2105        MUTATE_END( Expression, node );
     2106}
     2107
     2108//--------------------------------------------------------------------------
    20862109// GenericExpr
    20872110template< typename pass_type >
  • src/ResolvExpr/AlternativeFinder.cc

    r2a6c115 r0f79853  
    437437                                }
    438438                        }
     439                        if ( DefaultArgExpr * def = dynamic_cast< DefaultArgExpr * >( *actualExpr ) ) {
     440                                // default arguments should be free - don't include conversion cost.
     441                                // Unwrap them here because they are not relevant to the rest of the system.
     442                                *actualExpr = def->expr;
     443                                ++formal;
     444                                continue;
     445                        }
    439446                        Type * formalType = (*formal)->get_type();
    440447                        convCost += computeExpressionConversionCost( *actualExpr, formalType, indexer, alt.env );
     
    872879                                                                indexer ) ) {
    873880                                                        results.emplace_back(
    874                                                                 i, cnstExpr, move(env), move(need), move(have),
     881                                                                i, new DefaultArgExpr( cnstExpr ), move(env), move(need), move(have),
    875882                                                                move(openVars), nextArg, nTuples );
    876883                                                }
  • src/SynTree/Expression.cc

    r2a6c115 r0f79853  
    746746        os << std::endl << indent+1 << "... deleted by: ";
    747747        deleteStmt->print( os, indent+1 );
     748}
     749
     750
     751DefaultArgExpr::DefaultArgExpr( Expression * expr ) : expr( expr ) {
     752        assert( expr->result );
     753        result = expr->result->clone();
     754}
     755DefaultArgExpr::DefaultArgExpr( const DefaultArgExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ) {}
     756DefaultArgExpr::~DefaultArgExpr() {
     757        delete expr;
     758}
     759
     760void DefaultArgExpr::print( std::ostream & os, Indenter indent ) const {
     761        os << "Default Argument Expression" << std::endl << indent+1;
     762        expr->print( os, indent+1 );
    748763}
    749764
  • src/SynTree/Expression.h

    r2a6c115 r0f79853  
    865865};
    866866
     867/// expression wrapping the use of a default argument - should never make it past the resolver.
     868class DefaultArgExpr : public Expression {
     869public:
     870        Expression * expr;
     871
     872        DefaultArgExpr( Expression * expr );
     873        DefaultArgExpr( const DefaultArgExpr & other );
     874        ~DefaultArgExpr();
     875
     876        virtual DefaultArgExpr * clone() const { return new DefaultArgExpr( * this ); }
     877        virtual void accept( Visitor & v ) { v.visit( this ); }
     878        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     879        virtual void print( std::ostream & os, Indenter indent = {} ) const;
     880};
     881
    867882/// C11 _Generic expression
    868883class GenericExpr : public Expression {
  • src/SynTree/Mutator.h

    r2a6c115 r0f79853  
    9393        virtual Expression * mutate( InitExpr  * initExpr ) = 0;
    9494        virtual Expression * mutate( DeletedExpr * delExpr ) = 0;
     95        virtual Expression * mutate( DefaultArgExpr * argExpr ) = 0;
    9596        virtual Expression * mutate( GenericExpr * genExpr ) = 0;
    9697
  • src/SynTree/SynTree.h

    r2a6c115 r0f79853  
    101101class InitExpr;
    102102class DeletedExpr;
     103class DefaultArgExpr;
    103104class GenericExpr;
    104105
  • src/SynTree/Visitor.h

    r2a6c115 r0f79853  
    9595        virtual void visit( InitExpr *  initExpr ) = 0;
    9696        virtual void visit( DeletedExpr * delExpr ) = 0;
     97        virtual void visit( DefaultArgExpr * argExpr ) = 0;
    9798        virtual void visit( GenericExpr * genExpr ) = 0;
    9899
Note: See TracChangeset for help on using the changeset viewer.