- Timestamp:
- Jun 5, 2019, 4:28:28 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 0ce063b
- Parents:
- 2a8f0c1
- Location:
- src
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Node.cpp
r2a8f0c1 r4864a73 34 34 template< typename node_t, enum ast::Node::ref_type ref_t > 35 35 void ast::ptr_base<node_t, ref_t>::_dec( const node_t * node ) { node->decrement(ref_t); } 36 37 template< typename node_t, enum ast::Node::ref_type ref_t > 38 void ast::ptr_base<node_t, ref_t>::_check() const { if(node) assert(node->was_ever_strong == false || node->strong_count > 0); } 36 39 37 40 template< typename node_t, enum ast::Node::ref_type ref_t > -
src/AST/Node.hpp
r2a8f0c1 r4864a73 46 46 }; 47 47 48 bool unique() const { return strong_count == 1; } 49 48 50 private: 49 51 /// Make a copy of this node; should be overridden in subclass with more precise return type … … 56 58 mutable size_t strong_count = 0; 57 59 mutable size_t weak_count = 0; 60 mutable bool was_ever_strong = false; 58 61 59 62 void increment(ref_type ref) const { 60 63 switch (ref) { 61 case ref_type::strong: strong_count++; break;64 case ref_type::strong: strong_count++; was_ever_strong = true; break; 62 65 case ref_type::weak : weak_count ++; break; 63 66 } … … 176 179 } 177 180 178 const node_t * get() const { return node; }179 const node_t * operator->() const { return node; }180 const node_t & operator* () const { return *node; }181 explicit operator bool() const { return node; }182 operator const node_t * () const { return node; }181 const node_t * get() const { _check(); return node; } 182 const node_t * operator->() const { _check(); return node; } 183 const node_t & operator* () const { _check(); return *node; } 184 explicit operator bool() const { _check(); return node; } 185 operator const node_t * () const { _check(); return node; } 183 186 184 187 /// wrapper for convenient access to dynamic_cast 185 188 template<typename o_node_t> 186 const o_node_t * as() const { return dynamic_cast<const o_node_t *>(node); }189 const o_node_t * as() const { _check(); return dynamic_cast<const o_node_t *>(node); } 187 190 188 191 /// wrapper for convenient access to strict_dynamic_cast … … 208 211 void _inc( const node_t * other ); 209 212 void _dec( const node_t * other ); 213 void _check() const; 210 214 211 215 protected: -
src/ResolvExpr/Resolver.cc
r2a8f0c1 r4864a73 27 27 #include "typeops.h" // for extractResultType 28 28 #include "Unify.h" // for unify 29 #include "AST/Chain.hpp" 29 30 #include "AST/Decl.hpp" 30 31 #include "AST/Init.hpp" … … 407 408 408 409 void Resolver_old::previsit( ObjectDecl * objectDecl ) { 409 // To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that 410 // class-variable initContext is changed multiple time because the LHS is analysed twice. 411 // The second analysis changes initContext because of a function type can contain object 412 // declarations in the return and parameter types. So each value of initContext is 410 // To handle initialization of routine pointers, e.g., int (*fp)(int) = foo(), means that 411 // class-variable initContext is changed multiple time because the LHS is analysed twice. 412 // The second analysis changes initContext because of a function type can contain object 413 // declarations in the return and parameter types. So each value of initContext is 413 414 // retained, so the type on the first analysis is preserved and used for selecting the RHS. 414 415 GuardValue( currentObject ); … … 447 448 448 449 void Resolver_old::postvisit( FunctionDecl * functionDecl ) { 449 // default value expressions have an environment which shouldn't be there and trips up 450 // default value expressions have an environment which shouldn't be there and trips up 450 451 // later passes. 451 452 // xxx - it might be necessary to somehow keep the information from this environment, but I … … 939 940 /////////////////////////////////////////////////////////////////////////// 940 941 941 class Resolver_new final 942 : public ast::WithSymbolTable, public ast::WithGuards, 943 public ast::WithVisitorRef<Resolver_new>, public ast::WithShortCircuiting, 942 class Resolver_new final 943 : public ast::WithSymbolTable, public ast::WithGuards, 944 public ast::WithVisitorRef<Resolver_new>, public ast::WithShortCircuiting, 944 945 public ast::WithStmtsToAdd<> { 945 946 946 947 ast::ptr< ast::Type > functionReturn = nullptr; 947 948 // ast::CurrentObject currentObject = nullptr; 948 949 // bool inEnumDecl = false; 949 950 950 public: 951 public: 951 952 Resolver_new() = default; 952 953 Resolver_new( const ast::SymbolTable & syms ) { symtab = syms; } … … 991 992 992 993 const ast::FunctionDecl * Resolver_new::postvisit( const ast::FunctionDecl * functionDecl ) { 993 // default value expressions have an environment which shouldn't be there and trips up 994 // default value expressions have an environment which shouldn't be there and trips up 994 995 // later passes. 995 996 ast::ptr< ast::FunctionDecl > ret = functionDecl; 996 997 for ( unsigned i = 0; i < functionDecl->type->params.size(); ++i ) { 997 998 const ast::ptr<ast::DeclWithType> & d = functionDecl->type->params[i]; 998 999 999 1000 if ( const ast::ObjectDecl * obj = d.as< ast::ObjectDecl >() ) { 1000 1001 if ( const ast::SingleInit * init = obj->init.as< ast::SingleInit >() ) { 1001 1002 if ( init->value->env == nullptr ) continue; 1002 1003 // clone initializer minus the initializer environment 1003 strict_dynamic_cast< ast::SingleInit * >( 1004 strict_dynamic_cast< ast::ObjectDecl * >( 1005 ret.get_and_mutate()->type.get_and_mutate()->params[i].get_and_mutate() 1006 )->init.get_and_mutate() 1007 )->value.get_and_mutate()->env = nullptr; 1004 ast::chain_mutate( ret ) 1005 ( &ast::FunctionDecl::type ) 1006 ( &ast::FunctionType::params ) 1007 [i] 1008 ( &ast::ObjectDecl::init ) 1009 ( &ast::SingleInit::value )->env = nullptr; 1010 1011 assert( functionDecl != ret.get() || functionDecl->unique() ); 1012 assert( ! ret->type->params[i].strict_as< ast::ObjectDecl >()->init.strict_as< ast::SingleInit >()->value->env ); 1008 1013 } 1009 1014 }
Note: See TracChangeset
for help on using the changeset viewer.