Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SymTab/Validate.cc

    r630a82a r4040425  
    1010// Created On       : Sun May 17 21:50:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Apr  7 16:45:30 2016
    13 // Update Count     : 243
     12// Last Modified On : Wed Mar  2 17:31:39 2016
     13// Update Count     : 226
    1414//
    1515
     
    4040#include <list>
    4141#include <iterator>
    42 #include "Common/utility.h"
    43 #include "Common/UniqueName.h"
    4442#include "Validate.h"
    4543#include "SynTree/Visitor.h"
    4644#include "SynTree/Mutator.h"
    4745#include "SynTree/Type.h"
    48 #include "SynTree/Expression.h"
    4946#include "SynTree/Statement.h"
    5047#include "SynTree/TypeSubstitution.h"
     
    5249#include "FixFunction.h"
    5350// #include "ImplementationType.h"
    54 #include "GenPoly/DeclMutator.h"
     51#include "Common/utility.h"
     52#include "Common/UniqueName.h"
    5553#include "AddVisit.h"
    5654#include "MakeLibCfa.h"
     
    7270
    7371                virtual void visit( CompoundStmt *compoundStmt );
     72                virtual void visit( IfStmt *ifStmt );
     73                virtual void visit( WhileStmt *whileStmt );
     74                virtual void visit( ForStmt *forStmt );
    7475                virtual void visit( SwitchStmt *switchStmt );
    7576                virtual void visit( ChooseStmt *chooseStmt );
    76                 // virtual void visit( CaseStmt *caseStmt );
     77                virtual void visit( CaseStmt *caseStmt );
     78                virtual void visit( CatchStmt *catchStmt );
    7779          private:
    7880                HoistStruct();
     
    142144
    143145                virtual void visit( CompoundStmt *compoundStmt );
     146                virtual void visit( IfStmt *ifStmt );
     147                virtual void visit( WhileStmt *whileStmt );
     148                virtual void visit( ForStmt *forStmt );
    144149                virtual void visit( SwitchStmt *switchStmt );
    145150                virtual void visit( ChooseStmt *chooseStmt );
    146                 // virtual void visit( CaseStmt *caseStmt );
     151                virtual void visit( CaseStmt *caseStmt );
     152                virtual void visit( CatchStmt *catchStmt );
    147153
    148154                AutogenerateRoutines() : functionNesting( 0 ) {}
     
    160166                /// and return something if the return type is non-void.
    161167                static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
     168
    162169          private:
    163170                virtual void visit( FunctionDecl * functionDecl );
     
    195202        };
    196203
    197         class CompoundLiteral : public GenPoly::DeclMutator {
    198                 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
    199 
    200                 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl );
    201                 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr );
    202         };
    203 
    204204        void validate( std::list< Declaration * > &translationUnit, bool doDebug ) {
    205205                Pass1 pass1;
    206206                Pass2 pass2( doDebug, 0 );
    207207                Pass3 pass3( 0 );
    208                 CompoundLiteral compoundliteral;
    209 
    210208                EliminateTypedef::eliminateTypedef( translationUnit );
    211209                HoistStruct::hoistStruct( translationUnit );
     
    213211                acceptAll( translationUnit, pass2 );
    214212                ReturnChecker::checkFunctionReturns( translationUnit );
    215                 mutateAll( translationUnit, compoundliteral );
    216213                AutogenerateRoutines::autogenerateRoutines( translationUnit );
    217214                acceptAll( translationUnit, pass3 );
     
    295292        }
    296293
     294        void HoistStruct::visit( IfStmt *ifStmt ) {
     295                addVisit( ifStmt, *this );
     296        }
     297
     298        void HoistStruct::visit( WhileStmt *whileStmt ) {
     299                addVisit( whileStmt, *this );
     300        }
     301
     302        void HoistStruct::visit( ForStmt *forStmt ) {
     303                addVisit( forStmt, *this );
     304        }
     305
    297306        void HoistStruct::visit( SwitchStmt *switchStmt ) {
    298307                addVisit( switchStmt, *this );
     
    303312        }
    304313
    305         // void HoistStruct::visit( CaseStmt *caseStmt ) {
    306         //      addVisit( caseStmt, *this );
    307         // }
     314        void HoistStruct::visit( CaseStmt *caseStmt ) {
     315                addVisit( caseStmt, *this );
     316        }
     317
     318        void HoistStruct::visit( CatchStmt *cathStmt ) {
     319                addVisit( cathStmt, *this );
     320        }
    308321
    309322        void Pass1::visit( EnumDecl *enumDecl ) {
     
    861874        }
    862875
     876        void AutogenerateRoutines::visit( IfStmt *ifStmt ) {
     877                visitStatement( ifStmt );
     878        }
     879
     880        void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {
     881                visitStatement( whileStmt );
     882        }
     883
     884        void AutogenerateRoutines::visit( ForStmt *forStmt ) {
     885                visitStatement( forStmt );
     886        }
     887
    863888        void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) {
    864889                visitStatement( switchStmt );
     
    869894        }
    870895
    871         // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
    872         //      visitStatement( caseStmt );
    873         // }
     896        void AutogenerateRoutines::visit( CaseStmt *caseStmt ) {
     897                visitStatement( caseStmt );
     898        }
     899
     900        void AutogenerateRoutines::visit( CatchStmt *cathStmt ) {
     901                visitStatement( cathStmt );
     902        }
    874903
    875904        void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) {
     
    10511080        }
    10521081
    1053         DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {
    1054                 storageclass = objectDecl->get_storageClass();
    1055                 DeclarationWithType * temp = Mutator::mutate( objectDecl );
    1056                 storageclass = DeclarationNode::NoStorageClass;
    1057                 return temp;
    1058         }
    1059 
    1060         Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {
    1061                 // transform [storage_class] ... (struct S){ 3, ... };
    1062                 // into [storage_class] struct S temp =  { 3, ... };
    1063                 static UniqueName indexName( "_compLit" );
    1064 
    1065                 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() );
    1066                 compLitExpr->set_type( 0 );
    1067                 compLitExpr->set_initializer( 0 );
    1068                 delete compLitExpr;
    1069                 DeclarationWithType * newtempvar = mutate( tempvar );
    1070                 addDeclaration( newtempvar );                                   // add modified temporary to current block
    1071                 return new VariableExpr( newtempvar );
    1072         }
    10731082} // namespace SymTab
    10741083
Note: See TracChangeset for help on using the changeset viewer.