source: translator/GenPoly/PolyMutator.cc@ b1a6d6b

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new string with_gc
Last change on this file since b1a6d6b was b1a6d6b, checked in by Rob Schluntz <rschlunt@…>, 11 years ago

removed duplicate adapters, switch to c99 for initializer declarations

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 * This file is part of the Cforall project
3 *
4 * $Id: PolyMutator.cc,v 1.7 2005/08/29 20:14:13 rcbilson Exp $
5 *
6 */
7
8#include "PolyMutator.h"
9#include "SynTree/Declaration.h"
10#include "SynTree/Type.h"
11#include "SynTree/Expression.h"
12#include "SynTree/Statement.h"
13#include "SynTree/Mutator.h"
14
15
16namespace GenPoly {
17
18namespace {
19const std::list<Label> noLabels;
20}
21
22PolyMutator::PolyMutator()
23 : env( 0 )
24{
25}
26
27void
28PolyMutator::mutateStatementList( std::list< Statement* > &statements )
29{
30 for( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
31 if( !stmtsToAddAfter.empty() ) {
32 statements.splice( i, stmtsToAddAfter );
33 }
34 *i = (*i)->acceptMutator( *this );
35 if( !stmtsToAdd.empty() ) {
36 statements.splice( i, stmtsToAdd );
37 }
38 }
39 if( !stmtsToAddAfter.empty() ) {
40 statements.splice( statements.end(), stmtsToAddAfter );
41 }
42}
43
44Statement*
45PolyMutator::mutateStatement( Statement *stmt )
46{
47 Statement *newStmt = maybeMutate( stmt, *this );
48 if( !stmtsToAdd.empty() || !stmtsToAddAfter.empty() ) {
49 CompoundStmt *compound = new CompoundStmt( noLabels );
50 compound->get_kids().splice( compound->get_kids().end(), stmtsToAdd );
51 compound->get_kids().push_back( newStmt );
52 compound->get_kids().splice( compound->get_kids().end(), stmtsToAddAfter );
53 // doEndScope();
54 return compound;
55 } else {
56 return newStmt;
57 }
58}
59
60Expression*
61PolyMutator::mutateExpression( Expression *expr )
62{
63 if( expr ) {
64 if( expr->get_env() ) {
65 env = expr->get_env();
66 }
67 return expr->acceptMutator( *this );
68 } else {
69 return expr;
70 }
71}
72
73CompoundStmt*
74PolyMutator::mutate(CompoundStmt *compoundStmt)
75{
76 doBeginScope();
77 mutateStatementList( compoundStmt->get_kids() );
78 doEndScope();
79 return compoundStmt;
80}
81
82Statement*
83PolyMutator::mutate(IfStmt *ifStmt)
84{
85 ifStmt->set_thenPart( mutateStatement( ifStmt->get_thenPart() ) );
86 ifStmt->set_elsePart( mutateStatement( ifStmt->get_elsePart() ) );
87 ifStmt->set_condition( mutateExpression( ifStmt->get_condition() ) );
88 return ifStmt;
89}
90
91Statement*
92PolyMutator::mutate(WhileStmt *whileStmt)
93{
94 whileStmt->set_body( mutateStatement( whileStmt->get_body() ) );
95 whileStmt->set_condition( mutateExpression( whileStmt->get_condition() ) );
96 return whileStmt;
97}
98
99Statement*
100PolyMutator::mutate(ForStmt *forStmt)
101{
102 forStmt->set_body( mutateStatement( forStmt->get_body() ) );
103 forStmt->set_initialization( maybeMutate( forStmt->get_initialization(), *this ) );
104 forStmt->set_condition( mutateExpression( forStmt->get_condition() ) );
105 forStmt->set_increment( mutateExpression( forStmt->get_increment() ) );
106 return forStmt;
107}
108
109Statement*
110PolyMutator::mutate(SwitchStmt *switchStmt)
111{
112 mutateStatementList( switchStmt->get_branches() );
113 switchStmt->set_condition( mutateExpression( switchStmt->get_condition() ) );
114 return switchStmt;
115}
116
117Statement*
118PolyMutator::mutate(ChooseStmt *switchStmt)
119{
120 mutateStatementList( switchStmt->get_branches() );
121 switchStmt->set_condition( mutateExpression( switchStmt->get_condition() ) );
122 return switchStmt;
123}
124
125Statement*
126PolyMutator::mutate(CaseStmt *caseStmt)
127{
128 mutateStatementList( caseStmt->get_statements() );
129 caseStmt->set_condition( mutateExpression( caseStmt->get_condition() ) );
130
131 return caseStmt;
132}
133
134Statement*
135PolyMutator::mutate(TryStmt *tryStmt)
136{
137 tryStmt->set_block( maybeMutate( tryStmt->get_block(), *this ) );
138 mutateAll( tryStmt->get_catchers(), *this );
139
140 return tryStmt;
141}
142
143Statement*
144PolyMutator::mutate(CatchStmt *cathStmt)
145{
146 cathStmt->set_body( mutateStatement( cathStmt->get_body() ) );
147 cathStmt->set_decl( maybeMutate( cathStmt->get_decl(), *this ) );
148 return cathStmt;
149}
150
151Statement*
152PolyMutator::mutate(ReturnStmt *retStmt)
153{
154 retStmt->set_expr( mutateExpression( retStmt->get_expr() ) );
155 return retStmt;
156}
157
158Statement*
159PolyMutator::mutate(ExprStmt *exprStmt)
160{
161 exprStmt->set_expr( mutateExpression( exprStmt->get_expr() ) );
162 return exprStmt;
163}
164
165
166Expression*
167PolyMutator::mutate(UntypedExpr *untypedExpr)
168{
169 for( std::list< Expression* >::iterator i = untypedExpr->get_args().begin(); i != untypedExpr->get_args().end(); ++i ) {
170 *i = mutateExpression( *i );
171 }
172 return untypedExpr;
173}
174
175/* static class method */
176void
177PolyMutator::makeTyVarMap( Type *type, TyVarMap &tyVarMap )
178{
179 for( std::list< TypeDecl* >::const_iterator tyVar = type->get_forall().begin(); tyVar != type->get_forall().end(); ++tyVar ) {
180 assert( *tyVar );
181 tyVarMap[ (*tyVar)->get_name() ] = (*tyVar)->get_kind();
182 }
183 if( PointerType *pointer = dynamic_cast< PointerType* >( type ) ) {
184 makeTyVarMap( pointer->get_base(), tyVarMap );
185 }
186}
187
188/* static class method */
189} // namespace GenPoly
Note: See TracBrowser for help on using the repository browser.