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

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

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: Created 3 years, 7 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
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 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 } 1133 }
1134 1134
1135 if (FLAG_causal_async_stacks && 1135 if (FLAG_causal_async_stacks &&
1136 (function.IsAsyncClosure() || function.IsAsyncGenClosure())) { 1136 (function.IsAsyncClosure() || function.IsAsyncGenClosure())) {
1137 // We are returning from an asynchronous closure. Before we do that, be 1137 // We are returning from an asynchronous closure. Before we do that, be
1138 // sure to clear the thread's asynchronous stack trace. 1138 // sure to clear the thread's asynchronous stack trace.
1139 const Function& async_clear_thread_stack_trace = Function::ZoneHandle( 1139 const Function& async_clear_thread_stack_trace = Function::ZoneHandle(
1140 Z, isolate()->object_store()->async_clear_thread_stack_trace()); 1140 Z, isolate()->object_store()->async_clear_thread_stack_trace());
1141 ZoneGrowableArray<PushArgumentInstr*>* no_arguments = 1141 ZoneGrowableArray<PushArgumentInstr*>* no_arguments =
1142 new (Z) ZoneGrowableArray<PushArgumentInstr*>(0); 1142 new (Z) ZoneGrowableArray<PushArgumentInstr*>(0);
1143 StaticCallInstr* call_async_clear_thread_stack_trace = new (Z) 1143 const int kTypeArgsLen = 0;
1144 StaticCallInstr(node->token_pos().ToSynthetic(), 1144 StaticCallInstr* call_async_clear_thread_stack_trace =
1145 async_clear_thread_stack_trace, Object::null_array(), 1145 new (Z) StaticCallInstr(node->token_pos().ToSynthetic(),
1146 no_arguments, owner()->ic_data_array()); 1146 async_clear_thread_stack_trace, kTypeArgsLen,
1147 Object::null_array(), no_arguments,
1148 owner()->ic_data_array());
1147 Do(call_async_clear_thread_stack_trace); 1149 Do(call_async_clear_thread_stack_trace);
1148 } 1150 }
1149 1151
1150 // Async functions contain two types of return statements: 1152 // Async functions contain two types of return statements:
1151 // 1) Returns that should complete the completer once all finally blocks have 1153 // 1) Returns that should complete the completer once all finally blocks have
1152 // been inlined (call: :async_completer.complete(return_value)). These 1154 // been inlined (call: :async_completer.complete(return_value)). These
1153 // returns end up returning null in the end. 1155 // returns end up returning null in the end.
1154 // 2) "Continuation" returns that should not complete the completer but return 1156 // 2) "Continuation" returns that should not complete the completer but return
1155 // the value. 1157 // the value.
1156 // 1158 //
(...skipping 11 matching lines...) Expand all
1168 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 1170 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
1169 Value* rcv_value = Bind(BuildLoadLocal(*rcv_var, node->token_pos())); 1171 Value* rcv_value = Bind(BuildLoadLocal(*rcv_var, node->token_pos()));
1170 arguments->Add(PushArgument(rcv_value)); 1172 arguments->Add(PushArgument(rcv_value));
1171 Value* returned_value = Bind(BuildLoadExprTemp(node->token_pos())); 1173 Value* returned_value = Bind(BuildLoadExprTemp(node->token_pos()));
1172 arguments->Add(PushArgument(returned_value)); 1174 arguments->Add(PushArgument(returned_value));
1173 // Call a helper function to complete the completer. The debugger 1175 // Call a helper function to complete the completer. The debugger
1174 // uses the helper function to know when to step-out. 1176 // uses the helper function to know when to step-out.
1175 const Function& complete_on_async_return = Function::ZoneHandle( 1177 const Function& complete_on_async_return = Function::ZoneHandle(
1176 Z, isolate()->object_store()->complete_on_async_return()); 1178 Z, isolate()->object_store()->complete_on_async_return());
1177 ASSERT(!complete_on_async_return.IsNull()); 1179 ASSERT(!complete_on_async_return.IsNull());
1180 const int kTypeArgsLen = 0;
1178 StaticCallInstr* call = new (Z) StaticCallInstr( 1181 StaticCallInstr* call = new (Z) StaticCallInstr(
1179 node->token_pos().ToSynthetic(), complete_on_async_return, 1182 node->token_pos().ToSynthetic(), complete_on_async_return, kTypeArgsLen,
1180 Object::null_array(), arguments, owner()->ic_data_array()); 1183 Object::null_array(), arguments, owner()->ic_data_array());
1181 Do(call); 1184 Do(call);
1182 1185
1183 // Rebind the return value for the actual return call to be null. 1186 // Rebind the return value for the actual return call to be null.
1184 return_value = BuildNullValue(node->token_pos()); 1187 return_value = BuildNullValue(node->token_pos());
1185 } 1188 }
1186 1189
1187 intptr_t current_context_level = owner()->context_level(); 1190 intptr_t current_context_level = owner()->context_level();
1188 ASSERT(current_context_level >= 0); 1191 ASSERT(current_context_level >= 0);
1189 if (HasContextScope()) { 1192 if (HasContextScope()) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 ValueGraphVisitor for_right_value(owner()); 1358 ValueGraphVisitor for_right_value(owner());
1356 node->right()->Visit(&for_right_value); 1359 node->right()->Visit(&for_right_value);
1357 Append(for_right_value); 1360 Append(for_right_value);
1358 PushArgumentInstr* push_right = PushArgument(for_right_value.value()); 1361 PushArgumentInstr* push_right = PushArgument(for_right_value.value());
1359 1362
1360 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1363 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1361 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 1364 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
1362 arguments->Add(push_left); 1365 arguments->Add(push_left);
1363 arguments->Add(push_right); 1366 arguments->Add(push_right);
1364 const String& name = Symbols::Token(node->kind()); 1367 const String& name = Symbols::Token(node->kind());
1368 const intptr_t kTypeArgsLen = 0;
1365 const intptr_t kNumArgsChecked = 2; 1369 const intptr_t kNumArgsChecked = 2;
1366 InstanceCallInstr* call = new (Z) InstanceCallInstr( 1370 InstanceCallInstr* call = new (Z) InstanceCallInstr(
1367 node->token_pos(), name, node->kind(), arguments, Object::null_array(), 1371 node->token_pos(), name, node->kind(), arguments, kTypeArgsLen,
1368 kNumArgsChecked, owner()->ic_data_array()); 1372 Object::null_array(), kNumArgsChecked, owner()->ic_data_array());
1369 ReturnDefinition(call); 1373 ReturnDefinition(call);
1370 } 1374 }
1371 1375
1372 1376
1373 // Special handling for AND/OR. 1377 // Special handling for AND/OR.
1374 void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) { 1378 void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
1375 // Operators "&&" and "||" cannot be overloaded therefore do not call 1379 // Operators "&&" and "||" cannot be overloaded therefore do not call
1376 // operator. 1380 // operator.
1377 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) { 1381 if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
1378 // Implement short-circuit logic: do not evaluate right if evaluation 1382 // Implement short-circuit logic: do not evaluate right if evaluation
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 1520
1517 // We now know type is a real class (!num, !int, !smi, !string) 1521 // We now know type is a real class (!num, !int, !smi, !string)
1518 // and the type check could NOT be removed at compile time. 1522 // and the type check could NOT be removed at compile time.
1519 PushArgumentInstr* push_left = PushArgument(for_left_value.value()); 1523 PushArgumentInstr* push_left = PushArgument(for_left_value.value());
1520 if (FlowGraphBuilder::SimpleInstanceOfType(type)) { 1524 if (FlowGraphBuilder::SimpleInstanceOfType(type)) {
1521 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1525 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1522 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 1526 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
1523 arguments->Add(push_left); 1527 arguments->Add(push_left);
1524 Value* type_const = Bind(new (Z) ConstantInstr(type)); 1528 Value* type_const = Bind(new (Z) ConstantInstr(type));
1525 arguments->Add(PushArgument(type_const)); 1529 arguments->Add(PushArgument(type_const));
1530 const intptr_t kTypeArgsLen = 0;
1526 const intptr_t kNumArgsChecked = 2; 1531 const intptr_t kNumArgsChecked = 2;
1527 Definition* result = new (Z) InstanceCallInstr( 1532 Definition* result = new (Z) InstanceCallInstr(
1528 node->token_pos(), 1533 node->token_pos(),
1529 Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()), node->kind(), 1534 Library::PrivateCoreLibName(Symbols::_simpleInstanceOf()), node->kind(),
1530 arguments, 1535 arguments, kTypeArgsLen,
1531 Object::null_array(), // No argument names. 1536 Object::null_array(), // No argument names.
1532 kNumArgsChecked, owner()->ic_data_array()); 1537 kNumArgsChecked, owner()->ic_data_array());
1533 if (negate_result) { 1538 if (negate_result) {
1534 result = new (Z) BooleanNegateInstr(Bind(result)); 1539 result = new (Z) BooleanNegateInstr(Bind(result));
1535 } 1540 }
1536 ReturnDefinition(result); 1541 ReturnDefinition(result);
1537 return; 1542 return;
1538 } 1543 }
1539 1544
1540 PushArgumentInstr* push_instantiator_type_args = 1545 PushArgumentInstr* push_instantiator_type_args =
1541 PushInstantiatorTypeArguments(type, node->token_pos()); 1546 PushInstantiatorTypeArguments(type, node->token_pos());
1542 PushArgumentInstr* push_function_type_args = 1547 PushArgumentInstr* push_function_type_args =
1543 PushFunctionTypeArguments(type, node->token_pos()); 1548 PushFunctionTypeArguments(type, node->token_pos());
1544 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1549 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1545 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4); 1550 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
1546 arguments->Add(push_left); 1551 arguments->Add(push_left);
1547 arguments->Add(push_instantiator_type_args); 1552 arguments->Add(push_instantiator_type_args);
1548 arguments->Add(push_function_type_args); 1553 arguments->Add(push_function_type_args);
1549 Value* type_const = Bind(new (Z) ConstantInstr(type)); 1554 Value* type_const = Bind(new (Z) ConstantInstr(type));
1550 arguments->Add(PushArgument(type_const)); 1555 arguments->Add(PushArgument(type_const));
1556 const intptr_t kTypeArgsLen = 0;
1551 const intptr_t kNumArgsChecked = 1; 1557 const intptr_t kNumArgsChecked = 1;
1552 Definition* result = new (Z) InstanceCallInstr( 1558 Definition* result = new (Z) InstanceCallInstr(
1553 node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()), 1559 node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()),
1554 node->kind(), arguments, 1560 node->kind(), arguments, kTypeArgsLen,
1555 Object::null_array(), // No argument names. 1561 Object::null_array(), // No argument names.
1556 kNumArgsChecked, owner()->ic_data_array()); 1562 kNumArgsChecked, owner()->ic_data_array());
1557 if (negate_result) { 1563 if (negate_result) {
1558 result = new (Z) BooleanNegateInstr(Bind(result)); 1564 result = new (Z) BooleanNegateInstr(Bind(result));
1559 } 1565 }
1560 ReturnDefinition(result); 1566 ReturnDefinition(result);
1561 } 1567 }
1562 1568
1563 1569
1564 void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) { 1570 void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
(...skipping 14 matching lines...) Expand all
1579 PushInstantiatorTypeArguments(type, node->token_pos()); 1585 PushInstantiatorTypeArguments(type, node->token_pos());
1580 PushArgumentInstr* push_function_type_args = 1586 PushArgumentInstr* push_function_type_args =
1581 PushFunctionTypeArguments(type, node->token_pos()); 1587 PushFunctionTypeArguments(type, node->token_pos());
1582 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1588 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1583 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4); 1589 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
1584 arguments->Add(push_left); 1590 arguments->Add(push_left);
1585 arguments->Add(push_instantiator_type_args); 1591 arguments->Add(push_instantiator_type_args);
1586 arguments->Add(push_function_type_args); 1592 arguments->Add(push_function_type_args);
1587 Value* type_arg = Bind(new (Z) ConstantInstr(type)); 1593 Value* type_arg = Bind(new (Z) ConstantInstr(type));
1588 arguments->Add(PushArgument(type_arg)); 1594 arguments->Add(PushArgument(type_arg));
1595 const int kTypeArgsLen = 0;
1589 const intptr_t kNumArgsChecked = 1; 1596 const intptr_t kNumArgsChecked = 1;
1590 InstanceCallInstr* call = new (Z) InstanceCallInstr( 1597 InstanceCallInstr* call = new (Z) InstanceCallInstr(
1591 node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()), 1598 node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()),
1592 node->kind(), arguments, 1599 node->kind(), arguments, kTypeArgsLen,
1593 Object::null_array(), // No argument names. 1600 Object::null_array(), // No argument names.
1594 kNumArgsChecked, owner()->ic_data_array()); 1601 kNumArgsChecked, owner()->ic_data_array());
1595 ReturnDefinition(call); 1602 ReturnDefinition(call);
1596 } 1603 }
1597 1604
1598 1605
1599 StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare( 1606 StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare(
1600 AstNode* left, 1607 AstNode* left,
1601 AstNode* right, 1608 AstNode* right,
1602 Token::Kind kind, 1609 Token::Kind kind,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 Append(for_left_value); 1663 Append(for_left_value);
1657 PushArgumentInstr* push_left = PushArgument(for_left_value.value()); 1664 PushArgumentInstr* push_left = PushArgument(for_left_value.value());
1658 arguments->Add(push_left); 1665 arguments->Add(push_left);
1659 1666
1660 ValueGraphVisitor for_right_value(owner()); 1667 ValueGraphVisitor for_right_value(owner());
1661 node->right()->Visit(&for_right_value); 1668 node->right()->Visit(&for_right_value);
1662 Append(for_right_value); 1669 Append(for_right_value);
1663 PushArgumentInstr* push_right = PushArgument(for_right_value.value()); 1670 PushArgumentInstr* push_right = PushArgument(for_right_value.value());
1664 arguments->Add(push_right); 1671 arguments->Add(push_right);
1665 1672
1673 const intptr_t kTypeArgsLen = 0;
1666 const intptr_t kNumArgsChecked = 2; 1674 const intptr_t kNumArgsChecked = 2;
1667 Definition* result = new (Z) 1675 Definition* result = new (Z)
1668 InstanceCallInstr(node->token_pos(), Symbols::EqualOperator(), 1676 InstanceCallInstr(node->token_pos(), Symbols::EqualOperator(),
1669 Token::kEQ, // Result is negated later for kNE. 1677 Token::kEQ, // Result is negated later for kNE.
1670 arguments, Object::null_array(), kNumArgsChecked, 1678 arguments, kTypeArgsLen, Object::null_array(),
1671 owner()->ic_data_array()); 1679 kNumArgsChecked, owner()->ic_data_array());
1672 if (node->kind() == Token::kNE) { 1680 if (node->kind() == Token::kNE) {
1673 Isolate* isolate = Isolate::Current(); 1681 Isolate* isolate = Isolate::Current();
1674 if (isolate->type_checks() || isolate->asserts()) { 1682 if (isolate->type_checks() || isolate->asserts()) {
1675 Value* value = Bind(result); 1683 Value* value = Bind(result);
1676 result = new (Z) AssertBooleanInstr(node->token_pos(), value); 1684 result = new (Z) AssertBooleanInstr(node->token_pos(), value);
1677 } 1685 }
1678 Value* value = Bind(result); 1686 Value* value = Bind(result);
1679 result = new (Z) BooleanNegateInstr(value); 1687 result = new (Z) BooleanNegateInstr(value);
1680 } 1688 }
1681 ReturnDefinition(result); 1689 ReturnDefinition(result);
1682 return; 1690 return;
1683 } 1691 }
1684 1692
1685 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1693 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1686 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 1694 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
1687 1695
1688 ValueGraphVisitor for_left_value(owner()); 1696 ValueGraphVisitor for_left_value(owner());
1689 node->left()->Visit(&for_left_value); 1697 node->left()->Visit(&for_left_value);
1690 Append(for_left_value); 1698 Append(for_left_value);
1691 PushArgumentInstr* push_left = PushArgument(for_left_value.value()); 1699 PushArgumentInstr* push_left = PushArgument(for_left_value.value());
1692 arguments->Add(push_left); 1700 arguments->Add(push_left);
1693 1701
1694 ValueGraphVisitor for_right_value(owner()); 1702 ValueGraphVisitor for_right_value(owner());
1695 node->right()->Visit(&for_right_value); 1703 node->right()->Visit(&for_right_value);
1696 Append(for_right_value); 1704 Append(for_right_value);
1697 PushArgumentInstr* push_right = PushArgument(for_right_value.value()); 1705 PushArgumentInstr* push_right = PushArgument(for_right_value.value());
1698 arguments->Add(push_right); 1706 arguments->Add(push_right);
1699 1707
1700 ASSERT(Token::IsRelationalOperator(node->kind())); 1708 ASSERT(Token::IsRelationalOperator(node->kind()));
1709 const intptr_t kTypeArgsLen = 0;
1701 InstanceCallInstr* comp = new (Z) InstanceCallInstr( 1710 InstanceCallInstr* comp = new (Z) InstanceCallInstr(
1702 node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments, 1711 node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments,
1703 Object::null_array(), 2, owner()->ic_data_array()); 1712 kTypeArgsLen, Object::null_array(), 2, owner()->ic_data_array());
1704 ReturnDefinition(comp); 1713 ReturnDefinition(comp);
1705 } 1714 }
1706 1715
1707 1716
1708 void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) { 1717 void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
1709 // "!" cannot be overloaded, therefore do not call operator. 1718 // "!" cannot be overloaded, therefore do not call operator.
1710 if (node->kind() == Token::kNOT) { 1719 if (node->kind() == Token::kNOT) {
1711 ValueGraphVisitor for_value(owner()); 1720 ValueGraphVisitor for_value(owner());
1712 node->operand()->Visit(&for_value); 1721 node->operand()->Visit(&for_value);
1713 Append(for_value); 1722 Append(for_value);
1714 Value* value = for_value.value(); 1723 Value* value = for_value.value();
1715 Isolate* isolate = Isolate::Current(); 1724 Isolate* isolate = Isolate::Current();
1716 if (isolate->type_checks() || isolate->asserts()) { 1725 if (isolate->type_checks() || isolate->asserts()) {
1717 value = 1726 value =
1718 Bind(new (Z) AssertBooleanInstr(node->operand()->token_pos(), value)); 1727 Bind(new (Z) AssertBooleanInstr(node->operand()->token_pos(), value));
1719 } 1728 }
1720 BooleanNegateInstr* negate = new (Z) BooleanNegateInstr(value); 1729 BooleanNegateInstr* negate = new (Z) BooleanNegateInstr(value);
1721 ReturnDefinition(negate); 1730 ReturnDefinition(negate);
1722 return; 1731 return;
1723 } 1732 }
1724 1733
1725 ValueGraphVisitor for_value(owner()); 1734 ValueGraphVisitor for_value(owner());
1726 node->operand()->Visit(&for_value); 1735 node->operand()->Visit(&for_value);
1727 Append(for_value); 1736 Append(for_value);
1728 PushArgumentInstr* push_value = PushArgument(for_value.value()); 1737 PushArgumentInstr* push_value = PushArgument(for_value.value());
1729 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1738 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1730 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); 1739 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
1731 arguments->Add(push_value); 1740 arguments->Add(push_value);
1741 const intptr_t kTypeArgsLen = 0;
1732 InstanceCallInstr* call = new (Z) InstanceCallInstr( 1742 InstanceCallInstr* call = new (Z) InstanceCallInstr(
1733 node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments, 1743 node->token_pos(), Symbols::Token(node->kind()), node->kind(), arguments,
1734 Object::null_array(), 1, owner()->ic_data_array()); 1744 kTypeArgsLen, Object::null_array(), 1, owner()->ic_data_array());
1735 ReturnDefinition(call); 1745 ReturnDefinition(call);
1736 } 1746 }
1737 1747
1738 1748
1739 void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) { 1749 void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
1740 TestGraphVisitor for_test(owner(), node->condition()->token_pos()); 1750 TestGraphVisitor for_test(owner(), node->condition()->token_pos());
1741 node->condition()->Visit(&for_test); 1751 node->condition()->Visit(&for_test);
1742 1752
1743 // Translate the subexpressions for their effects. 1753 // Translate the subexpressions for their effects.
1744 EffectGraphVisitor for_true(owner()); 1754 EffectGraphVisitor for_true(owner());
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
2271 StringInterpolateNode* node) { 2281 StringInterpolateNode* node) {
2272 ValueGraphVisitor for_argument(owner()); 2282 ValueGraphVisitor for_argument(owner());
2273 ArrayNode* arguments = node->value(); 2283 ArrayNode* arguments = node->value();
2274 if (arguments->length() == 1) { 2284 if (arguments->length() == 1) {
2275 ZoneGrowableArray<PushArgumentInstr*>* values = 2285 ZoneGrowableArray<PushArgumentInstr*>* values =
2276 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); 2286 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
2277 arguments->ElementAt(0)->Visit(&for_argument); 2287 arguments->ElementAt(0)->Visit(&for_argument);
2278 Append(for_argument); 2288 Append(for_argument);
2279 PushArgumentInstr* push_arg = PushArgument(for_argument.value()); 2289 PushArgumentInstr* push_arg = PushArgument(for_argument.value());
2280 values->Add(push_arg); 2290 values->Add(push_arg);
2291 const int kTypeArgsLen = 0;
2281 const int kNumberOfArguments = 1; 2292 const int kNumberOfArguments = 1;
2282 const Array& kNoArgumentNames = Object::null_array(); 2293 const Array& kNoArgumentNames = Object::null_array();
2283 const Class& cls = 2294 const Class& cls =
2284 Class::Handle(Library::LookupCoreClass(Symbols::StringBase())); 2295 Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
2285 ASSERT(!cls.IsNull()); 2296 ASSERT(!cls.IsNull());
2286 const Function& function = Function::ZoneHandle( 2297 const Function& function = Function::ZoneHandle(
2287 Z, Resolver::ResolveStatic( 2298 Z, Resolver::ResolveStatic(
2288 cls, Library::PrivateCoreLibName(Symbols::InterpolateSingle()), 2299 cls, Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
2289 kNumberOfArguments, kNoArgumentNames)); 2300 kTypeArgsLen, kNumberOfArguments, kNoArgumentNames));
2290 StaticCallInstr* call = 2301 StaticCallInstr* call = new (Z)
2291 new (Z) StaticCallInstr(node->token_pos(), function, kNoArgumentNames, 2302 StaticCallInstr(node->token_pos(), function, kTypeArgsLen,
2292 values, owner()->ic_data_array()); 2303 kNoArgumentNames, values, owner()->ic_data_array());
2293 ReturnDefinition(call); 2304 ReturnDefinition(call);
2294 return; 2305 return;
2295 } 2306 }
2296 arguments->Visit(&for_argument); 2307 arguments->Visit(&for_argument);
2297 Append(for_argument); 2308 Append(for_argument);
2298 StringInterpolateInstr* instr = 2309 StringInterpolateInstr* instr =
2299 new (Z) StringInterpolateInstr(for_argument.value(), node->token_pos()); 2310 new (Z) StringInterpolateInstr(for_argument.value(), node->token_pos());
2300 ReturnDefinition(instr); 2311 ReturnDefinition(instr);
2301 } 2312 }
2302 2313
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
2413 Value* context = Bind(BuildCurrentContext(node->token_pos())); 2424 Value* context = Bind(BuildCurrentContext(node->token_pos()));
2414 Do(new (Z) StoreInstanceFieldInstr(Closure::context_offset(), 2425 Do(new (Z) StoreInstanceFieldInstr(Closure::context_offset(),
2415 closure_tmp_val, context, 2426 closure_tmp_val, context,
2416 kEmitStoreBarrier, node->token_pos())); 2427 kEmitStoreBarrier, node->token_pos()));
2417 } 2428 }
2418 ReturnDefinition(ExitTempLocalScope(closure_val)); 2429 ReturnDefinition(ExitTempLocalScope(closure_val));
2419 } 2430 }
2420 } 2431 }
2421 2432
2422 2433
2434 void EffectGraphVisitor::BuildPushTypeArguments(
2435 const ArgumentListNode& node,
2436 ZoneGrowableArray<PushArgumentInstr*>* values) {
2437 if (node.type_args_len() > 0) {
2438 Value* type_args_val;
2439 if (node.type_args_var() != NULL) {
2440 type_args_val =
2441 Bind(new (Z) LoadLocalInstr(*node.type_args_var(), node.token_pos()));
2442 } else {
2443 const TypeArguments& type_args = node.type_arguments();
2444 ASSERT(!type_args.IsNull() &&
2445 (type_args.Length() == node.type_args_len()));
2446 type_args_val =
2447 BuildInstantiatedTypeArguments(node.token_pos(), type_args);
2448 }
2449 PushArgumentInstr* push_type_args = PushArgument(type_args_val);
2450 values->Add(push_type_args);
2451 }
2452 }
2453
2454
2423 void EffectGraphVisitor::BuildPushArguments( 2455 void EffectGraphVisitor::BuildPushArguments(
2424 const ArgumentListNode& node, 2456 const ArgumentListNode& node,
2425 ZoneGrowableArray<PushArgumentInstr*>* values) { 2457 ZoneGrowableArray<PushArgumentInstr*>* values) {
2426 for (intptr_t i = 0; i < node.length(); ++i) { 2458 for (intptr_t i = 0; i < node.length(); ++i) {
2427 ValueGraphVisitor for_argument(owner()); 2459 ValueGraphVisitor for_argument(owner());
2428 node.NodeAt(i)->Visit(&for_argument); 2460 node.NodeAt(i)->Visit(&for_argument);
2429 Append(for_argument); 2461 Append(for_argument);
2430 PushArgumentInstr* push_arg = PushArgument(for_argument.value()); 2462 PushArgumentInstr* push_arg = PushArgument(for_argument.value());
2431 values->Add(push_arg); 2463 values->Add(push_arg);
2432 } 2464 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2470 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos())); 2502 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
2471 BuildInstanceCallConditional(node); 2503 BuildInstanceCallConditional(node);
2472 ReturnDefinition(BuildLoadExprTemp(node->token_pos())); 2504 ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
2473 } else { 2505 } else {
2474 EffectGraphVisitor::VisitInstanceCallNode(node); 2506 EffectGraphVisitor::VisitInstanceCallNode(node);
2475 } 2507 }
2476 } 2508 }
2477 2509
2478 2510
2479 void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) { 2511 void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
2480 ValueGraphVisitor for_receiver(owner());
2481 node->receiver()->Visit(&for_receiver);
2482 Append(for_receiver);
2483 if (node->is_conditional()) { 2512 if (node->is_conditional()) {
2513 ValueGraphVisitor for_receiver(owner());
2514 node->receiver()->Visit(&for_receiver);
2515 Append(for_receiver);
2484 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos())); 2516 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
2485 BuildInstanceCallConditional(node); 2517 BuildInstanceCallConditional(node);
2486 } else { 2518 } else {
2519 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2520 new (Z) ZoneGrowableArray<PushArgumentInstr*>(
2521 (node->arguments()->type_args_len() > 0 ? 2 : 1) +
2522 node->arguments()->length());
2523 BuildPushTypeArguments(*node->arguments(), arguments);
2524 ValueGraphVisitor for_receiver(owner());
2525 node->receiver()->Visit(&for_receiver);
2526 Append(for_receiver);
2487 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value()); 2527 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
2488 ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z)
2489 ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length() + 1);
2490 arguments->Add(push_receiver); 2528 arguments->Add(push_receiver);
2491
2492 BuildPushArguments(*node->arguments(), arguments); 2529 BuildPushArguments(*node->arguments(), arguments);
2493 InstanceCallInstr* call = new (Z) InstanceCallInstr( 2530 InstanceCallInstr* call = new (Z) InstanceCallInstr(
2494 node->token_pos(), node->function_name(), Token::kILLEGAL, arguments, 2531 node->token_pos(), node->function_name(), Token::kILLEGAL, arguments,
2495 node->arguments()->names(), 1, owner()->ic_data_array()); 2532 node->arguments()->type_args_len(), node->arguments()->names(), 1,
2533 owner()->ic_data_array());
2496 ReturnDefinition(call); 2534 ReturnDefinition(call);
2497 } 2535 }
2498 } 2536 }
2499 2537
2500 2538
2501 // <Expression> ::= StaticCall { function: Function 2539 // <Expression> ::= StaticCall { function: Function
2502 // arguments: <ArgumentList> } 2540 // arguments: <ArgumentList> }
2503 void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) { 2541 void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
2504 ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z) 2542 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2505 ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length()); 2543 new (Z) ZoneGrowableArray<PushArgumentInstr*>(
2544 (node->arguments()->type_args_len() > 0 ? 1 : 0) +
2545 node->arguments()->length());
2546 BuildPushTypeArguments(*node->arguments(), arguments);
2506 BuildPushArguments(*node->arguments(), arguments); 2547 BuildPushArguments(*node->arguments(), arguments);
2507 StaticCallInstr* call = new (Z) StaticCallInstr( 2548 StaticCallInstr* call = new (Z) StaticCallInstr(
2508 node->token_pos(), node->function(), node->arguments()->names(), 2549 node->token_pos(), node->function(), node->arguments()->type_args_len(),
2509 arguments, owner()->ic_data_array()); 2550 node->arguments()->names(), arguments, owner()->ic_data_array());
2510 if (node->function().recognized_kind() != MethodRecognizer::kUnknown) { 2551 if (node->function().recognized_kind() != MethodRecognizer::kUnknown) {
2511 call->set_result_cid(MethodRecognizer::ResultCid(node->function())); 2552 call->set_result_cid(MethodRecognizer::ResultCid(node->function()));
2512 } 2553 }
2513 ReturnDefinition(call); 2554 ReturnDefinition(call);
2514 } 2555 }
2515 2556
2516 2557
2517 void EffectGraphVisitor::BuildClosureCall(ClosureCallNode* node, 2558 void EffectGraphVisitor::BuildClosureCall(ClosureCallNode* node,
2518 bool result_needed) { 2559 bool result_needed) {
2560 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2561 new (Z) ZoneGrowableArray<PushArgumentInstr*>(
2562 (node->arguments()->type_args_len() > 0 ? 1 : 0) +
2563 node->arguments()->length());
2564 BuildPushTypeArguments(*node->arguments(), arguments);
2565
2519 ValueGraphVisitor for_closure(owner()); 2566 ValueGraphVisitor for_closure(owner());
2520 node->closure()->Visit(&for_closure); 2567 node->closure()->Visit(&for_closure);
2521 Append(for_closure); 2568 Append(for_closure);
2522
2523 Value* closure_value = for_closure.value(); 2569 Value* closure_value = for_closure.value();
2524 LocalVariable* tmp_var = EnterTempLocalScope(closure_value); 2570 LocalVariable* tmp_var = EnterTempLocalScope(closure_value);
2525 2571
2526 ZoneGrowableArray<PushArgumentInstr*>* arguments = new (Z)
2527 ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
2528 Value* closure_val = 2572 Value* closure_val =
2529 Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos())); 2573 Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
2530 PushArgumentInstr* push_closure = PushArgument(closure_val); 2574 PushArgumentInstr* push_closure = PushArgument(closure_val);
2531 arguments->Add(push_closure); 2575 arguments->Add(push_closure);
2532 BuildPushArguments(*node->arguments(), arguments); 2576 BuildPushArguments(*node->arguments(), arguments);
2533 2577
2534 closure_val = Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos())); 2578 closure_val = Bind(new (Z) LoadLocalInstr(*tmp_var, node->token_pos()));
2535 LoadFieldInstr* function_load = new (Z) LoadFieldInstr( 2579 LoadFieldInstr* function_load = new (Z) LoadFieldInstr(
2536 closure_val, Closure::function_offset(), 2580 closure_val, Closure::function_offset(),
2537 AbstractType::ZoneHandle(Z, AbstractType::null()), node->token_pos()); 2581 AbstractType::ZoneHandle(Z, AbstractType::null()), node->token_pos());
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2595 2639
2596 2640
2597 void EffectGraphVisitor::BuildConstructorCall( 2641 void EffectGraphVisitor::BuildConstructorCall(
2598 ConstructorCallNode* node, 2642 ConstructorCallNode* node,
2599 PushArgumentInstr* push_alloc_value) { 2643 PushArgumentInstr* push_alloc_value) {
2600 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2644 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2601 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 2645 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
2602 arguments->Add(push_alloc_value); 2646 arguments->Add(push_alloc_value);
2603 2647
2604 BuildPushArguments(*node->arguments(), arguments); 2648 BuildPushArguments(*node->arguments(), arguments);
2649 const intptr_t kTypeArgsLen = 0;
2605 Do(new (Z) StaticCallInstr(node->token_pos(), node->constructor(), 2650 Do(new (Z) StaticCallInstr(node->token_pos(), node->constructor(),
2606 node->arguments()->names(), arguments, 2651 kTypeArgsLen, node->arguments()->names(),
2607 owner()->ic_data_array())); 2652 arguments, owner()->ic_data_array()));
2608 } 2653 }
2609 2654
2610 2655
2611 static intptr_t GetResultCidOfListFactory(ConstructorCallNode* node) { 2656 static intptr_t GetResultCidOfListFactory(ConstructorCallNode* node) {
2612 const Function& function = node->constructor(); 2657 const Function& function = node->constructor();
2613 const Class& function_class = Class::Handle(function.Owner()); 2658 const Class& function_class = Class::Handle(function.Owner());
2614 2659
2615 if ((function_class.library() != Library::CoreLibrary()) && 2660 if ((function_class.library() != Library::CoreLibrary()) &&
2616 (function_class.library() != Library::TypedDataLibrary())) { 2661 (function_class.library() != Library::TypedDataLibrary())) {
2617 return kDynamicCid; 2662 return kDynamicCid;
(...skipping 17 matching lines...) Expand all
2635 void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { 2680 void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
2636 if (node->constructor().IsFactory()) { 2681 if (node->constructor().IsFactory()) {
2637 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2682 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2638 new (Z) ZoneGrowableArray<PushArgumentInstr*>(); 2683 new (Z) ZoneGrowableArray<PushArgumentInstr*>();
2639 PushArgumentInstr* push_type_arguments = 2684 PushArgumentInstr* push_type_arguments =
2640 PushArgument(BuildInstantiatedTypeArguments(node->token_pos(), 2685 PushArgument(BuildInstantiatedTypeArguments(node->token_pos(),
2641 node->type_arguments())); 2686 node->type_arguments()));
2642 arguments->Add(push_type_arguments); 2687 arguments->Add(push_type_arguments);
2643 ASSERT(arguments->length() == 1); 2688 ASSERT(arguments->length() == 1);
2644 BuildPushArguments(*node->arguments(), arguments); 2689 BuildPushArguments(*node->arguments(), arguments);
2690 const int kTypeArgsLen = 0;
2645 StaticCallInstr* call = new (Z) StaticCallInstr( 2691 StaticCallInstr* call = new (Z) StaticCallInstr(
2646 node->token_pos(), node->constructor(), node->arguments()->names(), 2692 node->token_pos(), node->constructor(), kTypeArgsLen,
2647 arguments, owner()->ic_data_array()); 2693 node->arguments()->names(), arguments, owner()->ic_data_array());
2648 const intptr_t result_cid = GetResultCidOfListFactory(node); 2694 const intptr_t result_cid = GetResultCidOfListFactory(node);
2649 if (result_cid != kDynamicCid) { 2695 if (result_cid != kDynamicCid) {
2650 call->set_result_cid(result_cid); 2696 call->set_result_cid(result_cid);
2651 call->set_is_known_list_constructor(true); 2697 call->set_is_known_list_constructor(true);
2652 // Recognized fixed length array factory must have two arguments: 2698 // Recognized fixed length array factory must have two arguments:
2653 // (0) type-arguments, (1) length. 2699 // (0) type-arguments, (1) length.
2654 ASSERT(!LoadFieldInstr::IsFixedLengthArrayCid(result_cid) || 2700 ASSERT(!LoadFieldInstr::IsFixedLengthArrayCid(result_cid) ||
2655 arguments->length() == 2); 2701 arguments->length() == 2);
2656 } else if (node->constructor().recognized_kind() != 2702 } else if (node->constructor().recognized_kind() !=
2657 MethodRecognizer::kUnknown) { 2703 MethodRecognizer::kUnknown) {
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2867 if (node->is_conditional()) { 2913 if (node->is_conditional()) {
2868 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos())); 2914 Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
2869 BuildInstanceGetterConditional(node); 2915 BuildInstanceGetterConditional(node);
2870 } else { 2916 } else {
2871 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value()); 2917 PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
2872 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2918 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2873 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); 2919 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
2874 arguments->Add(push_receiver); 2920 arguments->Add(push_receiver);
2875 const String& name = 2921 const String& name =
2876 String::ZoneHandle(Z, Field::GetterSymbol(node->field_name())); 2922 String::ZoneHandle(Z, Field::GetterSymbol(node->field_name()));
2877 InstanceCallInstr* call = new (Z) 2923 const intptr_t kTypeArgsLen = 0;
2878 InstanceCallInstr(node->token_pos(), name, Token::kGET, arguments, 2924 InstanceCallInstr* call = new (Z) InstanceCallInstr(
2879 Object::null_array(), 1, owner()->ic_data_array()); 2925 node->token_pos(), name, Token::kGET, arguments, kTypeArgsLen,
2926 Object::null_array(), 1, owner()->ic_data_array());
2880 ReturnDefinition(call); 2927 ReturnDefinition(call);
2881 } 2928 }
2882 } 2929 }
2883 2930
2884 2931
2885 void EffectGraphVisitor::BuildInstanceSetterArguments( 2932 void EffectGraphVisitor::BuildInstanceSetterArguments(
2886 InstanceSetterNode* node, 2933 InstanceSetterNode* node,
2887 ZoneGrowableArray<PushArgumentInstr*>* arguments, 2934 ZoneGrowableArray<PushArgumentInstr*>* arguments,
2888 bool result_is_needed) { 2935 bool result_is_needed) {
2889 ValueGraphVisitor for_receiver(owner()); 2936 ValueGraphVisitor for_receiver(owner());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2929 token_pos, load_temp, node->field_name(), node->value()); 2976 token_pos, load_temp, node->field_name(), node->value());
2930 setter->Visit(&for_false); 2977 setter->Visit(&for_false);
2931 Join(for_test, for_true, for_false); 2978 Join(for_test, for_true, for_false);
2932 return; 2979 return;
2933 } 2980 }
2934 ZoneGrowableArray<PushArgumentInstr*>* arguments = 2981 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2935 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 2982 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
2936 BuildInstanceSetterArguments(node, arguments, kResultNotNeeded); 2983 BuildInstanceSetterArguments(node, arguments, kResultNotNeeded);
2937 const String& name = 2984 const String& name =
2938 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name())); 2985 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
2986 const int kTypeArgsLen = 0;
2939 const intptr_t kNumArgsChecked = 1; // Do not check value type. 2987 const intptr_t kNumArgsChecked = 1; // Do not check value type.
2940 InstanceCallInstr* call = new (Z) InstanceCallInstr( 2988 InstanceCallInstr* call = new (Z) InstanceCallInstr(
2941 token_pos, name, Token::kSET, arguments, Object::null_array(), 2989 token_pos, name, Token::kSET, arguments, kTypeArgsLen,
2942 kNumArgsChecked, owner()->ic_data_array()); 2990 Object::null_array(), kNumArgsChecked, owner()->ic_data_array());
2943 ReturnDefinition(call); 2991 ReturnDefinition(call);
2944 } 2992 }
2945 2993
2946 2994
2947 void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) { 2995 void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
2948 const TokenPosition token_pos = node->token_pos(); 2996 const TokenPosition token_pos = node->token_pos();
2949 if (node->is_conditional()) { 2997 if (node->is_conditional()) {
2950 ValueGraphVisitor for_receiver(owner()); 2998 ValueGraphVisitor for_receiver(owner());
2951 node->receiver()->Visit(&for_receiver); 2999 node->receiver()->Visit(&for_receiver);
2952 Append(for_receiver); 3000 Append(for_receiver);
(...skipping 20 matching lines...) Expand all
2973 3021
2974 Join(for_test, for_true, for_false); 3022 Join(for_test, for_true, for_false);
2975 ReturnDefinition(BuildLoadExprTemp(token_pos)); 3023 ReturnDefinition(BuildLoadExprTemp(token_pos));
2976 return; 3024 return;
2977 } 3025 }
2978 ZoneGrowableArray<PushArgumentInstr*>* arguments = 3026 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2979 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 3027 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
2980 BuildInstanceSetterArguments(node, arguments, kResultNeeded); 3028 BuildInstanceSetterArguments(node, arguments, kResultNeeded);
2981 const String& name = 3029 const String& name =
2982 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name())); 3030 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
3031 const intptr_t kTypeArgsLen = 0;
2983 const intptr_t kNumArgsChecked = 1; // Do not check value type. 3032 const intptr_t kNumArgsChecked = 1; // Do not check value type.
2984 Do(new (Z) InstanceCallInstr(token_pos, name, Token::kSET, arguments, 3033 Do(new (Z) InstanceCallInstr(token_pos, name, Token::kSET, arguments,
2985 Object::null_array(), kNumArgsChecked, 3034 kTypeArgsLen, Object::null_array(),
2986 owner()->ic_data_array())); 3035 kNumArgsChecked, owner()->ic_data_array()));
2987 ReturnDefinition(BuildLoadExprTemp(token_pos)); 3036 ReturnDefinition(BuildLoadExprTemp(token_pos));
2988 } 3037 }
2989 3038
2990 3039
2991 void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) { 3040 void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
2992 const String& getter_name = 3041 const String& getter_name =
2993 String::ZoneHandle(Z, Field::GetterSymbol(node->field_name())); 3042 String::ZoneHandle(Z, Field::GetterSymbol(node->field_name()));
2994 ZoneGrowableArray<PushArgumentInstr*>* arguments = 3043 ZoneGrowableArray<PushArgumentInstr*>* arguments =
2995 new (Z) ZoneGrowableArray<PushArgumentInstr*>(); 3044 new (Z) ZoneGrowableArray<PushArgumentInstr*>();
2996 Function& getter_function = Function::ZoneHandle(Z, Function::null()); 3045 Function& getter_function = Function::ZoneHandle(Z, Function::null());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3038 NULL, // No Arguments to getter. 3087 NULL, // No Arguments to getter.
3039 InvocationMirror::EncodeType(node->cls().IsTopLevel() 3088 InvocationMirror::EncodeType(node->cls().IsTopLevel()
3040 ? InvocationMirror::kTopLevel 3089 ? InvocationMirror::kTopLevel
3041 : InvocationMirror::kStatic, 3090 : InvocationMirror::kStatic,
3042 InvocationMirror::kGetter)); 3091 InvocationMirror::kGetter));
3043 ReturnDefinition(call); 3092 ReturnDefinition(call);
3044 return; 3093 return;
3045 } 3094 }
3046 } 3095 }
3047 ASSERT(!getter_function.IsNull()); 3096 ASSERT(!getter_function.IsNull());
3097 const intptr_t kTypeArgsLen = 0;
3048 StaticCallInstr* call = 3098 StaticCallInstr* call =
3049 new (Z) StaticCallInstr(node->token_pos(), getter_function, 3099 new (Z) StaticCallInstr(node->token_pos(), getter_function, kTypeArgsLen,
3050 Object::null_array(), // No names 3100 Object::null_array(), // No names
3051 arguments, owner()->ic_data_array()); 3101 arguments, owner()->ic_data_array());
3052 ReturnDefinition(call); 3102 ReturnDefinition(call);
3053 } 3103 }
3054 3104
3055 3105
3056 void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node, 3106 void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
3057 bool result_is_needed) { 3107 bool result_is_needed) {
3058 const String& setter_name = 3108 const String& setter_name =
3059 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name())); 3109 String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3100 ValueGraphVisitor for_value(owner()); 3150 ValueGraphVisitor for_value(owner());
3101 node->value()->Visit(&for_value); 3151 node->value()->Visit(&for_value);
3102 Append(for_value); 3152 Append(for_value);
3103 Value* value = NULL; 3153 Value* value = NULL;
3104 if (result_is_needed) { 3154 if (result_is_needed) {
3105 value = Bind(BuildStoreExprTemp(for_value.value(), token_pos)); 3155 value = Bind(BuildStoreExprTemp(for_value.value(), token_pos));
3106 } else { 3156 } else {
3107 value = for_value.value(); 3157 value = for_value.value();
3108 } 3158 }
3109 arguments->Add(PushArgument(value)); 3159 arguments->Add(PushArgument(value));
3110 3160 const intptr_t kTypeArgsLen = 0;
3111 call = new (Z) StaticCallInstr(token_pos, setter_function, 3161 call = new (Z) StaticCallInstr(token_pos, setter_function, kTypeArgsLen,
3112 Object::null_array(), // No names. 3162 Object::null_array(), // No names.
3113 arguments, owner()->ic_data_array()); 3163 arguments, owner()->ic_data_array());
3114 } 3164 }
3115 if (result_is_needed) { 3165 if (result_is_needed) {
3116 Do(call); 3166 Do(call);
3117 ReturnDefinition(BuildLoadExprTemp(token_pos)); 3167 ReturnDefinition(BuildLoadExprTemp(token_pos));
3118 } else { 3168 } else {
3119 ReturnDefinition(call); 3169 ReturnDefinition(call);
3120 } 3170 }
3121 } 3171 }
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
3547 ValueGraphVisitor for_array(owner()); 3597 ValueGraphVisitor for_array(owner());
3548 node->array()->Visit(&for_array); 3598 node->array()->Visit(&for_array);
3549 Append(for_array); 3599 Append(for_array);
3550 arguments->Add(PushArgument(for_array.value())); 3600 arguments->Add(PushArgument(for_array.value()));
3551 3601
3552 ValueGraphVisitor for_index(owner()); 3602 ValueGraphVisitor for_index(owner());
3553 node->index_expr()->Visit(&for_index); 3603 node->index_expr()->Visit(&for_index);
3554 Append(for_index); 3604 Append(for_index);
3555 arguments->Add(PushArgument(for_index.value())); 3605 arguments->Add(PushArgument(for_index.value()));
3556 3606
3607 const intptr_t kTypeArgsLen = 0;
3557 if (super_function != NULL) { 3608 if (super_function != NULL) {
3558 // Generate static call to super operator. 3609 // Generate static call to super operator.
3559 StaticCallInstr* load = new (Z) StaticCallInstr( 3610 StaticCallInstr* load = new (Z) StaticCallInstr(
3560 node->token_pos(), *super_function, Object::null_array(), arguments, 3611 node->token_pos(), *super_function, kTypeArgsLen, Object::null_array(),
3561 owner()->ic_data_array()); 3612 arguments, owner()->ic_data_array());
3562 ReturnDefinition(load); 3613 ReturnDefinition(load);
3563 } else { 3614 } else {
3564 // Generate dynamic call to index operator. 3615 // Generate dynamic call to index operator.
3565 const intptr_t checked_argument_count = 1; 3616 const intptr_t checked_argument_count = 1;
3566 InstanceCallInstr* load = new (Z) InstanceCallInstr( 3617 InstanceCallInstr* load = new (Z) InstanceCallInstr(
3567 node->token_pos(), Symbols::IndexToken(), Token::kINDEX, arguments, 3618 node->token_pos(), Symbols::IndexToken(), Token::kINDEX, arguments,
3568 Object::null_array(), checked_argument_count, owner()->ic_data_array()); 3619 kTypeArgsLen, Object::null_array(), checked_argument_count,
3620 owner()->ic_data_array());
3569 ReturnDefinition(load); 3621 ReturnDefinition(load);
3570 } 3622 }
3571 } 3623 }
3572 3624
3573 3625
3574 Definition* EffectGraphVisitor::BuildStoreIndexedValues(StoreIndexedNode* node, 3626 Definition* EffectGraphVisitor::BuildStoreIndexedValues(StoreIndexedNode* node,
3575 bool result_is_needed) { 3627 bool result_is_needed) {
3576 Function* super_function = NULL; 3628 Function* super_function = NULL;
3577 const TokenPosition token_pos = node->token_pos(); 3629 const TokenPosition token_pos = node->token_pos();
3578 if (node->IsSuperStore()) { 3630 if (node->IsSuperStore()) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3618 node->value()->Visit(&for_value); 3670 node->value()->Visit(&for_value);
3619 Append(for_value); 3671 Append(for_value);
3620 Value* value = NULL; 3672 Value* value = NULL;
3621 if (result_is_needed) { 3673 if (result_is_needed) {
3622 value = Bind(BuildStoreExprTemp(for_value.value(), token_pos)); 3674 value = Bind(BuildStoreExprTemp(for_value.value(), token_pos));
3623 } else { 3675 } else {
3624 value = for_value.value(); 3676 value = for_value.value();
3625 } 3677 }
3626 arguments->Add(PushArgument(value)); 3678 arguments->Add(PushArgument(value));
3627 3679
3680 const intptr_t kTypeArgsLen = 0;
3628 if (super_function != NULL) { 3681 if (super_function != NULL) {
3629 // Generate static call to super operator []=. 3682 // Generate static call to super operator []=.
3630 3683
3631 StaticCallInstr* store = new (Z) 3684 StaticCallInstr* store = new (Z) StaticCallInstr(
3632 StaticCallInstr(token_pos, *super_function, Object::null_array(), 3685 token_pos, *super_function, kTypeArgsLen, Object::null_array(),
3633 arguments, owner()->ic_data_array()); 3686 arguments, owner()->ic_data_array());
3634 if (result_is_needed) { 3687 if (result_is_needed) {
3635 Do(store); 3688 Do(store);
3636 return BuildLoadExprTemp(token_pos); 3689 return BuildLoadExprTemp(token_pos);
3637 } else { 3690 } else {
3638 return store; 3691 return store;
3639 } 3692 }
3640 } else { 3693 } else {
3641 // Generate dynamic call to operator []=. 3694 // Generate dynamic call to operator []=.
3642 const intptr_t checked_argument_count = 2; // Do not check for value type. 3695 const intptr_t checked_argument_count = 2; // Do not check for value type.
3643 InstanceCallInstr* store = new (Z) InstanceCallInstr( 3696 InstanceCallInstr* store = new (Z) InstanceCallInstr(
3644 token_pos, Symbols::AssignIndexToken(), Token::kASSIGN_INDEX, arguments, 3697 token_pos, Symbols::AssignIndexToken(), Token::kASSIGN_INDEX, arguments,
3645 Object::null_array(), checked_argument_count, owner()->ic_data_array()); 3698 kTypeArgsLen, Object::null_array(), checked_argument_count,
3699 owner()->ic_data_array());
3646 if (result_is_needed) { 3700 if (result_is_needed) {
3647 Do(store); 3701 Do(store);
3648 return BuildLoadExprTemp(token_pos); 3702 return BuildLoadExprTemp(token_pos);
3649 } else { 3703 } else {
3650 return store; 3704 return store;
3651 } 3705 }
3652 } 3706 }
3653 } 3707 }
3654 3708
3655 3709
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3805 *async_stack_trace_var, node->token_pos().ToSynthetic())); 3859 *async_stack_trace_var, node->token_pos().ToSynthetic()));
3806 // Setup arguments for _asyncSetThreadStackTrace. 3860 // Setup arguments for _asyncSetThreadStackTrace.
3807 ZoneGrowableArray<PushArgumentInstr*>* arguments = 3861 ZoneGrowableArray<PushArgumentInstr*>* arguments =
3808 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1); 3862 new (Z) ZoneGrowableArray<PushArgumentInstr*>(1);
3809 arguments->Add(PushArgument(async_stack_trace_value)); 3863 arguments->Add(PushArgument(async_stack_trace_value));
3810 3864
3811 const Function& async_set_thread_stack_trace = Function::ZoneHandle( 3865 const Function& async_set_thread_stack_trace = Function::ZoneHandle(
3812 Z, isolate()->object_store()->async_set_thread_stack_trace()); 3866 Z, isolate()->object_store()->async_set_thread_stack_trace());
3813 ASSERT(!async_set_thread_stack_trace.IsNull()); 3867 ASSERT(!async_set_thread_stack_trace.IsNull());
3814 // Call _asyncSetThreadStackTrace 3868 // Call _asyncSetThreadStackTrace
3815 StaticCallInstr* call_async_set_thread_stack_trace = new (Z) 3869 const intptr_t kTypeArgsLen = 0;
3816 StaticCallInstr(node->token_pos().ToSynthetic(), 3870 StaticCallInstr* call_async_set_thread_stack_trace =
3817 async_set_thread_stack_trace, Object::null_array(), 3871 new (Z) StaticCallInstr(node->token_pos().ToSynthetic(),
3818 arguments, owner()->ic_data_array()); 3872 async_set_thread_stack_trace, kTypeArgsLen,
3873 Object::null_array(), arguments,
3874 owner()->ic_data_array());
3819 Do(call_async_set_thread_stack_trace); 3875 Do(call_async_set_thread_stack_trace);
3820 } 3876 }
3821 3877
3822 3878
3823 if (FLAG_support_debugger && is_top_level_sequence && 3879 if (FLAG_support_debugger && is_top_level_sequence &&
3824 function.is_debuggable()) { 3880 function.is_debuggable()) {
3825 // Place a debug check at method entry to ensure breaking on a method always 3881 // Place a debug check at method entry to ensure breaking on a method always
3826 // happens, even if there are no assignments/calls/runtimecalls in the first 3882 // happens, even if there are no assignments/calls/runtimecalls in the first
3827 // basic block. Place this check at the last parameter to ensure parameters 3883 // basic block. Place this check at the last parameter to ensure parameters
3828 // are in scope in the debugger at method entry. 3884 // are in scope in the debugger at method entry.
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
4142 bool is_super_invocation) { 4198 bool is_super_invocation) {
4143 TokenPosition args_pos = method_arguments->token_pos(); 4199 TokenPosition args_pos = method_arguments->token_pos();
4144 LocalVariable* temp = NULL; 4200 LocalVariable* temp = NULL;
4145 if (save_last_arg) { 4201 if (save_last_arg) {
4146 temp = owner()->parsed_function().expression_temp_var(); 4202 temp = owner()->parsed_function().expression_temp_var();
4147 } 4203 }
4148 ArgumentListNode* args = Parser::BuildNoSuchMethodArguments( 4204 ArgumentListNode* args = Parser::BuildNoSuchMethodArguments(
4149 args_pos, method_name, *method_arguments, temp, is_super_invocation); 4205 args_pos, method_name, *method_arguments, temp, is_super_invocation);
4150 // Make sure we resolve to a compatible noSuchMethod, otherwise call 4206 // Make sure we resolve to a compatible noSuchMethod, otherwise call
4151 // noSuchMethod of class Object. 4207 // noSuchMethod of class Object.
4208 const int kTypeArgsLen = 0;
4152 const int kNumArguments = 2; 4209 const int kNumArguments = 2;
4153 ArgumentsDescriptor args_desc( 4210 ArgumentsDescriptor args_desc(Array::ZoneHandle(
4154 Array::ZoneHandle(Z, ArgumentsDescriptor::New(kNumArguments))); 4211 Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
4155 Function& no_such_method_func = Function::ZoneHandle( 4212 Function& no_such_method_func = Function::ZoneHandle(
4156 Z, Resolver::ResolveDynamicForReceiverClass( 4213 Z, Resolver::ResolveDynamicForReceiverClass(
4157 target_class, Symbols::NoSuchMethod(), args_desc)); 4214 target_class, Symbols::NoSuchMethod(), args_desc));
4158 if (no_such_method_func.IsNull()) { 4215 if (no_such_method_func.IsNull()) {
4159 const Class& object_class = 4216 const Class& object_class =
4160 Class::ZoneHandle(Z, isolate()->object_store()->object_class()); 4217 Class::ZoneHandle(Z, isolate()->object_store()->object_class());
4161 no_such_method_func = Resolver::ResolveDynamicForReceiverClass( 4218 no_such_method_func = Resolver::ResolveDynamicForReceiverClass(
4162 object_class, Symbols::NoSuchMethod(), args_desc); 4219 object_class, Symbols::NoSuchMethod(), args_desc);
4163 } 4220 }
4164 // We are guaranteed to find noSuchMethod of class Object. 4221 // We are guaranteed to find noSuchMethod of class Object.
4165 ASSERT(!no_such_method_func.IsNull()); 4222 ASSERT(!no_such_method_func.IsNull());
4166 ZoneGrowableArray<PushArgumentInstr*>* push_arguments = 4223 ZoneGrowableArray<PushArgumentInstr*>* push_arguments =
4167 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2); 4224 new (Z) ZoneGrowableArray<PushArgumentInstr*>(2);
4168 BuildPushArguments(*args, push_arguments); 4225 BuildPushArguments(*args, push_arguments);
4169 return new (Z) 4226 return new (Z) StaticCallInstr(args_pos, no_such_method_func, kTypeArgsLen,
4170 StaticCallInstr(args_pos, no_such_method_func, Object::null_array(), 4227 Object::null_array(), push_arguments,
4171 push_arguments, owner()->ic_data_array()); 4228 owner()->ic_data_array());
4172 } 4229 }
4173 4230
4174 4231
4175 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError( 4232 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError(
4176 TokenPosition token_pos, 4233 TokenPosition token_pos,
4177 const Class& function_class, 4234 const Class& function_class,
4178 const String& function_name, 4235 const String& function_name,
4179 ArgumentListNode* function_arguments, 4236 ArgumentListNode* function_arguments,
4180 int invocation_type) { 4237 int invocation_type) {
4181 ZoneGrowableArray<PushArgumentInstr*>* arguments = 4238 ZoneGrowableArray<PushArgumentInstr*>* arguments =
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4219 4276
4220 // List existingArgumentNames. 4277 // List existingArgumentNames.
4221 Value* existing_argument_names_value = 4278 Value* existing_argument_names_value =
4222 Bind(new (Z) ConstantInstr(Array::ZoneHandle(Z, Array::null()))); 4279 Bind(new (Z) ConstantInstr(Array::ZoneHandle(Z, Array::null())));
4223 arguments->Add(PushArgument(existing_argument_names_value)); 4280 arguments->Add(PushArgument(existing_argument_names_value));
4224 // Resolve and call NoSuchMethodError._throwNew. 4281 // Resolve and call NoSuchMethodError._throwNew.
4225 const Library& core_lib = Library::Handle(Z, Library::CoreLibrary()); 4282 const Library& core_lib = Library::Handle(Z, Library::CoreLibrary());
4226 const Class& cls = 4283 const Class& cls =
4227 Class::Handle(Z, core_lib.LookupClass(Symbols::NoSuchMethodError())); 4284 Class::Handle(Z, core_lib.LookupClass(Symbols::NoSuchMethodError()));
4228 ASSERT(!cls.IsNull()); 4285 ASSERT(!cls.IsNull());
4286 const intptr_t kTypeArgsLen = 0;
4229 const Function& func = Function::ZoneHandle( 4287 const Function& func = Function::ZoneHandle(
4230 Z, Resolver::ResolveStatic( 4288 Z, Resolver::ResolveStatic(
4231 cls, Library::PrivateCoreLibName(Symbols::ThrowNew()), 4289 cls, Library::PrivateCoreLibName(Symbols::ThrowNew()),
4232 arguments->length(), Object::null_array())); 4290 kTypeArgsLen, arguments->length(), Object::null_array()));
4233 ASSERT(!func.IsNull()); 4291 ASSERT(!func.IsNull());
4234 return new (Z) StaticCallInstr(token_pos, func, 4292 return new (Z) StaticCallInstr(token_pos, func, kTypeArgsLen,
4235 Object::null_array(), // No names. 4293 Object::null_array(), // No names.
4236 arguments, owner()->ic_data_array()); 4294 arguments, owner()->ic_data_array());
4237 } 4295 }
4238 4296
4239 4297
4240 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) { 4298 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
4241 if (FLAG_support_debugger) { 4299 if (FLAG_support_debugger) {
4242 if (node->exception()->IsLiteralNode() || 4300 if (node->exception()->IsLiteralNode() ||
4243 node->exception()->IsLoadLocalNode() || 4301 node->exception()->IsLoadLocalNode() ||
4244 node->exception()->IsLoadStaticFieldNode() || 4302 node->exception()->IsLoadStaticFieldNode() ||
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
4393 ASSERT(type.HasResolvedTypeClass()); 4451 ASSERT(type.HasResolvedTypeClass());
4394 const Class& type_class = Class::Handle(type.type_class()); 4452 const Class& type_class = Class::Handle(type.type_class());
4395 // Bail if the type has any type parameters. 4453 // Bail if the type has any type parameters.
4396 if (type_class.IsGeneric()) return false; 4454 if (type_class.IsGeneric()) return false;
4397 4455
4398 // Finally a simple class for instance of checking. 4456 // Finally a simple class for instance of checking.
4399 return true; 4457 return true;
4400 } 4458 }
4401 4459
4402 } // namespace dart 4460 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698