- Timestamp:
- Sep 4, 2020, 2:14:10 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 14d8a9b
- Parents:
- 56c44dc (diff), 2801829 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/AST
- Files:
-
- 9 edited
-
Convert.cpp (modified) (2 diffs)
-
Copy.hpp (modified) (1 diff)
-
Expr.hpp (modified) (1 diff)
-
Pass.hpp (modified) (2 diffs)
-
Pass.impl.hpp (modified) (9 diffs)
-
Pass.proto.hpp (modified) (1 diff)
-
Print.cpp (modified) (2 diffs)
-
TypeSubstitution.hpp (modified) (4 diffs)
-
module.mk (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
r56c44dc rce55a81 705 705 new KeywordCastExpr( 706 706 get<Expression>().accept1(node->arg), 707 castTarget 707 castTarget, 708 {node->concrete_target.field, node->concrete_target.getter} 708 709 ) 709 710 ); … … 2087 2088 old->location, 2088 2089 GET_ACCEPT_1(arg, Expr), 2089 castTarget 2090 castTarget, 2091 {old->concrete_target.field, old->concrete_target.getter} 2090 2092 ) 2091 2093 ); -
src/AST/Copy.hpp
r56c44dc rce55a81 21 21 #include "Stmt.hpp" 22 22 #include "Type.hpp" 23 #include <unordered_set> 24 #include <unordered_map> 23 25 24 26 namespace ast { -
src/AST/Expr.hpp
r56c44dc rce55a81 312 312 public: 313 313 ptr<Expr> arg; 314 struct Concrete { 315 std::string field; 316 std::string getter; 317 318 Concrete() = default; 319 Concrete(const Concrete &) = default; 320 }; 314 321 ast::AggregateDecl::Aggregate target; 322 Concrete concrete_target; 323 315 324 316 325 KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t ) 317 326 : Expr( loc ), arg( a ), target( t ) {} 327 328 KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t, const Concrete & ct ) 329 : Expr( loc ), arg( a ), target( t ), concrete_target( ct ) {} 318 330 319 331 /// Get a name for the target type -
src/AST/Pass.hpp
r56c44dc rce55a81 48 48 // 49 49 // Several additional features are available through inheritance 50 // | PureVisitor - makes the visitor pure, it never modifies nodes in place and always 51 // clones nodes it needs to make changes to 50 52 // | WithTypeSubstitution - provides polymorphic const TypeSubstitution * env for the 51 53 // current expression … … 266 268 267 269 /// Keep track of the polymorphic const TypeSubstitution * env for the current expression 270 271 /// If used the visitor will always clone nodes. 272 struct PureVisitor {}; 273 268 274 struct WithConstTypeSubstitution { 269 275 const TypeSubstitution * env = nullptr; -
src/AST/Pass.impl.hpp
r56c44dc rce55a81 57 57 58 58 namespace ast { 59 template<typename node_t> 60 node_t * shallowCopy( const node_t * node ); 61 59 62 namespace __pass { 60 63 // Check if this is either a null pointer or a pointer to an empty container … … 62 65 static inline bool empty( T * ptr ) { 63 66 return !ptr || ptr->empty(); 67 } 68 69 template< typename core_t, typename node_t > 70 static inline node_t* mutate(const node_t *node) { 71 return std::is_base_of<PureVisitor, core_t>::value ? ::ast::shallowCopy(node) : ::ast::mutate(node); 64 72 } 65 73 … … 320 328 321 329 if( __pass::differs(old_val, new_val) ) { 322 auto new_parent = mutate(parent);330 auto new_parent = __pass::mutate<core_t>(parent); 323 331 new_parent->*child = new_val; 324 332 parent = new_parent; … … 334 342 if ( node->forall.empty() ) return; 335 343 336 node_t * mut = mutate( node );344 node_t * mut = __pass::mutate<core_t>( node ); 337 345 mut->forall = subs->clone( node->forall, *this ); 338 346 node = mut; … … 894 902 895 903 if(mutated) { 896 auto n = mutate(node);904 auto n = __pass::mutate<core_t>(node); 897 905 n->clauses = std::move( new_clauses ); 898 906 node = n; … … 904 912 auto nval = call_accept( node->field ); \ 905 913 if(nval != node->field ) { \ 906 auto nparent = mutate(node); \914 auto nparent = __pass::mutate<core_t>(node); \ 907 915 nparent->field = nval; \ 908 916 node = nparent; \ … … 1610 1618 1611 1619 if(mutated) { 1612 auto n = mutate(node);1620 auto n = __pass::mutate<core_t>(node); 1613 1621 n->associations = std::move( new_kids ); 1614 1622 node = n; … … 1940 1948 } 1941 1949 if (mutated) { 1942 auto new_node = mutate( node );1950 auto new_node = __pass::mutate<core_t>( node ); 1943 1951 new_node->typeEnv.swap( new_map ); 1944 1952 node = new_node; … … 1956 1964 } 1957 1965 if (mutated) { 1958 auto new_node = mutate( node );1966 auto new_node = __pass::mutate<core_t>( node ); 1959 1967 new_node->varEnv.swap( new_map ); 1960 1968 node = new_node; -
src/AST/Pass.proto.hpp
r56c44dc rce55a81 22 22 template<typename core_t> 23 23 class Pass; 24 25 struct PureVisitor; 24 26 25 27 namespace __pass { -
src/AST/Print.cpp
r56c44dc rce55a81 21 21 #include "Type.hpp" 22 22 #include "TypeSubstitution.hpp" 23 #include "CompilationState.h" 23 24 24 25 #include "Common/utility.h" // for group_iterate … … 239 240 240 241 if ( node->result ) { 241 os << endl << indent << "... with resolved type:" << endl; 242 ++indent; 243 os << indent; 244 node->result->accept( *this ); 245 --indent; 242 if (!deterministic_output) { 243 os << endl << indent << "... with resolved type:" << endl; 244 ++indent; 245 os << indent; 246 node->result->accept( *this ); 247 --indent; 248 } 246 249 } 247 250 -
src/AST/TypeSubstitution.hpp
r56c44dc rce55a81 46 46 template< typename SynTreeClass > 47 47 struct ApplyResult { 48 // const SynTreeClass * node;49 48 ast::ptr<SynTreeClass> node; 50 49 int count; … … 159 158 160 159 // definitition must happen after PassVisitor is included so that WithGuards can be used 161 struct TypeSubstitution::Substituter : public WithGuards, public WithVisitorRef<Substituter> {160 struct TypeSubstitution::Substituter : public WithGuards, public WithVisitorRef<Substituter>, public PureVisitor { 162 161 static size_t traceId; 163 162 … … 187 186 assert( input ); 188 187 Pass<Substituter> sub( *this, false ); 189 input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );188 input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) ); 190 189 return { input, sub.core.subCount }; 191 190 } … … 195 194 assert( input ); 196 195 Pass<Substituter> sub( *this, true ); 197 input = strict_dynamic_cast< const SynTreeClass * >( deepCopy(input)->accept( sub ) );196 input = strict_dynamic_cast< const SynTreeClass * >( input->accept( sub ) ); 198 197 return { input, sub.core.subCount }; 199 198 } -
src/AST/module.mk
r56c44dc rce55a81 17 17 SRC_AST = \ 18 18 AST/AssertAcyclic.cpp \ 19 AST/AssertAcyclic.hpp \ 19 20 AST/Attribute.cpp \ 21 AST/Attribute.hpp \ 22 AST/Bitfield.hpp \ 23 AST/Chain.hpp \ 20 24 AST/Convert.cpp \ 25 AST/Convert.hpp \ 26 AST/Copy.hpp \ 27 AST/CVQualifiers.hpp \ 21 28 AST/Decl.cpp \ 29 AST/Decl.hpp \ 22 30 AST/DeclReplacer.cpp \ 31 AST/DeclReplacer.hpp \ 32 AST/Eval.hpp \ 23 33 AST/Expr.cpp \ 34 AST/Expr.hpp \ 24 35 AST/ForallSubstitutionTable.cpp \ 36 AST/ForallSubstitutionTable.hpp \ 37 AST/ForallSubstitutor.hpp \ 38 AST/FunctionSpec.hpp \ 39 AST/Fwd.hpp \ 25 40 AST/GenericSubstitution.cpp \ 41 AST/GenericSubstitution.hpp \ 26 42 AST/Init.cpp \ 43 AST/Init.hpp \ 44 AST/Label.hpp \ 27 45 AST/LinkageSpec.cpp \ 46 AST/LinkageSpec.hpp \ 28 47 AST/Node.cpp \ 48 AST/Node.hpp \ 49 AST/ParseNode.hpp \ 29 50 AST/Pass.cpp \ 51 AST/Pass.hpp \ 52 AST/Pass.impl.hpp \ 53 AST/Pass.proto.hpp \ 30 54 AST/Print.cpp \ 55 AST/Print.hpp \ 31 56 AST/Stmt.cpp \ 57 AST/Stmt.hpp \ 58 AST/StorageClasses.hpp \ 32 59 AST/SymbolTable.cpp \ 60 AST/SymbolTable.hpp \ 33 61 AST/Type.cpp \ 62 AST/Type.hpp \ 34 63 AST/TypeEnvironment.cpp \ 35 AST/TypeSubstitution.cpp 64 AST/TypeEnvironment.hpp \ 65 AST/TypeSubstitution.cpp \ 66 AST/TypeSubstitution.hpp \ 67 AST/Visitor.hpp 36 68 37 69 SRC += $(SRC_AST)
Note:
See TracChangeset
for help on using the changeset viewer.