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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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
« no previous file with comments | « runtime/vm/ast_test.cc ('k') | runtime/vm/atomic.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 #include "vm/thread.h"
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 AwaitTransformer::AwaitTransformer(SequenceNode* preamble, 54 AwaitTransformer::AwaitTransformer(SequenceNode* preamble,
55 LocalScope* async_temp_scope) 55 LocalScope* async_temp_scope)
56 : preamble_(preamble), 56 : preamble_(preamble),
57 temp_cnt_(0), 57 temp_cnt_(0),
58 async_temp_scope_(async_temp_scope), 58 async_temp_scope_(async_temp_scope),
59 thread_(Thread::Current()) { 59 thread_(Thread::Current()) {
60 ASSERT(async_temp_scope_ != NULL); 60 ASSERT(async_temp_scope_ != NULL);
61 } 61 }
62 62
63
64 AstNode* AwaitTransformer::Transform(AstNode* expr) { 63 AstNode* AwaitTransformer::Transform(AstNode* expr) {
65 expr->Visit(this); 64 expr->Visit(this);
66 return result_; 65 return result_;
67 } 66 }
68 67
69
70 LocalVariable* AwaitTransformer::EnsureCurrentTempVar() { 68 LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
71 String& symbol = 69 String& symbol =
72 String::ZoneHandle(Z, Symbols::NewFormatted(T, "%d", temp_cnt_)); 70 String::ZoneHandle(Z, Symbols::NewFormatted(T, "%d", temp_cnt_));
73 symbol = Symbols::FromConcat(T, Symbols::AwaitTempVarPrefix(), symbol); 71 symbol = Symbols::FromConcat(T, Symbols::AwaitTempVarPrefix(), symbol);
74 ASSERT(!symbol.IsNull()); 72 ASSERT(!symbol.IsNull());
75 // Look up the variable in the scope used for async temp variables. 73 // Look up the variable in the scope used for async temp variables.
76 LocalVariable* await_tmp = async_temp_scope_->LocalLookupVariable(symbol); 74 LocalVariable* await_tmp = async_temp_scope_->LocalLookupVariable(symbol);
77 if (await_tmp == NULL) { 75 if (await_tmp == NULL) {
78 // We need a new temp variable; add it to the function's top scope. 76 // We need a new temp variable; add it to the function's top scope.
79 await_tmp = new (Z) 77 await_tmp = new (Z)
80 LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource, 78 LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
81 symbol, Object::dynamic_type()); 79 symbol, Object::dynamic_type());
82 async_temp_scope_->AddVariable(await_tmp); 80 async_temp_scope_->AddVariable(await_tmp);
83 // After adding it to the top scope, we can look it up from the preamble. 81 // After adding it to the top scope, we can look it up from the preamble.
84 // The following call includes an ASSERT check. 82 // The following call includes an ASSERT check.
85 await_tmp = GetVariableInScope(preamble_->scope(), symbol); 83 await_tmp = GetVariableInScope(preamble_->scope(), symbol);
86 } 84 }
87 return await_tmp; 85 return await_tmp;
88 } 86 }
89 87
90
91 LocalVariable* AwaitTransformer::GetVariableInScope(LocalScope* scope, 88 LocalVariable* AwaitTransformer::GetVariableInScope(LocalScope* scope,
92 const String& symbol) { 89 const String& symbol) {
93 LocalVariable* var = scope->LookupVariable(symbol, false); 90 LocalVariable* var = scope->LookupVariable(symbol, false);
94 ASSERT(var != NULL); 91 ASSERT(var != NULL);
95 return var; 92 return var;
96 } 93 }
97 94
98
99 LocalVariable* AwaitTransformer::AddNewTempVarToPreamble( 95 LocalVariable* AwaitTransformer::AddNewTempVarToPreamble(
100 AstNode* node, 96 AstNode* node,
101 TokenPosition token_pos) { 97 TokenPosition token_pos) {
102 LocalVariable* tmp_var = EnsureCurrentTempVar(); 98 LocalVariable* tmp_var = EnsureCurrentTempVar();
103 ASSERT(token_pos.IsSynthetic() || token_pos.IsNoSource()); 99 ASSERT(token_pos.IsSynthetic() || token_pos.IsNoSource());
104 preamble_->Add(new (Z) StoreLocalNode(token_pos, tmp_var, node)); 100 preamble_->Add(new (Z) StoreLocalNode(token_pos, tmp_var, node));
105 NextTempVar(); 101 NextTempVar();
106 return tmp_var; 102 return tmp_var;
107 } 103 }
108 104
109
110 LoadLocalNode* AwaitTransformer::MakeName(AstNode* node) { 105 LoadLocalNode* AwaitTransformer::MakeName(AstNode* node) {
111 LocalVariable* temp = AddNewTempVarToPreamble(node, ST(node->token_pos())); 106 LocalVariable* temp = AddNewTempVarToPreamble(node, ST(node->token_pos()));
112 return new (Z) LoadLocalNode(ST(node->token_pos()), temp); 107 return new (Z) LoadLocalNode(ST(node->token_pos()), temp);
113 } 108 }
114 109
115
116 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) { 110 void AwaitTransformer::VisitLiteralNode(LiteralNode* node) {
117 result_ = node; 111 result_ = node;
118 } 112 }
119 113
120
121 void AwaitTransformer::VisitTypeNode(TypeNode* node) { 114 void AwaitTransformer::VisitTypeNode(TypeNode* node) {
122 if (node->is_deferred_reference()) { 115 if (node->is_deferred_reference()) {
123 // Deferred references must use a temporary even after loading 116 // Deferred references must use a temporary even after loading
124 // happened, so that the number of await temps is the same as 117 // happened, so that the number of await temps is the same as
125 // before the loading. 118 // before the loading.
126 result_ = MakeName(node); 119 result_ = MakeName(node);
127 } else { 120 } else {
128 result_ = node; 121 result_ = node;
129 } 122 }
130 } 123 }
131 124
132
133 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { 125 void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
134 // Await transformation: 126 // Await transformation:
135 // 127 //
136 // :await_temp_var_X = <expr>; 128 // :await_temp_var_X = <expr>;
137 // AwaitMarker(kNewContinuationState); 129 // AwaitMarker(kNewContinuationState);
138 // :result_param = _awaitHelper( 130 // :result_param = _awaitHelper(
139 // :await_temp_var_X, 131 // :await_temp_var_X,
140 // :async_then_callback, 132 // :async_then_callback,
141 // :async_catch_error_callback, 133 // :async_catch_error_callback,
142 // :async_op); 134 // :async_op);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 209
218 LoadLocalNode* load_error_param = 210 LoadLocalNode* load_error_param =
219 new (Z) LoadLocalNode(token_pos, error_param); 211 new (Z) LoadLocalNode(token_pos, error_param);
220 LoadLocalNode* load_stack_trace_param = 212 LoadLocalNode* load_stack_trace_param =
221 new (Z) LoadLocalNode(token_pos, stack_trace_param); 213 new (Z) LoadLocalNode(token_pos, stack_trace_param);
222 SequenceNode* error_ne_null_branch = 214 SequenceNode* error_ne_null_branch =
223 new (Z) SequenceNode(token_pos, ChainNewScope(preamble_->scope())); 215 new (Z) SequenceNode(token_pos, ChainNewScope(preamble_->scope()));
224 error_ne_null_branch->Add( 216 error_ne_null_branch->Add(
225 new (Z) ThrowNode(token_pos, load_error_param, load_stack_trace_param)); 217 new (Z) ThrowNode(token_pos, load_error_param, load_stack_trace_param));
226 preamble_->Add(new (Z) IfNode( 218 preamble_->Add(new (Z) IfNode(
227 token_pos, new (Z) ComparisonNode( 219 token_pos,
228 token_pos, Token::kNE, load_error_param, 220 new (Z) ComparisonNode(
229 new (Z) LiteralNode(token_pos, Object::null_instance())), 221 token_pos, Token::kNE, load_error_param,
222 new (Z) LiteralNode(token_pos, Object::null_instance())),
230 error_ne_null_branch, NULL)); 223 error_ne_null_branch, NULL));
231 224
232 result_ = MakeName(new (Z) LoadLocalNode(token_pos, result_param)); 225 result_ = MakeName(new (Z) LoadLocalNode(token_pos, result_param));
233 } 226 }
234 227
235
236 // Transforms boolean expressions into a sequence of evaluations that only 228 // Transforms boolean expressions into a sequence of evaluations that only
237 // lazily evaluate subexpressions. 229 // lazily evaluate subexpressions.
238 // 230 //
239 // Example: 231 // Example:
240 // 232 //
241 // (a || b) only evaluates b if a is false 233 // (a || b) only evaluates b if a is false
242 // 234 //
243 // Transformation (roughly): 235 // Transformation (roughly):
244 // 236 //
245 // t_1 = a; 237 // t_1 = a;
(...skipping 18 matching lines...) Expand all
264 IfNode* right_body = new (Z) 256 IfNode* right_body = new (Z)
265 IfNode(ST(new_left->token_pos()), 257 IfNode(ST(new_left->token_pos()),
266 new (Z) ComparisonNode( 258 new (Z) ComparisonNode(
267 ST(new_left->token_pos()), compare_logical_op, new_left, 259 ST(new_left->token_pos()), compare_logical_op, new_left,
268 new (Z) LiteralNode(ST(new_left->token_pos()), Bool::True())), 260 new (Z) LiteralNode(ST(new_left->token_pos()), Bool::True())),
269 eval, NULL); 261 eval, NULL);
270 preamble_->Add(right_body); 262 preamble_->Add(right_body);
271 return result; 263 return result;
272 } 264 }
273 265
274
275 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) { 266 LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) {
276 return new (Z) 267 return new (Z)
277 LocalScope(parent, parent->function_level(), parent->loop_level()); 268 LocalScope(parent, parent->function_level(), parent->loop_level());
278 } 269 }
279 270
280
281 void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) { 271 void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) {
282 AstNode* new_left = Transform(node->left()); 272 AstNode* new_left = Transform(node->left());
283 AstNode* new_right = NULL; 273 AstNode* new_right = NULL;
284 // Preserve lazy evaluation. 274 // Preserve lazy evaluation.
285 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) { 275 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
286 new_right = LazyTransform(node->kind(), new_left, node->right()); 276 new_right = LazyTransform(node->kind(), new_left, node->right());
287 } else { 277 } else {
288 new_right = Transform(node->right()); 278 new_right = Transform(node->right());
289 } 279 }
290 result_ = MakeName(new (Z) BinaryOpNode(node->token_pos(), node->kind(), 280 result_ = MakeName(new (Z) BinaryOpNode(node->token_pos(), node->kind(),
291 new_left, new_right)); 281 new_left, new_right));
292 } 282 }
293 283
294
295 void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) { 284 void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
296 AstNode* new_left = Transform(node->left()); 285 AstNode* new_left = Transform(node->left());
297 AstNode* new_right = Transform(node->right()); 286 AstNode* new_right = Transform(node->right());
298 result_ = MakeName(new (Z) ComparisonNode(node->token_pos(), node->kind(), 287 result_ = MakeName(new (Z) ComparisonNode(node->token_pos(), node->kind(),
299 new_left, new_right)); 288 new_left, new_right));
300 } 289 }
301 290
302
303 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) { 291 void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
304 AstNode* new_operand = Transform(node->operand()); 292 AstNode* new_operand = Transform(node->operand());
305 result_ = MakeName( 293 result_ = MakeName(
306 new (Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand)); 294 new (Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
307 } 295 }
308 296
309
310 // ::= (<condition>) ? <true-branch> : <false-branch> 297 // ::= (<condition>) ? <true-branch> : <false-branch>
311 // 298 //
312 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) { 299 void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
313 AstNode* new_condition = Transform(node->condition()); 300 AstNode* new_condition = Transform(node->condition());
314 SequenceNode* new_true = new (Z) SequenceNode( 301 SequenceNode* new_true = new (Z) SequenceNode(
315 ST(node->true_expr()->token_pos()), ChainNewScope(preamble_->scope())); 302 ST(node->true_expr()->token_pos()), ChainNewScope(preamble_->scope()));
316 SequenceNode* saved_preamble = preamble_; 303 SequenceNode* saved_preamble = preamble_;
317 preamble_ = new_true; 304 preamble_ = new_true;
318 AstNode* new_true_result = Transform(node->true_expr()); 305 AstNode* new_true_result = Transform(node->true_expr());
319 SequenceNode* new_false = new (Z) SequenceNode( 306 SequenceNode* new_false = new (Z) SequenceNode(
320 ST(node->false_expr()->token_pos()), ChainNewScope(preamble_->scope())); 307 ST(node->false_expr()->token_pos()), ChainNewScope(preamble_->scope()));
321 preamble_ = new_false; 308 preamble_ = new_false;
322 AstNode* new_false_result = Transform(node->false_expr()); 309 AstNode* new_false_result = Transform(node->false_expr());
323 preamble_ = saved_preamble; 310 preamble_ = saved_preamble;
324 IfNode* new_if = 311 IfNode* new_if =
325 new (Z) IfNode(ST(node->token_pos()), new_condition, new_true, new_false); 312 new (Z) IfNode(ST(node->token_pos()), new_condition, new_true, new_false);
326 preamble_->Add(new_if); 313 preamble_->Add(new_if);
327 result_ = MakeName(new (Z) ConditionalExprNode( 314 result_ = MakeName(new (Z) ConditionalExprNode(
328 ST(node->token_pos()), new_condition, new_true_result, new_false_result)); 315 ST(node->token_pos()), new_condition, new_true_result, new_false_result));
329 } 316 }
330 317
331
332 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) { 318 void AwaitTransformer::VisitArgumentListNode(ArgumentListNode* node) {
333 ArgumentListNode* new_args = new (Z) ArgumentListNode(node->token_pos()); 319 ArgumentListNode* new_args = new (Z) ArgumentListNode(node->token_pos());
334 for (intptr_t i = 0; i < node->length(); i++) { 320 for (intptr_t i = 0; i < node->length(); i++) {
335 new_args->Add(Transform(node->NodeAt(i))); 321 new_args->Add(Transform(node->NodeAt(i)));
336 } 322 }
337 new_args->set_names(node->names()); 323 new_args->set_names(node->names());
338 result_ = new_args; 324 result_ = new_args;
339 } 325 }
340 326
341
342 void AwaitTransformer::VisitArrayNode(ArrayNode* node) { 327 void AwaitTransformer::VisitArrayNode(ArrayNode* node) {
343 GrowableArray<AstNode*> new_elements; 328 GrowableArray<AstNode*> new_elements;
344 for (intptr_t i = 0; i < node->length(); i++) { 329 for (intptr_t i = 0; i < node->length(); i++) {
345 new_elements.Add(Transform(node->ElementAt(i))); 330 new_elements.Add(Transform(node->ElementAt(i)));
346 } 331 }
347 result_ = new (Z) ArrayNode(node->token_pos(), node->type(), new_elements); 332 result_ = new (Z) ArrayNode(node->token_pos(), node->type(), new_elements);
348 } 333 }
349 334
350
351 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) { 335 void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
352 ArrayNode* new_value = Transform(node->value())->AsArrayNode(); 336 ArrayNode* new_value = Transform(node->value())->AsArrayNode();
353 result_ = 337 result_ =
354 MakeName(new (Z) StringInterpolateNode(node->token_pos(), new_value)); 338 MakeName(new (Z) StringInterpolateNode(node->token_pos(), new_value));
355 } 339 }
356 340
357
358 void AwaitTransformer::VisitClosureNode(ClosureNode* node) { 341 void AwaitTransformer::VisitClosureNode(ClosureNode* node) {
359 AstNode* new_receiver = node->receiver(); 342 AstNode* new_receiver = node->receiver();
360 if (new_receiver != NULL) { 343 if (new_receiver != NULL) {
361 new_receiver = Transform(new_receiver); 344 new_receiver = Transform(new_receiver);
362 } 345 }
363 result_ = MakeName(new (Z) ClosureNode(node->token_pos(), node->function(), 346 result_ = MakeName(new (Z) ClosureNode(node->token_pos(), node->function(),
364 new_receiver, node->scope())); 347 new_receiver, node->scope()));
365 } 348 }
366 349
367
368 void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) { 350 void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) {
369 AstNode* new_receiver = Transform(node->receiver()); 351 AstNode* new_receiver = Transform(node->receiver());
370 ArgumentListNode* new_args = 352 ArgumentListNode* new_args =
371 Transform(node->arguments())->AsArgumentListNode(); 353 Transform(node->arguments())->AsArgumentListNode();
372 result_ = MakeName(new (Z) InstanceCallNode(node->token_pos(), new_receiver, 354 result_ = MakeName(new (Z) InstanceCallNode(node->token_pos(), new_receiver,
373 node->function_name(), new_args, 355 node->function_name(), new_args,
374 node->is_conditional())); 356 node->is_conditional()));
375 } 357 }
376 358
377
378 void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) { 359 void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
379 ArgumentListNode* new_args = 360 ArgumentListNode* new_args =
380 Transform(node->arguments())->AsArgumentListNode(); 361 Transform(node->arguments())->AsArgumentListNode();
381 result_ = MakeName( 362 result_ = MakeName(
382 new (Z) StaticCallNode(node->token_pos(), node->function(), new_args)); 363 new (Z) StaticCallNode(node->token_pos(), node->function(), new_args));
383 } 364 }
384 365
385
386 void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) { 366 void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
387 ArgumentListNode* new_args = 367 ArgumentListNode* new_args =
388 Transform(node->arguments())->AsArgumentListNode(); 368 Transform(node->arguments())->AsArgumentListNode();
389 result_ = MakeName( 369 result_ = MakeName(
390 new (Z) ConstructorCallNode(node->token_pos(), node->type_arguments(), 370 new (Z) ConstructorCallNode(node->token_pos(), node->type_arguments(),
391 node->constructor(), new_args)); 371 node->constructor(), new_args));
392 } 372 }
393 373
394
395 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) { 374 void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
396 AstNode* new_receiver = Transform(node->receiver()); 375 AstNode* new_receiver = Transform(node->receiver());
397 result_ = MakeName(new (Z) InstanceGetterNode(node->token_pos(), new_receiver, 376 result_ = MakeName(new (Z) InstanceGetterNode(node->token_pos(), new_receiver,
398 node->field_name(), 377 node->field_name(),
399 node->is_conditional())); 378 node->is_conditional()));
400 } 379 }
401 380
402
403 void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) { 381 void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) {
404 AstNode* new_receiver = node->receiver(); 382 AstNode* new_receiver = node->receiver();
405 if (new_receiver != NULL) { 383 if (new_receiver != NULL) {
406 new_receiver = Transform(new_receiver); 384 new_receiver = Transform(new_receiver);
407 } 385 }
408 AstNode* new_value = Transform(node->value()); 386 AstNode* new_value = Transform(node->value());
409 result_ = MakeName(new (Z) InstanceSetterNode(node->token_pos(), new_receiver, 387 result_ = MakeName(new (Z) InstanceSetterNode(node->token_pos(), new_receiver,
410 node->field_name(), new_value, 388 node->field_name(), new_value,
411 node->is_conditional())); 389 node->is_conditional()));
412 } 390 }
413 391
414
415 void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) { 392 void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) {
416 AstNode* new_receiver = node->receiver(); 393 AstNode* new_receiver = node->receiver();
417 if (new_receiver != NULL) { 394 if (new_receiver != NULL) {
418 new_receiver = Transform(new_receiver); 395 new_receiver = Transform(new_receiver);
419 } 396 }
420 StaticGetterNode* new_getter = new (Z) StaticGetterNode( 397 StaticGetterNode* new_getter = new (Z) StaticGetterNode(
421 node->token_pos(), new_receiver, node->cls(), node->field_name()); 398 node->token_pos(), new_receiver, node->cls(), node->field_name());
422 new_getter->set_owner(node->owner()); 399 new_getter->set_owner(node->owner());
423 result_ = MakeName(new_getter); 400 result_ = MakeName(new_getter);
424 } 401 }
425 402
426
427 void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) { 403 void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) {
428 AstNode* new_receiver = node->receiver(); 404 AstNode* new_receiver = node->receiver();
429 if (new_receiver != NULL) { 405 if (new_receiver != NULL) {
430 new_receiver = Transform(new_receiver); 406 new_receiver = Transform(new_receiver);
431 } 407 }
432 AstNode* new_value = Transform(node->value()); 408 AstNode* new_value = Transform(node->value());
433 StaticSetterNode* new_setter = 409 StaticSetterNode* new_setter =
434 node->function().IsNull() 410 node->function().IsNull()
435 ? new (Z) StaticSetterNode(node->token_pos(), new_receiver, 411 ? new (Z) StaticSetterNode(node->token_pos(), new_receiver,
436 node->cls(), node->field_name(), new_value) 412 node->cls(), node->field_name(), new_value)
437 : new (Z) StaticSetterNode(node->token_pos(), new_receiver, 413 : new (Z) StaticSetterNode(node->token_pos(), new_receiver,
438 node->field_name(), node->function(), 414 node->field_name(), node->function(),
439 new_value); 415 new_value);
440 416
441 result_ = MakeName(new_setter); 417 result_ = MakeName(new_setter);
442 } 418 }
443 419
444
445 void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) { 420 void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) {
446 result_ = MakeName(node); 421 result_ = MakeName(node);
447 } 422 }
448 423
449
450 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) { 424 void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
451 AstNode* new_value = Transform(node->value()); 425 AstNode* new_value = Transform(node->value());
452 result_ = MakeName( 426 result_ = MakeName(
453 new (Z) StoreLocalNode(node->token_pos(), &node->local(), new_value)); 427 new (Z) StoreLocalNode(node->token_pos(), &node->local(), new_value));
454 } 428 }
455 429
456
457 void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) { 430 void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
458 result_ = MakeName(node); 431 result_ = MakeName(node);
459 } 432 }
460 433
461
462 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) { 434 void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
463 AstNode* new_value = Transform(node->value()); 435 AstNode* new_value = Transform(node->value());
464 result_ = MakeName(new (Z) StoreStaticFieldNode( 436 result_ = MakeName(new (Z) StoreStaticFieldNode(
465 node->token_pos(), Field::ZoneHandle(Z, node->field().Original()), 437 node->token_pos(), Field::ZoneHandle(Z, node->field().Original()),
466 new_value)); 438 new_value));
467 } 439 }
468 440
469
470 void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) { 441 void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
471 AstNode* new_array = Transform(node->array()); 442 AstNode* new_array = Transform(node->array());
472 AstNode* new_index = Transform(node->index_expr()); 443 AstNode* new_index = Transform(node->index_expr());
473 result_ = MakeName(new (Z) LoadIndexedNode(node->token_pos(), new_array, 444 result_ = MakeName(new (Z) LoadIndexedNode(node->token_pos(), new_array,
474 new_index, node->super_class())); 445 new_index, node->super_class()));
475 } 446 }
476 447
477
478 void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) { 448 void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) {
479 AstNode* new_array = Transform(node->array()); 449 AstNode* new_array = Transform(node->array());
480 AstNode* new_index = Transform(node->index_expr()); 450 AstNode* new_index = Transform(node->index_expr());
481 AstNode* new_value = Transform(node->value()); 451 AstNode* new_value = Transform(node->value());
482 result_ = MakeName(new (Z) StoreIndexedNode( 452 result_ = MakeName(new (Z) StoreIndexedNode(
483 node->token_pos(), new_array, new_index, new_value, node->super_class())); 453 node->token_pos(), new_array, new_index, new_value, node->super_class()));
484 } 454 }
485 455
486
487 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) { 456 void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
488 AstNode* new_expr = Transform(node->expr()); 457 AstNode* new_expr = Transform(node->expr());
489 result_ = MakeName(new (Z) AssignableNode(node->token_pos(), new_expr, 458 result_ = MakeName(new (Z) AssignableNode(node->token_pos(), new_expr,
490 node->type(), node->dst_name())); 459 node->type(), node->dst_name()));
491 } 460 }
492 461
493
494 void AwaitTransformer::VisitLetNode(LetNode* node) { 462 void AwaitTransformer::VisitLetNode(LetNode* node) {
495 // Add all the initializer nodes to the preamble and the 463 // Add all the initializer nodes to the preamble and the
496 // temporary variables to the scope for async temporary variables. 464 // temporary variables to the scope for async temporary variables.
497 // The temporary variables will be captured as a side effect of being 465 // The temporary variables will be captured as a side effect of being
498 // added to a scope, and the subsequent nodes that are added to the 466 // added to a scope, and the subsequent nodes that are added to the
499 // preample can access them. 467 // preample can access them.
500 for (intptr_t i = 0; i < node->num_temps(); i++) { 468 for (intptr_t i = 0; i < node->num_temps(); i++) {
501 async_temp_scope_->AddVariable(node->TempAt(i)); 469 async_temp_scope_->AddVariable(node->TempAt(i));
502 AstNode* new_init_val = Transform(node->InitializerAt(i)); 470 AstNode* new_init_val = Transform(node->InitializerAt(i));
503 preamble_->Add(new (Z) StoreLocalNode(node->token_pos(), node->TempAt(i), 471 preamble_->Add(new (Z) StoreLocalNode(node->token_pos(), node->TempAt(i),
504 new_init_val)); 472 new_init_val));
505 } 473 }
506 474
507 // Add all expressions but the last to the preamble. We must do 475 // Add all expressions but the last to the preamble. We must do
508 // this because subexpressions of the awaitable expression we 476 // this because subexpressions of the awaitable expression we
509 // are currently transforming may depend on each other, 477 // are currently transforming may depend on each other,
510 // e.g. await foo(a++, a++). Thus we must preserve the order of the 478 // e.g. await foo(a++, a++). Thus we must preserve the order of the
511 // transformed subexpressions. 479 // transformed subexpressions.
512 for (intptr_t i = 0; i < node->nodes().length() - 1; i++) { 480 for (intptr_t i = 0; i < node->nodes().length() - 1; i++) {
513 preamble_->Add(Transform(node->nodes()[i])); 481 preamble_->Add(Transform(node->nodes()[i]));
514 } 482 }
515 483
516 // The last expression in the let node is the value of the node. 484 // The last expression in the let node is the value of the node.
517 // The result of the transformed let node is this expression. 485 // The result of the transformed let node is this expression.
518 ASSERT(node->nodes().length() > 0); 486 ASSERT(node->nodes().length() > 0);
519 const intptr_t last_node_index = node->nodes().length() - 1; 487 const intptr_t last_node_index = node->nodes().length() - 1;
520 result_ = Transform(node->nodes()[last_node_index]); 488 result_ = Transform(node->nodes()[last_node_index]);
521 } 489 }
522 490
523
524 void AwaitTransformer::VisitThrowNode(ThrowNode* node) { 491 void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
525 AstNode* new_exception = Transform(node->exception()); 492 AstNode* new_exception = Transform(node->exception());
526 result_ = MakeName( 493 result_ = MakeName(
527 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace())); 494 new (Z) ThrowNode(node->token_pos(), new_exception, node->stacktrace()));
528 } 495 }
529 496
530 } // namespace dart 497 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/ast_test.cc ('k') | runtime/vm/atomic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698