| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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) |
| OLD | NEW |