OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 2729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2740 Function& constructor = Function::Handle(zone); | 2740 Function& constructor = Function::Handle(zone); |
2741 constructor ^= result.raw(); | 2741 constructor ^= result.raw(); |
2742 if (!constructor.IsGenerativeConstructor()) { | 2742 if (!constructor.IsGenerativeConstructor()) { |
2743 const String& message = String::Handle( | 2743 const String& message = String::Handle( |
2744 String::NewFormatted("%s: class '%s' is not a constructor.", | 2744 String::NewFormatted("%s: class '%s' is not a constructor.", |
2745 CURRENT_FUNC, class_name.ToCString())); | 2745 CURRENT_FUNC, class_name.ToCString())); |
2746 return ApiError::New(message); | 2746 return ApiError::New(message); |
2747 } | 2747 } |
2748 Instance& exception = Instance::Handle(zone); | 2748 Instance& exception = Instance::Handle(zone); |
2749 exception = Instance::New(cls); | 2749 exception = Instance::New(cls); |
2750 const Array& args = Array::Handle(zone, Array::New(3)); | 2750 const Array& args = Array::Handle(zone, Array::New(2)); |
2751 args.SetAt(0, exception); | 2751 args.SetAt(0, exception); |
2752 args.SetAt(1, Smi::Handle(zone, Smi::New(Function::kCtorPhaseAll))); | 2752 args.SetAt(1, String::Handle(String::New(exception_message))); |
2753 args.SetAt(2, String::Handle(String::New(exception_message))); | |
2754 result = DartEntry::InvokeFunction(constructor, args); | 2753 result = DartEntry::InvokeFunction(constructor, args); |
2755 if (result.IsError()) return result.raw(); | 2754 if (result.IsError()) return result.raw(); |
2756 ASSERT(result.IsNull()); | 2755 ASSERT(result.IsNull()); |
2757 | 2756 |
2758 if (thread->top_exit_frame_info() == 0) { | 2757 if (thread->top_exit_frame_info() == 0) { |
2759 // There are no dart frames on the stack so it would be illegal to | 2758 // There are no dart frames on the stack so it would be illegal to |
2760 // throw an exception here. | 2759 // throw an exception here. |
2761 const String& message = String::Handle( | 2760 const String& message = String::Handle( |
2762 String::New("No Dart frames on stack, cannot throw exception")); | 2761 String::New("No Dart frames on stack, cannot throw exception")); |
2763 return ApiError::New(message); | 2762 return ApiError::New(message); |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3597 constr_name.ToCString(), | 3596 constr_name.ToCString(), |
3598 lookup_class_name.ToCString())); | 3597 lookup_class_name.ToCString())); |
3599 return ApiError::New(message); | 3598 return ApiError::New(message); |
3600 } else { | 3599 } else { |
3601 const String& message = String::Handle( | 3600 const String& message = String::Handle( |
3602 String::NewFormatted("%s: could not find constructor '%s'.", | 3601 String::NewFormatted("%s: could not find constructor '%s'.", |
3603 current_func, constr_name.ToCString())); | 3602 current_func, constr_name.ToCString())); |
3604 return ApiError::New(message); | 3603 return ApiError::New(message); |
3605 } | 3604 } |
3606 } | 3605 } |
3607 int extra_args = (constructor.IsGenerativeConstructor() ? 2 : 1); | 3606 int extra_args = 1; |
3608 String& error_message = String::Handle(); | 3607 String& error_message = String::Handle(); |
3609 if (!constructor.AreValidArgumentCounts(num_args + extra_args, | 3608 if (!constructor.AreValidArgumentCounts(num_args + extra_args, |
3610 0, | 3609 0, |
3611 &error_message)) { | 3610 &error_message)) { |
3612 const String& message = String::Handle( | 3611 const String& message = String::Handle( |
3613 String::NewFormatted("%s: wrong argument count for " | 3612 String::NewFormatted("%s: wrong argument count for " |
3614 "constructor '%s': %s.", | 3613 "constructor '%s': %s.", |
3615 current_func, | 3614 current_func, |
3616 constr_name.ToCString(), | 3615 constr_name.ToCString(), |
3617 error_message.ToCString())); | 3616 error_message.ToCString())); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3711 if (!cls.is_allocated() && Dart::IsRunningPrecompiledCode()) { | 3710 if (!cls.is_allocated() && Dart::IsRunningPrecompiledCode()) { |
3712 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); | 3711 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); |
3713 } | 3712 } |
3714 #endif | 3713 #endif |
3715 // Create the new object. | 3714 // Create the new object. |
3716 new_object = Instance::New(cls); | 3715 new_object = Instance::New(cls); |
3717 } | 3716 } |
3718 | 3717 |
3719 // Create the argument list. | 3718 // Create the argument list. |
3720 intptr_t arg_index = 0; | 3719 intptr_t arg_index = 0; |
3721 int extra_args = (constructor.IsGenerativeConstructor() ? 2 : 1); | 3720 int extra_args = 1; |
3722 const Array& args = | 3721 const Array& args = |
3723 Array::Handle(Z, Array::New(number_of_arguments + extra_args)); | 3722 Array::Handle(Z, Array::New(number_of_arguments + extra_args)); |
3724 if (constructor.IsGenerativeConstructor()) { | 3723 if (constructor.IsGenerativeConstructor()) { |
3725 // Constructors get the uninitialized object and a constructor phase. | 3724 // Constructors get the uninitialized object. |
3726 if (!type_arguments.IsNull()) { | 3725 if (!type_arguments.IsNull()) { |
3727 // The type arguments will be null if the class has no type parameters, in | 3726 // The type arguments will be null if the class has no type parameters, in |
3728 // which case the following call would fail because there is no slot | 3727 // which case the following call would fail because there is no slot |
3729 // reserved in the object for the type vector. | 3728 // reserved in the object for the type vector. |
3730 new_object.SetTypeArguments(type_arguments); | 3729 new_object.SetTypeArguments(type_arguments); |
3731 } | 3730 } |
3732 args.SetAt(arg_index++, new_object); | 3731 args.SetAt(arg_index++, new_object); |
3733 args.SetAt(arg_index++, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll))); | |
3734 } else { | 3732 } else { |
3735 // Factories get type arguments. | 3733 // Factories get type arguments. |
3736 args.SetAt(arg_index++, type_arguments); | 3734 args.SetAt(arg_index++, type_arguments); |
3737 } | 3735 } |
3738 Object& argument = Object::Handle(Z); | 3736 Object& argument = Object::Handle(Z); |
3739 for (int i = 0; i < number_of_arguments; i++) { | 3737 for (int i = 0; i < number_of_arguments; i++) { |
3740 argument = Api::UnwrapHandle(arguments[i]); | 3738 argument = Api::UnwrapHandle(arguments[i]); |
3741 if (!argument.IsNull() && !argument.IsInstance()) { | 3739 if (!argument.IsNull() && !argument.IsInstance()) { |
3742 if (argument.IsError()) { | 3740 if (argument.IsError()) { |
3743 return Api::NewHandle(T, argument.raw()); | 3741 return Api::NewHandle(T, argument.raw()); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3915 if (constructor_name.IsNull()) { | 3913 if (constructor_name.IsNull()) { |
3916 strings.SetAt(2, Symbols::Empty()); | 3914 strings.SetAt(2, Symbols::Empty()); |
3917 } else { | 3915 } else { |
3918 strings.SetAt(2, constructor_name); | 3916 strings.SetAt(2, constructor_name); |
3919 } | 3917 } |
3920 const String& dot_name = String::Handle(Z, String::ConcatAll(strings)); | 3918 const String& dot_name = String::Handle(Z, String::ConcatAll(strings)); |
3921 const TypeArguments& type_arguments = | 3919 const TypeArguments& type_arguments = |
3922 TypeArguments::Handle(Z, type_obj.arguments()); | 3920 TypeArguments::Handle(Z, type_obj.arguments()); |
3923 const Function& constructor = | 3921 const Function& constructor = |
3924 Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name)); | 3922 Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name)); |
3925 const int extra_args = 2; | 3923 const int extra_args = 1; |
3926 if (!constructor.IsNull() && | 3924 if (!constructor.IsNull() && |
3927 constructor.IsGenerativeConstructor() && | 3925 constructor.IsGenerativeConstructor() && |
3928 constructor.AreValidArgumentCounts(number_of_arguments + extra_args, | 3926 constructor.AreValidArgumentCounts(number_of_arguments + extra_args, |
3929 0, | 3927 0, |
3930 NULL)) { | 3928 NULL)) { |
3931 // Create the argument list. | 3929 // Create the argument list. |
3932 // Constructors get the uninitialized object and a constructor phase. | 3930 // Constructors get the uninitialized object. |
3933 if (!type_arguments.IsNull()) { | 3931 if (!type_arguments.IsNull()) { |
3934 // The type arguments will be null if the class has no type | 3932 // The type arguments will be null if the class has no type |
3935 // parameters, in which case the following call would fail | 3933 // parameters, in which case the following call would fail |
3936 // because there is no slot reserved in the object for the | 3934 // because there is no slot reserved in the object for the |
3937 // type vector. | 3935 // type vector. |
3938 instance.SetTypeArguments(type_arguments); | 3936 instance.SetTypeArguments(type_arguments); |
3939 } | 3937 } |
3940 Dart_Handle result; | 3938 Dart_Handle result; |
3941 Array& args = Array::Handle(Z); | 3939 Array& args = Array::Handle(Z); |
3942 result = SetupArguments( | 3940 result = SetupArguments( |
3943 T, number_of_arguments, arguments, extra_args, &args); | 3941 T, number_of_arguments, arguments, extra_args, &args); |
3944 if (!::Dart_IsError(result)) { | 3942 if (!::Dart_IsError(result)) { |
3945 args.SetAt(0, instance); | 3943 args.SetAt(0, instance); |
3946 args.SetAt(1, Smi::Handle(Z, Smi::New(Function::kCtorPhaseAll))); | |
3947 const Object& retval = Object::Handle(Z, | 3944 const Object& retval = Object::Handle(Z, |
3948 DartEntry::InvokeFunction(constructor, args)); | 3945 DartEntry::InvokeFunction(constructor, args)); |
3949 if (retval.IsError()) { | 3946 if (retval.IsError()) { |
3950 result = Api::NewHandle(T, retval.raw()); | 3947 result = Api::NewHandle(T, retval.raw()); |
3951 } else { | 3948 } else { |
3952 result = Api::NewHandle(T, instance.raw()); | 3949 result = Api::NewHandle(T, instance.raw()); |
3953 } | 3950 } |
3954 } | 3951 } |
3955 return result; | 3952 return result; |
3956 } | 3953 } |
(...skipping 2040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5997 return Api::Success(); | 5994 return Api::Success(); |
5998 } | 5995 } |
5999 #endif // DART_PRECOMPILED | 5996 #endif // DART_PRECOMPILED |
6000 | 5997 |
6001 | 5998 |
6002 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { | 5999 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { |
6003 return Dart::IsRunningPrecompiledCode(); | 6000 return Dart::IsRunningPrecompiledCode(); |
6004 } | 6001 } |
6005 | 6002 |
6006 } // namespace dart | 6003 } // namespace dart |
OLD | NEW |