Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ControlStruct/HoistControlDecls.cpp

    r45040b61 ra488783  
    99// Author           : Andrew Beach
    1010// Created On       : Fri Dec  3 15:34:00 2021
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jan 31 18:52:35 2022
    13 // Update Count     : 23
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Dec  3 15:34:00 2021
     13// Update Count     : 0
    1414//
    1515
     
    1919#include "AST/Pass.hpp"
    2020#include "AST/TranslationUnit.hpp"
    21 using namespace ast;
    2221
    2322namespace ControlStruct {
    2423
     24namespace {
     25
    2526template<typename StmtT>
    26 const Stmt * hoist( const StmtT * stmt ) {
     27const ast::Stmt * hoist( const StmtT * stmt ) {
    2728        // If no hoisting is needed, then make no changes.
     29        if ( 0 == stmt->inits.size() ) {
     30                return stmt;
     31        }
    2832
    29         if ( stmt->inits.size() == 0 ) {                                        // no declarations ?
    30                 // if ( /* no conditional declarations */ ...  ) ...
    31                 return stmt;
    32         } // if
    33 
    34         // Put hoist declarations and modified statement in a compound statement.
    35 
    36         CompoundStmt * block = new CompoundStmt( stmt->location ); // create empty compound statement
    37         //    {
    38         //    }
    39 
    40         for ( const Stmt * next : stmt->inits ) {                       // link conditional declarations into compound
     33        // Put initializers and the old statement in the compound statement.
     34        ast::CompoundStmt * block = new ast::CompoundStmt( stmt->location );
     35        StmtT * mutStmt = ast::mutate( stmt );
     36        for ( const ast::Stmt * next : mutStmt->inits ) {
    4137                block->kids.push_back( next );
    4238        }
    43         //    if ( int x = f(), y = g(); ... ) ...
    44         // link declarations into compound statement
    45         //    {
    46         //         int x = f();
    47         //         int y = g();
    48         //    }
    49 
    50         StmtT * mutStmt = mutate( stmt );                                       // create mutate handle to change statement
    51         mutStmt->inits.clear();                                                         // remove declarations
    52         //    if ( ... ) ...
    53 
    54         block->kids.push_back( mutStmt );                                       // link modified statement into compound
    55         //    {
    56         //        int x = f();
    57         //        int y = g();
    58         //        if ( ... ) ...
    59         //    }
     39        mutStmt->inits.clear();
     40        block->kids.push_back( mutStmt );
    6041        return block;
    6142}
    6243
    63 struct hoistControlDeclsCore {
    64         // Statements with declarations in conditional.
    65         const Stmt * postvisit( const IfStmt * stmt ) {
    66                 return hoist<IfStmt>( stmt );
     44struct HoistControlCore {
     45        const ast::Stmt * postvisit( const ast::IfStmt * stmt ) {
     46                return hoist<ast::IfStmt>( stmt );
    6747        }
    68         const Stmt * postvisit( const ForStmt * stmt ) {
    69                 return hoist<ForStmt>( stmt );
     48        const ast::Stmt * postvisit( const ast::ForStmt * stmt ) {
     49                return hoist<ast::ForStmt>( stmt );
    7050        }
    71         const Stmt * postvisit( const WhileStmt * stmt ) {
    72                 return hoist<WhileStmt>( stmt );
     51        const ast::Stmt * postvisit( const ast::WhileStmt * stmt ) {
     52                return hoist<ast::WhileStmt>( stmt );
    7353        }
    7454};
    7555
    76 // Hoist initialization out of for statements.
    77 void hoistControlDecls( TranslationUnit & translationUnit ) {
    78         Pass<hoistControlDeclsCore>::run( translationUnit );
     56} // namespace
     57
     58/// Hoist initialization out of for statements.
     59void hoistControlDecls( ast::TranslationUnit & translationUnit ) {
     60        ast::Pass<HoistControlCore>::run( translationUnit );
    7961}
    8062
Note: See TracChangeset for help on using the changeset viewer.