Changes in / [0f740d6:37eef7a]


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r0f740d6 r37eef7a  
    265265                stmt->location = node->location;
    266266                stmt->labels = makeLabelL( stmt, node->labels );
     267                cache.emplace( node, stmt );
    267268                this->node = stmt;
    268269                return nullptr;
     
    270271
    271272        const ast::CompoundStmt * visit( const ast::CompoundStmt * node ) override final {
     273                if ( inCache( node ) ) return nullptr;
    272274                auto stmt = new CompoundStmt( get<Statement>().acceptL( node->kids ) );
    273275                stmtPostamble( stmt, node );
     
    276278
    277279        const ast::Stmt * visit( const ast::ExprStmt * node ) override final {
     280                if ( inCache( node ) ) return nullptr;
    278281                auto stmt = new ExprStmt( get<Expression>().accept1( node->expr ) );
    279282                return stmtPostamble( stmt, node );
     
    281284
    282285        const ast::Stmt * visit( const ast::AsmStmt * node ) override final {
     286                if ( inCache( node ) ) return nullptr;
    283287                auto stmt = new AsmStmt(
    284288                        node->isVolatile,
     
    293297
    294298        const ast::Stmt * visit( const ast::DirectiveStmt * node ) override final {
     299                if ( inCache( node ) ) return nullptr;
    295300                auto stmt = new DirectiveStmt( node->directive );
    296301                return stmtPostamble( stmt, node );
     
    298303
    299304        const ast::Stmt * visit( const ast::IfStmt * node ) override final {
     305                if ( inCache( node ) ) return nullptr;
    300306                auto stmt = new IfStmt(
    301307                        get<Expression>().accept1( node->cond ),
     
    308314
    309315        const ast::Stmt * visit( const ast::SwitchStmt * node ) override final {
     316                if ( inCache( node ) ) return nullptr;
    310317                auto stmt = new SwitchStmt(
    311318                        get<Expression>().accept1( node->cond ),
     
    316323
    317324        const ast::Stmt * visit( const ast::CaseStmt * node ) override final {
     325                if ( inCache( node ) ) return nullptr;
    318326                auto stmt = new CaseStmt(
    319327                        get<Expression>().accept1( node->cond ),
     
    325333
    326334        const ast::Stmt * visit( const ast::WhileStmt * node ) override final {
     335                if ( inCache( node ) ) return nullptr;
    327336                auto inits = get<Statement>().acceptL( node->inits );
    328337                auto stmt = new WhileStmt(
     
    336345
    337346        const ast::Stmt * visit( const ast::ForStmt * node ) override final {
     347                if ( inCache( node ) ) return nullptr;
    338348                auto stmt = new ForStmt(
    339349                        get<Statement>().acceptL( node->inits ),
     
    346356
    347357        const ast::Stmt * visit( const ast::BranchStmt * node ) override final {
     358                if ( inCache( node ) ) return nullptr;
    348359                BranchStmt * stmt;
    349360                if (node->computedTarget) {
     
    375386
    376387        const ast::Stmt * visit( const ast::ReturnStmt * node ) override final {
     388                if ( inCache( node ) ) return nullptr;
    377389                auto stmt = new ReturnStmt( get<Expression>().accept1( node->expr ) );
    378390                return stmtPostamble( stmt, node );
     
    380392
    381393        const ast::Stmt * visit( const ast::ThrowStmt * node ) override final {
     394                if ( inCache( node ) ) return nullptr;
    382395                ThrowStmt::Kind kind;
    383396                switch (node->kind) {
     
    400413
    401414        const ast::Stmt * visit( const ast::TryStmt * node ) override final {
     415                if ( inCache( node ) ) return nullptr;
    402416                auto handlers = get<CatchStmt>().acceptL( node->handlers );
    403417                auto stmt = new TryStmt(
     
    410424
    411425        const ast::Stmt * visit( const ast::CatchStmt * node ) override final {
     426                if ( inCache( node ) ) return nullptr;
    412427                CatchStmt::Kind kind;
    413428                switch (node->kind) {
     
    431446
    432447        const ast::Stmt * visit( const ast::FinallyStmt * node ) override final {
     448                if ( inCache( node ) ) return nullptr;
    433449                auto stmt = new FinallyStmt( get<CompoundStmt>().accept1( node->body ) );
    434450                return stmtPostamble( stmt, node );
     
    436452
    437453        const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
     454                if ( inCache( node ) ) return nullptr;
    438455                auto stmt = new WaitForStmt;
    439456                stmt->clauses.reserve( node->clauses.size() );
     
    460477
    461478        const ast::Stmt * visit( const ast::WithStmt * node ) override final {
     479                if ( inCache( node ) ) return nullptr;
    462480                auto stmt = new WithStmt(
    463481                        get<Expression>().acceptL( node->exprs ),
     
    468486
    469487        const ast::NullStmt * visit( const ast::NullStmt * node ) override final {
     488                if ( inCache( node ) ) return nullptr;
    470489                auto stmt = new NullStmt();
    471490                stmtPostamble( stmt, node );
     
    474493
    475494        const ast::Stmt * visit( const ast::DeclStmt * node ) override final {
     495                if ( inCache( node ) ) return nullptr;
    476496                auto stmt = new DeclStmt( get<Declaration>().accept1( node->decl ) );
    477497                return stmtPostamble( stmt, node );
     
    479499
    480500        const ast::Stmt * visit( const ast::ImplicitCtorDtorStmt * node ) override final {
    481                 (void)node;
    482                 return nullptr;
     501                if ( inCache( node ) ) return nullptr;
     502                auto stmt = new ImplicitCtorDtorStmt{
     503                        get<Statement>().accept1( node->callStmt )
     504                };
     505                return stmtPostamble( stmt, node );
    483506        }
    484507
     
    15831606
    15841607        virtual void visit( CompoundStmt * old ) override final {
     1608                if ( inCache( old ) ) return;
    15851609                auto stmt = new ast::CompoundStmt(
    15861610                        old->location,
     
    15901614
    15911615                this->node = stmt;
     1616                cache.emplace( old, this->node );
    15921617        }
    15931618
    15941619        virtual void visit( ExprStmt * old ) override final {
     1620                if ( inCache( old ) ) return;
    15951621                this->node = new ast::ExprStmt(
    15961622                        old->location,
     
    15981624                        GET_LABELS_V(old->labels)
    15991625                );
     1626                cache.emplace( old, this->node );
    16001627        }
    16011628
    16021629        virtual void visit( AsmStmt * old ) override final {
     1630                if ( inCache( old ) ) return;
    16031631                this->node = new ast::AsmStmt(
    16041632                        old->location,
     
    16111639                        GET_LABELS_V(old->labels)
    16121640                );
     1641                cache.emplace( old, this->node );
    16131642        }
    16141643
    16151644        virtual void visit( DirectiveStmt * old ) override final {
     1645                if ( inCache( old ) ) return;
    16161646                this->node = new ast::DirectiveStmt(
    16171647                        old->location,
     
    16191649                        GET_LABELS_V(old->labels)
    16201650                );
     1651                cache.emplace( old, this->node );
    16211652        }
    16221653
    16231654        virtual void visit( IfStmt * old ) override final {
     1655                if ( inCache( old ) ) return;
    16241656                this->node = new ast::IfStmt(
    16251657                        old->location,
     
    16301662                        GET_LABELS_V(old->labels)
    16311663                );
     1664                cache.emplace( old, this->node );
    16321665        }
    16331666
    16341667        virtual void visit( SwitchStmt * old ) override final {
     1668                if ( inCache( old ) ) return;
    16351669                this->node = new ast::SwitchStmt(
    16361670                        old->location,
     
    16391673                        GET_LABELS_V(old->labels)
    16401674                );
     1675                cache.emplace( old, this->node );
    16411676        }
    16421677
    16431678        virtual void visit( CaseStmt * old ) override final {
     1679                if ( inCache( old ) ) return;
    16441680                this->node = new ast::CaseStmt(
    16451681                        old->location,
     
    16481684                        GET_LABELS_V(old->labels)
    16491685                );
     1686                cache.emplace( old, this->node );
    16501687        }
    16511688
    16521689        virtual void visit( WhileStmt * old ) override final {
     1690                if ( inCache( old ) ) return;
    16531691                this->node = new ast::WhileStmt(
    16541692                        old->location,
     
    16591697                        GET_LABELS_V(old->labels)
    16601698                );
     1699                cache.emplace( old, this->node );
    16611700        }
    16621701
    16631702        virtual void visit( ForStmt * old ) override final {
     1703                if ( inCache( old ) ) return;
    16641704                this->node = new ast::ForStmt(
    16651705                        old->location,
     
    16701710                        GET_LABELS_V(old->labels)
    16711711                );
     1712                cache.emplace( old, this->node );
    16721713        }
    16731714
    16741715        virtual void visit( BranchStmt * old ) override final {
     1716                if ( inCache( old ) ) return;
    16751717                if (old->computedTarget) {
    16761718                        this->node = new ast::BranchStmt(
     
    17061748                        this->node = stmt;
    17071749                }
     1750                cache.emplace( old, this->node );
    17081751        }
    17091752
    17101753        virtual void visit( ReturnStmt * old ) override final {
     1754                if ( inCache( old ) ) return;
    17111755                this->node = new ast::ReturnStmt(
    17121756                        old->location,
     
    17141758                        GET_LABELS_V(old->labels)
    17151759                );
     1760                cache.emplace( old, this->node );
    17161761        }
    17171762
    17181763        virtual void visit( ThrowStmt * old ) override final {
     1764                if ( inCache( old ) ) return;
    17191765                ast::ThrowStmt::Kind kind;
    17201766                switch (old->kind) {
     
    17361782                        GET_LABELS_V(old->labels)
    17371783                );
     1784                cache.emplace( old, this->node );
    17381785        }
    17391786
    17401787        virtual void visit( TryStmt * old ) override final {
     1788                if ( inCache( old ) ) return;
    17411789                this->node = new ast::TryStmt(
    17421790                        old->location,
     
    17461794                        GET_LABELS_V(old->labels)
    17471795                );
     1796                cache.emplace( old, this->node );
    17481797        }
    17491798
    17501799        virtual void visit( CatchStmt * old ) override final {
     1800                if ( inCache( old ) ) return;
    17511801                ast::CatchStmt::Kind kind;
    17521802                switch (old->kind) {
     
    17691819                        GET_LABELS_V(old->labels)
    17701820                );
     1821                cache.emplace( old, this->node );
    17711822        }
    17721823
    17731824        virtual void visit( FinallyStmt * old ) override final {
     1825                if ( inCache( old ) ) return;
    17741826                this->node = new ast::FinallyStmt(
    17751827                        old->location,
     
    17771829                        GET_LABELS_V(old->labels)
    17781830                );
     1831                cache.emplace( old, this->node );
    17791832        }
    17801833
    17811834        virtual void visit( WaitForStmt * old ) override final {
     1835                if ( inCache( old ) ) return;
    17821836                ast::WaitForStmt * stmt = new ast::WaitForStmt(
    17831837                        old->location,
     
    18071861
    18081862                this->node = stmt;
     1863                cache.emplace( old, this->node );
    18091864        }
    18101865
    18111866        virtual void visit( WithStmt * old ) override final {
     1867                if ( inCache( old ) ) return;
    18121868                this->node = new ast::WithStmt(
    18131869                        old->location,
     
    18161872                        GET_LABELS_V(old->labels)
    18171873                );
     1874                cache.emplace( old, this->node );
    18181875        }
    18191876
    18201877        virtual void visit( NullStmt * old ) override final {
     1878                if ( inCache( old ) ) return;
    18211879                this->node = new ast::NullStmt(
    18221880                        old->location,
    18231881                        GET_LABELS_V(old->labels)
    18241882                );
     1883                cache.emplace( old, this->node );
    18251884        }
    18261885
    18271886        virtual void visit( DeclStmt * old ) override final {
     1887                if ( inCache( old ) ) return;
    18281888                this->node = new ast::DeclStmt(
    18291889                        old->location,
     
    18311891                        GET_LABELS_V(old->labels)
    18321892                );
     1893                cache.emplace( old, this->node );
    18331894        }
    18341895
    18351896        virtual void visit( ImplicitCtorDtorStmt * old ) override final {
     1897                if ( inCache( old ) ) return;
    18361898                this->node = new ast::ImplicitCtorDtorStmt(
    18371899                        old->location,
     
    18391901                        GET_LABELS_V(old->labels)
    18401902                );
     1903                cache.emplace( old, this->node );
    18411904        }
    18421905
Note: See TracChangeset for help on using the changeset viewer.