Changeset 70f89d00
- Timestamp:
- May 30, 2016, 12:51:22 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, 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, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- f1b1e4c
- Parents:
- 677c1be
- Location:
- src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/GenInit.cc
r677c1be r70f89d00 143 143 if ( tryConstruct( objDecl ) ) { 144 144 if ( inFunction ) { 145 // remove qualifiers so that const objects can be initialized, and attach the 146 // qualifiers to ConstructorInit so that they can be replaced after resolving 147 Type * type = objDecl->get_type(); 148 Type::Qualifiers qualifiers = type->get_qualifiers(); 149 type->get_qualifiers() = Type::Qualifiers(); 150 145 151 if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) { 146 152 // call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array … … 165 171 assert( dtor.size() == 1 ); 166 172 167 objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );173 objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init(), objDecl, qualifiers ) ); 168 174 } else { 169 175 // array came with an initializer list: initialize each element … … 185 191 ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor ); 186 192 ExprStmt * dtorStmt = new ExprStmt( noLabels, dtor ); 187 objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init() ) );193 objDecl->set_init( new ConstructorInit( ctorStmt, dtorStmt, objDecl->get_init(), objDecl, qualifiers ) ); 188 194 } 189 195 } -
src/InitTweak/InitTweak.cc
r677c1be r70f89d00 83 83 } 84 84 } 85 86 namespace { 87 template<typename CallExpr> 88 std::string funcName( CallExpr * expr ) { 89 Expression * func = expr->get_function(); 90 if ( NameExpr * nameExpr = dynamic_cast< NameExpr * >( func ) ) { 91 return nameExpr->get_name(); 92 } else if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( func ) ) { 93 return varExpr->get_var()->get_name(); 94 } else { 95 assert( false && "Unexpected expression type being called as a function in call expression" ); 96 } 97 } 98 } 99 100 std::string getFunctionName( Expression * expr ) { 101 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr ) ) { 102 return funcName( appExpr ); 103 } else if ( UntypedExpr * untypedExpr = dynamic_cast< UntypedExpr * > ( expr ) ) { 104 return funcName( untypedExpr ); 105 } else { 106 assert( false && "Unexpected expression type passed to getFunctionName" ); 107 } 108 } 85 109 } -
src/InitTweak/InitTweak.h
r677c1be r70f89d00 39 39 /// Currently has assertions that make it less than fully general. 40 40 bool isInstrinsicSingleArgCallStmt( Statement * expr ); 41 42 /// returns the name of the function being called 43 std::string getFunctionName(Expression * expr); 41 44 } // namespace 42 45 -
src/ResolvExpr/AlternativeFinder.cc
r677c1be r70f89d00 39 39 #include "Tuples/NameMatcher.h" 40 40 #include "Common/utility.h" 41 #include "InitTweak/InitTweak.h" 41 42 42 43 extern bool resolvep; … … 546 547 547 548 { 548 NameExpr *fname = 0;; 549 if ( ( fname = dynamic_cast<NameExpr *>( untypedExpr->get_function())) 550 && ( fname->get_name() == std::string("&&")) ) { 549 std::string fname = InitTweak::getFunctionName( untypedExpr ); 550 if ( fname == "&&" ) { 551 551 VoidType v = Type::Qualifiers(); // resolve to type void * 552 552 PointerType pt( Type::Qualifiers(), v.clone() ); -
src/ResolvExpr/Resolver.cc
r677c1be r70f89d00 492 492 } catch ( SemanticError ) { 493 493 // no alternatives for the constructor initializer - fallback on C-style initializer 494 // xxx- not sure if this makes a ton of sense - should maybe never be able to have this situation? 494 // xxx - not sure if this makes a ton of sense - should maybe never be able to have this situation? 495 496 // reset type qualifiers 497 ctorInit->get_object()->get_type()->get_qualifiers() = ctorInit->get_qualifiers(); 495 498 fallbackInit( ctorInit ); 496 499 return; 497 500 } 501 // reset type qualifiers 502 ctorInit->get_object()->get_type()->get_qualifiers() = ctorInit->get_qualifiers(); 498 503 499 504 // found a constructor - can get rid of C-style initializer -
src/SynTree/Initializer.cc
r677c1be r70f89d00 20 20 21 21 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 22 Initializer::Initializer( const Initializer & other ) : maybeConstructed( other.maybeConstructed ) { 23 } 24 22 25 23 26 Initializer::~Initializer() {} … … 39 42 } 40 43 41 SingleInit::~SingleInit() { }42 43 SingleInit *SingleInit::clone() const { return new SingleInit( *this);}44 SingleInit::~SingleInit() { 45 deleteAll(designators); 46 } 44 47 45 48 void SingleInit::print( std::ostream &os, int indent ) { … … 58 61 59 62 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed ) 60 : Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) {63 : Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) { 61 64 } 62 65 63 ListInit::~ListInit() {} 64 65 ListInit *ListInit::clone() const { 66 return new ListInit( *this ); 66 ListInit::~ListInit() { 67 deleteAll( initializers ); 68 deleteAll( designators ); 67 69 } 68 70 … … 84 86 85 87 86 ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {} 88 ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init, ObjectDecl * object, Type::Qualifiers qualifiers ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ), object( object ), qualifiers( qualifiers ) {} 89 ConstructorInit::ConstructorInit( const ConstructorInit &other ) : Initializer( other ), ctor( maybeClone( other.ctor ) ), dtor( maybeClone( other.dtor ) ), init( maybeClone( other.init ) ), object( other.object ), qualifiers( other.qualifiers ) { 90 } 91 87 92 ConstructorInit::~ConstructorInit() { 88 93 delete ctor; 94 delete dtor; 89 95 delete init; 90 }91 92 ConstructorInit *ConstructorInit::clone() const {93 return new ConstructorInit( *this );94 96 } 95 97 -
src/SynTree/Initializer.h
r677c1be r70f89d00 20 20 #include "Visitor.h" 21 21 #include "Mutator.h" 22 #include "Type.h" 22 23 23 24 #include <cassert> … … 28 29 // Initializer( std::string _name = std::string(""), int _pos = 0 ); 29 30 Initializer( bool maybeConstructed ); 31 Initializer( const Initializer & other ); 30 32 virtual ~Initializer(); 31 33 … … 68 70 std::list<Expression *> &get_designators() { return designators; } 69 71 70 virtual SingleInit *clone() const ;72 virtual SingleInit *clone() const { return new SingleInit( *this); } 71 73 virtual void accept( Visitor &v ) { v.visit( this ); } 72 74 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } … … 94 96 std::list<Initializer*>::iterator end_initializers() { return initializers.end(); } 95 97 96 virtual ListInit *clone() const ;98 virtual ListInit *clone() const { return new ListInit( *this ); } 97 99 virtual void accept( Visitor &v ) { v.visit( this ); } 98 100 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } … … 107 109 class ConstructorInit : public Initializer { 108 110 public: 109 ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ); 111 ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init, ObjectDecl * objectDecl, Type::Qualifiers qualifiers ); 112 ConstructorInit( const ConstructorInit &other ); 110 113 virtual ~ConstructorInit(); 111 114 … … 116 119 void set_init( Initializer * newValue ) { init = newValue; } 117 120 Initializer * get_init() const { return init; } 121 void set_object( ObjectDecl * newValue ) { object = newValue; } 122 ObjectDecl * get_object() const { return object; } 123 void set_qualifiers( Type::Qualifiers newValue ) { qualifiers = newValue; } 124 Type::Qualifiers get_qualifiers() { return qualifiers; } 118 125 119 virtual ConstructorInit *clone() const;126 ConstructorInit *clone() const { return new ConstructorInit( *this ); } 120 127 virtual void accept( Visitor &v ) { v.visit( this ); } 121 128 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } … … 128 135 // if an appropriate constructor definition is not found by the resolver 129 136 Initializer * init; 137 // Non-owned pointer back to the object being constructed 138 ObjectDecl * object; 139 // to construct const objects, need to first remove type qualifiers, then resolve 140 // then add qualifiers back onto object 141 Type::Qualifiers qualifiers; 130 142 }; 131 143
Note: See TracChangeset
for help on using the changeset viewer.