Ignore:
Timestamp:
Apr 28, 2016, 12:32:49 PM (8 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
fea7ca7
Parents:
84bb4d9
Message:

remove RemoveInit?'s ObjectDecl? mutate which duplicates constructor calls on polymorphic objects, change name of RemoveInit? files to more accurate GenInit?

File:
1 moved

Legend:

Unmodified
Added
Removed
  • src/InitTweak/GenInit.cc

    r84bb4d9 ra0fdbd5  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // RemoveInit.cc --
     7// GenInit.cc --
    88//
    99// Author           : Rob Schluntz
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Apr 14 15:09:36 2016
     12// Last Modified On : Thu Apr 28 12:26:47 2016
    1313// Update Count     : 166
    1414//
     
    1616#include <stack>
    1717#include <list>
    18 #include "RemoveInit.h"
     18#include "GenInit.h"
    1919#include "SynTree/Declaration.h"
    2020#include "SynTree/Type.h"
     
    3232        }
    3333
    34         class RemoveInit : public GenPoly::PolyMutator {
     34        class ReturnFixer : public GenPoly::PolyMutator {
    3535          public:
    36                 /// removes and replaces initialization for polymorphic value objects
    37                 /// with assignment (TODO: constructor) statements.
    38                 /// also consistently allocates a temporary variable for the return value
    39                 /// of a function so that anything which the resolver decides can be assigned
     36                /// consistently allocates a temporary variable for the return value
     37                /// of a function so that anything which the resolver decides can be constructed
    4038                /// into the return type of a function can be returned.
    41                 static void removeInitializers( std::list< Declaration * > &translationUnit );
    42 
    43                 RemoveInit();
    44 
    45                 virtual ObjectDecl * mutate( ObjectDecl *objDecl );
     39                static void makeReturnTemp( std::list< Declaration * > &translationUnit );
     40
     41                ReturnFixer();
     42
    4643                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
    4744
     
    7976        };
    8077
    81         void tweak( std::list< Declaration * > & translationUnit ) {
    82                 RemoveInit::removeInitializers( translationUnit );
     78        void genInit( std::list< Declaration * > & translationUnit ) {
     79                ReturnFixer::makeReturnTemp( translationUnit );
    8380                CtorDtor::generateCtorDtor( translationUnit );
    8481        }
    8582
    86         void RemoveInit::removeInitializers( std::list< Declaration * > & translationUnit ) {
    87                 RemoveInit remover;
    88                 mutateAll( translationUnit, remover );
    89         }
    90 
    91         RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}
    92 
    93         // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the
    94         // declaration. This will (seemingly) cause the later phases to do the right thing with the assignment
    95         ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) {
    96                 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) {
    97                         if (SingleInit * single = dynamic_cast<SingleInit*>(objDecl->get_init())) {
    98                                 // xxx this can be more complicated - consider ListInit
    99                                 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?{}" ) );
    100                                 assign->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
    101                                 assign->get_args().push_back( single->get_value()->clone() );
    102                                 stmtsToAddAfter.push_back(new ExprStmt(noLabels, assign));
    103                         } // if
    104                 } // if
    105                 return objDecl;
    106         }
    107 
    108         Statement *RemoveInit::mutate( ReturnStmt *returnStmt ) {
     83        void ReturnFixer::makeReturnTemp( std::list< Declaration * > & translationUnit ) {
     84                ReturnFixer fixer;
     85                mutateAll( translationUnit, fixer );
     86        }
     87
     88        ReturnFixer::ReturnFixer() : tempNamer( "_retVal" ) {}
     89
     90        Statement *ReturnFixer::mutate( ReturnStmt *returnStmt ) {
    10991                // update for multiple return values
    11092                assert( returnVals.size() == 0 || returnVals.size() == 1 );
     
    128110        }
    129111
    130         DeclarationWithType* RemoveInit::mutate( FunctionDecl *functionDecl ) {
     112        DeclarationWithType* ReturnFixer::mutate( FunctionDecl *functionDecl ) {
    131113                std::list<DeclarationWithType*> oldReturnVals = returnVals;
    132114                std::string oldFuncName = funcName;
Note: See TracChangeset for help on using the changeset viewer.