Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: runtime/vm/ast_transformer.cc

Issue 850183005: Introduce simple Thread class to support gradual refactoring of interfaces. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/ast_transformer.h ('k') | runtime/vm/base_isolate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/ast_transformer.h" 5 #include "vm/ast_transformer.h"
6 6
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 #include "vm/parser.h" 8 #include "vm/parser.h"
9 #include "vm/thread.h"
9 10
10 namespace dart { 11 namespace dart {
11 12
12 // Quick access to the locally defined isolate() method. 13 // Quick access to the current isolate and zone.
13 #define I (isolate()) 14 #define I (thread()->isolate())
15 #define Z (thread()->zone())
14 16
15 // Nodes that are unreachable from already parsed expressions. 17 // Nodes that are unreachable from already parsed expressions.
16 #define FOR_EACH_UNREACHABLE_NODE(V) \ 18 #define FOR_EACH_UNREACHABLE_NODE(V) \
17 V(AwaitMarker) \ 19 V(AwaitMarker) \
18 V(Case) \ 20 V(Case) \
19 V(CatchClause) \ 21 V(CatchClause) \
20 V(CloneContext) \ 22 V(CloneContext) \
21 V(ClosureCall) \ 23 V(ClosureCall) \
22 V(DoWhile) \ 24 V(DoWhile) \
23 V(If) \ 25 V(If) \
(...skipping 19 matching lines...) Expand all
43 FOR_EACH_UNREACHABLE_NODE(DEFINE_UNREACHABLE) 45 FOR_EACH_UNREACHABLE_NODE(DEFINE_UNREACHABLE)
44 #undef DEFINE_UNREACHABLE 46 #undef DEFINE_UNREACHABLE
45 47
46 AwaitTransformer::AwaitTransformer(SequenceNode* preamble, 48 AwaitTransformer::AwaitTransformer(SequenceNode* preamble,
47 ParsedFunction* const parsed_function, 49 ParsedFunction* const parsed_function,
48 LocalScope* function_top) 50 LocalScope* function_top)
49 : preamble_(preamble), 51 : preamble_(preamble),
50 temp_cnt_(0), 52 temp_cnt_(0),
51 parsed_function_(parsed_function), 53 parsed_function_(parsed_function),
52 function_top_(function_top), 54 function_top_(function_top),
53 isolate_(Isolate::Current()) { 55 thread_(Thread::Current()) {
54 ASSERT(function_top_ != NULL); 56 ASSERT(function_top_ != NULL);
55 } 57 }
56 58
57 59
58 AstNode* AwaitTransformer::Transform(AstNode* expr) { 60 AstNode* AwaitTransformer::Transform(AstNode* expr) {
59 expr->Visit(this); 61 expr->Visit(this);
60 return result_; 62 return result_;
61 } 63 }
62 64
63 65
64 LocalVariable* AwaitTransformer::EnsureCurrentTempVar() { 66 LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
65 const char* await_temp_prefix = ":await_temp_var_"; 67 const char* await_temp_prefix = ":await_temp_var_";
66 const String& cnt_str = String::ZoneHandle( 68 const String& cnt_str = String::ZoneHandle(
67 I, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_)); 69 I, String::NewFormatted("%s%d", await_temp_prefix, temp_cnt_));
68 const String& symbol = String::ZoneHandle(I, Symbols::New(cnt_str)); 70 const String& symbol = String::ZoneHandle(I, Symbols::New(cnt_str));
69 ASSERT(!symbol.IsNull()); 71 ASSERT(!symbol.IsNull());
70 // Look up the variable through the preamble scope. 72 // Look up the variable through the preamble scope.
71 LocalVariable* await_tmp = preamble_->scope()->LookupVariable(symbol, false); 73 LocalVariable* await_tmp = preamble_->scope()->LookupVariable(symbol, false);
72 if (await_tmp == NULL) { 74 if (await_tmp == NULL) {
73 // If we need a new temp variable, we add it to the function's top scope. 75 // If we need a new temp variable, we add it to the function's top scope.
74 await_tmp = new (I) LocalVariable( 76 await_tmp = new (Z) LocalVariable(
75 Scanner::kNoSourcePos, symbol, Type::ZoneHandle(Type::DynamicType())); 77 Scanner::kNoSourcePos, symbol, Type::ZoneHandle(Type::DynamicType()));
76 function_top_->AddVariable(await_tmp); 78 function_top_->AddVariable(await_tmp);
77 // After adding it to the top scope, we can look it up from the preamble. 79 // After adding it to the top scope, we can look it up from the preamble.
78 // The following call includes an ASSERT check. 80 // The following call includes an ASSERT check.
79 await_tmp = GetVariableInScope(preamble_->scope(), symbol); 81 await_tmp = GetVariableInScope(preamble_->scope(), symbol);
80 } 82 }
81 return await_tmp; 83 return await_tmp;
82 } 84 }
83 85
84 86
85 LocalVariable* AwaitTransformer::GetVariableInScope(LocalScope* scope, 87 LocalVariable* AwaitTransformer::GetVariableInScope(LocalScope* scope,
86 const String& symbol) { 88 const String& symbol) {
87 LocalVariable* var = scope->LookupVariable(symbol, false); 89 LocalVariable* var = scope->LookupVariable(symbol, false);
88 ASSERT(var != NULL); 90 ASSERT(var != NULL);
89 return var; 91 return var;
90 } 92 }
91 93
92 94
93 LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node) { 95 LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node) {
94 LocalVariable* tmp_var = EnsureCurrentTempVar(); 96 LocalVariable* tmp_var = EnsureCurrentTempVar();
95 preamble_->Add(new(I) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node)); 97 preamble_->Add(new(Z) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node));
96 NextTempVar(); 98 NextTempVar();
97 return tmp_var; 99 return tmp_var;
98 } 100 }
99 101
100 102
101 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) { 103 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) {
102 result_ = node; 104 result_ = node;
103 } 105 }
104 106
105 107
106 void AwaitTransformer::VisitTypeNode(TypeNode* node) { 108 void AwaitTransformer::VisitTypeNode(TypeNode* node) {
107 result_ = new(I) TypeNode(node->token_pos(), node->type()); 109 result_ = new(Z) TypeNode(node->token_pos(), node->type());
108 } 110 }
109 111
110 112
111 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { 113 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
112 // Await transformation: 114 // Await transformation:
113 // 115 //
114 // :await_temp_var_X = <expr>; 116 // :await_temp_var_X = <expr>;
115 // :result_param = :await_temp_var_X; 117 // :result_param = :await_temp_var_X;
116 // if (:result_param is !Future) { 118 // if (:result_param is !Future) {
117 // :result_param = Future.value(:result_param); 119 // :result_param = Future.value(:result_param);
118 // } 120 // }
119 // AwaitMarker(kNewContinuationState); 121 // AwaitMarker(kNewContinuationState);
120 // :result_param = :result_param.then(:async_op); 122 // :result_param = :result_param.then(:async_op);
121 // _asyncCatchHelper(:result_param.catchError, :async_op); 123 // _asyncCatchHelper(:result_param.catchError, :async_op);
122 // return; // (return_type() == kContinuationTarget) 124 // return; // (return_type() == kContinuationTarget)
123 // 125 //
124 // :saved_try_ctx_var = :await_saved_try_ctx_var_y; 126 // :saved_try_ctx_var = :await_saved_try_ctx_var_y;
125 // :await_temp_var_(X+1) = :result_param; 127 // :await_temp_var_(X+1) = :result_param;
126 128
127 LocalVariable* async_op = GetVariableInScope( 129 LocalVariable* async_op = GetVariableInScope(
128 preamble_->scope(), Symbols::AsyncOperation()); 130 preamble_->scope(), Symbols::AsyncOperation());
129 LocalVariable* result_param = GetVariableInScope( 131 LocalVariable* result_param = GetVariableInScope(
130 preamble_->scope(), Symbols::AsyncOperationParam()); 132 preamble_->scope(), Symbols::AsyncOperationParam());
131 LocalVariable* error_param = GetVariableInScope( 133 LocalVariable* error_param = GetVariableInScope(
132 preamble_->scope(), Symbols::AsyncOperationErrorParam()); 134 preamble_->scope(), Symbols::AsyncOperationErrorParam());
133 135
134 AstNode* transformed_expr = Transform(node->expr()); 136 AstNode* transformed_expr = Transform(node->expr());
135 preamble_->Add(new(I) StoreLocalNode( 137 preamble_->Add(new(Z) StoreLocalNode(
136 Scanner::kNoSourcePos, result_param, transformed_expr)); 138 Scanner::kNoSourcePos, result_param, transformed_expr));
137 139
138 LoadLocalNode* load_result_param = new(I) LoadLocalNode( 140 LoadLocalNode* load_result_param = new(Z) LoadLocalNode(
139 Scanner::kNoSourcePos, result_param); 141 Scanner::kNoSourcePos, result_param);
140 142
141 const Class& future_cls = 143 const Class& future_cls =
142 Class::ZoneHandle(I, I->object_store()->future_class()); 144 Class::ZoneHandle(I, I->object_store()->future_class());
143 ASSERT(!future_cls.IsNull()); 145 ASSERT(!future_cls.IsNull());
144 const AbstractType& future_type = 146 const AbstractType& future_type =
145 AbstractType::ZoneHandle(I, future_cls.RareType()); 147 AbstractType::ZoneHandle(I, future_cls.RareType());
146 ASSERT(!future_type.IsNull()); 148 ASSERT(!future_type.IsNull());
147 149
148 LocalScope* is_not_future_scope = ChainNewScope(preamble_->scope()); 150 LocalScope* is_not_future_scope = ChainNewScope(preamble_->scope());
149 SequenceNode* is_not_future_branch = 151 SequenceNode* is_not_future_branch =
150 new (I) SequenceNode(Scanner::kNoSourcePos, is_not_future_scope); 152 new (Z) SequenceNode(Scanner::kNoSourcePos, is_not_future_scope);
151 153
152 // if (:result_param is !Future) { 154 // if (:result_param is !Future) {
153 // :result_param = Future.value(:result_param); 155 // :result_param = Future.value(:result_param);
154 // } 156 // }
155 const Function& value_ctor = Function::ZoneHandle( 157 const Function& value_ctor = Function::ZoneHandle(
156 I, future_cls.LookupFunction(Symbols::FutureValue())); 158 I, future_cls.LookupFunction(Symbols::FutureValue()));
157 ASSERT(!value_ctor.IsNull()); 159 ASSERT(!value_ctor.IsNull());
158 ArgumentListNode* ctor_args = new (I) ArgumentListNode(Scanner::kNoSourcePos); 160 ArgumentListNode* ctor_args = new (Z) ArgumentListNode(Scanner::kNoSourcePos);
159 ctor_args->Add(new (I) LoadLocalNode(Scanner::kNoSourcePos, result_param)); 161 ctor_args->Add(new (Z) LoadLocalNode(Scanner::kNoSourcePos, result_param));
160 ConstructorCallNode* ctor_call = 162 ConstructorCallNode* ctor_call =
161 new (I) ConstructorCallNode(Scanner::kNoSourcePos, 163 new (Z) ConstructorCallNode(Scanner::kNoSourcePos,
162 TypeArguments::ZoneHandle(I), 164 TypeArguments::ZoneHandle(I),
163 value_ctor, 165 value_ctor,
164 ctor_args); 166 ctor_args);
165 is_not_future_branch->Add(new (I) StoreLocalNode( 167 is_not_future_branch->Add(new (Z) StoreLocalNode(
166 Scanner::kNoSourcePos, result_param, ctor_call)); 168 Scanner::kNoSourcePos, result_param, ctor_call));
167 AstNode* is_not_future_test = new (I) ComparisonNode( 169 AstNode* is_not_future_test = new (Z) ComparisonNode(
168 Scanner::kNoSourcePos, 170 Scanner::kNoSourcePos,
169 Token::kISNOT, 171 Token::kISNOT,
170 load_result_param, 172 load_result_param,
171 new (I) TypeNode(Scanner::kNoSourcePos, future_type)); 173 new (Z) TypeNode(Scanner::kNoSourcePos, future_type));
172 preamble_->Add(new(I) IfNode(Scanner::kNoSourcePos, 174 preamble_->Add(new(Z) IfNode(Scanner::kNoSourcePos,
173 is_not_future_test, 175 is_not_future_test,
174 is_not_future_branch, 176 is_not_future_branch,
175 NULL)); 177 NULL));
176 178
177 AwaitMarkerNode* await_marker = new (I) AwaitMarkerNode(); 179 AwaitMarkerNode* await_marker = new (Z) AwaitMarkerNode();
178 await_marker->set_scope(preamble_->scope()); 180 await_marker->set_scope(preamble_->scope());
179 preamble_->Add(await_marker); 181 preamble_->Add(await_marker);
180 ArgumentListNode* args = new(I) ArgumentListNode(Scanner::kNoSourcePos); 182 ArgumentListNode* args = new(Z) ArgumentListNode(Scanner::kNoSourcePos);
181 183
182 args->Add(new(I) LoadLocalNode(Scanner::kNoSourcePos, async_op)); 184 args->Add(new(Z) LoadLocalNode(Scanner::kNoSourcePos, async_op));
183 preamble_->Add(new (I) StoreLocalNode( 185 preamble_->Add(new (Z) StoreLocalNode(
184 Scanner::kNoSourcePos, 186 Scanner::kNoSourcePos,
185 result_param, 187 result_param,
186 new(I) InstanceCallNode(Scanner::kNoSourcePos, 188 new(Z) InstanceCallNode(Scanner::kNoSourcePos,
187 load_result_param, 189 load_result_param,
188 Symbols::FutureThen(), 190 Symbols::FutureThen(),
189 args))); 191 args)));
190 const Library& core_lib = Library::Handle(Library::CoreLibrary()); 192 const Library& core_lib = Library::Handle(Library::CoreLibrary());
191 const Function& async_catch_helper = Function::ZoneHandle( 193 const Function& async_catch_helper = Function::ZoneHandle(
192 I, core_lib.LookupFunctionAllowPrivate(Symbols::AsyncCatchHelper())); 194 I, core_lib.LookupFunctionAllowPrivate(Symbols::AsyncCatchHelper()));
193 ASSERT(!async_catch_helper.IsNull()); 195 ASSERT(!async_catch_helper.IsNull());
194 ArgumentListNode* catch_helper_args = new (I) ArgumentListNode( 196 ArgumentListNode* catch_helper_args = new (Z) ArgumentListNode(
195 Scanner::kNoSourcePos); 197 Scanner::kNoSourcePos);
196 InstanceGetterNode* catch_error_getter = new (I) InstanceGetterNode( 198 InstanceGetterNode* catch_error_getter = new (Z) InstanceGetterNode(
197 Scanner::kNoSourcePos, 199 Scanner::kNoSourcePos,
198 load_result_param, 200 load_result_param,
199 Symbols::FutureCatchError()); 201 Symbols::FutureCatchError());
200 catch_helper_args->Add(catch_error_getter); 202 catch_helper_args->Add(catch_error_getter);
201 catch_helper_args->Add(new (I) LoadLocalNode( 203 catch_helper_args->Add(new (Z) LoadLocalNode(
202 Scanner::kNoSourcePos, async_op)); 204 Scanner::kNoSourcePos, async_op));
203 preamble_->Add(new (I) StaticCallNode( 205 preamble_->Add(new (Z) StaticCallNode(
204 Scanner::kNoSourcePos, 206 Scanner::kNoSourcePos,
205 async_catch_helper, 207 async_catch_helper,
206 catch_helper_args)); 208 catch_helper_args));
207 ReturnNode* continuation_return = new(I) ReturnNode(Scanner::kNoSourcePos); 209 ReturnNode* continuation_return = new(Z) ReturnNode(Scanner::kNoSourcePos);
208 continuation_return->set_return_type(ReturnNode::kContinuationTarget); 210 continuation_return->set_return_type(ReturnNode::kContinuationTarget);
209 preamble_->Add(continuation_return); 211 preamble_->Add(continuation_return);
210 212
211 // If this expression is part of a try block, also append the code for 213 // If this expression is part of a try block, also append the code for
212 // restoring the saved try context that lives on the stack. 214 // restoring the saved try context that lives on the stack.
213 const String& async_saved_try_ctx_name = 215 const String& async_saved_try_ctx_name =
214 String::Handle(I, parsed_function_->async_saved_try_ctx_name()); 216 String::Handle(I, parsed_function_->async_saved_try_ctx_name());
215 if (!async_saved_try_ctx_name.IsNull()) { 217 if (!async_saved_try_ctx_name.IsNull()) {
216 LocalVariable* async_saved_try_ctx = 218 LocalVariable* async_saved_try_ctx =
217 GetVariableInScope(preamble_->scope(), async_saved_try_ctx_name); 219 GetVariableInScope(preamble_->scope(), async_saved_try_ctx_name);
218 preamble_->Add(new (I) StoreLocalNode( 220 preamble_->Add(new (Z) StoreLocalNode(
219 Scanner::kNoSourcePos, 221 Scanner::kNoSourcePos,
220 parsed_function_->saved_try_ctx(), 222 parsed_function_->saved_try_ctx(),
221 new (I) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx))); 223 new (Z) LoadLocalNode(Scanner::kNoSourcePos, async_saved_try_ctx)));
222 } 224 }
223 225
224 LoadLocalNode* load_error_param = new (I) LoadLocalNode( 226 LoadLocalNode* load_error_param = new (Z) LoadLocalNode(
225 Scanner::kNoSourcePos, error_param); 227 Scanner::kNoSourcePos, error_param);
226 SequenceNode* error_ne_null_branch = new (I) SequenceNode( 228 SequenceNode* error_ne_null_branch = new (Z) SequenceNode(
227 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope())); 229 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
228 error_ne_null_branch->Add(new (I) ThrowNode( 230 error_ne_null_branch->Add(new (Z) ThrowNode(
229 Scanner::kNoSourcePos, 231 Scanner::kNoSourcePos,
230 load_error_param, 232 load_error_param,
231 NULL)); 233 NULL));
232 preamble_->Add(new (I) IfNode( 234 preamble_->Add(new (Z) IfNode(
233 Scanner::kNoSourcePos, 235 Scanner::kNoSourcePos,
234 new (I) ComparisonNode( 236 new (Z) ComparisonNode(
235 Scanner::kNoSourcePos, 237 Scanner::kNoSourcePos,
236 Token::kNE, 238 Token::kNE,
237 load_error_param, 239 load_error_param,
238 new (I) LiteralNode(Scanner::kNoSourcePos, 240 new (Z) LiteralNode(Scanner::kNoSourcePos,
239 Object::null_instance())), 241 Object::null_instance())),
240 error_ne_null_branch, 242 error_ne_null_branch,
241 NULL)); 243 NULL));
242 244
243 LocalVariable* result = AddToPreambleNewTempVar(new(I) LoadLocalNode( 245 LocalVariable* result = AddToPreambleNewTempVar(new(Z) LoadLocalNode(
244 Scanner::kNoSourcePos, result_param)); 246 Scanner::kNoSourcePos, result_param));
245 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 247 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
246 } 248 }
247 249
248 250
249 // Transforms boolean expressions into a sequence of evaluatons that only lazily 251 // Transforms boolean expressions into a sequence of evaluatons that only lazily
250 // evaluate subexpressions. 252 // evaluate subexpressions.
251 // 253 //
252 // Example: 254 // Example:
253 // 255 //
254 // (a || b) only evaluates b if a is false 256 // (a || b) only evaluates b if a is false
255 // 257 //
256 // Transformation (roughly): 258 // Transformation (roughly):
257 // 259 //
258 // t_1 = a; 260 // t_1 = a;
259 // if (!t_1) { 261 // if (!t_1) {
260 // t_2 = b; 262 // t_2 = b;
261 // } 263 // }
262 // t_3 = t_1 || t_2; // Compiler takes care that lazy evaluation takes place 264 // t_3 = t_1 || t_2; // Compiler takes care that lazy evaluation takes place
263 // on this level. 265 // on this level.
264 AstNode* AwaitTransformer::LazyTransform(const Token::Kind logical_op, 266 AstNode* AwaitTransformer::LazyTransform(const Token::Kind logical_op,
265 AstNode* new_left, 267 AstNode* new_left,
266 AstNode* right) { 268 AstNode* right) {
267 ASSERT(logical_op == Token::kAND || logical_op == Token::kOR); 269 ASSERT(logical_op == Token::kAND || logical_op == Token::kOR);
268 AstNode* result = NULL; 270 AstNode* result = NULL;
269 const Token::Kind compare_logical_op = (logical_op == Token::kAND) ? 271 const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
270 Token::kEQ : Token::kNE; 272 Token::kEQ : Token::kNE;
271 SequenceNode* eval = new (I) SequenceNode( 273 SequenceNode* eval = new (Z) SequenceNode(
272 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope())); 274 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
273 SequenceNode* saved_preamble = preamble_; 275 SequenceNode* saved_preamble = preamble_;
274 preamble_ = eval; 276 preamble_ = eval;
275 result = Transform(right); 277 result = Transform(right);
276 preamble_ = saved_preamble; 278 preamble_ = saved_preamble;
277 IfNode* right_body = new(I) IfNode( 279 IfNode* right_body = new(Z) IfNode(
278 Scanner::kNoSourcePos, 280 Scanner::kNoSourcePos,
279 new(I) ComparisonNode( 281 new(Z) ComparisonNode(
280 Scanner::kNoSourcePos, 282 Scanner::kNoSourcePos,
281 compare_logical_op, 283 compare_logical_op,
282 new_left, 284 new_left,
283 new(I) LiteralNode(Scanner::kNoSourcePos, Bool::True())), 285 new(Z) LiteralNode(Scanner::kNoSourcePos, Bool::True())),
284 eval, 286 eval,
285 NULL); 287 NULL);
286 preamble_->Add(right_body); 288 preamble_->Add(right_body);
287 return result; 289 return result;
288 } 290 }
289 291
290 292
291 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) { 293 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) {
292 return new (I) LocalScope( 294 return new (Z) LocalScope(
293 parent, parent->function_level(), parent->loop_level()); 295 parent, parent->function_level(), parent->loop_level());
294 } 296 }
295 297
296 298
297 void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) { 299 void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) {
298 AstNode* new_left = Transform(node->left()); 300 AstNode* new_left = Transform(node->left());
299 AstNode* new_right = NULL; 301 AstNode* new_right = NULL;
300 // Preserve lazy evaluaton. 302 // Preserve lazy evaluaton.
301 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) { 303 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
302 new_right = LazyTransform(node->kind(), new_left, node->right()); 304 new_right = LazyTransform(node->kind(), new_left, node->right());
303 } else { 305 } else {
304 new_right = Transform(node->right()); 306 new_right = Transform(node->right());
305 } 307 }
306 LocalVariable* result = AddToPreambleNewTempVar( 308 LocalVariable* result = AddToPreambleNewTempVar(
307 new(I) BinaryOpNode(node->token_pos(), 309 new(Z) BinaryOpNode(node->token_pos(),
308 node->kind(), 310 node->kind(),
309 new_left, 311 new_left,
310 new_right)); 312 new_right));
311 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 313 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
312 } 314 }
313 315
314 316
315 void AwaitTransformer::VisitBinaryOpWithMask32Node( 317 void AwaitTransformer::VisitBinaryOpWithMask32Node(
316 BinaryOpWithMask32Node* node) { 318 BinaryOpWithMask32Node* node) {
317 ASSERT((node->kind() != Token::kAND) && (node->kind() != Token::kOR)); 319 ASSERT((node->kind() != Token::kAND) && (node->kind() != Token::kOR));
318 AstNode* new_left = Transform(node->left()); 320 AstNode* new_left = Transform(node->left());
319 AstNode* new_right = Transform(node->right()); 321 AstNode* new_right = Transform(node->right());
320 LocalVariable* result = AddToPreambleNewTempVar( 322 LocalVariable* result = AddToPreambleNewTempVar(
321 new(I) BinaryOpWithMask32Node(node->token_pos(), 323 new(Z) BinaryOpWithMask32Node(node->token_pos(),
322 node->kind(), 324 node->kind(),
323 new_left, 325 new_left,
324 new_right, 326 new_right,
325 node->mask32())); 327 node->mask32()));
326 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 328 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
327 } 329 }
328 330
329 331
330 void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) { 332 void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
331 AstNode* new_left = Transform(node->left()); 333 AstNode* new_left = Transform(node->left());
332 AstNode* new_right = Transform(node->right()); 334 AstNode* new_right = Transform(node->right());
333 LocalVariable* result = AddToPreambleNewTempVar( 335 LocalVariable* result = AddToPreambleNewTempVar(
334 new(I) ComparisonNode(node->token_pos(), 336 new(Z) ComparisonNode(node->token_pos(),
335 node->kind(), 337 node->kind(),
336 new_left, 338 new_left,
337 new_right)); 339 new_right));
338 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 340 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
339 } 341 }
340 342
341 343
342 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) { 344 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
343 AstNode* new_operand = Transform(node->operand()); 345 AstNode* new_operand = Transform(node->operand());
344 LocalVariable* result = AddToPreambleNewTempVar( 346 LocalVariable* result = AddToPreambleNewTempVar(
345 new(I) UnaryOpNode(node->token_pos(), node->kind(), new_operand)); 347 new(Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
346 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 348 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
347 } 349 }
348 350
349 351
350 // ::= (<condition>) ? <true-branch> : <false-branch> 352 // ::= (<condition>) ? <true-branch> : <false-branch>
351 // 353 //
352 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) { 354 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
353 AstNode* new_condition = Transform(node->condition()); 355 AstNode* new_condition = Transform(node->condition());
354 SequenceNode* new_true = new (I) SequenceNode( 356 SequenceNode* new_true = new (Z) SequenceNode(
355 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope())); 357 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
356 SequenceNode* saved_preamble = preamble_; 358 SequenceNode* saved_preamble = preamble_;
357 preamble_ = new_true; 359 preamble_ = new_true;
358 AstNode* new_true_result = Transform(node->true_expr()); 360 AstNode* new_true_result = Transform(node->true_expr());
359 SequenceNode* new_false = new (I) SequenceNode( 361 SequenceNode* new_false = new (Z) SequenceNode(
360 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope())); 362 Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
361 preamble_ = new_false; 363 preamble_ = new_false;
362 AstNode* new_false_result = Transform(node->false_expr()); 364 AstNode* new_false_result = Transform(node->false_expr());
363 preamble_ = saved_preamble; 365 preamble_ = saved_preamble;
364 IfNode* new_if = new(I) IfNode(Scanner::kNoSourcePos, 366 IfNode* new_if = new(Z) IfNode(Scanner::kNoSourcePos,
365 new_condition, 367 new_condition,
366 new_true, 368 new_true,
367 new_false); 369 new_false);
368 preamble_->Add(new_if); 370 preamble_->Add(new_if);
369 LocalVariable* result = AddToPreambleNewTempVar( 371 LocalVariable* result = AddToPreambleNewTempVar(
370 new(I) ConditionalExprNode(Scanner::kNoSourcePos, 372 new(Z) ConditionalExprNode(Scanner::kNoSourcePos,
371 new_condition, 373 new_condition,
372 new_true_result, 374 new_true_result,
373 new_false_result)); 375 new_false_result));
374 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 376 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
375 } 377 }
376 378
377 379
378 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) { 380 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) {
379 ArgumentListNode* new_args = new(I) ArgumentListNode(node->token_pos()); 381 ArgumentListNode* new_args = new(Z) ArgumentListNode(node->token_pos());
380 for (intptr_t i = 0; i < node->length(); i++) { 382 for (intptr_t i = 0; i < node->length(); i++) {
381 new_args->Add(Transform(node->NodeAt(i))); 383 new_args->Add(Transform(node->NodeAt(i)));
382 } 384 }
383 new_args->set_names(node->names()); 385 new_args->set_names(node->names());
384 result_ = new_args; 386 result_ = new_args;
385 } 387 }
386 388
387 389
388 void AwaitTransformer::VisitArrayNode(ArrayNode* node) { 390 void AwaitTransformer::VisitArrayNode(ArrayNode* node) {
389 GrowableArray<AstNode*> new_elements; 391 GrowableArray<AstNode*> new_elements;
390 for (intptr_t i = 0; i < node->length(); i++) { 392 for (intptr_t i = 0; i < node->length(); i++) {
391 new_elements.Add(Transform(node->ElementAt(i))); 393 new_elements.Add(Transform(node->ElementAt(i)));
392 } 394 }
393 result_ = new(I) ArrayNode(node->token_pos(), node->type(), new_elements); 395 result_ = new(Z) ArrayNode(node->token_pos(), node->type(), new_elements);
394 } 396 }
395 397
396 398
397 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) { 399 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
398 ArrayNode* new_value = Transform(node->value())->AsArrayNode(); 400 ArrayNode* new_value = Transform(node->value())->AsArrayNode();
399 LocalVariable* result = AddToPreambleNewTempVar( 401 LocalVariable* result = AddToPreambleNewTempVar(
400 new(I) StringInterpolateNode(node->token_pos(), 402 new(Z) StringInterpolateNode(node->token_pos(),
401 new_value)); 403 new_value));
402 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 404 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
403 } 405 }
404 406
405 407
406 void AwaitTransformer::VisitClosureNode(ClosureNode* node) { 408 void AwaitTransformer::VisitClosureNode(ClosureNode* node) {
407 AstNode* new_receiver = node->receiver(); 409 AstNode* new_receiver = node->receiver();
408 if (new_receiver != NULL) { 410 if (new_receiver != NULL) {
409 new_receiver = Transform(new_receiver); 411 new_receiver = Transform(new_receiver);
410 } 412 }
411 LocalVariable* result = AddToPreambleNewTempVar( 413 LocalVariable* result = AddToPreambleNewTempVar(
412 new(I) ClosureNode(node->token_pos(), 414 new(Z) ClosureNode(node->token_pos(),
413 node->function(), 415 node->function(),
414 new_receiver, 416 new_receiver,
415 node->scope())); 417 node->scope()));
416 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 418 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
417 } 419 }
418 420
419 421
420 void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) { 422 void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) {
421 AstNode* new_receiver = Transform(node->receiver()); 423 AstNode* new_receiver = Transform(node->receiver());
422 ArgumentListNode* new_args = 424 ArgumentListNode* new_args =
423 Transform(node->arguments())->AsArgumentListNode(); 425 Transform(node->arguments())->AsArgumentListNode();
424 LocalVariable* result = AddToPreambleNewTempVar( 426 LocalVariable* result = AddToPreambleNewTempVar(
425 new(I) InstanceCallNode(node->token_pos(), 427 new(Z) InstanceCallNode(node->token_pos(),
426 new_receiver, 428 new_receiver,
427 node->function_name(), 429 node->function_name(),
428 new_args)); 430 new_args));
429 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 431 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
430 } 432 }
431 433
432 434
433 void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) { 435 void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
434 ArgumentListNode* new_args = 436 ArgumentListNode* new_args =
435 Transform(node->arguments())->AsArgumentListNode(); 437 Transform(node->arguments())->AsArgumentListNode();
436 LocalVariable* result = AddToPreambleNewTempVar( 438 LocalVariable* result = AddToPreambleNewTempVar(
437 new(I) StaticCallNode(node->token_pos(), 439 new(Z) StaticCallNode(node->token_pos(),
438 node->function(), 440 node->function(),
439 new_args)); 441 new_args));
440 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 442 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
441 } 443 }
442 444
443 445
444 void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) { 446 void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
445 ArgumentListNode* new_args = 447 ArgumentListNode* new_args =
446 Transform(node->arguments())->AsArgumentListNode(); 448 Transform(node->arguments())->AsArgumentListNode();
447 LocalVariable* result = AddToPreambleNewTempVar( 449 LocalVariable* result = AddToPreambleNewTempVar(
448 new(I) ConstructorCallNode(node->token_pos(), 450 new(Z) ConstructorCallNode(node->token_pos(),
449 node->type_arguments(), 451 node->type_arguments(),
450 node->constructor(), 452 node->constructor(),
451 new_args)); 453 new_args));
452 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 454 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
453 } 455 }
454 456
455 457
456 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) { 458 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
457 AstNode* new_receiver = Transform(node->receiver()); 459 AstNode* new_receiver = Transform(node->receiver());
458 LocalVariable* result = AddToPreambleNewTempVar( 460 LocalVariable* result = AddToPreambleNewTempVar(
459 new(I) InstanceGetterNode(node->token_pos(), 461 new(Z) InstanceGetterNode(node->token_pos(),
460 new_receiver, 462 new_receiver,
461 node->field_name())); 463 node->field_name()));
462 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 464 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
463 } 465 }
464 466
465 467
466 void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) { 468 void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) {
467 AstNode* new_receiver = node->receiver(); 469 AstNode* new_receiver = node->receiver();
468 if (new_receiver != NULL) { 470 if (new_receiver != NULL) {
469 new_receiver = Transform(new_receiver); 471 new_receiver = Transform(new_receiver);
470 } 472 }
471 AstNode* new_value = Transform(node->value()); 473 AstNode* new_value = Transform(node->value());
472 LocalVariable* result = AddToPreambleNewTempVar( 474 LocalVariable* result = AddToPreambleNewTempVar(
473 new(I) InstanceSetterNode(node->token_pos(), 475 new(Z) InstanceSetterNode(node->token_pos(),
474 new_receiver, 476 new_receiver,
475 node->field_name(), 477 node->field_name(),
476 new_value)); 478 new_value));
477 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 479 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
478 } 480 }
479 481
480 482
481 void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) { 483 void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) {
482 AstNode* new_receiver = node->receiver(); 484 AstNode* new_receiver = node->receiver();
483 if (new_receiver != NULL) { 485 if (new_receiver != NULL) {
484 new_receiver = Transform(new_receiver); 486 new_receiver = Transform(new_receiver);
485 } 487 }
486 LocalVariable* result = AddToPreambleNewTempVar( 488 LocalVariable* result = AddToPreambleNewTempVar(
487 new(I) StaticGetterNode(node->token_pos(), 489 new(Z) StaticGetterNode(node->token_pos(),
488 new_receiver, 490 new_receiver,
489 node->is_super_getter(), 491 node->is_super_getter(),
490 node->cls(), 492 node->cls(),
491 node->field_name())); 493 node->field_name()));
492 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 494 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
493 } 495 }
494 496
495 497
496 void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) { 498 void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) {
497 AstNode* new_receiver = node->receiver(); 499 AstNode* new_receiver = node->receiver();
498 if (new_receiver != NULL) { 500 if (new_receiver != NULL) {
499 new_receiver = Transform(new_receiver); 501 new_receiver = Transform(new_receiver);
500 } 502 }
501 AstNode* new_value = Transform(node->value()); 503 AstNode* new_value = Transform(node->value());
502 LocalVariable* result = AddToPreambleNewTempVar( 504 LocalVariable* result = AddToPreambleNewTempVar(
503 new(I) StaticSetterNode(node->token_pos(), 505 new(Z) StaticSetterNode(node->token_pos(),
504 new_receiver, 506 new_receiver,
505 node->cls(), 507 node->cls(),
506 node->field_name(), 508 node->field_name(),
507 new_value)); 509 new_value));
508 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 510 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
509 } 511 }
510 512
511 513
512 void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) { 514 void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) {
513 LocalVariable* result = AddToPreambleNewTempVar( 515 LocalVariable* result = AddToPreambleNewTempVar(
514 new(I) LoadLocalNode(node->token_pos(), &node->local())); 516 new(Z) LoadLocalNode(node->token_pos(), &node->local()));
515 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 517 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
516 } 518 }
517 519
518 520
519 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) { 521 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
520 AstNode* new_value = Transform(node->value()); 522 AstNode* new_value = Transform(node->value());
521 LocalVariable* result = AddToPreambleNewTempVar( 523 LocalVariable* result = AddToPreambleNewTempVar(
522 new(I) StoreLocalNode(node->token_pos(), 524 new(Z) StoreLocalNode(node->token_pos(),
523 &node->local(), 525 &node->local(),
524 new_value)); 526 new_value));
525 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 527 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
526 } 528 }
527 529
528 530
529 void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) { 531 void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
530 LocalVariable* result = AddToPreambleNewTempVar( 532 LocalVariable* result = AddToPreambleNewTempVar(
531 new(I) LoadStaticFieldNode(node->token_pos(), 533 new(Z) LoadStaticFieldNode(node->token_pos(),
532 node->field())); 534 node->field()));
533 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 535 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
534 } 536 }
535 537
536 538
537 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) { 539 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
538 AstNode* new_value = Transform(node->value()); 540 AstNode* new_value = Transform(node->value());
539 LocalVariable* result = AddToPreambleNewTempVar( 541 LocalVariable* result = AddToPreambleNewTempVar(
540 new(I) StoreStaticFieldNode(node->token_pos(), 542 new(Z) StoreStaticFieldNode(node->token_pos(),
541 node->field(), 543 node->field(),
542 new_value)); 544 new_value));
543 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 545 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
544 } 546 }
545 547
546 548
547 void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) { 549 void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
548 AstNode* new_array = Transform(node->array()); 550 AstNode* new_array = Transform(node->array());
549 AstNode* new_index = Transform(node->index_expr()); 551 AstNode* new_index = Transform(node->index_expr());
550 LocalVariable* result = AddToPreambleNewTempVar( 552 LocalVariable* result = AddToPreambleNewTempVar(
551 new(I) LoadIndexedNode(node->token_pos(), 553 new(Z) LoadIndexedNode(node->token_pos(),
552 new_array, 554 new_array,
553 new_index, 555 new_index,
554 node->super_class())); 556 node->super_class()));
555 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 557 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
556 } 558 }
557 559
558 560
559 void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) { 561 void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) {
560 AstNode* new_array = Transform(node->array()); 562 AstNode* new_array = Transform(node->array());
561 AstNode* new_index = Transform(node->index_expr()); 563 AstNode* new_index = Transform(node->index_expr());
562 AstNode* new_value = Transform(node->value()); 564 AstNode* new_value = Transform(node->value());
563 LocalVariable* result = AddToPreambleNewTempVar( 565 LocalVariable* result = AddToPreambleNewTempVar(
564 new(I) StoreIndexedNode(node->token_pos(), 566 new(Z) StoreIndexedNode(node->token_pos(),
565 new_array, 567 new_array,
566 new_index, 568 new_index,
567 new_value, 569 new_value,
568 node->super_class())); 570 node->super_class()));
569 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 571 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
570 } 572 }
571 573
572 574
573 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) { 575 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
574 AstNode* new_expr = Transform(node->expr()); 576 AstNode* new_expr = Transform(node->expr());
575 LocalVariable* result = AddToPreambleNewTempVar( 577 LocalVariable* result = AddToPreambleNewTempVar(
576 new(I) AssignableNode(node->token_pos(), 578 new(Z) AssignableNode(node->token_pos(),
577 new_expr, 579 new_expr,
578 node->type(), 580 node->type(),
579 node->dst_name())); 581 node->dst_name()));
580 result_ = new(I) LoadLocalNode(Scanner::kNoSourcePos, result); 582 result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
581 } 583 }
582 584
583 585
584 void AwaitTransformer::VisitLetNode(LetNode* node) { 586 void AwaitTransformer::VisitLetNode(LetNode* node) {
585 // TODO(mlippautz): Check initializers and their temps. 587 // TODO(mlippautz): Check initializers and their temps.
586 LetNode* result = new(I) LetNode(node->token_pos()); 588 LetNode* result = new(Z) LetNode(node->token_pos());
587 for (intptr_t i = 0; i < node->nodes().length(); i++) { 589 for (intptr_t i = 0; i < node->nodes().length(); i++) {
588 result->AddNode(Transform(node->nodes()[i])); 590 result->AddNode(Transform(node->nodes()[i]));
589 } 591 }
590 result_ = result; 592 result_ = result;
591 } 593 }
592 594
593 595
594 void AwaitTransformer::VisitThrowNode(ThrowNode* node) { 596 void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
595 // TODO(mlippautz): Check if relevant. 597 // TODO(mlippautz): Check if relevant.
596 AstNode* new_exception = Transform(node->exception()); 598 AstNode* new_exception = Transform(node->exception());
597 AstNode* new_stacktrace = Transform(node->stacktrace()); 599 AstNode* new_stacktrace = Transform(node->stacktrace());
598 result_ = new(I) ThrowNode(node->token_pos(), 600 result_ = new(Z) ThrowNode(node->token_pos(),
599 new_exception, 601 new_exception,
600 new_stacktrace); 602 new_stacktrace);
601 } 603 }
602 604
603 } // namespace dart 605 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/ast_transformer.h ('k') | runtime/vm/base_isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698