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

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: fix dartk 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
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 1723 matching lines...) Expand 10 before | Expand all | Expand 10 after
1734 } 1734 }
1735 1735
1736 1736
1737 RawObject* ConstantEvaluator::EvaluateConstConstructorCall( 1737 RawObject* ConstantEvaluator::EvaluateConstConstructorCall(
1738 const dart::Class& type_class, 1738 const dart::Class& type_class,
1739 const TypeArguments& type_arguments, 1739 const TypeArguments& type_arguments,
1740 const Function& constructor, 1740 const Function& constructor,
1741 const Object& argument) { 1741 const Object& argument) {
1742 // Factories have one extra argument: the type arguments. 1742 // Factories have one extra argument: the type arguments.
1743 // Constructors have 1 extra arguments: receiver. 1743 // Constructors have 1 extra arguments: receiver.
1744 const int kTypeArgsLen = 0;
1744 const int kNumArgs = 1; 1745 const int kNumArgs = 1;
1745 const int kNumExtraArgs = 1; 1746 const int kNumExtraArgs = 1;
1746 const int num_arguments = kNumArgs + kNumExtraArgs; 1747 const int num_arguments = kNumArgs + kNumExtraArgs;
1747 const Array& arg_values = 1748 const Array& arg_values =
1748 Array::Handle(Z, Array::New(num_arguments, Heap::kOld)); 1749 Array::Handle(Z, Array::New(num_arguments, Heap::kOld));
1749 Instance& instance = Instance::Handle(Z); 1750 Instance& instance = Instance::Handle(Z);
1750 if (!constructor.IsFactory()) { 1751 if (!constructor.IsFactory()) {
1751 instance = Instance::New(type_class, Heap::kOld); 1752 instance = Instance::New(type_class, Heap::kOld);
1752 if (!type_arguments.IsNull()) { 1753 if (!type_arguments.IsNull()) {
1753 ASSERT(type_arguments.IsInstantiated()); 1754 ASSERT(type_arguments.IsInstantiated());
1754 instance.SetTypeArguments( 1755 instance.SetTypeArguments(
1755 TypeArguments::Handle(Z, type_arguments.Canonicalize())); 1756 TypeArguments::Handle(Z, type_arguments.Canonicalize()));
1756 } 1757 }
1757 arg_values.SetAt(0, instance); 1758 arg_values.SetAt(0, instance);
1758 } else { 1759 } else {
1759 // Prepend type_arguments to list of arguments to factory. 1760 // Prepend type_arguments to list of arguments to factory.
1760 ASSERT(type_arguments.IsZoneHandle()); 1761 ASSERT(type_arguments.IsZoneHandle());
1761 arg_values.SetAt(0, type_arguments); 1762 arg_values.SetAt(0, type_arguments);
1762 } 1763 }
1763 arg_values.SetAt((0 + kNumExtraArgs), argument); 1764 arg_values.SetAt((0 + kNumExtraArgs), argument);
1764 const Array& args_descriptor = Array::Handle( 1765 const Array& args_descriptor =
1765 Z, ArgumentsDescriptor::New(num_arguments, Object::empty_array())); 1766 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, num_arguments,
1767 Object::empty_array()));
1766 const Object& result = Object::Handle( 1768 const Object& result = Object::Handle(
1767 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor)); 1769 Z, DartEntry::InvokeFunction(constructor, arg_values, args_descriptor));
1768 ASSERT(!result.IsError()); 1770 ASSERT(!result.IsError());
1769 if (constructor.IsFactory()) { 1771 if (constructor.IsFactory()) {
1770 // The factory method returns the allocated object. 1772 // The factory method returns the allocated object.
1771 instance ^= result.raw(); 1773 instance ^= result.raw();
1772 } 1774 }
1773 return H.Canonicalize(instance); 1775 return H.Canonicalize(instance);
1774 } 1776 }
1775 1777
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
2168 arguments.SetAt(pos++, result_); 2170 arguments.SetAt(pos++, result_);
2169 names.SetAt(i, H.DartSymbol(named_expression->name())); 2171 names.SetAt(i, H.DartSymbol(named_expression->name()));
2170 } 2172 }
2171 return RunFunction(function, arguments, names); 2173 return RunFunction(function, arguments, names);
2172 } 2174 }
2173 2175
2174 2176
2175 const Object& ConstantEvaluator::RunFunction(const Function& function, 2177 const Object& ConstantEvaluator::RunFunction(const Function& function,
2176 const Array& arguments, 2178 const Array& arguments,
2177 const Array& names) { 2179 const Array& names) {
2178 const Array& args_descriptor = 2180 const int kTypeArgsLen = 0; // Generic functions not yet supported.
2179 Array::Handle(Z, ArgumentsDescriptor::New(arguments.Length(), names)); 2181 const Array& args_descriptor = Array::Handle(
2182 Z, ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length(), names));
2180 const Object& result = Object::Handle( 2183 const Object& result = Object::Handle(
2181 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor)); 2184 Z, DartEntry::InvokeFunction(function, arguments, args_descriptor));
2182 if (result.IsError()) { 2185 if (result.IsError()) {
2183 H.ReportError(Error::Cast(result), "error evaluating constant constructor"); 2186 H.ReportError(Error::Cast(result), "error evaluating constant constructor");
2184 } 2187 }
2185 return result; 2188 return result;
2186 } 2189 }
2187 2190
2188 2191
2189 FlowGraphBuilder::FlowGraphBuilder( 2192 FlowGraphBuilder::FlowGraphBuilder(
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
2688 } 2691 }
2689 2692
2690 2693
2691 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, 2694 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position,
2692 const dart::String& name, 2695 const dart::String& name,
2693 Token::Kind kind, 2696 Token::Kind kind,
2694 intptr_t argument_count, 2697 intptr_t argument_count,
2695 const Array& argument_names, 2698 const Array& argument_names,
2696 intptr_t num_args_checked) { 2699 intptr_t num_args_checked) {
2697 ArgumentArray arguments = GetArguments(argument_count); 2700 ArgumentArray arguments = GetArguments(argument_count);
2698 InstanceCallInstr* call = 2701 const intptr_t kTypeArgsLen = 0; // Generic instance calls not yet supported.
2699 new (Z) InstanceCallInstr(position, name, kind, arguments, argument_names, 2702 InstanceCallInstr* call = new (Z)
2700 num_args_checked, ic_data_array_); 2703 InstanceCallInstr(position, name, kind, arguments, kTypeArgsLen,
2704 argument_names, num_args_checked, ic_data_array_);
2701 Push(call); 2705 Push(call);
2702 return Fragment(call); 2706 return Fragment(call);
2703 } 2707 }
2704 2708
2705 2709
2706 Fragment FlowGraphBuilder::ClosureCall(int argument_count, 2710 Fragment FlowGraphBuilder::ClosureCall(int argument_count,
2707 const Array& argument_names) { 2711 const Array& argument_names) {
2708 Value* function = Pop(); 2712 Value* function = Pop();
2709 ArgumentArray arguments = GetArguments(argument_count); 2713 ArgumentArray arguments = GetArguments(argument_count);
2710 ClosureCallInstr* call = new (Z) ClosureCallInstr( 2714 const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported.
2711 function, arguments, argument_names, TokenPosition::kNoSource); 2715 ClosureCallInstr* call =
2716 new (Z) ClosureCallInstr(function, arguments, kTypeArgsLen,
2717 argument_names, TokenPosition::kNoSource);
2712 Push(call); 2718 Push(call);
2713 return Fragment(call); 2719 return Fragment(call);
2714 } 2720 }
2715 2721
2716 2722
2717 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) { 2723 Fragment FlowGraphBuilder::ThrowException(TokenPosition position) {
2718 Fragment instructions; 2724 Fragment instructions;
2719 instructions += Drop(); 2725 instructions += Drop();
2720 instructions += Fragment(new (Z) ThrowInstr(position)).closed(); 2726 instructions += Fragment(new (Z) ThrowInstr(position)).closed();
2721 // Use it's side effect of leaving a constant on the stack (does not change 2727 // 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
2914 } 2920 }
2915 return FactoryRecognizer::ResultCid(function); 2921 return FactoryRecognizer::ResultCid(function);
2916 } 2922 }
2917 2923
2918 2924
2919 Fragment FlowGraphBuilder::StaticCall(TokenPosition position, 2925 Fragment FlowGraphBuilder::StaticCall(TokenPosition position,
2920 const Function& target, 2926 const Function& target,
2921 intptr_t argument_count, 2927 intptr_t argument_count,
2922 const Array& argument_names) { 2928 const Array& argument_names) {
2923 ArgumentArray arguments = GetArguments(argument_count); 2929 ArgumentArray arguments = GetArguments(argument_count);
2924 StaticCallInstr* call = new (Z) StaticCallInstr( 2930 const intptr_t kTypeArgsLen = 0; // Generic static calls not yet supported.
2925 position, target, argument_names, arguments, ic_data_array_); 2931 StaticCallInstr* call =
2932 new (Z) StaticCallInstr(position, target, kTypeArgsLen, argument_names,
2933 arguments, ic_data_array_);
2926 const intptr_t list_cid = 2934 const intptr_t list_cid =
2927 GetResultCidOfListFactory(Z, target, argument_count); 2935 GetResultCidOfListFactory(Z, target, argument_count);
2928 if (list_cid != kDynamicCid) { 2936 if (list_cid != kDynamicCid) {
2929 call->set_result_cid(list_cid); 2937 call->set_result_cid(list_cid);
2930 call->set_is_known_list_constructor(true); 2938 call->set_is_known_list_constructor(true);
2931 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) { 2939 } else if (target.recognized_kind() != MethodRecognizer::kUnknown) {
2932 call->set_result_cid(MethodRecognizer::ResultCid(target)); 2940 call->set_result_cid(MethodRecognizer::ResultCid(target));
2933 } 2941 }
2934 Push(call); 2942 Push(call);
2935 return Fragment(call); 2943 return Fragment(call);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { 3044 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) {
3037 Value* array = Pop(); 3045 Value* array = Pop();
3038 StringInterpolateInstr* interpolate = 3046 StringInterpolateInstr* interpolate =
3039 new (Z) StringInterpolateInstr(array, position); 3047 new (Z) StringInterpolateInstr(array, position);
3040 Push(interpolate); 3048 Push(interpolate);
3041 return Fragment(interpolate); 3049 return Fragment(interpolate);
3042 } 3050 }
3043 3051
3044 3052
3045 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { 3053 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) {
3054 const int kTypeArgsLen = 0;
3046 const int kNumberOfArguments = 1; 3055 const int kNumberOfArguments = 1;
3047 const Array& kNoArgumentNames = Object::null_array(); 3056 const Array& kNoArgumentNames = Object::null_array();
3048 const dart::Class& cls = dart::Class::Handle( 3057 const dart::Class& cls = dart::Class::Handle(
3049 dart::Library::LookupCoreClass(Symbols::StringBase())); 3058 dart::Library::LookupCoreClass(Symbols::StringBase()));
3050 ASSERT(!cls.IsNull()); 3059 ASSERT(!cls.IsNull());
3051 const Function& function = Function::ZoneHandle( 3060 const Function& function = Function::ZoneHandle(
3052 Z, Resolver::ResolveStatic(cls, dart::Library::PrivateCoreLibName( 3061 Z,
3053 Symbols::InterpolateSingle()), 3062 Resolver::ResolveStatic(
3054 kNumberOfArguments, kNoArgumentNames)); 3063 cls, dart::Library::PrivateCoreLibName(Symbols::InterpolateSingle()),
3064 kTypeArgsLen, kNumberOfArguments, kNoArgumentNames));
3055 Fragment instructions; 3065 Fragment instructions;
3056 instructions += PushArgument(); 3066 instructions += PushArgument();
3057 instructions += StaticCall(position, function, 1); 3067 instructions += StaticCall(position, function, 1);
3058 return instructions; 3068 return instructions;
3059 } 3069 }
3060 3070
3061 3071
3062 Fragment FlowGraphBuilder::ThrowTypeError() { 3072 Fragment FlowGraphBuilder::ThrowTypeError() {
3063 const dart::Class& klass = dart::Class::ZoneHandle( 3073 const dart::Class& klass = dart::Class::ZoneHandle(
3064 Z, dart::Library::LookupCoreClass(Symbols::TypeError())); 3074 Z, dart::Library::LookupCoreClass(Symbols::TypeError()));
(...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after
4191 ZoneGrowableArray<const Instance*>* default_values = 4201 ZoneGrowableArray<const Instance*>* default_values =
4192 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); 4202 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount());
4193 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { 4203 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) {
4194 default_values->Add(&Object::null_instance()); 4204 default_values->Add(&Object::null_instance());
4195 } 4205 }
4196 parsed_function_->set_default_parameter_values(default_values); 4206 parsed_function_->set_default_parameter_values(default_values);
4197 4207
4198 Fragment body(normal_entry); 4208 Fragment body(normal_entry);
4199 body += CheckStackOverflowInPrologue(); 4209 body += CheckStackOverflowInPrologue();
4200 4210
4211 // TODO(regis): Check if a type argument vector is passed.
4212
4201 // The receiver is the first argument to noSuchMethod, and it is the first 4213 // The receiver is the first argument to noSuchMethod, and it is the first
4202 // argument passed to the dispatcher function. 4214 // argument passed to the dispatcher function.
4203 LocalScope* scope = parsed_function_->node_sequence()->scope(); 4215 LocalScope* scope = parsed_function_->node_sequence()->scope();
4204 body += LoadLocal(scope->VariableAt(0)); 4216 body += LoadLocal(scope->VariableAt(0));
4205 body += PushArgument(); 4217 body += PushArgument();
4206 4218
4207 // The second argument to noSuchMethod is an invocation mirror. Push the 4219 // The second argument to noSuchMethod is an invocation mirror. Push the
4208 // arguments for allocating the invocation mirror. First, the name. 4220 // arguments for allocating the invocation mirror. First, the name.
4209 body += Constant(dart::String::ZoneHandle(Z, function.name())); 4221 body += Constant(dart::String::ZoneHandle(Z, function.name()));
4210 body += PushArgument(); 4222 body += PushArgument();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4246 const dart::Class& mirror_class = dart::Class::Handle( 4258 const dart::Class& mirror_class = dart::Class::Handle(
4247 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror())); 4259 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror()));
4248 ASSERT(!mirror_class.IsNull()); 4260 ASSERT(!mirror_class.IsNull());
4249 const Function& allocation_function = Function::ZoneHandle( 4261 const Function& allocation_function = Function::ZoneHandle(
4250 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName( 4262 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName(
4251 Symbols::AllocateInvocationMirror()))); 4263 Symbols::AllocateInvocationMirror())));
4252 ASSERT(!allocation_function.IsNull()); 4264 ASSERT(!allocation_function.IsNull());
4253 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4); 4265 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4);
4254 body += PushArgument(); // For the call to noSuchMethod. 4266 body += PushArgument(); // For the call to noSuchMethod.
4255 4267
4268 const int kTypeArgsLen = 0;
4256 ArgumentsDescriptor two_arguments( 4269 ArgumentsDescriptor two_arguments(
4257 Array::Handle(Z, ArgumentsDescriptor::New(2))); 4270 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, 2)));
4258 Function& no_such_method = 4271 Function& no_such_method =
4259 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( 4272 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass(
4260 dart::Class::Handle(Z, function.Owner()), 4273 dart::Class::Handle(Z, function.Owner()),
4261 Symbols::NoSuchMethod(), two_arguments)); 4274 Symbols::NoSuchMethod(), two_arguments));
4262 if (no_such_method.IsNull()) { 4275 if (no_such_method.IsNull()) {
4263 // If noSuchMethod is not found on the receiver class, call 4276 // If noSuchMethod is not found on the receiver class, call
4264 // Object.noSuchMethod. 4277 // Object.noSuchMethod.
4265 no_such_method = Resolver::ResolveDynamicForReceiverClass( 4278 no_such_method = Resolver::ResolveDynamicForReceiverClass(
4266 dart::Class::Handle(Z, I->object_store()->object_class()), 4279 dart::Class::Handle(Z, I->object_store()->object_class()),
4267 Symbols::NoSuchMethod(), two_arguments); 4280 Symbols::NoSuchMethod(), two_arguments);
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after
5111 if (target.IsGenerativeConstructor() || target.IsFactory()) { 5124 if (target.IsGenerativeConstructor() || target.IsFactory()) {
5112 // The VM requires a TypeArguments object as first parameter for 5125 // The VM requires a TypeArguments object as first parameter for
5113 // every factory constructor. 5126 // every factory constructor.
5114 ++argument_count; 5127 ++argument_count;
5115 } 5128 }
5116 5129
5117 List<NamedExpression>& named = node->arguments()->named(); 5130 List<NamedExpression>& named = node->arguments()->named();
5118 const Array& argument_names = H.ArgumentNames(&named); 5131 const Array& argument_names = H.ArgumentNames(&named);
5119 5132
5120 // The frontend ensures we the [StaticInvocation] has matching arguments. 5133 // The frontend ensures we the [StaticInvocation] has matching arguments.
5121 ASSERT(target.AreValidArguments(argument_count, argument_names, NULL)); 5134 const intptr_t kTypeArgsLen = 0; // Generic functions not yet supported.
5135 ASSERT(target.AreValidArguments(kTypeArgsLen, argument_count, argument_names,
5136 NULL));
5122 5137
5123 Fragment instructions; 5138 Fragment instructions;
5124 LocalVariable* instance_variable = NULL; 5139 LocalVariable* instance_variable = NULL;
5125 5140
5126 // If we cross the Kernel -> VM core library boundary, a [StaticInvocation] 5141 // If we cross the Kernel -> VM core library boundary, a [StaticInvocation]
5127 // can appear, but the thing we're calling is not a static method, but a 5142 // can appear, but the thing we're calling is not a static method, but a
5128 // factory constructor. 5143 // factory constructor.
5129 // The `H.LookupStaticmethodByKernelProcedure` will potentially resolve to the 5144 // The `H.LookupStaticmethodByKernelProcedure` will potentially resolve to the
5130 // forwarded constructor. 5145 // forwarded constructor.
5131 // In that case we'll make an instance and pass it as first argument. 5146 // In that case we'll make an instance and pass it as first argument.
(...skipping 1742 matching lines...) Expand 10 before | Expand all | Expand 10 after
6874 thread->clear_sticky_error(); 6889 thread->clear_sticky_error();
6875 return error.raw(); 6890 return error.raw();
6876 } 6891 }
6877 } 6892 }
6878 6893
6879 6894
6880 } // namespace kernel 6895 } // namespace kernel
6881 } // namespace dart 6896 } // namespace dart
6882 6897
6883 #endif // !defined(DART_PRECOMPILED_RUNTIME) 6898 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698