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

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

Issue 2799373002: Pass a second type argument vector to all type instantiation calls in the VM. (Closed)
Patch Set: addressed comments Created 3 years, 8 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/debugger.cc ('k') | runtime/vm/flow_graph_compiler.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) 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 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 } 1227 }
1228 const TokenPosition token_pos = node->token_pos(); 1228 const TokenPosition token_pos = node->token_pos();
1229 Value* instantiator_type_arguments = NULL; 1229 Value* instantiator_type_arguments = NULL;
1230 if (type.IsInstantiated(kCurrentClass)) { 1230 if (type.IsInstantiated(kCurrentClass)) {
1231 instantiator_type_arguments = BuildNullValue(token_pos); 1231 instantiator_type_arguments = BuildNullValue(token_pos);
1232 } else { 1232 } else {
1233 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); 1233 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos);
1234 } 1234 }
1235 Value* function_type_arguments = NULL; 1235 Value* function_type_arguments = NULL;
1236 if (type.IsInstantiated(kCurrentFunction)) { 1236 if (type.IsInstantiated(kCurrentFunction)) {
1237 // TODO(regis): function_type_arguments = BuildNullValue((token_pos); 1237 function_type_arguments = BuildNullValue(token_pos);
1238 } else { 1238 } else {
1239 function_type_arguments = BuildFunctionTypeArguments(token_pos); 1239 function_type_arguments = BuildFunctionTypeArguments(token_pos);
1240 } 1240 }
1241 ReturnDefinition(new (Z) InstantiateTypeInstr( 1241 ReturnDefinition(new (Z) InstantiateTypeInstr(
1242 token_pos, type, instantiator_type_arguments, function_type_arguments)); 1242 token_pos, type, instantiator_type_arguments, function_type_arguments));
1243 } 1243 }
1244 1244
1245 1245
1246 // Returns true if the type check can be skipped, for example, if the 1246 // Returns true if the type check can be skipped, for example, if the
1247 // destination type is dynamic or if the compile type of the value is a subtype 1247 // destination type is dynamic or if the compile type of the value is a subtype
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 const String& dst_name) { 1456 const String& dst_name) {
1457 // Build the type check computation. 1457 // Build the type check computation.
1458 Value* instantiator_type_arguments = NULL; 1458 Value* instantiator_type_arguments = NULL;
1459 Value* function_type_arguments = NULL; 1459 Value* function_type_arguments = NULL;
1460 if (dst_type.IsInstantiated(kCurrentClass)) { 1460 if (dst_type.IsInstantiated(kCurrentClass)) {
1461 instantiator_type_arguments = BuildNullValue(token_pos); 1461 instantiator_type_arguments = BuildNullValue(token_pos);
1462 } else { 1462 } else {
1463 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); 1463 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos);
1464 } 1464 }
1465 if (dst_type.IsInstantiated(kCurrentFunction)) { 1465 if (dst_type.IsInstantiated(kCurrentFunction)) {
1466 // TODO(regis): function_type_arguments = BuildNullValue(token_pos); 1466 function_type_arguments = BuildNullValue(token_pos);
1467 } else { 1467 } else {
1468 function_type_arguments = BuildFunctionTypeArguments(token_pos); 1468 function_type_arguments = BuildFunctionTypeArguments(token_pos);
1469 } 1469 }
1470 1470
1471 const intptr_t deopt_id = Thread::Current()->GetNextDeoptId(); 1471 const intptr_t deopt_id = Thread::Current()->GetNextDeoptId();
1472 return new (Z) AssertAssignableInstr( 1472 return new (Z) AssertAssignableInstr(
1473 token_pos, value, instantiator_type_arguments, function_type_arguments, 1473 token_pos, value, instantiator_type_arguments, function_type_arguments,
1474 dst_type, dst_name, deopt_id); 1474 dst_type, dst_name, deopt_id);
1475 } 1475 }
1476 1476
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 kNumArgsChecked, owner()->ic_data_array()); 1525 kNumArgsChecked, owner()->ic_data_array());
1526 if (negate_result) { 1526 if (negate_result) {
1527 result = new (Z) BooleanNegateInstr(Bind(result)); 1527 result = new (Z) BooleanNegateInstr(Bind(result));
1528 } 1528 }
1529 ReturnDefinition(result); 1529 ReturnDefinition(result);
1530 return; 1530 return;
1531 } 1531 }
1532 1532
1533 PushArgumentInstr* push_instantiator_type_args = 1533 PushArgumentInstr* push_instantiator_type_args =
1534 PushInstantiatorTypeArguments(type, node->token_pos()); 1534 PushInstantiatorTypeArguments(type, node->token_pos());
1535 // TODO(regis): PushArgumentInstr* push_function_type_args = 1535 PushArgumentInstr* push_function_type_args =
1536 // PushFunctionTypeArguments(type, node->token_pos()); 1536 PushFunctionTypeArguments(type, node->token_pos());
1537 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1537 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1538 new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); 1538 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
1539 arguments->Add(push_left); 1539 arguments->Add(push_left);
1540 arguments->Add(push_instantiator_type_args); 1540 arguments->Add(push_instantiator_type_args);
1541 // TODO(regis): arguments->Add(push_function_type_args); 1541 arguments->Add(push_function_type_args);
1542 Value* type_const = Bind(new (Z) ConstantInstr(type)); 1542 Value* type_const = Bind(new (Z) ConstantInstr(type));
1543 arguments->Add(PushArgument(type_const)); 1543 arguments->Add(PushArgument(type_const));
1544 const intptr_t kNumArgsChecked = 1; 1544 const intptr_t kNumArgsChecked = 1;
1545 Definition* result = new (Z) InstanceCallInstr( 1545 Definition* result = new (Z) InstanceCallInstr(
1546 node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()), 1546 node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()),
1547 node->kind(), arguments, 1547 node->kind(), arguments,
1548 Object::null_array(), // No argument names. 1548 Object::null_array(), // No argument names.
1549 kNumArgsChecked, owner()->ic_data_array()); 1549 kNumArgsChecked, owner()->ic_data_array());
1550 if (negate_result) { 1550 if (negate_result) {
1551 result = new (Z) BooleanNegateInstr(Bind(result)); 1551 result = new (Z) BooleanNegateInstr(Bind(result));
(...skipping 11 matching lines...) Expand all
1563 node->left()->Visit(&for_value); 1563 node->left()->Visit(&for_value);
1564 Append(for_value); 1564 Append(for_value);
1565 if (CanSkipTypeCheck(node->token_pos(), for_value.value(), type, 1565 if (CanSkipTypeCheck(node->token_pos(), for_value.value(), type,
1566 Symbols::InTypeCast())) { 1566 Symbols::InTypeCast())) {
1567 ReturnValue(for_value.value()); 1567 ReturnValue(for_value.value());
1568 return; 1568 return;
1569 } 1569 }
1570 PushArgumentInstr* push_left = PushArgument(for_value.value()); 1570 PushArgumentInstr* push_left = PushArgument(for_value.value());
1571 PushArgumentInstr* push_instantiator_type_args = 1571 PushArgumentInstr* push_instantiator_type_args =
1572 PushInstantiatorTypeArguments(type, node->token_pos()); 1572 PushInstantiatorTypeArguments(type, node->token_pos());
1573 // TODO(regis): PushArgumentInstr* push_function_type_args = 1573 PushArgumentInstr* push_function_type_args =
1574 // PushFunctionTypeArguments(type, node->token_pos()); 1574 PushFunctionTypeArguments(type, node->token_pos());
1575 ZoneGrowableArray<PushArgumentInstr*>* arguments = 1575 ZoneGrowableArray<PushArgumentInstr*>* arguments =
1576 new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); 1576 new (Z) ZoneGrowableArray<PushArgumentInstr*>(4);
1577 arguments->Add(push_left); 1577 arguments->Add(push_left);
1578 arguments->Add(push_instantiator_type_args); 1578 arguments->Add(push_instantiator_type_args);
1579 // TODO(regis): arguments->Add(push_function_type_args); 1579 arguments->Add(push_function_type_args);
1580 Value* type_arg = Bind(new (Z) ConstantInstr(type)); 1580 Value* type_arg = Bind(new (Z) ConstantInstr(type));
1581 arguments->Add(PushArgument(type_arg)); 1581 arguments->Add(PushArgument(type_arg));
1582 const intptr_t kNumArgsChecked = 1; 1582 const intptr_t kNumArgsChecked = 1;
1583 InstanceCallInstr* call = new (Z) InstanceCallInstr( 1583 InstanceCallInstr* call = new (Z) InstanceCallInstr(
1584 node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()), 1584 node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()),
1585 node->kind(), arguments, 1585 node->kind(), arguments,
1586 Object::null_array(), // No argument names. 1586 Object::null_array(), // No argument names.
1587 kNumArgsChecked, owner()->ic_data_array()); 1587 kNumArgsChecked, owner()->ic_data_array());
1588 ReturnDefinition(call); 1588 ReturnDefinition(call);
1589 } 1589 }
(...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after
2731 Class::ZoneHandle(Z, owner()->function().Owner()); 2731 Class::ZoneHandle(Z, owner()->function().Owner());
2732 Value* instantiator_type_args = BuildInstantiatorTypeArguments(token_pos); 2732 Value* instantiator_type_args = BuildInstantiatorTypeArguments(token_pos);
2733 const bool use_instantiator_type_args = 2733 const bool use_instantiator_type_args =
2734 type_arguments.IsUninstantiatedIdentity() || 2734 type_arguments.IsUninstantiatedIdentity() ||
2735 type_arguments.CanShareInstantiatorTypeArguments(instantiator_class); 2735 type_arguments.CanShareInstantiatorTypeArguments(instantiator_class);
2736 if (use_instantiator_type_args) { 2736 if (use_instantiator_type_args) {
2737 return instantiator_type_args; 2737 return instantiator_type_args;
2738 } 2738 }
2739 Value* function_type_args = NULL; 2739 Value* function_type_args = NULL;
2740 if (type_arguments.IsInstantiated(kCurrentFunction)) { 2740 if (type_arguments.IsInstantiated(kCurrentFunction)) {
2741 // TODO(regis): function_type_args = BuildNullValue(token_pos); 2741 function_type_args = BuildNullValue(token_pos);
2742 } else { 2742 } else {
2743 function_type_args = BuildFunctionTypeArguments(token_pos); 2743 function_type_args = BuildFunctionTypeArguments(token_pos);
2744 } 2744 }
2745 return Bind(new (Z) InstantiateTypeArgumentsInstr( 2745 return Bind(new (Z) InstantiateTypeArgumentsInstr(
2746 token_pos, type_arguments, instantiator_class, instantiator_type_args, 2746 token_pos, type_arguments, instantiator_class, instantiator_type_args,
2747 function_type_args)); 2747 function_type_args));
2748 } 2748 }
2749 2749
2750 2750
2751 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { 2751 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
(...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after
4133 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError( 4133 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError(
4134 TokenPosition token_pos, 4134 TokenPosition token_pos,
4135 const Class& function_class, 4135 const Class& function_class,
4136 const String& function_name, 4136 const String& function_name,
4137 ArgumentListNode* function_arguments, 4137 ArgumentListNode* function_arguments,
4138 int invocation_type) { 4138 int invocation_type) {
4139 ZoneGrowableArray<PushArgumentInstr*>* arguments = 4139 ZoneGrowableArray<PushArgumentInstr*>* arguments =
4140 new (Z) ZoneGrowableArray<PushArgumentInstr*>(); 4140 new (Z) ZoneGrowableArray<PushArgumentInstr*>();
4141 // Object receiver, actually a class literal of the unresolved method's owner. 4141 // Object receiver, actually a class literal of the unresolved method's owner.
4142 AbstractType& type = Type::ZoneHandle( 4142 AbstractType& type = Type::ZoneHandle(
4143 Z, 4143 Z, Type::New(function_class, Object::null_type_arguments(), token_pos,
4144 Type::New(function_class, TypeArguments::Handle(Z, TypeArguments::null()), 4144 Heap::kOld));
4145 token_pos, Heap::kOld));
4146 type ^= ClassFinalizer::FinalizeType(function_class, type); 4145 type ^= ClassFinalizer::FinalizeType(function_class, type);
4147 Value* receiver_value = Bind(new (Z) ConstantInstr(type)); 4146 Value* receiver_value = Bind(new (Z) ConstantInstr(type));
4148 arguments->Add(PushArgument(receiver_value)); 4147 arguments->Add(PushArgument(receiver_value));
4149 // String memberName. 4148 // String memberName.
4150 const String& member_name = 4149 const String& member_name =
4151 String::ZoneHandle(Z, Symbols::New(T, function_name)); 4150 String::ZoneHandle(Z, Symbols::New(T, function_name));
4152 Value* member_name_value = Bind(new (Z) ConstantInstr(member_name)); 4151 Value* member_name_value = Bind(new (Z) ConstantInstr(member_name));
4153 arguments->Add(PushArgument(member_name_value)); 4152 arguments->Add(PushArgument(member_name_value));
4154 // Smi invocation_type. 4153 // Smi invocation_type.
4155 Value* invocation_type_value = Bind( 4154 Value* invocation_type_value = Bind(
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
4352 ASSERT(type.HasResolvedTypeClass()); 4351 ASSERT(type.HasResolvedTypeClass());
4353 const Class& type_class = Class::Handle(type.type_class()); 4352 const Class& type_class = Class::Handle(type.type_class());
4354 // Bail if the type has any type parameters. 4353 // Bail if the type has any type parameters.
4355 if (type_class.IsGeneric()) return false; 4354 if (type_class.IsGeneric()) return false;
4356 4355
4357 // Finally a simple class for instance of checking. 4356 // Finally a simple class for instance of checking.
4358 return true; 4357 return true;
4359 } 4358 }
4360 4359
4361 } // namespace dart 4360 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/debugger.cc ('k') | runtime/vm/flow_graph_compiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698