| 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 |