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

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

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: address review comments and sync 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
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.cc ('k') | runtime/vm/object.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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 <set> 5 #include <set>
6 6
7 #include "vm/kernel_to_il.h" 7 #include "vm/kernel_to_il.h"
8 8
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/intermediate_language.h" 10 #include "vm/intermediate_language.h"
(...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 } 1554 }
1555 1555
1556 1556
1557 RawObject* ConstantEvaluator::EvaluateConstConstructorCall( 1557 RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
1558 const dart::Class& type_class, 1558 const dart::Class& type_class,
1559 const TypeArguments& type_arguments, 1559 const TypeArguments& type_arguments,
1560 const Function& constructor, 1560 const Function& constructor,
1561 const Object& argument) { 1561 const Object& argument) {
1562 // Factories have one extra argument: the type arguments. 1562 // Factories have one extra argument: the type arguments.
1563 // Constructors have 1 extra arguments: receiver. 1563 // Constructors have 1 extra arguments: receiver.
1564 const int kTypeArgsLen = 0;
1564 const int kNumArgs = 1; 1565 const int kNumArgs = 1;
1565 const int kNumExtraArgs = 1; 1566 const int kNumExtraArgs = 1;
1566 const int num_arguments = kNumArgs + kNumExtraArgs; 1567 const int num_arguments = kNumArgs + kNumExtraArgs;
1567 const Array& arg_values = 1568 const Array& arg_values =
1568 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); 1569 Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
1569 Instance& instance = Instance::Handle(Z); 1570 Instance& instance = Instance::Handle(Z);
1570 if (!constructor.IsFactory()) { 1571 if (!constructor.IsFactory()) {
1571 instance = Instance::New(type_class, Heap::kOld); 1572 instance = Instance::New(type_class, Heap::kOld);
1572 if (!type_arguments.IsNull()) { 1573 if (!type_arguments.IsNull()) {
1573 ASSERT(type_arguments.IsInstantiated()); 1574 ASSERT(type_arguments.IsInstantiated());
1574 instance.SetTypeArguments( 1575 instance.SetTypeArguments(
1575 TypeArguments::Handle(Z, type_arguments.Canonicalize())); 1576 TypeArguments::Handle(Z, type_arguments.Canonicalize()));
1576 } 1577 }
1577 arg_values.SetAt(0, instance); 1578 arg_values.SetAt(0, instance);
1578 } else { 1579 } else {
1579 // Prepend type_arguments to list of arguments to factory. 1580 // Prepend type_arguments to list of arguments to factory.
1580 ASSERT(type_arguments.IsZoneHandle()); 1581 ASSERT(type_arguments.IsZoneHandle());
1581 arg_values.SetAt(0, type_arguments); 1582 arg_values.SetAt(0, type_arguments);
1582 } 1583 }
1583 arg_values.SetAt((0 + kNumExtraArgs), argument); 1584 arg_values.SetAt((0 + kNumExtraArgs), argument);
1584 const Array& args_descriptor = Array::Handle( 1585 const Array& args_descriptor =
1585 Z, ArgumentsDescriptor::New(num_arguments, Object::empty_array())); 1586 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments,
1587 Object::empty_array()));
1586 const Object& result = Object::Handle( 1588 const Object& result = Object::Handle(
1587 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); 1589 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
1588 ASSERT(!result.IsError()); 1590 ASSERT(!result.IsError());
1589 if (constructor.IsFactory()) { 1591 if (constructor.IsFactory()) {
1590 // The factory method returns the allocated object. 1592 // The factory method returns the allocated object.
1591 instance ^= result.raw(); 1593 instance ^= result.raw();
1592 } 1594 }
1593 return H.Canonicalize(instance); 1595 return H.Canonicalize(instance);
1594 } 1596 }
1595 1597
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1988 arguments.SetAt(pos++, result_); 1990 arguments.SetAt(pos++, result_);
1989 names.SetAt(i, H.DartSymbol(named_expression->name())); 1991 names.SetAt(i, H.DartSymbol(named_expression->name()));
1990 } 1992 }
1991 return RunFunction(function, arguments, names); 1993 return RunFunction(function, arguments, names);
1992 } 1994 }
1993 1995
1994 1996
1995 const Object& ConstantEvaluator::RunFunction(const Function& function, 1997 const Object& ConstantEvaluator::RunFunction(const Function& function,
1996 const Array& arguments, 1998 const Array& arguments,
1997 const Array& names) { 1999 const Array& names) {
1998 const Array& args_descriptor = 2000 const int kTypeArgsLen = 0; // Generic functions not yet supported.
1999 Array::Handle(Z, ArgumentsDescriptor::New(arguments.Length(), names)); 2001 const Array& args_descriptor = Array::Handle(
2002 Z, ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length(), names));
2000 const Object& result = Object::Handle( 2003 const Object& result = Object::Handle(
2001 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor)); 2004 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
2002 if (result.IsError()) { 2005 if (result.IsError()) {
2003 H.ReportError(Error::Cast(result), "error evaluating constant constructor"); 2006 H.ReportError(Error::Cast(result), "error evaluating constant constructor");
2004 } 2007 }
2005 return result; 2008 return result;
2006 } 2009 }
2007 2010
2008 2011
2009 FlowGraphBuilder::FlowGraphBuilder( 2012 FlowGraphBuilder::FlowGraphBuilder(
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
2525 } 2528 }
2526 2529
2527 2530
2528 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, 2531 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position,
2529 const dart::String& name, 2532 const dart::String& name,
2530 Token::Kind kind, 2533 Token::Kind kind,
2531 intptr_t argument_count, 2534 intptr_t argument_count,
2532 const Array& argument_names, 2535 const Array& argument_names,
2533 intptr_t num_args_checked) { 2536 intptr_t num_args_checked) {
2534 ArgumentArray arguments = GetArguments(argument_count); 2537 ArgumentArray arguments = GetArguments(argument_count);
2535 InstanceCallInstr* call = 2538 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported.
2536 new (Z) InstanceCallInstr(position, name, kind, arguments, argument_names, 2539 InstanceCallInstr* call = new (Z)
2537 num_args_checked, ic_data_array_); 2540 InstanceCallInstr(position, name, kind, arguments, kTypeArgsLen,
2541 argument_names, num_args_checked, ic_data_array_);
2538 Push(call); 2542 Push(call);
2539 return Fragment(call); 2543 return Fragment(call);
2540 } 2544 }
2541 2545
2542 2546
2543 Fragment FlowGraphBuilder::ClosureCall(int argument_count, 2547 Fragment FlowGraphBuilder::ClosureCall(int argument_count,
2544 const Array& argument_names) { 2548 const Array& argument_names) {
2545 Value* function = Pop(); 2549 Value* function = Pop();
2546 ArgumentArray arguments = GetArguments(argument_count); 2550 ArgumentArray arguments = GetArguments(argument_count);
2547 ClosureCallInstr* call = new (Z) ClosureCallInstr( 2551 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported.
2548 function, arguments, argument_names, TokenPosition::kNoSource); 2552 ClosureCallInstr* call =
2553 new (Z) ClosureCallInstr(function, arguments, kTypeArgsLen,
2554 argument_names, TokenPosition::kNoSource);
2549 Push(call); 2555 Push(call);
2550 return Fragment(call); 2556 return Fragment(call);
2551 } 2557 }
2552 2558
2553 2559
2554 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { 2560 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) {
2555 Fragment instructions; 2561 Fragment instructions;
2556 instructions += Drop(); 2562 instructions += Drop();
2557 instructions += Fragment(new (Z) ThrowInstr(position)).closed(); 2563 instructions += Fragment(new (Z) ThrowInstr(position)).closed();
2558 // Use it's side effect of leaving a constant on the stack (does not change 2564 // Use it's side effect of leaving a constant on the stack (does not change
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
2751 } 2757 }
2752 return FactoryRecognizer::ResultCid(function); 2758 return FactoryRecognizer::ResultCid(function);
2753 } 2759 }
2754 2760
2755 2761
2756 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, 2762 Fragment FlowGraphBuilder::StaticCall(TokenPosition position,
2757 const Function& target, 2763 const Function& target,
2758 intptr_t argument_count, 2764 intptr_t argument_count,
2759 const Array& argument_names) { 2765 const Array& argument_names) {
2760 ArgumentArray arguments = GetArguments(argument_count); 2766 ArgumentArray arguments = GetArguments(argument_count);
2761 StaticCallInstr* call = new (Z) StaticCallInstr( 2767 const intptr_t kTypeArgsLen = 0; // Generic static calls not yet supported.
2762 position, target, argument_names, arguments, ic_data_array_); 2768 StaticCallInstr* call =
2769 new (Z) StaticCallInstr(position, target, kTypeArgsLen, argument_names,
2770 arguments, ic_data_array_);
2763 const intptr_t list_cid = 2771 const intptr_t list_cid =
2764 GetResultCidOfListFactory(Z, target, argument_count); 2772 GetResultCidOfListFactory(Z, target, argument_count);
2765 if (list_cid != kDynamicCid) { 2773 if (list_cid != kDynamicCid) {
2766 call->set_result_cid(list_cid); 2774 call->set_result_cid(list_cid);
2767 call->set_is_known_list_constructor(true); 2775 call->set_is_known_list_constructor(true);
2768 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) { 2776 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) {
2769 call->set_result_cid(MethodRecognizer::ResultCid(target)); 2777 call->set_result_cid(MethodRecognizer::ResultCid(target));
2770 } 2778 }
2771 Push(call); 2779 Push(call);
2772 return Fragment(call); 2780 return Fragment(call);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2873 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { 2881 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) {
2874 Value* array = Pop(); 2882 Value* array = Pop();
2875 StringInterpolateInstr* interpolate = 2883 StringInterpolateInstr* interpolate =
2876 new (Z) StringInterpolateInstr(array, position); 2884 new (Z) StringInterpolateInstr(array, position);
2877 Push(interpolate); 2885 Push(interpolate);
2878 return Fragment(interpolate); 2886 return Fragment(interpolate);
2879 } 2887 }
2880 2888
2881 2889
2882 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { 2890 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) {
2891 const int kTypeArgsLen = 0;
2883 const int kNumberOfArguments = 1; 2892 const int kNumberOfArguments = 1;
2884 const Array& kNoArgumentNames = Object::null_array(); 2893 const Array& kNoArgumentNames = Object::null_array();
2885 const dart::Class& cls = dart::Class::Handle( 2894 const dart::Class& cls = dart::Class::Handle(
2886 dart::Library::LookupCoreClass(Symbols::StringBase())); 2895 dart::Library::LookupCoreClass(Symbols::StringBase()));
2887 ASSERT(!cls.IsNull()); 2896 ASSERT(!cls.IsNull());
2888 const Function& function = Function::ZoneHandle( 2897 const Function& function = Function::ZoneHandle(
2889 Z, Resolver::ResolveStatic(cls, dart::Library::PrivateCoreLibName( 2898 Z,
2890 Symbols::InterpolateSingle()), 2899 Resolver::ResolveStatic(
2891 kNumberOfArguments, kNoArgumentNames)); 2900 cls, dart::Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
2901 kTypeArgsLen, kNumberOfArguments, kNoArgumentNames));
2892 Fragment instructions; 2902 Fragment instructions;
2893 instructions += PushArgument(); 2903 instructions += PushArgument();
2894 instructions += StaticCall(position, function, 1); 2904 instructions += StaticCall(position, function, 1);
2895 return instructions; 2905 return instructions;
2896 } 2906 }
2897 2907
2898 2908
2899 Fragment FlowGraphBuilder::ThrowTypeError() { 2909 Fragment FlowGraphBuilder::ThrowTypeError() {
2900 const dart::Class& klass = dart::Class::ZoneHandle( 2910 const dart::Class& klass = dart::Class::ZoneHandle(
2901 Z, dart::Library::LookupCoreClass(Symbols::TypeError())); 2911 Z, dart::Library::LookupCoreClass(Symbols::TypeError()));
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after
4047 ZoneGrowableArray<const Instance*>* default_values = 4057 ZoneGrowableArray<const Instance*>* default_values =
4048 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); 4058 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount());
4049 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { 4059 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) {
4050 default_values->Add(&Object::null_instance()); 4060 default_values->Add(&Object::null_instance());
4051 } 4061 }
4052 parsed_function_->set_default_parameter_values(default_values); 4062 parsed_function_->set_default_parameter_values(default_values);
4053 4063
4054 Fragment body(normal_entry); 4064 Fragment body(normal_entry);
4055 body += CheckStackOverflowInPrologue(); 4065 body += CheckStackOverflowInPrologue();
4056 4066
4067 // TODO(regis): Check if a type argument vector is passed.
4068
4057 // The receiver is the first argument to noSuchMethod, and it is the first 4069 // The receiver is the first argument to noSuchMethod, and it is the first
4058 // argument passed to the dispatcher function. 4070 // argument passed to the dispatcher function.
4059 LocalScope* scope = parsed_function_->node_sequence()->scope(); 4071 LocalScope* scope = parsed_function_->node_sequence()->scope();
4060 body += LoadLocal(scope->VariableAt(0)); 4072 body += LoadLocal(scope->VariableAt(0));
4061 body += PushArgument(); 4073 body += PushArgument();
4062 4074
4063 // The second argument to noSuchMethod is an invocation mirror. Push the 4075 // The second argument to noSuchMethod is an invocation mirror. Push the
4064 // arguments for allocating the invocation mirror. First, the name. 4076 // arguments for allocating the invocation mirror. First, the name.
4065 body += Constant(dart::String::ZoneHandle(Z, function.name())); 4077 body += Constant(dart::String::ZoneHandle(Z, function.name()));
4066 body += PushArgument(); 4078 body += PushArgument();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4102 const dart::Class& mirror_class = dart::Class::Handle( 4114 const dart::Class& mirror_class = dart::Class::Handle(
4103 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror())); 4115 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror()));
4104 ASSERT(!mirror_class.IsNull()); 4116 ASSERT(!mirror_class.IsNull());
4105 const Function& allocation_function = Function::ZoneHandle( 4117 const Function& allocation_function = Function::ZoneHandle(
4106 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName( 4118 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName(
4107 Symbols::AllocateInvocationMirror()))); 4119 Symbols::AllocateInvocationMirror())));
4108 ASSERT(!allocation_function.IsNull()); 4120 ASSERT(!allocation_function.IsNull());
4109 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4); 4121 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4);
4110 body += PushArgument(); // For the call to noSuchMethod. 4122 body += PushArgument(); // For the call to noSuchMethod.
4111 4123
4124 const int kTypeArgsLen = 0;
4112 ArgumentsDescriptor two_arguments( 4125 ArgumentsDescriptor two_arguments(
4113 Array::Handle(Z, ArgumentsDescriptor::New(2))); 4126 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, 2)));
4114 Function& no_such_method = 4127 Function& no_such_method =
4115 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( 4128 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
4116 dart::Class::Handle(Z, function.Owner()), 4129 dart::Class::Handle(Z, function.Owner()),
4117 Symbols::NoSuchMethod(), two_arguments)); 4130 Symbols::NoSuchMethod(), two_arguments));
4118 if (no_such_method.IsNull()) { 4131 if (no_such_method.IsNull()) {
4119 // If noSuchMethod is not found on the receiver class, call 4132 // If noSuchMethod is not found on the receiver class, call
4120 // Object.noSuchMethod. 4133 // Object.noSuchMethod.
4121 no_such_method = Resolver::ResolveDynamicForReceiverClass( 4134 no_such_method = Resolver::ResolveDynamicForReceiverClass(
4122 dart::Class::Handle(Z, I->object_store()->object_class()), 4135 dart::Class::Handle(Z, I->object_store()->object_class()),
4123 Symbols::NoSuchMethod(), two_arguments); 4136 Symbols::NoSuchMethod(), two_arguments);
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after
5010 if (target.IsGenerativeConstructor() || target.IsFactory()) { 5023 if (target.IsGenerativeConstructor() || target.IsFactory()) {
5011 // The VM requires a TypeArguments object as first parameter for 5024 // The VM requires a TypeArguments object as first parameter for
5012 // every factory constructor. 5025 // every factory constructor.
5013 ++argument_count; 5026 ++argument_count;
5014 } 5027 }
5015 5028
5016 List<NamedExpression>& named = node->arguments()->named(); 5029 List<NamedExpression>& named = node->arguments()->named();
5017 const Array& argument_names = H.ArgumentNames(&named); 5030 const Array& argument_names = H.ArgumentNames(&named);
5018 5031
5019 // The frontend ensures we the [StaticInvocation] has matching arguments. 5032 // The frontend ensures we the [StaticInvocation] has matching arguments.
5020 ASSERT(target.AreValidArguments(argument_count, argument_names, NULL)); 5033 const intptr_t kTypeArgsLen = 0; // Generic functions not yet supported.
5034 ASSERT(target.AreValidArguments(kTypeArgsLen, argument_count, argument_names,
5035 NULL));
5021 5036
5022 Fragment instructions; 5037 Fragment instructions;
5023 LocalVariable* instance_variable = NULL; 5038 LocalVariable* instance_variable = NULL;
5024 5039
5025 // If we cross the Kernel -> VM core library boundary, a [StaticInvocation] 5040 // If we cross the Kernel -> VM core library boundary, a [StaticInvocation]
5026 // can appear, but the thing we're calling is not a static method, but a 5041 // can appear, but the thing we're calling is not a static method, but a
5027 // factory constructor. 5042 // factory constructor.
5028 // The `H.LookupStaticmethodByKernelProcedure` will potentially resolve to the 5043 // The `H.LookupStaticmethodByKernelProcedure` will potentially resolve to the
5029 // forwarded constructor. 5044 // forwarded constructor.
5030 // In that case we'll make an instance and pass it as first argument. 5045 // In that case we'll make an instance and pass it as first argument.
(...skipping 1784 matching lines...) Expand 10 before | Expand all | Expand 10 after
6815 thread->clear_sticky_error(); 6830 thread->clear_sticky_error();
6816 return error.raw(); 6831 return error.raw();
6817 } 6832 }
6818 } 6833 }
6819 6834
6820 6835
6821 } // namespace kernel 6836 } // namespace kernel
6822 } // namespace dart 6837 } // namespace dart
6823 6838
6824 #endif // !defined(DART_PRECOMPILED_RUNTIME) 6839 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.cc ('k') | runtime/vm/object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698