Changeset 490fb92e for src/AST/Convert.cpp
- Timestamp:
- Oct 23, 2020, 9:06:16 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 37b7d95
- Parents:
- 41b8ea4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Convert.cpp
r41b8ea4 r490fb92e 47 47 48 48 //================================================================================================ 49 namespace {49 namespace ast { 50 50 51 51 // This is to preserve the FindSpecialDecls hack. It does not (and perhaps should not) 52 52 // allow us to use the same stratagy in the new ast. 53 // xxx - since convert back pass works, this concern seems to be unnecessary. 54 55 // these need to be accessed in new FixInit now 53 56 ast::Type * sizeType = nullptr; 54 57 ast::FunctionDecl * dereferenceOperator = nullptr; … … 63 66 using Cache = std::unordered_map< const ast::Node *, BaseSyntaxNode * >; 64 67 Cache cache; 68 69 // Statements can no longer be shared. 70 // however, since StmtExprResult is now implemented, need to still maintain 71 // readonly references. 72 Cache readonlyCache; 65 73 66 74 template<typename T> … … 154 162 } 155 163 156 const ast::DeclWithType * visit( const ast::ObjectDecl * node ) override final { 157 auto&& bfwd = get<Expression>().accept1( node->bitfieldWidth ); 158 auto&& type = get<Type>().accept1( node->type ); 159 auto&& init = get<Initializer>().accept1( node->init ); 160 auto&& attr = get<Attribute>().acceptL( node->attributes ); 164 const ast::DeclWithType * visit( const ast::ObjectDecl * node ) override final { 161 165 if ( inCache( node ) ) { 162 166 return nullptr; 163 167 } 168 auto bfwd = get<Expression>().accept1( node->bitfieldWidth ); 169 auto type = get<Type>().accept1( node->type ); 170 auto attr = get<Attribute>().acceptL( node->attributes ); 171 164 172 auto decl = new ObjectDecl( 165 173 node->name, … … 168 176 bfwd, 169 177 type->clone(), 170 init,178 nullptr, // prevent infinite loop 171 179 attr, 172 180 Type::FuncSpecifiers( node->funcSpec.val ) 173 181 ); 174 return declWithTypePostamble( decl, node ); 182 183 // handles the case where node->init references itself 184 // xxx - does it really happen? 185 declWithTypePostamble(decl, node); 186 auto init = get<Initializer>().accept1( node->init ); 187 decl->init = init; 188 189 this->node = decl; 190 return nullptr; 175 191 } 176 192 … … 205 221 decl->statements = get<CompoundStmt>().accept1( node->stmts ); 206 222 decl->withExprs = get<Expression>().acceptL( node->withExprs ); 207 if ( dereferenceOperator == node ) {223 if ( ast::dereferenceOperator == node ) { 208 224 Validate::dereferenceOperator = decl; 209 225 } 210 if ( dtorStructDestroy == node ) {226 if ( ast::dtorStructDestroy == node ) { 211 227 Validate::dtorStructDestroy = decl; 212 228 } … … 267 283 ); 268 284 269 if ( dtorStruct == node ) {285 if ( ast::dtorStruct == node ) { 270 286 Validate::dtorStruct = decl; 271 287 } … … 320 336 321 337 const ast::Stmt * stmtPostamble( Statement * stmt, const ast::Stmt * node ) { 322 cache.emplace( node, stmt ); 338 // force statements in old tree to be unique. 339 // cache.emplace( node, stmt ); 340 readonlyCache.emplace( node, stmt ); 323 341 stmt->location = node->location; 324 342 stmt->labels = makeLabelL( stmt, node->labels ); … … 337 355 if ( inCache( node ) ) return nullptr; 338 356 auto stmt = new ExprStmt( nullptr ); 339 cache.emplace( node, stmt );340 357 stmt->expr = get<Expression>().accept1( node->expr ); 341 358 return stmtPostamble( stmt, node ); … … 1011 1028 auto stmts = node->stmts; 1012 1029 // disable sharing between multiple StmtExprs explicitly. 1013 if (inCache(stmts)) { 1014 stmts = ast::deepCopy(stmts.get()); 1015 } 1030 // this should no longer be true. 1031 1016 1032 auto rslt = new StmtExpr( 1017 1033 get<CompoundStmt>().accept1(stmts) … … 1020 1036 rslt->returnDecls = get<ObjectDecl>().acceptL(node->returnDecls); 1021 1037 rslt->dtors = get<Expression>().acceptL(node->dtors); 1038 if (node->resultExpr) { 1039 // this MUST be found by children visit 1040 rslt->resultExpr = strict_dynamic_cast<ExprStmt *>(readonlyCache.at(node->resultExpr)); 1041 } 1022 1042 1023 1043 auto expr = visitBaseExpr( node, rslt ); … … 1036 1056 1037 1057 auto expr = visitBaseExpr( node, rslt ); 1038 this->node = expr ;1058 this->node = expr->clone(); 1039 1059 return nullptr; 1040 1060 } … … 1126 1146 auto type = new BasicType{ cv( node ), (BasicType::Kind)(unsigned)node->kind }; 1127 1147 // I believe this should always be a BasicType. 1128 if ( sizeType == node ) {1148 if ( ast::sizeType == node ) { 1129 1149 Validate::SizeType = type; 1130 1150 } … … 1529 1549 1530 1550 // function type is now derived from parameter decls instead of storing them 1551 1552 /* 1531 1553 auto ftype = new ast::FunctionType((ast::ArgumentFlag)old->type->isVarArgs, cv(old->type)); 1532 1554 ftype->params.reserve(paramVars.size()); … … 1540 1562 } 1541 1563 ftype->forall = std::move(forall); 1542 visitType(old->type, ftype); 1564 */ 1565 1566 // can function type have attributes? seems not to be the case. 1567 // visitType(old->type, ftype); 1543 1568 1544 1569 auto decl = new ast::FunctionDecl{ … … 1546 1571 old->name, 1547 1572 // GET_ACCEPT_1(type, FunctionType), 1573 std::move(forall), 1548 1574 std::move(paramVars), 1549 1575 std::move(returnVars), … … 1552 1578 { old->linkage.val }, 1553 1579 GET_ACCEPT_V(attributes, Attribute), 1554 { old->get_funcSpec().val } 1580 { old->get_funcSpec().val }, 1581 old->type->isVarArgs 1555 1582 }; 1556 1583 1557 decl->type = ftype;1584 // decl->type = ftype; 1558 1585 cache.emplace( old, decl ); 1559 1586 … … 1570 1597 1571 1598 if ( Validate::dereferenceOperator == old ) { 1572 dereferenceOperator = decl;1599 ast::dereferenceOperator = decl; 1573 1600 } 1574 1601 1575 1602 if ( Validate::dtorStructDestroy == old ) { 1576 dtorStructDestroy = decl;1603 ast::dtorStructDestroy = decl; 1577 1604 } 1578 1605 } … … 1599 1626 1600 1627 if ( Validate::dtorStruct == old ) { 1601 dtorStruct = decl;1628 ast::dtorStruct = decl; 1602 1629 } 1603 1630 } … … 2531 2558 // I believe this should always be a BasicType. 2532 2559 if ( Validate::SizeType == old ) { 2533 sizeType = type;2560 ast::sizeType = type; 2534 2561 } 2535 2562 visitType( old, type );
Note: See TracChangeset
for help on using the changeset viewer.