Changes in / [61accc5:f184ca3]
- Location:
- src
- Files:
-
- 11 edited
-
CodeGen/CodeGenerator.cc (modified) (1 diff)
-
CodeGen/CodeGenerator.h (modified) (1 diff)
-
Common/PassVisitor.h (modified) (3 diffs)
-
Common/PassVisitor.impl.h (modified) (5 diffs)
-
ResolvExpr/AlternativeFinder.cc (modified) (6 diffs)
-
ResolvExpr/Resolver.h (modified) (1 diff)
-
SynTree/Expression.cc (modified) (1 diff)
-
SynTree/Expression.h (modified) (1 diff)
-
SynTree/Mutator.h (modified) (1 diff)
-
SynTree/SynTree.h (modified) (1 diff)
-
SynTree/Visitor.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r61accc5 rf184ca3 836 836 assertf( ! genC, "Deleted expressions should not reach code generation." ); 837 837 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 );843 838 } 844 839 -
src/CodeGen/CodeGenerator.h
r61accc5 rf184ca3 94 94 void postvisit( ConstructorExpr * ); 95 95 void postvisit( DeletedExpr * ); 96 void postvisit( DefaultArgExpr * );97 96 void postvisit( GenericExpr * ); 98 97 -
src/Common/PassVisitor.h
r61accc5 rf184ca3 125 125 virtual void visit( InitExpr * initExpr ) override final; 126 126 virtual void visit( DeletedExpr * delExpr ) override final; 127 virtual void visit( DefaultArgExpr * argExpr ) override final;128 127 virtual void visit( GenericExpr * genExpr ) override final; 129 128 … … 225 224 virtual Expression * mutate( InitExpr * initExpr ) override final; 226 225 virtual Expression * mutate( DeletedExpr * delExpr ) override final; 227 virtual Expression * mutate( DefaultArgExpr * argExpr ) override final;228 226 virtual Expression * mutate( GenericExpr * genExpr ) override final; 229 227 … … 260 258 261 259 private: 262 bool inFunction = false;263 264 260 template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); 265 261 template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor ); -
src/Common/PassVisitor.impl.h
r61accc5 rf184ca3 404 404 indexerAddId( &func ); 405 405 maybeAccept_impl( node->type, *this ); 406 // function body needs to have the same scope as parameters - CompoundStmt will not enter407 // a new scope if inFunction is true408 ValueGuard< bool > oldInFunction( inFunction );409 inFunction = true;410 406 maybeAccept_impl( node->statements, *this ); 411 407 maybeAccept_impl( node->attributes, *this ); … … 438 434 indexerAddId( &func ); 439 435 maybeMutate_impl( node->type, *this ); 440 // function body needs to have the same scope as parameters - CompoundStmt will not enter441 // a new scope if inFunction is true442 ValueGuard< bool > oldInFunction( inFunction );443 inFunction = true;444 436 maybeMutate_impl( node->statements, *this ); 445 437 maybeMutate_impl( node->attributes, *this ); … … 720 712 VISIT_START( node ); 721 713 { 722 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 723 ValueGuard< bool > oldInFunction( inFunction ); 724 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } ); 714 auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 725 715 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } ); 726 inFunction = false;727 716 visitStatementList( node->kids ); 728 717 } … … 734 723 MUTATE_START( node ); 735 724 { 736 // do not enter a new scope if inFunction is true - needs to check old state before the assignment 737 ValueGuard< bool > oldInFunction( inFunction ); 738 auto guard1 = makeFuncGuard( [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeEnter(); }, [this, &oldInFunction]() { if ( ! oldInFunction.old ) indexerScopeLeave(); } ); 725 auto guard1 = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 739 726 auto guard2 = makeFuncGuard( [this]() { call_beginScope(); }, [this]() { call_endScope(); } ); 740 inFunction = false;741 727 mutateStatementList( node->kids ); 742 728 } … … 2088 2074 template< typename pass_type > 2089 2075 Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) { 2090 MUTATE_START( node );2091 2092 indexerScopedMutate( node->env, *this );2093 indexerScopedMutate( node->result, *this );2094 maybeMutate_impl( node->expr, *this );2095 2096 MUTATE_END( Expression, node );2097 }2098 2099 //--------------------------------------------------------------------------2100 // DefaultArgExpr2101 template< typename pass_type >2102 void PassVisitor< pass_type >::visit( DefaultArgExpr * node ) {2103 VISIT_START( node );2104 2105 indexerScopedAccept( node->result, *this );2106 maybeAccept_impl( node->expr, *this );2107 2108 VISIT_END( node );2109 }2110 2111 template< typename pass_type >2112 Expression * PassVisitor< pass_type >::mutate( DefaultArgExpr * node ) {2113 2076 MUTATE_START( node ); 2114 2077 -
src/ResolvExpr/AlternativeFinder.cc
r61accc5 rf184ca3 176 176 selected[ mangleName ] = current; 177 177 } else if ( candidate->cost == mapPlace->second.candidate->cost ) { 178 // if one of the candidates contains a deleted identifier, can pick the other, since 179 // deleted expressions should not be ambiguous if there is another option that is at least as good 180 if ( findDeletedExpr( candidate->expr ) ) { 181 // do nothing 182 PRINT( std::cerr << "candidate is deleted" << std::endl; ) 183 } else if ( findDeletedExpr( mapPlace->second.candidate->expr ) ) { 184 PRINT( std::cerr << "current is deleted" << std::endl; ) 185 selected[ mangleName ] = current; 186 } else { 187 PRINT( 188 std::cerr << "marking ambiguous" << std::endl; 189 ) 190 mapPlace->second.isAmbiguous = true; 191 } 178 PRINT( 179 std::cerr << "marking ambiguous" << std::endl; 180 ) 181 mapPlace->second.isAmbiguous = true; 192 182 } else { 193 183 PRINT( … … 345 335 if ( ConstantExpr * constantExpr = dynamic_cast< ConstantExpr * >( member ) ) { 346 336 // get the value of the constant expression as an int, must be between 0 and the length of the tuple type to have meaning 347 auto val = constantExpr->intValue(); 337 // xxx - this should be improved by memoizing the value of constant exprs 338 // during parsing and reusing that information here. 339 std::stringstream ss( constantExpr->get_constant()->get_value() ); 340 int val = 0; 348 341 std::string tmp; 349 if ( val >= 0 && (unsigned long long)val < tupleType->size() ) { 342 if ( ss >> val && ! (ss >> tmp) ) { 343 if ( val >= 0 && (unsigned int)val < tupleType->size() ) { 344 alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) ); 345 } // if 346 } // if 347 } else if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( member ) ) { 348 // xxx - temporary hack until 0/1 are int constants 349 if ( nameExpr->get_name() == "0" || nameExpr->get_name() == "1" ) { 350 std::stringstream ss( nameExpr->get_name() ); 351 int val; 352 ss >> val; 350 353 alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) ); 351 } // if354 } 352 355 } // if 353 356 } … … 436 439 return Cost::infinity; 437 440 } 438 }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 441 } 446 442 Type * formalType = (*formal)->get_type(); … … 615 611 ConstantExpr* getDefaultValue( Initializer* init ) { 616 612 if ( SingleInit* si = dynamic_cast<SingleInit*>( init ) ) { 617 if ( CastExpr* ce = dynamic_cast<CastExpr*>( si->value ) ) { 618 return dynamic_cast<ConstantExpr*>( ce->arg ); 619 } else { 620 return dynamic_cast<ConstantExpr*>( si->value ); 613 if ( CastExpr* ce = dynamic_cast<CastExpr*>( si->get_value() ) ) { 614 return dynamic_cast<ConstantExpr*>( ce->get_arg() ); 621 615 } 622 616 } … … 879 873 indexer ) ) { 880 874 results.emplace_back( 881 i, new DefaultArgExpr( cnstExpr ), move(env), move(need), move(have),875 i, cnstExpr, move(env), move(need), move(have), 882 876 move(openVars), nextArg, nTuples ); 883 877 } … … 1071 1065 funcFinder.findWithAdjustment( untypedExpr->function ); 1072 1066 // if there are no function alternatives, then proceeding is a waste of time. 1073 // xxx - findWithAdjustment throws, so this check and others like it shouldn't be necessary.1074 1067 if ( funcFinder.alternatives.empty() ) return; 1075 1068 -
src/ResolvExpr/Resolver.h
r61accc5 rf184ca3 36 36 void resolveCtorInit( ConstructorInit * ctorInit, const SymTab::Indexer & indexer ); 37 37 void resolveStmtExpr( StmtExpr * stmtExpr, const SymTab::Indexer & indexer ); 38 /// Searches expr and returns the first DeletedExpr found, otherwise nullptr39 DeletedExpr * findDeletedExpr( Expression * expr );40 38 } // namespace ResolvExpr 41 39 -
src/SynTree/Expression.cc
r61accc5 rf184ca3 746 746 os << std::endl << indent+1 << "... deleted by: "; 747 747 deleteStmt->print( os, indent+1 ); 748 }749 750 751 DefaultArgExpr::DefaultArgExpr( Expression * expr ) : expr( expr ) {752 assert( expr->result );753 result = expr->result->clone();754 }755 DefaultArgExpr::DefaultArgExpr( const DefaultArgExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ) {}756 DefaultArgExpr::~DefaultArgExpr() {757 delete expr;758 }759 760 void DefaultArgExpr::print( std::ostream & os, Indenter indent ) const {761 os << "Default Argument Expression" << std::endl << indent+1;762 expr->print( os, indent+1 );763 748 } 764 749 -
src/SynTree/Expression.h
r61accc5 rf184ca3 865 865 }; 866 866 867 /// expression wrapping the use of a default argument - should never make it past the resolver.868 class DefaultArgExpr : public Expression {869 public: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 882 867 /// C11 _Generic expression 883 868 class GenericExpr : public Expression { -
src/SynTree/Mutator.h
r61accc5 rf184ca3 93 93 virtual Expression * mutate( InitExpr * initExpr ) = 0; 94 94 virtual Expression * mutate( DeletedExpr * delExpr ) = 0; 95 virtual Expression * mutate( DefaultArgExpr * argExpr ) = 0;96 95 virtual Expression * mutate( GenericExpr * genExpr ) = 0; 97 96 -
src/SynTree/SynTree.h
r61accc5 rf184ca3 101 101 class InitExpr; 102 102 class DeletedExpr; 103 class DefaultArgExpr;104 103 class GenericExpr; 105 104 -
src/SynTree/Visitor.h
r61accc5 rf184ca3 95 95 virtual void visit( InitExpr * initExpr ) = 0; 96 96 virtual void visit( DeletedExpr * delExpr ) = 0; 97 virtual void visit( DefaultArgExpr * argExpr ) = 0;98 97 virtual void visit( GenericExpr * genExpr ) = 0; 99 98
Note:
See TracChangeset
for help on using the changeset viewer.