Changeset 71f4e4f


Ignore:
Timestamp:
Jan 13, 2016, 5:19:47 PM (6 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
f1e012b
Parents:
02c7d04
Message:

added ConstructorInit?, simple constructors and destructors work correctly

Location:
src
Files:
2 added
15 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // CodeGenerator.cc -- 
     7// CodeGenerator.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Sep 17 15:25:58 2015
    13 // Update Count     : 233
     12// Last Modified On : Wed Jan 13 16:26:59 2016
     13// Update Count     : 234
    1414//
    1515
     
    9898                handleStorageClass( objectDecl );
    9999                output << genType( objectDecl->get_type(), mangleName( objectDecl ) );
    100        
     100
    101101                if ( objectDecl->get_init() ) {
    102102                        output << " = ";
     
    112112                if ( aggDecl->get_name() != "" )
    113113                        output << aggDecl->get_name();
    114        
     114
    115115                std::list< Declaration * > &memb = aggDecl->get_members();
    116116
     
    118118                        output << " {" << endl;
    119119
    120                         cur_indent += CodeGenerator::tabsize; 
     120                        cur_indent += CodeGenerator::tabsize;
    121121                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    122                                 output << indent; 
     122                                output << indent;
    123123                                (*i)->accept( *this );
    124124                                output << ";" << endl;
    125125                        }
    126126
    127                         cur_indent -= CodeGenerator::tabsize; 
     127                        cur_indent -= CodeGenerator::tabsize;
    128128
    129129                        output << indent << "}";
     
    140140                handleAggregate( aggregateDecl );
    141141        }
    142  
     142
    143143        void CodeGenerator::visit( EnumDecl *aggDecl ) {
    144144                output << "enum ";
     
    146146                if ( aggDecl->get_name() != "" )
    147147                        output << aggDecl->get_name();
    148        
     148
    149149                std::list< Declaration* > &memb = aggDecl->get_members();
    150150
     
    152152                        output << " {" << endl;
    153153
    154                         cur_indent += CodeGenerator::tabsize; 
     154                        cur_indent += CodeGenerator::tabsize;
    155155                        for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
    156156                                ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
    157157                                assert( obj );
    158                                 output << indent << mangleName( obj ); 
     158                                output << indent << mangleName( obj );
    159159                                if ( obj->get_init() ) {
    160160                                        output << " = ";
     
    164164                        } // for
    165165
    166                         cur_indent -= CodeGenerator::tabsize; 
     166                        cur_indent -= CodeGenerator::tabsize;
    167167
    168168                        output << indent << "}";
    169169                } // if
    170170        }
    171  
     171
    172172        void CodeGenerator::visit( ContextDecl *aggregateDecl ) {}
    173  
     173
    174174        void CodeGenerator::visit( TypedefDecl *typeDecl ) {
    175175                output << "typedef ";
    176176                output << genType( typeDecl->get_base(), typeDecl->get_name() );
    177177        }
    178  
     178
    179179        void CodeGenerator::visit( TypeDecl *typeDecl ) {
    180180                // really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes,
     
    216216        }
    217217
    218         void CodeGenerator::visit( Constant *constant ) { 
     218        void CodeGenerator::visit( Constant *constant ) {
    219219                output << constant->get_value() ;
    220220        }
     
    233233                                                assert( arg != applicationExpr->get_args().end() );
    234234                                                if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
    235                
     235
    236236                                                        *arg = addrExpr->get_arg();
    237237                                                } else {
     
    242242                                                break;
    243243                                        }
    244              
     244
    245245                                  default:
    246246                                        // do nothing
    247247                                        ;
    248248                                }
    249            
     249
    250250                                switch ( opInfo.type ) {
    251251                                  case OT_INDEX:
     
    256256                                        output << "]";
    257257                                        break;
    258              
     258
    259259                                  case OT_CALL:
    260260                                  case OT_CTOR:
     
    263263                                        assert( false );
    264264                                        break;
    265              
     265
    266266                                  case OT_PREFIX:
    267267                                  case OT_PREFIXASSIGN:
     
    272272                                        output << ")";
    273273                                        break;
    274              
     274
    275275                                  case OT_POSTFIX:
    276276                                  case OT_POSTFIXASSIGN:
     
    289289                                        output << ")";
    290290                                        break;
    291              
     291
    292292                                  case OT_CONSTANT:
    293293                                  case OT_LABELADDRESS:
     
    308308                } // if
    309309        }
    310  
     310
    311311        void CodeGenerator::visit( UntypedExpr *untypedExpr ) {
    312312                if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
     
    322322                                        output << "]";
    323323                                        break;
    324              
     324
    325325                                  case OT_CALL:
    326326                                        case OT_CTOR:
     
    328328                                        assert( false );
    329329                                        break;
    330              
     330
    331331                                  case OT_PREFIX:
    332332                                  case OT_PREFIXASSIGN:
     
    338338                                        output << ")";
    339339                                        break;
    340              
     340
    341341                                  case OT_POSTFIX:
    342342                                  case OT_POSTFIXASSIGN:
     
    345345                                        output << opInfo.symbol;
    346346                                        break;
    347  
     347
    348348                                  case OT_INFIX:
    349349                                  case OT_INFIXASSIGN:
     
    355355                                        output << ")";
    356356                                        break;
    357                                        
     357
    358358                                  case OT_CONSTANT:
    359359                                        // there are no intrinsic definitions of 0 or 1 as functions
     
    373373                } // if
    374374        }
    375  
     375
    376376        void CodeGenerator::visit( NameExpr *nameExpr ) {
    377377                OperatorInfo opInfo;
     
    383383                } // if
    384384        }
    385  
     385
    386386        void CodeGenerator::visit( AddressExpr *addressExpr ) {
    387387                output << "(&";
     
    410410                        output << ")";
    411411                        castExpr->get_arg()->accept( *this );
    412                         output << ")";                 
     412                        output << ")";
    413413                }
    414414        }
    415  
     415
    416416        void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) {
    417417                assert( false );
    418418        }
    419  
     419
    420420        void CodeGenerator::visit( MemberExpr *memberExpr ) {
    421421                memberExpr->get_aggregate()->accept( *this );
    422422                output << "." << mangleName( memberExpr->get_member() );
    423423        }
    424  
     424
    425425        void CodeGenerator::visit( VariableExpr *variableExpr ) {
    426426                OperatorInfo opInfo;
     
    431431                } // if
    432432        }
    433  
     433
    434434        void CodeGenerator::visit( ConstantExpr *constantExpr ) {
    435435                assert( constantExpr->get_constant() );
    436436                constantExpr->get_constant()->accept( *this );
    437437        }
    438  
     438
    439439        void CodeGenerator::visit( SizeofExpr *sizeofExpr ) {
    440440                output << "sizeof(";
     
    457457                output << ")";
    458458        }
    459  
     459
    460460        void CodeGenerator::visit( LogicalExpr *logicalExpr ) {
    461461                output << "(";
     
    469469                output << ")";
    470470        }
    471  
     471
    472472        void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) {
    473473                output << "(";
     
    479479                output << ")";
    480480        }
    481  
     481
    482482        void CodeGenerator::visit( CommaExpr *commaExpr ) {
    483483                output << "(";
     
    487487                output << ")";
    488488        }
    489  
     489
    490490        void CodeGenerator::visit( TupleExpr *tupleExpr ) {}
    491  
     491
    492492        void CodeGenerator::visit( TypeExpr *typeExpr ) {}
    493493
     
    520520                        }
    521521                }
    522                 cur_indent -= CodeGenerator::tabsize; 
     522                cur_indent -= CodeGenerator::tabsize;
    523523
    524524                output << indent << "}";
     
    526526
    527527        void CodeGenerator::visit( ExprStmt *exprStmt ) {
    528                 // I don't see why this check is necessary. 
    529                 // If this starts to cause problems then put it back in, 
     528                // I don't see why this check is necessary.
     529                // If this starts to cause problems then put it back in,
    530530                // with an explanation
    531531                assert( exprStmt );
     
    577577                switchStmt->get_condition()->accept( *this );
    578578                output << " ) ";
    579                
     579
    580580                output << "{" << std::endl;
    581581                cur_indent += CodeGenerator::tabsize;
     
    597597                } // if
    598598                output << ":\n";
    599                
     599
    600600                std::list<Statement *> sts = caseStmt->get_statements();
    601601
     
    614614                        if ( ! branchStmt->get_target().empty() )
    615615                                output << "goto " << branchStmt->get_target();
    616                         else { 
     616                        else {
    617617                                if ( branchStmt->get_computedTarget() != 0 ) {
    618618                                        output << "goto *";
     
    665665
    666666        void CodeGenerator::visit( ForStmt *forStmt ) {
    667                 // initialization is always hoisted, so don't 
    668                 // bother doing anything with that 
     667                // initialization is always hoisted, so don't
     668                // bother doing anything with that
    669669                output << "for (;";
    670670
     
    690690        void CodeGenerator::visit( DeclStmt *declStmt ) {
    691691                declStmt->get_decl()->accept( *this );
    692        
     692
    693693                if ( doSemicolon( declStmt->get_decl() ) ) {
    694694                        output << ";";
  • src/InitTweak/RemoveInit.cc

    r02c7d04 r71f4e4f  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Mon Jan 11 16:10:45 2016
    13 // Update Count     : 150
     12// Last Modified On : Wed Jan 13 15:19:35 2016
     13// Update Count     : 154
    1414//
    1515
     
    148148                }
    149149
    150                 ExprStmt * makeCtorDtorStmt( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
     150                Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
    151151                        UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );
    152152                        expr->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
    153153                        expr->get_args().splice( expr->get_args().end(), args );
    154                         return new ExprStmt( noLabels, expr );
     154                        return expr;
    155155                }
    156156
     
    186186                // hands off if designated or if @=
    187187                if ( tryConstruct( objDecl ) ) {
    188                         ExprStmt * ctor = makeCtorDtorStmt( "?{}", objDecl, makeInitList( objDecl->get_init() ) );
    189                         ExprStmt * dtor = makeCtorDtorStmt( "^?{}", objDecl, std::list< Expression * >() );
    190 
    191                         // set_ctor...
     188                        Expression * ctor = makeCtorDtorExpr( "?{}", objDecl, makeInitList( objDecl->get_init() ) );
     189                        Expression * dtor = makeCtorDtorExpr( "^?{}", objDecl, std::list< Expression * >() );
     190
    192191                        // need to remember init expression, in case no ctors exist
    193                         // if ctor does exist, want to use ctor stmt instead of init
    194                         objDecl->set_ctor( ctor );
    195                         destructorStmts.push_front( dtor );
     192                        // if ctor does exist, want to use ctor expression instead of init
     193                        // push this decision to the resolver
     194                        objDecl->set_init( new ConstructorInit( ctor, objDecl->get_init() ) );
     195                        destructorStmts.push_front( new ExprStmt( noLabels, dtor ) );
    196196                }
    197197                return objDecl;
  • src/InitTweak/module.mk

    r02c7d04 r71f4e4f  
    1111## Created On       : Mon Jun  1 17:49:17 2015
    1212## Last Modified By : Rob Schluntz
    13 ## Last Modified On : Mon Jan 11 14:40:16 2016
    14 ## Update Count     : 2
     13## Last Modified On : Wed Jan 13 16:29:03 2016
     14## Update Count     : 3
    1515###############################################################################
    1616
    17 SRC += InitTweak/RemoveInit.cc
    18 
     17SRC += InitTweak/RemoveInit.cc \
     18        InitTweak/FixInit.cc
  • src/Makefile.in

    r02c7d04 r71f4e4f  
    124124        GenPoly/cfa_cpp-DeclMutator.$(OBJEXT) \
    125125        InitTweak/cfa_cpp-RemoveInit.$(OBJEXT) \
     126        InitTweak/cfa_cpp-FixInit.$(OBJEXT) \
    126127        Parser/cfa_cpp-parser.$(OBJEXT) Parser/cfa_cpp-lex.$(OBJEXT) \
    127128        Parser/cfa_cpp-TypedefTable.$(OBJEXT) \
     
    346347        GenPoly/CopyParams.cc GenPoly/FindFunction.cc \
    347348        GenPoly/InstantiateGeneric.cc GenPoly/DeclMutator.cc \
    348         InitTweak/RemoveInit.cc Parser/parser.yy Parser/lex.ll \
    349         Parser/TypedefTable.cc Parser/ParseNode.cc \
     349        InitTweak/RemoveInit.cc InitTweak/FixInit.cc Parser/parser.yy \
     350        Parser/lex.ll Parser/TypedefTable.cc Parser/ParseNode.cc \
    350351        Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
    351352        Parser/StatementNode.cc Parser/InitializerNode.cc \
     
    562563        @: > InitTweak/$(DEPDIR)/$(am__dirstamp)
    563564InitTweak/cfa_cpp-RemoveInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
     565        InitTweak/$(DEPDIR)/$(am__dirstamp)
     566InitTweak/cfa_cpp-FixInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
    564567        InitTweak/$(DEPDIR)/$(am__dirstamp)
    565568Parser/parser.h: Parser/parser.cc
     
    783786        -rm -f GenPoly/cfa_cpp-ScrubTyVars.$(OBJEXT)
    784787        -rm -f GenPoly/cfa_cpp-Specialize.$(OBJEXT)
     788        -rm -f InitTweak/cfa_cpp-FixInit.$(OBJEXT)
    785789        -rm -f InitTweak/cfa_cpp-RemoveInit.$(OBJEXT)
    786790        -rm -f Parser/cfa_cpp-DeclarationNode.$(OBJEXT)
     
    890894@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/cfa_cpp-ScrubTyVars.Po@am__quote@
    891895@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/cfa_cpp-Specialize.Po@am__quote@
     896@AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po@am__quote@
    892897@AMDEP_TRUE@@am__include@ @am__quote@InitTweak/$(DEPDIR)/cfa_cpp-RemoveInit.Po@am__quote@
    893898@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/cfa_cpp-DeclarationNode.Po@am__quote@
     
    13881393@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-RemoveInit.obj `if test -f 'InitTweak/RemoveInit.cc'; then $(CYGPATH_W) 'InitTweak/RemoveInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/RemoveInit.cc'; fi`
    13891394
     1395InitTweak/cfa_cpp-FixInit.o: InitTweak/FixInit.cc
     1396@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/cfa_cpp-FixInit.o -MD -MP -MF InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo -c -o InitTweak/cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc
     1397@am__fastdepCXX_TRUE@   $(am__mv) InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po
     1398@AMDEP_TRUE@@am__fastdepCXX_FALSE@      source='InitTweak/FixInit.cc' object='InitTweak/cfa_cpp-FixInit.o' libtool=no @AMDEPBACKSLASH@
     1399@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1400@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-FixInit.o `test -f 'InitTweak/FixInit.cc' || echo '$(srcdir)/'`InitTweak/FixInit.cc
     1401
     1402InitTweak/cfa_cpp-FixInit.obj: InitTweak/FixInit.cc
     1403@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT InitTweak/cfa_cpp-FixInit.obj -MD -MP -MF InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo -c -o InitTweak/cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi`
     1404@am__fastdepCXX_TRUE@   $(am__mv) InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Tpo InitTweak/$(DEPDIR)/cfa_cpp-FixInit.Po
     1405@AMDEP_TRUE@@am__fastdepCXX_FALSE@      source='InitTweak/FixInit.cc' object='InitTweak/cfa_cpp-FixInit.obj' libtool=no @AMDEPBACKSLASH@
     1406@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1407@am__fastdepCXX_FALSE@  $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o InitTweak/cfa_cpp-FixInit.obj `if test -f 'InitTweak/FixInit.cc'; then $(CYGPATH_W) 'InitTweak/FixInit.cc'; else $(CYGPATH_W) '$(srcdir)/InitTweak/FixInit.cc'; fi`
     1408
    13901409Parser/cfa_cpp-parser.o: Parser/parser.cc
    13911410@am__fastdepCXX_TRUE@   $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/cfa_cpp-parser.o -MD -MP -MF Parser/$(DEPDIR)/cfa_cpp-parser.Tpo -c -o Parser/cfa_cpp-parser.o `test -f 'Parser/parser.cc' || echo '$(srcdir)/'`Parser/parser.cc
  • src/ResolvExpr/Resolver.cc

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Resolver.cc -- 
     7// Resolver.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:17:01 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 24 17:33:54 2015
    13 // Update Count     : 178
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 16:23:51 2016
     13// Update Count     : 186
    1414//
    1515
     
    3333          public:
    3434                Resolver() : SymTab::Indexer( false ), switchType( 0 ) {}
    35  
     35
    3636                virtual void visit( FunctionDecl *functionDecl );
    3737                virtual void visit( ObjectDecl *functionDecl );
     
    5454                virtual void visit( SingleInit *singleInit );
    5555                virtual void visit( ListInit *listInit );
     56                virtual void visit( ConstructorInit *ctorInit );
    5657          private:
    5758        typedef std::list< Initializer * >::iterator InitIterator;
     
    9596                        return newExpr;
    9697                }
    97  
     98
    9899                Expression *findSingleExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    99100                        TypeEnvironment env;
     
    126127                        } // if
    127128                }
    128  
     129
    129130                Expression *findIntegralExpression( Expression *untyped, const SymTab::Indexer &indexer ) {
    130131                        TypeEnvironment env;
     
    159160                        return newExpr;
    160161                }
    161  
    162         }
    163  
     162
     163        }
     164
    164165        void Resolver::visit( ObjectDecl *objectDecl ) {
    165166                Type *new_type = resolveTypeof( objectDecl->get_type(), *this );
     
    251252                        forStmt->set_condition( newExpr );
    252253                } // if
    253                
     254
    254255                if ( forStmt->get_increment() ) {
    255256                        Expression * newExpr = findVoidExpression( forStmt->get_increment(), *this );
     
    265266                delete switchStmt->get_condition();
    266267                switchStmt->set_condition( newExpr );
    267  
     268
    268269                visitor.Visitor::visit( switchStmt );
    269270        }
     
    307308        bool isCharType( T t ) {
    308309                if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) {
    309                         return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 
     310                        return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar ||
    310311                                bt->get_kind() == BasicType::UnsignedChar;
    311312                }
     
    319320                                string n = ne->get_name();
    320321                                if (n == "0") {
    321                                         initContext = new BasicType(Type::Qualifiers(), 
     322                                        initContext = new BasicType(Type::Qualifiers(),
    322323                                                                                                BasicType::SignedInt);
    323324                                } else {
     
    325326                                        initContext = decl->get_type();
    326327                                }
    327                         } else if (ConstantExpr * e = 
     328                        } else if (ConstantExpr * e =
    328329                                           dynamic_cast<ConstantExpr*>(singleInit->get_value())) {
    329330                                Constant *c = e->get_constant();
     
    349350                                                        singleInit->set_value( ce->get_arg() );
    350351                                                        ce->set_arg( NULL );
    351                                                         delete ce;                                                                     
     352                                                        delete ce;
    352353                                                }
    353354                                        }
     
    465466#endif
    466467        }
     468
     469        void Resolver::visit( ConstructorInit *ctorInit ) {
     470                TypeEnvironment env;
     471                AlternativeFinder finder( *this, env );
     472                finder.find( ctorInit->get_ctor() );
     473                if ( finder.get_alternatives().size() == 0 ) {
     474                        // could not find valid constructor
     475                        delete ctorInit->get_ctor();
     476                        ctorInit->set_ctor( NULL );
     477
     478                        maybeAccept( ctorInit->get_init(), *this );
     479                } else if ( finder.get_alternatives().size() == 1 ) {
     480                        // found a constructor - can get rid of C-style initializer
     481                        Alternative &choice = finder.get_alternatives().front();
     482                        Expression *newExpr = choice.expr->clone();
     483                        finishExpr( newExpr, choice.env );
     484                        ctorInit->set_ctor( newExpr );
     485                        delete ctorInit->get_init();
     486                        ctorInit->set_init( NULL );
     487                } else {
     488                        // too many constructors found
     489                        assert(false);
     490                }
     491        }
    467492} // namespace ResolvExpr
    468493
  • src/SynTree/Declaration.h

    r02c7d04 r71f4e4f  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jan 07 14:48:44 2016
    13 // Update Count     : 34
     12// Last Modified On : Wed Jan 13 16:11:49 2016
     13// Update Count     : 36
    1414//
    1515
     
    9191        Expression *get_bitfieldWidth() const { return bitfieldWidth; }
    9292        void set_bitfieldWidth( Expression *newValue ) { bitfieldWidth = newValue; }
    93         ExprStmt * get_ctor() const { return ctor; }
    94         void set_ctor( ExprStmt * newValue ) { ctor = newValue; }
    9593
    9694        virtual ObjectDecl *clone() const { return new ObjectDecl( *this ); }
     
    103101        Initializer *init;
    104102        Expression *bitfieldWidth;
    105         ExprStmt * ctor;
    106103};
    107104
  • src/SynTree/Initializer.cc

    r02c7d04 r71f4e4f  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jan 07 15:00:18 2016
    13 // Update Count     : 23
     12// Last Modified On : Wed Jan 13 15:31:45 2016
     13// Update Count     : 28
    1414//
    1515
     
    7979                (*i)->print( os, indent + 2 );
    8080}
     81
     82
     83ConstructorInit::ConstructorInit( Expression * ctor, Initializer * init ) : Initializer( true ), ctor( ctor ), init( init ) {}
     84ConstructorInit::~ConstructorInit() {
     85        delete ctor;
     86        delete init;
     87}
     88
     89ConstructorInit *ConstructorInit::clone() const {
     90        return new ConstructorInit( *this );
     91}
     92
     93void ConstructorInit::print( std::ostream &os, int indent ) {
     94        os << std::endl << std::string(indent, ' ') << "Constructor initializer: ";
     95        if ( ctor ) {
     96                os << " initially constructed with ";
     97                ctor->print( os, indent+2 );
     98        } // if
     99
     100        if ( init ) {
     101                os << " with fallback C-style initializer: ";
     102                init->print( os, indent+2 );
     103        }
     104}
     105
     106
    81107// Local Variables: //
    82108// tab-width: 4 //
  • src/SynTree/Initializer.h

    r02c7d04 r71f4e4f  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jan 07 13:33:20 2016
    13 // Update Count     : 5
     12// Last Modified On : Wed Jan 13 15:29:53 2016
     13// Update Count     : 17
    1414//
    1515
     
    103103};
    104104
     105// ConstructorInit represents an initializer that is either a constructor expression or
     106// a C-style initializer.
     107class ConstructorInit : public Initializer {
     108  public:
     109        ConstructorInit( Expression * ctor, Initializer * init );
     110        virtual ~ConstructorInit();
     111
     112        void set_ctor( Expression * newValue ) { ctor = newValue; }
     113        Expression * get_ctor() const { return ctor; }
     114        void set_init( Initializer * newValue ) { init = newValue; }
     115        Initializer * get_init() const { return init; }
     116
     117        virtual ConstructorInit *clone() const;
     118        virtual void accept( Visitor &v ) { v.visit( this ); }
     119        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     120        virtual void print( std::ostream &os, int indent = 0 );
     121
     122  private:
     123        Expression * ctor;
     124        // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
     125        // if an appropriate constructor definition is not found by the resolver
     126        Initializer * init;
     127};
     128
    105129#endif // INITIALIZER_H
    106130
  • src/SynTree/Mutator.cc

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Mutator.cc -- 
     7// Mutator.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Jul 25 19:21:33 2015
    13 // Update Count     : 11
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:32:29 2016
     13// Update Count     : 15
    1414//
    1515
     
    419419}
    420420
     421Initializer *Mutator::mutate( ConstructorInit *ctorInit ) {
     422        ctorInit->set_ctor( maybeMutate( ctorInit->get_ctor(), *this ) );
     423        ctorInit->set_init( maybeMutate( ctorInit->get_init(), *this ) );
     424        return ctorInit;
     425}
     426
    421427Subrange *Mutator::mutate( Subrange *subrange ) {
    422428        return subrange;
  • src/SynTree/Mutator.h

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Mutator.h -- 
     7// Mutator.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 19 22:26:16 2015
    13 // Update Count     : 8
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:24:26 2016
     13// Update Count     : 9
    1414//
    1515#include <cassert>
     
    6262        virtual Expression* mutate( MemberExpr *memberExpr );
    6363        virtual Expression* mutate( VariableExpr *variableExpr );
    64         virtual Expression* mutate( ConstantExpr *constantExpr ); 
     64        virtual Expression* mutate( ConstantExpr *constantExpr );
    6565        virtual Expression* mutate( SizeofExpr *sizeofExpr );
    6666        virtual Expression* mutate( AlignofExpr *alignofExpr );
     
    9191        virtual Initializer* mutate( SingleInit *singleInit );
    9292        virtual Initializer* mutate( ListInit *listInit );
     93        virtual Initializer* mutate( ConstructorInit *ctorInit );
    9394
    9495        virtual Subrange *mutate( Subrange *subrange );
  • src/SynTree/ObjectDecl.cc

    r02c7d04 r71f4e4f  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Jan 08 15:29:10 2016
    13 // Update Count     : 27
     12// Last Modified On : Wed Jan 13 16:11:19 2016
     13// Update Count     : 29
    1414//
    1515
     
    2525        set_isInline( isInline );
    2626        set_isNoreturn( isNoreturn );
    27         set_ctor( NULL );
    2827}
    2928
    3029ObjectDecl::ObjectDecl( const ObjectDecl &other )
    31         : Parent( other ), type( maybeClone( other.type ) ), init( maybeClone( other.init ) ), bitfieldWidth( maybeClone( other.bitfieldWidth ) ), ctor( maybeClone( other.ctor ) ) {
     30        : Parent( other ), type( maybeClone( other.type ) ), init( maybeClone( other.init ) ), bitfieldWidth( maybeClone( other.bitfieldWidth ) ) {
    3231}
    3332
     
    3635        delete init;
    3736        delete bitfieldWidth;
    38         delete ctor;
    3937}
    4038
     
    6765                os << " with bitfield width ";
    6866                bitfieldWidth->print( os );
    69         } // if
    70 
    71         if ( ctor ) {
    72                 os << " initially constructed with ";
    73                 ctor->print( os, indent );
    7467        } // if
    7568}
  • src/SynTree/SynTree.h

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // SynTree.h -- 
     7// SynTree.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 23 23:25:04 2015
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:28:41 2016
     13// Update Count     : 4
    1414//
    1515
     
    9999class SingleInit;
    100100class ListInit;
     101class ConstructorInit;
    101102
    102103class Subrange;
  • src/SynTree/Visitor.cc

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Visitor.cc -- 
     7// Visitor.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 24 16:11:05 2015
    13 // Update Count     : 15
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:27:23 2016
     13// Update Count     : 18
    1414//
    1515
     
    353353}
    354354
     355void Visitor::visit( ConstructorInit *ctorInit ) {
     356        maybeAccept( ctorInit->get_ctor(), *this );
     357        maybeAccept( ctorInit->get_init(), *this );
     358}
     359
    355360void Visitor::visit( Subrange *subrange ) {}
    356361
  • src/SynTree/Visitor.h

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Visitor.h -- 
     7// Visitor.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul 23 23:22:23 2015
    13 // Update Count     : 4
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 15:24:05 2016
     13// Update Count     : 5
    1414//
    1515
     
    6262        virtual void visit( MemberExpr *memberExpr );
    6363        virtual void visit( VariableExpr *variableExpr );
    64         virtual void visit( ConstantExpr *constantExpr ); 
     64        virtual void visit( ConstantExpr *constantExpr );
    6565        virtual void visit( SizeofExpr *sizeofExpr );
    6666        virtual void visit( AlignofExpr *alignofExpr );
     
    9191        virtual void visit( SingleInit *singleInit );
    9292        virtual void visit( ListInit *listInit );
     93        virtual void visit( ConstructorInit *ctorInit );
    9394
    9495        virtual void visit( Subrange *subrange );
  • src/main.cc

    r02c7d04 r71f4e4f  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // main.cc -- 
     7// main.cc --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Fri May 15 23:12:02 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec 17 12:59:06 2015
    13 // Update Count     : 179
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Wed Jan 13 16:47:25 2016
     13// Update Count     : 181
    1414//
    1515
     
    4242#include "InitTweak/Mutate.h"
    4343#include "InitTweak/RemoveInit.h"
     44#include "InitTweak/FixInit.h"
    4445//#include "Explain/GenProlog.h"
    4546//#include "Try/Visit.h"
     
    99100
    100101        opterr = 0;                                                                                     // prevent getopt from printing error messages
    101        
     102
    102103        int c;
    103104        while ( (c = getopt_long( argc, argv, "abefglnpqrsvyzD:", long_opts, &long_index )) != -1 ) {
     
    182183                        output = new ofstream( argv[ optind ] );
    183184                } // if
    184        
     185
    185186                Parser::get_parser().set_debug( grammarp );
    186187
     
    203204                                        exit( 1 );
    204205                                } // if
    205                    
     206
    206207                                parse( prelude, LinkageSpec::Intrinsic );
    207208                        } // if
    208209                } // if
    209210
    210                 parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp );     
    211  
     211                parse( input, libcfap ? LinkageSpec::Intrinsic : LinkageSpec::Cforall, grammarp );
     212
    212213                if ( parsep ) {
    213214                        Parser::get_parser().get_parseTree()->printList( std::cout );
     
    244245                OPTPRINT( "mutate" )
    245246                ControlStruct::mutate( translationUnit );
    246                 OPTPRINT( "fixNames" ) 
     247                OPTPRINT( "fixNames" )
    247248                CodeGen::fixNames( translationUnit );
    248249                OPTPRINT( "tweak" )
     
    264265                        dump( translationUnit );
    265266                }
     267
     268                // fix ObjectDecl - replaces ConstructorInit nodes
     269                InitTweak::fix( translationUnit );
    266270
    267271                OPTPRINT( "instantiateGeneric" )
     
    331335        std::list< Declaration * > decls;
    332336        if ( noprotop ) {
    333                 filter( translationUnit.begin(), translationUnit.end(), 
     337                filter( translationUnit.begin(), translationUnit.end(),
    334338                                std::back_inserter( decls ), notPrelude );
    335339        } else {
Note: See TracChangeset for help on using the changeset viewer.