Chromium Code Reviews| 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 "lib/stacktrace.h" | 10 #include "lib/stacktrace.h" |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 static const int kExtNewRatio = 16; | 347 static const int kExtNewRatio = 16; |
| 348 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) { | 348 if (size > (heap->CapacityInWords(Heap::kNew) * kWordSize) / kExtNewRatio) { |
| 349 return Heap::kOld; | 349 return Heap::kOld; |
| 350 } else { | 350 } else { |
| 351 return Heap::kNew; | 351 return Heap::kNew; |
| 352 } | 352 } |
| 353 } | 353 } |
| 354 | 354 |
| 355 | 355 |
| 356 static RawObject* Send0Arg(const Instance& receiver, const String& selector) { | 356 static RawObject* Send0Arg(const Instance& receiver, const String& selector) { |
| 357 const intptr_t kTypeArgsLen = 0; | |
| 357 const intptr_t kNumArgs = 1; | 358 const intptr_t kNumArgs = 1; |
| 358 ArgumentsDescriptor args_desc( | 359 ArgumentsDescriptor args_desc( |
| 359 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 360 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 360 const Function& function = | 361 const Function& function = |
| 361 Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc)); | 362 Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc)); |
| 362 if (function.IsNull()) { | 363 if (function.IsNull()) { |
| 363 return ApiError::New(String::Handle(String::New(""))); | 364 return ApiError::New(String::Handle(String::New(""))); |
| 364 } | 365 } |
| 365 const Array& args = Array::Handle(Array::New(kNumArgs)); | 366 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 366 args.SetAt(0, receiver); | 367 args.SetAt(0, receiver); |
| 367 return DartEntry::InvokeFunction(function, args); | 368 return DartEntry::InvokeFunction(function, args); |
| 368 } | 369 } |
| 369 | 370 |
| 370 | 371 |
| 371 static RawObject* Send1Arg(const Instance& receiver, | 372 static RawObject* Send1Arg(const Instance& receiver, |
| 372 const String& selector, | 373 const String& selector, |
| 373 const Instance& argument) { | 374 const Instance& argument) { |
| 375 const intptr_t kTypeArgsLen = 0; | |
| 374 const intptr_t kNumArgs = 2; | 376 const intptr_t kNumArgs = 2; |
| 375 ArgumentsDescriptor args_desc( | 377 ArgumentsDescriptor args_desc( |
| 376 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 378 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 377 const Function& function = | 379 const Function& function = |
| 378 Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc)); | 380 Function::Handle(Resolver::ResolveDynamic(receiver, selector, args_desc)); |
| 379 if (function.IsNull()) { | 381 if (function.IsNull()) { |
| 380 return ApiError::New(String::Handle(String::New(""))); | 382 return ApiError::New(String::Handle(String::New(""))); |
| 381 } | 383 } |
| 382 const Array& args = Array::Handle(Array::New(kNumArgs)); | 384 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 383 args.SetAt(0, receiver); | 385 args.SetAt(0, receiver); |
| 384 args.SetAt(1, argument); | 386 args.SetAt(1, argument); |
| 385 return DartEntry::InvokeFunction(function, args); | 387 return DartEntry::InvokeFunction(function, args); |
| 386 } | 388 } |
| (...skipping 2331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2718 GET_LIST_LENGTH(Z, ExternalTypedData, obj, len); | 2720 GET_LIST_LENGTH(Z, ExternalTypedData, obj, len); |
| 2719 } | 2721 } |
| 2720 CHECK_CALLBACK_STATE(T); | 2722 CHECK_CALLBACK_STATE(T); |
| 2721 | 2723 |
| 2722 // Now check and handle a dart object that implements the List interface. | 2724 // Now check and handle a dart object that implements the List interface. |
| 2723 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); | 2725 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); |
| 2724 if (instance.IsNull()) { | 2726 if (instance.IsNull()) { |
| 2725 return Api::NewError("Object does not implement the List interface"); | 2727 return Api::NewError("Object does not implement the List interface"); |
| 2726 } | 2728 } |
| 2727 const String& name = String::Handle(Z, Field::GetterName(Symbols::Length())); | 2729 const String& name = String::Handle(Z, Field::GetterName(Symbols::Length())); |
| 2730 const int kTypeArgsLen = 0; | |
| 2728 const int kNumArgs = 1; | 2731 const int kNumArgs = 1; |
| 2729 ArgumentsDescriptor args_desc( | 2732 ArgumentsDescriptor args_desc( |
| 2730 Array::Handle(Z, ArgumentsDescriptor::New(kNumArgs))); | 2733 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 2731 const Function& function = | 2734 const Function& function = |
| 2732 Function::Handle(Z, Resolver::ResolveDynamic(instance, name, args_desc)); | 2735 Function::Handle(Z, Resolver::ResolveDynamic(instance, name, args_desc)); |
| 2733 if (function.IsNull()) { | 2736 if (function.IsNull()) { |
| 2734 return Api::NewError("List object does not have a 'length' field."); | 2737 return Api::NewError("List object does not have a 'length' field."); |
| 2735 } | 2738 } |
| 2736 | 2739 |
| 2737 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 2740 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| 2738 args.SetAt(0, instance); // Set up the receiver as the first argument. | 2741 args.SetAt(0, instance); // Set up the receiver as the first argument. |
| 2739 const Object& retval = | 2742 const Object& retval = |
| 2740 Object::Handle(Z, DartEntry::InvokeFunction(function, args)); | 2743 Object::Handle(Z, DartEntry::InvokeFunction(function, args)); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2824 GET_LIST_RANGE(T, Array, obj, offset, length); | 2827 GET_LIST_RANGE(T, Array, obj, offset, length); |
| 2825 } else if (obj.IsGrowableObjectArray()) { | 2828 } else if (obj.IsGrowableObjectArray()) { |
| 2826 GET_LIST_RANGE(T, GrowableObjectArray, obj, offset, length); | 2829 GET_LIST_RANGE(T, GrowableObjectArray, obj, offset, length); |
| 2827 } else if (obj.IsError()) { | 2830 } else if (obj.IsError()) { |
| 2828 return list; | 2831 return list; |
| 2829 } else { | 2832 } else { |
| 2830 CHECK_CALLBACK_STATE(T); | 2833 CHECK_CALLBACK_STATE(T); |
| 2831 // Check and handle a dart object that implements the List interface. | 2834 // Check and handle a dart object that implements the List interface. |
| 2832 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); | 2835 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); |
| 2833 if (!instance.IsNull()) { | 2836 if (!instance.IsNull()) { |
| 2837 const intptr_t kTypeArgsLen = 0; | |
| 2834 const intptr_t kNumArgs = 2; | 2838 const intptr_t kNumArgs = 2; |
| 2835 ArgumentsDescriptor args_desc( | 2839 ArgumentsDescriptor args_desc( |
| 2836 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 2840 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 2837 const Function& function = Function::Handle( | 2841 const Function& function = Function::Handle( |
| 2838 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), | 2842 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), |
| 2839 args_desc)); | 2843 args_desc)); |
| 2840 if (!function.IsNull()) { | 2844 if (!function.IsNull()) { |
| 2841 const Array& args = Array::Handle(Array::New(kNumArgs)); | 2845 const Array& args = Array::Handle(Array::New(kNumArgs)); |
| 2842 args.SetAt(0, instance); | 2846 args.SetAt(0, instance); |
| 2843 Instance& index = Instance::Handle(Z); | 2847 Instance& index = Instance::Handle(Z); |
| 2844 for (intptr_t i = 0; i < length; ++i) { | 2848 for (intptr_t i = 0; i < length; ++i) { |
| 2845 index = Integer::New(i); | 2849 index = Integer::New(i); |
| 2846 args.SetAt(1, index); | 2850 args.SetAt(1, index); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2882 } else if (obj.IsGrowableObjectArray()) { | 2886 } else if (obj.IsGrowableObjectArray()) { |
| 2883 SET_LIST_ELEMENT(GrowableObjectArray, obj, index, value); | 2887 SET_LIST_ELEMENT(GrowableObjectArray, obj, index, value); |
| 2884 } else if (obj.IsError()) { | 2888 } else if (obj.IsError()) { |
| 2885 return list; | 2889 return list; |
| 2886 } else { | 2890 } else { |
| 2887 CHECK_CALLBACK_STATE(T); | 2891 CHECK_CALLBACK_STATE(T); |
| 2888 | 2892 |
| 2889 // Check and handle a dart object that implements the List interface. | 2893 // Check and handle a dart object that implements the List interface. |
| 2890 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); | 2894 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); |
| 2891 if (!instance.IsNull()) { | 2895 if (!instance.IsNull()) { |
| 2896 const intptr_t kTypeArgsLen = 0; | |
| 2892 const intptr_t kNumArgs = 3; | 2897 const intptr_t kNumArgs = 3; |
| 2893 ArgumentsDescriptor args_desc( | 2898 ArgumentsDescriptor args_desc( |
| 2894 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 2899 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 2895 const Function& function = Function::Handle( | 2900 const Function& function = Function::Handle( |
| 2896 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), | 2901 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), |
| 2897 args_desc)); | 2902 args_desc)); |
| 2898 if (!function.IsNull()) { | 2903 if (!function.IsNull()) { |
| 2899 const Integer& index_obj = Integer::Handle(Z, Integer::New(index)); | 2904 const Integer& index_obj = Integer::Handle(Z, Integer::New(index)); |
| 2900 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); | 2905 const Object& value_obj = Object::Handle(Z, Api::UnwrapHandle(value)); |
| 2901 if (!value_obj.IsNull() && !value_obj.IsInstance()) { | 2906 if (!value_obj.IsNull() && !value_obj.IsInstance()) { |
| 2902 RETURN_TYPE_ERROR(Z, value, Instance); | 2907 RETURN_TYPE_ERROR(Z, value, Instance); |
| 2903 } | 2908 } |
| 2904 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 2909 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3068 length); | 3073 length); |
| 3069 } | 3074 } |
| 3070 if (obj.IsError()) { | 3075 if (obj.IsError()) { |
| 3071 return list; | 3076 return list; |
| 3072 } | 3077 } |
| 3073 CHECK_CALLBACK_STATE(T); | 3078 CHECK_CALLBACK_STATE(T); |
| 3074 | 3079 |
| 3075 // Check and handle a dart object that implements the List interface. | 3080 // Check and handle a dart object that implements the List interface. |
| 3076 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); | 3081 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); |
| 3077 if (!instance.IsNull()) { | 3082 if (!instance.IsNull()) { |
| 3083 const int kTypeArgsLen = 0; | |
| 3078 const int kNumArgs = 2; | 3084 const int kNumArgs = 2; |
| 3079 ArgumentsDescriptor args_desc( | 3085 ArgumentsDescriptor args_desc( |
| 3080 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 3086 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
| 3081 const Function& function = Function::Handle( | 3087 const Function& function = Function::Handle( |
| 3082 Z, | 3088 Z, |
| 3083 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc)); | 3089 Resolver::ResolveDynamic(instance, Symbols::IndexToken(), args_desc)); |
| 3084 if (!function.IsNull()) { | 3090 if (!function.IsNull()) { |
| 3085 Object& result = Object::Handle(Z); | 3091 Object& result = Object::Handle(Z); |
| 3086 Integer& intobj = Integer::Handle(Z); | 3092 Integer& intobj = Integer::Handle(Z); |
| 3087 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 3093 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| 3088 args.SetAt(0, instance); // Set up the receiver as the first argument. | 3094 args.SetAt(0, instance); // Set up the receiver as the first argument. |
| 3089 for (int i = 0; i < length; i++) { | 3095 for (int i = 0; i < length; i++) { |
| 3090 HANDLESCOPE(T); | 3096 HANDLESCOPE(T); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3155 length); | 3161 length); |
| 3156 } | 3162 } |
| 3157 if (obj.IsError()) { | 3163 if (obj.IsError()) { |
| 3158 return list; | 3164 return list; |
| 3159 } | 3165 } |
| 3160 CHECK_CALLBACK_STATE(T); | 3166 CHECK_CALLBACK_STATE(T); |
| 3161 | 3167 |
| 3162 // Check and handle a dart object that implements the List interface. | 3168 // Check and handle a dart object that implements the List interface. |
| 3163 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); | 3169 const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj)); |
| 3164 if (!instance.IsNull()) { | 3170 if (!instance.IsNull()) { |
| 3171 const int kTypeArgsLen = 0; | |
| 3165 const int kNumArgs = 3; | 3172 const int kNumArgs = 3; |
| 3166 ArgumentsDescriptor args_desc( | 3173 ArgumentsDescriptor args_desc( |
| 3167 Array::Handle(ArgumentsDescriptor::New(kNumArgs))); | 3174 Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs))); |
|
zra
2017/05/03 15:03:24
Array::Handle(Z, ...)
regis
2017/05/09 18:31:22
Done.
| |
| 3168 const Function& function = Function::Handle( | 3175 const Function& function = Function::Handle( |
| 3169 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), | 3176 Z, Resolver::ResolveDynamic(instance, Symbols::AssignIndexToken(), |
| 3170 args_desc)); | 3177 args_desc)); |
| 3171 if (!function.IsNull()) { | 3178 if (!function.IsNull()) { |
| 3172 Integer& indexobj = Integer::Handle(Z); | 3179 Integer& indexobj = Integer::Handle(Z); |
| 3173 Integer& valueobj = Integer::Handle(Z); | 3180 Integer& valueobj = Integer::Handle(Z); |
| 3174 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 3181 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| 3175 args.SetAt(0, instance); // Set up the receiver as the first argument. | 3182 args.SetAt(0, instance); // Set up the receiver as the first argument. |
| 3176 for (int i = 0; i < length; i++) { | 3183 for (int i = 0; i < length; i++) { |
| 3177 indexobj = Integer::New(offset + i); | 3184 indexobj = Integer::New(offset + i); |
| (...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3785 "%s: could not find factory '%s' in class '%s'.", current_func, | 3792 "%s: could not find factory '%s' in class '%s'.", current_func, |
| 3786 constr_name.ToCString(), lookup_class_name.ToCString())); | 3793 constr_name.ToCString(), lookup_class_name.ToCString())); |
| 3787 return ApiError::New(message); | 3794 return ApiError::New(message); |
| 3788 } else { | 3795 } else { |
| 3789 const String& message = String::Handle( | 3796 const String& message = String::Handle( |
| 3790 String::NewFormatted("%s: could not find constructor '%s'.", | 3797 String::NewFormatted("%s: could not find constructor '%s'.", |
| 3791 current_func, constr_name.ToCString())); | 3798 current_func, constr_name.ToCString())); |
| 3792 return ApiError::New(message); | 3799 return ApiError::New(message); |
| 3793 } | 3800 } |
| 3794 } | 3801 } |
| 3795 int extra_args = 1; | 3802 const int kTypeArgsLen = 0; |
| 3803 const int extra_args = 1; | |
| 3796 String& error_message = String::Handle(); | 3804 String& error_message = String::Handle(); |
| 3797 if (!constructor.AreValidArgumentCounts(num_args + extra_args, 0, | 3805 if (!constructor.AreValidArgumentCounts(kTypeArgsLen, num_args + extra_args, |
| 3798 &error_message)) { | 3806 0, &error_message)) { |
| 3799 const String& message = String::Handle(String::NewFormatted( | 3807 const String& message = String::Handle(String::NewFormatted( |
| 3800 "%s: wrong argument count for " | 3808 "%s: wrong argument count for " |
| 3801 "constructor '%s': %s.", | 3809 "constructor '%s': %s.", |
| 3802 current_func, constr_name.ToCString(), error_message.ToCString())); | 3810 current_func, constr_name.ToCString(), error_message.ToCString())); |
| 3803 return ApiError::New(message); | 3811 return ApiError::New(message); |
| 3804 } | 3812 } |
| 3805 return constructor.raw(); | 3813 return constructor.raw(); |
| 3806 } | 3814 } |
| 3807 | 3815 |
| 3808 | 3816 |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4101 if (constructor_name.IsNull()) { | 4109 if (constructor_name.IsNull()) { |
| 4102 strings.SetAt(2, Symbols::Empty()); | 4110 strings.SetAt(2, Symbols::Empty()); |
| 4103 } else { | 4111 } else { |
| 4104 strings.SetAt(2, constructor_name); | 4112 strings.SetAt(2, constructor_name); |
| 4105 } | 4113 } |
| 4106 const String& dot_name = String::Handle(Z, String::ConcatAll(strings)); | 4114 const String& dot_name = String::Handle(Z, String::ConcatAll(strings)); |
| 4107 const TypeArguments& type_arguments = | 4115 const TypeArguments& type_arguments = |
| 4108 TypeArguments::Handle(Z, type_obj.arguments()); | 4116 TypeArguments::Handle(Z, type_obj.arguments()); |
| 4109 const Function& constructor = | 4117 const Function& constructor = |
| 4110 Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name)); | 4118 Function::Handle(Z, cls.LookupFunctionAllowPrivate(dot_name)); |
| 4119 const int kTypeArgsLen = 0; | |
| 4111 const int extra_args = 1; | 4120 const int extra_args = 1; |
| 4112 if (!constructor.IsNull() && constructor.IsGenerativeConstructor() && | 4121 if (!constructor.IsNull() && constructor.IsGenerativeConstructor() && |
| 4113 constructor.AreValidArgumentCounts(number_of_arguments + extra_args, 0, | 4122 constructor.AreValidArgumentCounts( |
| 4114 NULL)) { | 4123 kTypeArgsLen, number_of_arguments + extra_args, 0, NULL)) { |
| 4115 // Create the argument list. | 4124 // Create the argument list. |
| 4116 // Constructors get the uninitialized object. | 4125 // Constructors get the uninitialized object. |
| 4117 if (!type_arguments.IsNull()) { | 4126 if (!type_arguments.IsNull()) { |
| 4118 // The type arguments will be null if the class has no type | 4127 // The type arguments will be null if the class has no type |
| 4119 // parameters, in which case the following call would fail | 4128 // parameters, in which case the following call would fail |
| 4120 // because there is no slot reserved in the object for the | 4129 // because there is no slot reserved in the object for the |
| 4121 // type vector. | 4130 // type vector. |
| 4122 instance.SetTypeArguments(type_arguments); | 4131 instance.SetTypeArguments(type_arguments); |
| 4123 } | 4132 } |
| 4124 Dart_Handle result; | 4133 Dart_Handle result; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4158 return Api::NewError( | 4167 return Api::NewError( |
| 4159 "%s expects argument 'number_of_arguments' to be non-negative.", | 4168 "%s expects argument 'number_of_arguments' to be non-negative.", |
| 4160 CURRENT_FUNC); | 4169 CURRENT_FUNC); |
| 4161 } | 4170 } |
| 4162 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target)); | 4171 const Object& obj = Object::Handle(Z, Api::UnwrapHandle(target)); |
| 4163 if (obj.IsError()) { | 4172 if (obj.IsError()) { |
| 4164 return target; | 4173 return target; |
| 4165 } | 4174 } |
| 4166 Dart_Handle result; | 4175 Dart_Handle result; |
| 4167 Array& args = Array::Handle(Z); | 4176 Array& args = Array::Handle(Z); |
| 4177 const intptr_t kTypeArgsLen = 0; | |
| 4168 if (obj.IsType()) { | 4178 if (obj.IsType()) { |
| 4169 if (!Type::Cast(obj).IsFinalized()) { | 4179 if (!Type::Cast(obj).IsFinalized()) { |
| 4170 return Api::NewError( | 4180 return Api::NewError( |
| 4171 "%s expects argument 'target' to be a fully resolved type.", | 4181 "%s expects argument 'target' to be a fully resolved type.", |
| 4172 CURRENT_FUNC); | 4182 CURRENT_FUNC); |
| 4173 } | 4183 } |
| 4174 | 4184 |
| 4175 const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class()); | 4185 const Class& cls = Class::Handle(Z, Type::Cast(obj).type_class()); |
| 4176 const Function& function = Function::Handle( | 4186 const Function& function = |
| 4177 Z, Resolver::ResolveStaticAllowPrivate( | 4187 Function::Handle(Z, Resolver::ResolveStaticAllowPrivate( |
| 4178 cls, function_name, number_of_arguments, Object::empty_array())); | 4188 cls, function_name, kTypeArgsLen, |
| 4189 number_of_arguments, Object::empty_array())); | |
| 4179 if (function.IsNull()) { | 4190 if (function.IsNull()) { |
| 4180 const String& cls_name = String::Handle(Z, cls.Name()); | 4191 const String& cls_name = String::Handle(Z, cls.Name()); |
| 4181 return Api::NewError("%s: did not find static method '%s.%s'.", | 4192 return Api::NewError("%s: did not find static method '%s.%s'.", |
| 4182 CURRENT_FUNC, cls_name.ToCString(), | 4193 CURRENT_FUNC, cls_name.ToCString(), |
| 4183 function_name.ToCString()); | 4194 function_name.ToCString()); |
| 4184 } | 4195 } |
| 4185 #if !defined(PRODUCT) | 4196 #if !defined(PRODUCT) |
| 4186 if (tds.enabled()) { | 4197 if (tds.enabled()) { |
| 4187 const String& cls_name = String::Handle(Z, cls.Name()); | 4198 const String& cls_name = String::Handle(Z, cls.Name()); |
| 4188 tds.SetNumArguments(1); | 4199 tds.SetNumArguments(1); |
| 4189 tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(), | 4200 tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(), |
| 4190 function_name.ToCString()); | 4201 function_name.ToCString()); |
| 4191 } | 4202 } |
| 4192 #endif // !defined(PRODUCT) | 4203 #endif // !defined(PRODUCT) |
| 4193 // Setup args and check for malformed arguments in the arguments list. | 4204 // Setup args and check for malformed arguments in the arguments list. |
| 4194 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); | 4205 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); |
| 4195 if (!::Dart_IsError(result)) { | 4206 if (!::Dart_IsError(result)) { |
| 4196 result = Api::NewHandle(T, DartEntry::InvokeFunction(function, args)); | 4207 result = Api::NewHandle(T, DartEntry::InvokeFunction(function, args)); |
| 4197 } | 4208 } |
| 4198 return result; | 4209 return result; |
| 4199 } else if (obj.IsNull() || obj.IsInstance()) { | 4210 } else if (obj.IsNull() || obj.IsInstance()) { |
| 4200 // Since we have allocated an object it would mean that the type of the | 4211 // Since we have allocated an object it would mean that the type of the |
| 4201 // receiver is already resolved and finalized, hence it is not necessary | 4212 // receiver is already resolved and finalized, hence it is not necessary |
| 4202 // to check here. | 4213 // to check here. |
| 4203 Instance& instance = Instance::Handle(Z); | 4214 Instance& instance = Instance::Handle(Z); |
| 4204 instance ^= obj.raw(); | 4215 instance ^= obj.raw(); |
| 4205 ArgumentsDescriptor args_desc( | 4216 ArgumentsDescriptor args_desc(Array::Handle( |
| 4206 Array::Handle(Z, ArgumentsDescriptor::New(number_of_arguments + 1))); | 4217 Z, ArgumentsDescriptor::New(kTypeArgsLen, number_of_arguments + 1))); |
| 4207 const Function& function = Function::Handle( | 4218 const Function& function = Function::Handle( |
| 4208 Z, Resolver::ResolveDynamic(instance, function_name, args_desc)); | 4219 Z, Resolver::ResolveDynamic(instance, function_name, args_desc)); |
| 4209 if (function.IsNull()) { | 4220 if (function.IsNull()) { |
| 4210 // Setup args and check for malformed arguments in the arguments list. | 4221 // Setup args and check for malformed arguments in the arguments list. |
| 4211 result = SetupArguments(T, number_of_arguments, arguments, 1, &args); | 4222 result = SetupArguments(T, number_of_arguments, arguments, 1, &args); |
| 4212 if (!::Dart_IsError(result)) { | 4223 if (!::Dart_IsError(result)) { |
| 4213 args.SetAt(0, instance); | 4224 args.SetAt(0, instance); |
| 4214 const Array& args_descriptor = | 4225 const Array& args_descriptor = Array::Handle( |
| 4215 Array::Handle(Z, ArgumentsDescriptor::New(args.Length())); | 4226 Z, ArgumentsDescriptor::New(kTypeArgsLen, args.Length())); |
| 4216 result = Api::NewHandle( | 4227 result = Api::NewHandle( |
| 4217 T, DartEntry::InvokeNoSuchMethod(instance, function_name, args, | 4228 T, DartEntry::InvokeNoSuchMethod(instance, function_name, args, |
| 4218 args_descriptor)); | 4229 args_descriptor)); |
| 4219 } | 4230 } |
| 4220 return result; | 4231 return result; |
| 4221 } | 4232 } |
| 4222 #if !defined(PRODUCT) | 4233 #if !defined(PRODUCT) |
| 4223 if (tds.enabled()) { | 4234 if (tds.enabled()) { |
| 4224 const Class& cls = Class::Handle(Z, instance.clazz()); | 4235 const Class& cls = Class::Handle(Z, instance.clazz()); |
| 4225 ASSERT(!cls.IsNull()); | 4236 ASSERT(!cls.IsNull()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4258 const String& lib_name = String::Handle(Z, lib.url()); | 4269 const String& lib_name = String::Handle(Z, lib.url()); |
| 4259 tds.SetNumArguments(1); | 4270 tds.SetNumArguments(1); |
| 4260 tds.FormatArgument(0, "name", "%s.%s", lib_name.ToCString(), | 4271 tds.FormatArgument(0, "name", "%s.%s", lib_name.ToCString(), |
| 4261 function_name.ToCString()); | 4272 function_name.ToCString()); |
| 4262 } | 4273 } |
| 4263 #endif // !defined(PRODUCT) | 4274 #endif // !defined(PRODUCT) |
| 4264 | 4275 |
| 4265 // LookupFunctionAllowPrivate does not check argument arity, so we | 4276 // LookupFunctionAllowPrivate does not check argument arity, so we |
| 4266 // do it here. | 4277 // do it here. |
| 4267 String& error_message = String::Handle(Z); | 4278 String& error_message = String::Handle(Z); |
| 4268 if (!function.AreValidArgumentCounts(number_of_arguments, 0, | 4279 if (!function.AreValidArgumentCounts(kTypeArgsLen, number_of_arguments, 0, |
| 4269 &error_message)) { | 4280 &error_message)) { |
| 4270 return Api::NewError("%s: wrong argument count for function '%s': %s.", | 4281 return Api::NewError("%s: wrong argument count for function '%s': %s.", |
| 4271 CURRENT_FUNC, function_name.ToCString(), | 4282 CURRENT_FUNC, function_name.ToCString(), |
| 4272 error_message.ToCString()); | 4283 error_message.ToCString()); |
| 4273 } | 4284 } |
| 4274 // Setup args and check for malformed arguments in the arguments list. | 4285 // Setup args and check for malformed arguments in the arguments list. |
| 4275 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); | 4286 result = SetupArguments(T, number_of_arguments, arguments, 0, &args); |
| 4276 if (!::Dart_IsError(result)) { | 4287 if (!::Dart_IsError(result)) { |
| 4277 result = Api::NewHandle(T, DartEntry::InvokeFunction(function, args)); | 4288 result = Api::NewHandle(T, DartEntry::InvokeFunction(function, args)); |
| 4278 } | 4289 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4388 #if !defined(PRODUCT) | 4399 #if !defined(PRODUCT) |
| 4389 if (tds.enabled()) { | 4400 if (tds.enabled()) { |
| 4390 const String& cls_name = String::Handle(cls.Name()); | 4401 const String& cls_name = String::Handle(cls.Name()); |
| 4391 tds.SetNumArguments(1); | 4402 tds.SetNumArguments(1); |
| 4392 tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(), | 4403 tds.FormatArgument(0, "name", "%s.%s", cls_name.ToCString(), |
| 4393 field_name.ToCString()); | 4404 field_name.ToCString()); |
| 4394 } | 4405 } |
| 4395 #endif // !defined(PRODUCT) | 4406 #endif // !defined(PRODUCT) |
| 4396 | 4407 |
| 4397 // Invoke the getter and return the result. | 4408 // Invoke the getter and return the result. |
| 4409 const int kTypeArgsLen = 0; | |
| 4398 const int kNumArgs = 1; | 4410 const int kNumArgs = 1; |
| 4399 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 4411 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| 4400 args.SetAt(0, instance); | 4412 args.SetAt(0, instance); |
| 4401 if (getter.IsNull()) { | 4413 if (getter.IsNull()) { |
| 4402 const Array& args_descriptor = | 4414 const Array& args_descriptor = Array::Handle( |
| 4403 Array::Handle(Z, ArgumentsDescriptor::New(args.Length())); | 4415 Z, ArgumentsDescriptor::New(kTypeArgsLen, args.Length())); |
| 4404 return Api::NewHandle( | 4416 return Api::NewHandle( |
| 4405 T, DartEntry::InvokeNoSuchMethod(instance, getter_name, args, | 4417 T, DartEntry::InvokeNoSuchMethod(instance, getter_name, args, |
| 4406 args_descriptor)); | 4418 args_descriptor)); |
| 4407 } | 4419 } |
| 4408 return Api::NewHandle(T, DartEntry::InvokeFunction(getter, args)); | 4420 return Api::NewHandle(T, DartEntry::InvokeFunction(getter, args)); |
| 4409 | 4421 |
| 4410 } else if (obj.IsLibrary()) { | 4422 } else if (obj.IsLibrary()) { |
| 4411 // To access a top-level we may need to use the Field or the | 4423 // To access a top-level we may need to use the Field or the |
| 4412 // getter Function. The getter function may either be in the | 4424 // getter Function. The getter function may either be in the |
| 4413 // library or in the field's owner class, depending. | 4425 // library or in the field's owner class, depending. |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4544 field_name.ToCString()); | 4556 field_name.ToCString()); |
| 4545 } | 4557 } |
| 4546 setter = cls.LookupDynamicFunctionAllowPrivate(setter_name); | 4558 setter = cls.LookupDynamicFunctionAllowPrivate(setter_name); |
| 4547 if (!setter.IsNull()) { | 4559 if (!setter.IsNull()) { |
| 4548 break; | 4560 break; |
| 4549 } | 4561 } |
| 4550 cls = cls.SuperClass(); | 4562 cls = cls.SuperClass(); |
| 4551 } | 4563 } |
| 4552 | 4564 |
| 4553 // Invoke the setter and return the result. | 4565 // Invoke the setter and return the result. |
| 4566 const int kTypeArgsLen = 0; | |
| 4554 const int kNumArgs = 2; | 4567 const int kNumArgs = 2; |
| 4555 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); | 4568 const Array& args = Array::Handle(Z, Array::New(kNumArgs)); |
| 4556 args.SetAt(0, instance); | 4569 args.SetAt(0, instance); |
| 4557 args.SetAt(1, value_instance); | 4570 args.SetAt(1, value_instance); |
| 4558 if (setter.IsNull()) { | 4571 if (setter.IsNull()) { |
| 4559 const Array& args_descriptor = | 4572 const Array& args_descriptor = Array::Handle( |
| 4560 Array::Handle(Z, ArgumentsDescriptor::New(args.Length())); | 4573 Z, ArgumentsDescriptor::New(kTypeArgsLen, args.Length())); |
| 4561 return Api::NewHandle( | 4574 return Api::NewHandle( |
| 4562 T, DartEntry::InvokeNoSuchMethod(instance, setter_name, args, | 4575 T, DartEntry::InvokeNoSuchMethod(instance, setter_name, args, |
| 4563 args_descriptor)); | 4576 args_descriptor)); |
| 4564 } | 4577 } |
| 4565 return Api::NewHandle(T, DartEntry::InvokeFunction(setter, args)); | 4578 return Api::NewHandle(T, DartEntry::InvokeFunction(setter, args)); |
| 4566 | 4579 |
| 4567 } else if (obj.IsLibrary()) { | 4580 } else if (obj.IsLibrary()) { |
| 4568 // To access a top-level we may need to use the Field or the | 4581 // To access a top-level we may need to use the Field or the |
| 4569 // setter Function. The setter function may either be in the | 4582 // setter Function. The setter function may either be in the |
| 4570 // library or in the field's owner class, depending. | 4583 // library or in the field's owner class, depending. |
| (...skipping 2275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6846 } | 6859 } |
| 6847 | 6860 |
| 6848 | 6861 |
| 6849 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { | 6862 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { |
| 6850 #ifndef PRODUCT | 6863 #ifndef PRODUCT |
| 6851 Profiler::DumpStackTrace(context); | 6864 Profiler::DumpStackTrace(context); |
| 6852 #endif | 6865 #endif |
| 6853 } | 6866 } |
| 6854 | 6867 |
| 6855 } // namespace dart | 6868 } // namespace dart |
| OLD | NEW |