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

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

Issue 1417733007: VM: Fix bug with ??= expressions using await. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: added test, addressed comments Created 5 years, 1 month 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 | « no previous file | runtime/vm/parser.cc » ('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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/flow_graph_builder.h" 5 #include "vm/flow_graph_builder.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "vm/ast_printer.h" 8 #include "vm/ast_printer.h"
9 #include "vm/bit_vector.h" 9 #include "vm/bit_vector.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 } else { 1331 } else {
1332 EffectGraphVisitor for_right(owner()); 1332 EffectGraphVisitor for_right(owner());
1333 node->right()->Visit(&for_right); 1333 node->right()->Visit(&for_right);
1334 if (node->kind() == Token::kAND) { 1334 if (node->kind() == Token::kAND) {
1335 Join(for_left, for_right, empty); 1335 Join(for_left, for_right, empty);
1336 } else { 1336 } else {
1337 Join(for_left, empty, for_right); 1337 Join(for_left, empty, for_right);
1338 } 1338 }
1339 } 1339 }
1340 return; 1340 return;
1341 } else if (node->kind() == Token::kIFNULL) {
1342 // left ?? right. This operation cannot be overloaded.
1343 // temp = left; temp === null ? right : temp
1344 ValueGraphVisitor for_left_value(owner());
1345 node->left()->Visit(&for_left_value);
1346 Append(for_left_value);
1347 Do(BuildStoreExprTemp(for_left_value.value()));
1348
1349 LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
1350 LoadLocalNode* load_temp =
1351 new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
1352 LiteralNode* null_constant =
1353 new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
1354 ComparisonNode* check_is_null =
1355 new(Z) ComparisonNode(Scanner::kNoSourcePos,
1356 Token::kEQ_STRICT,
1357 load_temp,
1358 null_constant);
1359 TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
1360 check_is_null->Visit(&for_test);
1361
1362 ValueGraphVisitor for_right_value(owner());
1363 node->right()->Visit(&for_right_value);
1364 for_right_value.Do(BuildStoreExprTemp(for_right_value.value()));
1365
1366 ValueGraphVisitor for_temp(owner());
1367 // Nothing to do, left value is already loaded into temp.
1368
1369 Join(for_test, for_right_value, for_temp);
1370 return;
1371 } 1341 }
1342 ASSERT(node->kind() != Token::kIFNULL);
1372 ValueGraphVisitor for_left_value(owner()); 1343 ValueGraphVisitor for_left_value(owner());
1373 node->left()->Visit(&for_left_value); 1344 node->left()->Visit(&for_left_value);
1374 Append(for_left_value); 1345 Append(for_left_value);
1375 PushArgumentInstr* push_left = PushArgument(for_left_value.value()); 1346 PushArgumentInstr* push_left = PushArgument(for_left_value.value());
1376 1347
1377 ValueGraphVisitor for_right_value(owner()); 1348 ValueGraphVisitor for_right_value(owner());
1378 node->right()->Visit(&for_right_value); 1349 node->right()->Visit(&for_right_value);
1379 Append(for_right_value); 1350 Append(for_right_value);
1380 PushArgumentInstr* push_right = PushArgument(for_right_value.value()); 1351 PushArgumentInstr* push_right = PushArgument(for_right_value.value());
1381 1352
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 Join(for_test, for_right, for_false); 1406 Join(for_test, for_right, for_false);
1436 } else { 1407 } else {
1437 ASSERT(node->kind() == Token::kOR); 1408 ASSERT(node->kind() == Token::kOR);
1438 ValueGraphVisitor for_true(owner()); 1409 ValueGraphVisitor for_true(owner());
1439 Value* constant_true = for_true.Bind(new(Z) ConstantInstr(Bool::True())); 1410 Value* constant_true = for_true.Bind(new(Z) ConstantInstr(Bool::True()));
1440 for_true.Do(BuildStoreExprTemp(constant_true)); 1411 for_true.Do(BuildStoreExprTemp(constant_true));
1441 Join(for_test, for_true, for_right); 1412 Join(for_test, for_true, for_right);
1442 } 1413 }
1443 ReturnDefinition(BuildLoadExprTemp()); 1414 ReturnDefinition(BuildLoadExprTemp());
1444 return; 1415 return;
1445 } else if (node->kind() == Token::kIFNULL) {
1446 // left ?? right. This operation cannot be overloaded.
1447 // temp = left; temp === null ? right : temp
1448 ValueGraphVisitor for_left_value(owner());
1449 node->left()->Visit(&for_left_value);
1450 Append(for_left_value);
1451 Do(BuildStoreExprTemp(for_left_value.value()));
1452
1453 LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
1454 LoadLocalNode* load_temp =
1455 new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
1456 LiteralNode* null_constant =
1457 new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
1458 ComparisonNode* check_is_null =
1459 new(Z) ComparisonNode(Scanner::kNoSourcePos,
1460 Token::kEQ_STRICT,
1461 load_temp,
1462 null_constant);
1463 TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
1464 check_is_null->Visit(&for_test);
1465
1466 ValueGraphVisitor for_right_value(owner());
1467 node->right()->Visit(&for_right_value);
1468 for_right_value.Do(BuildStoreExprTemp(for_right_value.value()));
1469
1470 ValueGraphVisitor for_temp(owner());
1471 // Nothing to do, left value is already loaded into temp.
1472
1473 Join(for_test, for_right_value, for_temp);
1474 ReturnDefinition(BuildLoadExprTemp());
1475 return;
1476 } 1416 }
1477 1417
1478 EffectGraphVisitor::VisitBinaryOpNode(node); 1418 EffectGraphVisitor::VisitBinaryOpNode(node);
1479 } 1419 }
1480 1420
1481 1421
1482 static const String& BinaryOpAndMaskName(BinaryOpNode* node) { 1422 static const String& BinaryOpAndMaskName(BinaryOpNode* node) {
1483 if (node->kind() == Token::kSHL) { 1423 if (node->kind() == Token::kSHL) {
1484 return Library::PrivateCoreLibName(Symbols::_leftShiftWithMask32()); 1424 return Library::PrivateCoreLibName(Symbols::_leftShiftWithMask32());
1485 } 1425 }
(...skipping 3187 matching lines...) Expand 10 before | Expand all | Expand 10 after
4673 Report::MessageF(Report::kBailout, 4613 Report::MessageF(Report::kBailout,
4674 Script::Handle(function.script()), 4614 Script::Handle(function.script()),
4675 function.token_pos(), 4615 function.token_pos(),
4676 "FlowGraphBuilder Bailout: %s %s", 4616 "FlowGraphBuilder Bailout: %s %s",
4677 String::Handle(function.name()).ToCString(), 4617 String::Handle(function.name()).ToCString(),
4678 reason); 4618 reason);
4679 UNREACHABLE(); 4619 UNREACHABLE();
4680 } 4620 }
4681 4621
4682 } // namespace dart 4622 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698