Changes in / [bd66967:d2ac7d5]


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/InitTweak/InitTweak.cc

    rbd66967 rd2ac7d5  
    304304
    305305        namespace {
    306                 DeclarationWithType * getCalledFunction( Expression * expr );
    307 
    308                 template<typename CallExpr>
    309                 DeclarationWithType * handleDerefCalledFunction( CallExpr * expr ) {
    310                         // (*f)(x) => should get "f"
    311                         std::string name = getFunctionName( expr );
    312                         assertf( name == "*?", "Unexpected untyped expression: %s", name.c_str() );
    313                         assertf( ! expr->get_args().empty(), "Can't get called function from dereference with no arguments" );
    314                         return getCalledFunction( expr->get_args().front() );
    315                 }
    316 
    317306                DeclarationWithType * getCalledFunction( Expression * expr ) {
    318307                        assert( expr );
     
    323312                        } else if ( CastExpr * castExpr = dynamic_cast< CastExpr * >( expr ) ) {
    324313                                return getCalledFunction( castExpr->get_arg() );
    325                         } else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * >( expr ) ) {
    326                                 return handleDerefCalledFunction( untypedExpr );
    327                         } else if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * > ( expr ) ) {
    328                                 return handleDerefCalledFunction( appExpr );
    329314                        }
    330315                        return nullptr;
     
    392377
    393378        namespace {
    394                 std::string funcName( Expression * func );
    395 
    396                 template<typename CallExpr>
    397                 std::string handleDerefName( CallExpr * expr ) {
    398                         // (*f)(x) => should get name "f"
    399                         std::string name = getFunctionName( expr );
    400                         assertf( name == "*?", "Unexpected untyped expression: %s", name.c_str() );
    401                         assertf( ! expr->get_args().empty(), "Can't get function name from dereference with no arguments" );
    402                         return funcName( expr->get_args().front() );
    403                 }
    404 
    405379                std::string funcName( Expression * func ) {
    406380                        if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( func ) ) {
     
    414388                        } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) {
    415389                                return funcName( memberExpr->get_member() );
    416                         } else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * >( func ) ) {
    417                                 return handleDerefName( untypedExpr );
    418                         } else if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( func ) ) {
    419                                 return handleDerefName( appExpr );
    420390                        } else {
    421391                                assertf( false, "Unexpected expression type being called as a function in call expression" );
     
    425395
    426396        std::string getFunctionName( Expression * expr ) {
    427                 // there's some unforunate overlap here with getCalledFunction. Ideally this would be able to use getCalledFunction and
    428                 // return the name of the DeclarationWithType, but this needs to work for NameExpr and UntypedMemberExpr, where getCalledFunction
    429                 // can't possibly do anything reasonable.
    430397                if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ) ) {
    431398                        return funcName( appExpr->get_function() );
Note: See TracChangeset for help on using the changeset viewer.