source: src/GenPoly/PolyMutator.cc @ f60d997

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since f60d997 was 09f800b, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

fix initializing object with result of polymorphic call

  • Property mode set to 100644
File size: 5.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// PolyMutator.cc --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Rob Schluntz
12// Last Modified On : Fri Aug 14 15:28:50 2015
13// Update Count     : 11
14//
15
16#include "PolyMutator.h"
17#include "SynTree/Declaration.h"
18#include "SynTree/Type.h"
19#include "SynTree/Expression.h"
20#include "SynTree/Statement.h"
21#include "SynTree/Mutator.h"
22#include "SynTree/Initializer.h"
23
24namespace GenPoly {
25        namespace {
26                const std::list<Label> noLabels;
27        }
28
29        PolyMutator::PolyMutator() : env( 0 ) {
30        }
31
32        void PolyMutator::mutateStatementList( std::list< Statement* > &statements ) {
33                for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
34                        if ( ! stmtsToAddAfter.empty() ) {
35                                statements.splice( i, stmtsToAddAfter );
36                        } // if
37                        *i = (*i)->acceptMutator( *this );
38                        if ( ! stmtsToAdd.empty() ) {
39                                statements.splice( i, stmtsToAdd );
40                        } // if
41                } // for
42                if ( ! stmtsToAddAfter.empty() ) {
43                        statements.splice( statements.end(), stmtsToAddAfter );
44                } // if
45        }
46
47        Statement * PolyMutator::mutateStatement( Statement *stmt ) {
48                Statement *newStmt = maybeMutate( stmt, *this );
49                if ( ! stmtsToAdd.empty() || ! stmtsToAddAfter.empty() ) {
50                        CompoundStmt *compound = new CompoundStmt( noLabels );
51                        compound->get_kids().splice( compound->get_kids().end(), stmtsToAdd );
52                        compound->get_kids().push_back( newStmt );
53                        compound->get_kids().splice( compound->get_kids().end(), stmtsToAddAfter );
54                        // doEndScope();
55                        return compound;
56                } else {
57                        return newStmt;
58                }
59        }
60
61        Expression * PolyMutator::mutateExpression( Expression *expr ) {
62                if ( expr ) {
63                        if ( expr->get_env() ) {
64                                env = expr->get_env();
65                        }
66                        return expr->acceptMutator( *this );
67                } else {
68                        return expr;
69                }
70        }
71
72        CompoundStmt * PolyMutator::mutate(CompoundStmt *compoundStmt) {
73                doBeginScope();
74                mutateStatementList( compoundStmt->get_kids() );
75                doEndScope();
76                return compoundStmt;
77        }
78
79        Statement * PolyMutator::mutate(IfStmt *ifStmt) {
80                ifStmt->set_thenPart(  mutateStatement( ifStmt->get_thenPart() ) );
81                ifStmt->set_elsePart(  mutateStatement( ifStmt->get_elsePart() ) );
82                ifStmt->set_condition(  mutateExpression( ifStmt->get_condition() ) );
83                return ifStmt;
84        }
85
86        Statement * PolyMutator::mutate(WhileStmt *whileStmt) {
87                whileStmt->set_body(  mutateStatement( whileStmt->get_body() ) );
88                whileStmt->set_condition(  mutateExpression( whileStmt->get_condition() ) );
89                return whileStmt;
90        }
91
92        Statement * PolyMutator::mutate(ForStmt *forStmt) {
93                forStmt->set_body(  mutateStatement( forStmt->get_body() ) );
94                mutateAll( forStmt->get_initialization(), *this );
95                forStmt->set_condition(  mutateExpression( forStmt->get_condition() ) );
96                forStmt->set_increment(  mutateExpression( forStmt->get_increment() ) );
97                return forStmt;
98        }
99
100        Statement * PolyMutator::mutate(SwitchStmt *switchStmt) {
101                mutateStatementList( switchStmt->get_branches() );
102                switchStmt->set_condition( mutateExpression( switchStmt->get_condition() ) );
103                return switchStmt;
104        }
105
106        Statement * PolyMutator::mutate(ChooseStmt *switchStmt) {
107                mutateStatementList( switchStmt->get_branches() );
108                switchStmt->set_condition( mutateExpression( switchStmt->get_condition() ) );
109                return switchStmt;
110        }
111
112        Statement * PolyMutator::mutate(CaseStmt *caseStmt) {
113                mutateStatementList( caseStmt->get_statements() );
114                caseStmt->set_condition(  mutateExpression( caseStmt->get_condition() ) );
115                return caseStmt;
116        }
117
118        Statement * PolyMutator::mutate(TryStmt *tryStmt) {
119                tryStmt->set_block(  maybeMutate( tryStmt->get_block(), *this ) );
120                mutateAll( tryStmt->get_catchers(), *this );
121                return tryStmt;
122        }
123
124        Statement * PolyMutator::mutate(CatchStmt *cathStmt) {
125                cathStmt->set_body(  mutateStatement( cathStmt->get_body() ) );
126                cathStmt->set_decl(  maybeMutate( cathStmt->get_decl(), *this ) );
127                return cathStmt;
128        }
129
130        Statement * PolyMutator::mutate(ReturnStmt *retStmt) {
131                retStmt->set_expr( mutateExpression( retStmt->get_expr() ) );
132                return retStmt;
133        }
134
135        Statement * PolyMutator::mutate(ExprStmt *exprStmt) {
136                exprStmt->set_expr( mutateExpression( exprStmt->get_expr() ) );
137                return exprStmt;
138        }
139
140
141        Expression * PolyMutator::mutate(UntypedExpr *untypedExpr) {
142                for ( std::list< Expression* >::iterator i = untypedExpr->get_args().begin(); i != untypedExpr->get_args().end(); ++i ) {
143                        *i = mutateExpression( *i );
144                } // for
145                return untypedExpr;
146        }
147 
148 
149        Initializer *PolyMutator::mutate( SingleInit *singleInit ) {
150                singleInit->set_value( mutateExpression( singleInit->get_value() ) );
151                return singleInit;
152        }
153
154
155        /* static class method */
156        void PolyMutator::makeTyVarMap( Type *type, TyVarMap &tyVarMap ) {
157                for ( std::list< TypeDecl* >::const_iterator tyVar = type->get_forall().begin(); tyVar != type->get_forall().end(); ++tyVar ) {
158                        assert( *tyVar );
159                        tyVarMap[ (*tyVar)->get_name() ] = (*tyVar)->get_kind();
160                }
161                if ( PointerType *pointer = dynamic_cast< PointerType* >( type ) ) {
162                        makeTyVarMap( pointer->get_base(), tyVarMap );
163                }
164        }
165} // namespace GenPoly
166
167// Local Variables: //
168// tab-width: 4 //
169// mode: c++ //
170// compile-command: "make install" //
171// End: //
Note: See TracBrowser for help on using the repository browser.