| Index: runtime/vm/kernel_to_il.cc
|
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
|
| index 69a12bb21c1c3b234b0ce0ed0d92df62637c4704..7e40676888b99c48f8bed6b004fd645fbaee905e 100644
|
| --- a/runtime/vm/kernel_to_il.cc
|
| +++ b/runtime/vm/kernel_to_il.cc
|
| @@ -2,7 +2,6 @@
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -#include <map>
|
| #include <set>
|
| #include <string>
|
|
|
| @@ -2154,10 +2153,18 @@ Fragment FlowGraphBuilder::LoadInstantiatorTypeArguments() {
|
| }
|
|
|
|
|
| +Fragment FlowGraphBuilder::LoadFunctionTypeArguments() {
|
| + UNIMPLEMENTED(); // TODO(regis)
|
| + return Fragment(NULL);
|
| +}
|
| +
|
| +
|
| Fragment FlowGraphBuilder::InstantiateType(const AbstractType& type) {
|
| - InstantiateTypeInstr* instr = new (Z)
|
| - InstantiateTypeInstr(TokenPosition::kNoSource, type, Pop(),
|
| - NULL); // TODO(regis): Pop function type arguments.
|
| + Value* function_type_args = Pop();
|
| + Value* instantiator_type_args = Pop();
|
| + InstantiateTypeInstr* instr =
|
| + new (Z) InstantiateTypeInstr(TokenPosition::kNoSource, type,
|
| + instantiator_type_args, function_type_args);
|
| Push(instr);
|
| return Fragment(instr);
|
| }
|
| @@ -2165,9 +2172,11 @@ Fragment FlowGraphBuilder::InstantiateType(const AbstractType& type) {
|
|
|
| Fragment FlowGraphBuilder::InstantiateTypeArguments(
|
| const TypeArguments& type_arguments) {
|
| + Value* function_type_args = Pop();
|
| + Value* instantiator_type_args = Pop();
|
| InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr(
|
| - TokenPosition::kNoSource, type_arguments, *active_class_.klass, Pop(),
|
| - NULL); // TODO(regis): Pop function type arguments.
|
| + TokenPosition::kNoSource, type_arguments, *active_class_.klass,
|
| + instantiator_type_args, function_type_args);
|
| Push(instr);
|
| return Fragment(instr);
|
| }
|
| @@ -2200,7 +2209,16 @@ Fragment FlowGraphBuilder::TranslateInstantiatedTypeArguments(
|
| } else {
|
| // Otherwise we need to resolve [TypeParameterType]s in the type
|
| // expression based on the current instantiator type argument vector.
|
| - instructions += LoadInstantiatorTypeArguments();
|
| + if (!type_arguments.IsInstantiated(kCurrentClass)) {
|
| + instructions += LoadInstantiatorTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + if (!type_arguments.IsInstantiated(kCurrentFunction)) {
|
| + instructions += LoadFunctionTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| instructions += InstantiateTypeArguments(type_arguments);
|
| }
|
| }
|
| @@ -3814,13 +3832,23 @@ Fragment FlowGraphBuilder::AssertAssignable(const dart::AbstractType& dst_type,
|
| Fragment instructions;
|
| Value* value = Pop();
|
|
|
| - instructions += LoadInstantiatorTypeArguments();
|
| - Value* type_args = Pop();
|
| + if (!dst_type.IsInstantiated(kCurrentClass)) {
|
| + instructions += LoadInstantiatorTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + Value* instantiator_type_args = Pop();
|
| +
|
| + if (!dst_type.IsInstantiated(kCurrentFunction)) {
|
| + instructions += LoadFunctionTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + Value* function_type_args = Pop();
|
|
|
| - AssertAssignableInstr* instr = new (Z)
|
| - AssertAssignableInstr(TokenPosition::kNoSource, value, type_args,
|
| - NULL, // TODO(regis): Pop function type arguments.
|
| - dst_type, dst_name, H.thread()->GetNextDeoptId());
|
| + AssertAssignableInstr* instr = new (Z) AssertAssignableInstr(
|
| + TokenPosition::kNoSource, value, instantiator_type_args,
|
| + function_type_args, dst_type, dst_name, H.thread()->GetNextDeoptId());
|
| Push(instr);
|
|
|
| instructions += Fragment(instr);
|
| @@ -4655,7 +4683,16 @@ void FlowGraphBuilder::VisitTypeLiteral(TypeLiteral* node) {
|
| if (type.IsInstantiated()) {
|
| instructions += Constant(type);
|
| } else {
|
| - instructions += LoadInstantiatorTypeArguments();
|
| + if (!type.IsInstantiated(kCurrentClass)) {
|
| + instructions += LoadInstantiatorTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + if (!type.IsInstantiated(kCurrentFunction)) {
|
| + instructions += LoadFunctionTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| instructions += InstantiateType(type);
|
| }
|
| fragment_ = instructions;
|
| @@ -5081,12 +5118,19 @@ void FlowGraphBuilder::VisitIsExpression(IsExpression* node) {
|
| return;
|
| }
|
|
|
| - if (!type.IsInstantiated()) {
|
| + if (!type.IsInstantiated(kCurrentClass)) {
|
| instructions += LoadInstantiatorTypeArguments();
|
| } else {
|
| instructions += NullConstant();
|
| }
|
| - instructions += PushArgument(); // Type arguments.
|
| + instructions += PushArgument(); // Instantiator type arguments.
|
| +
|
| + if (!type.IsInstantiated(kCurrentFunction)) {
|
| + instructions += LoadFunctionTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + instructions += PushArgument(); // Function type arguments.
|
|
|
| instructions += Constant(type);
|
| instructions += PushArgument(); // Type.
|
| @@ -5094,7 +5138,7 @@ void FlowGraphBuilder::VisitIsExpression(IsExpression* node) {
|
| instructions +=
|
| InstanceCall(node->position(),
|
| dart::Library::PrivateCoreLibName(Symbols::_instanceOf()),
|
| - Token::kIS, 3);
|
| + Token::kIS, 4);
|
| }
|
|
|
| fragment_ = instructions;
|
| @@ -5122,19 +5166,26 @@ void FlowGraphBuilder::VisitAsExpression(AsExpression* node) {
|
| } else {
|
| instructions += PushArgument();
|
|
|
| - if (!type.IsInstantiated()) {
|
| + if (!type.IsInstantiated(kCurrentClass)) {
|
| instructions += LoadInstantiatorTypeArguments();
|
| } else {
|
| instructions += NullConstant();
|
| }
|
| - instructions += PushArgument(); // Type arguments.
|
| + instructions += PushArgument(); // Instantiator type arguments.
|
| +
|
| + if (!type.IsInstantiated(kCurrentFunction)) {
|
| + instructions += LoadFunctionTypeArguments();
|
| + } else {
|
| + instructions += NullConstant();
|
| + }
|
| + instructions += PushArgument(); // Function type arguments.
|
|
|
| instructions += Constant(type);
|
| instructions += PushArgument(); // Type.
|
|
|
| instructions += InstanceCall(
|
| node->position(), dart::Library::PrivateCoreLibName(Symbols::_as()),
|
| - Token::kAS, 3);
|
| + Token::kAS, 4);
|
| }
|
|
|
| fragment_ = instructions;
|
| @@ -6175,13 +6226,15 @@ void FlowGraphBuilder::VisitTryCatch(class TryCatch* node) {
|
| catch_body += LoadLocal(CurrentException());
|
| catch_body += PushArgument(); // exception
|
| catch_body += NullConstant();
|
| - catch_body += PushArgument(); // type arguments
|
| + catch_body += PushArgument(); // instantiator type arguments
|
| + catch_body += NullConstant();
|
| + catch_body += PushArgument(); // function type arguments
|
| catch_body += Constant(*type_guard);
|
| catch_body += PushArgument(); // guard type
|
| catch_body += InstanceCall(
|
| TokenPosition::kNoSource,
|
| dart::Library::PrivateCoreLibName(Symbols::_instanceOf()),
|
| - Token::kIS, 3);
|
| + Token::kIS, 4);
|
|
|
| TargetEntryInstr* catch_entry;
|
| TargetEntryInstr* next_catch_entry;
|
|
|