| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart.h" | 10 #include "vm/dart.h" |
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 } | 1097 } |
| 1098 | 1098 |
| 1099 | 1099 |
| 1100 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { | 1100 DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) { |
| 1101 Isolate* isolate = Isolate::Current(); | 1101 Isolate* isolate = Isolate::Current(); |
| 1102 DARTSCOPE(isolate); | 1102 DARTSCOPE(isolate); |
| 1103 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); | 1103 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); |
| 1104 ASSERT(!isolate_lib.IsNull()); | 1104 ASSERT(!isolate_lib.IsNull()); |
| 1105 const String& class_name = String::Handle( | 1105 const String& class_name = String::Handle( |
| 1106 isolate, isolate_lib.PrivateName(Symbols::_ReceivePortImpl())); | 1106 isolate, isolate_lib.PrivateName(Symbols::_ReceivePortImpl())); |
| 1107 // TODO(asiva): Symbols should contain private keys. |
| 1108 const String& function_name = |
| 1109 String::Handle(isolate_lib.PrivateName(Symbols::_get_or_create())); |
| 1107 const int kNumArguments = 1; | 1110 const int kNumArguments = 1; |
| 1108 const Function& function = Function::Handle( | 1111 const Function& function = Function::Handle( |
| 1109 isolate, | 1112 isolate, |
| 1110 Resolver::ResolveStatic(isolate_lib, | 1113 Resolver::ResolveStatic(isolate_lib, |
| 1111 class_name, | 1114 class_name, |
| 1112 Symbols::_get_or_create(), | 1115 function_name, |
| 1113 kNumArguments, | 1116 kNumArguments, |
| 1114 Object::empty_array(), | 1117 Object::empty_array(), |
| 1115 Resolver::kIsQualified)); | 1118 Resolver::kIsQualified)); |
| 1119 ASSERT(!function.IsNull()); |
| 1116 const Array& args = Array::Handle(isolate, Array::New(kNumArguments)); | 1120 const Array& args = Array::Handle(isolate, Array::New(kNumArguments)); |
| 1117 args.SetAt(0, Integer::Handle(isolate, Integer::New(port_id))); | 1121 args.SetAt(0, Integer::Handle(isolate, Integer::New(port_id))); |
| 1118 return Api::NewHandle(isolate, DartEntry::InvokeStatic(function, args)); | 1122 return Api::NewHandle(isolate, DartEntry::InvokeStatic(function, args)); |
| 1119 } | 1123 } |
| 1120 | 1124 |
| 1121 | 1125 |
| 1122 DART_EXPORT Dart_Port Dart_GetMainPortId() { | 1126 DART_EXPORT Dart_Port Dart_GetMainPortId() { |
| 1123 Isolate* isolate = Isolate::Current(); | 1127 Isolate* isolate = Isolate::Current(); |
| 1124 CHECK_ISOLATE(isolate); | 1128 CHECK_ISOLATE(isolate); |
| 1125 return isolate->main_port(); | 1129 return isolate->main_port(); |
| (...skipping 1650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 if (func_name.IsNull()) { | 2780 if (func_name.IsNull()) { |
| 2777 RETURN_TYPE_ERROR(isolate, function_name, String); | 2781 RETURN_TYPE_ERROR(isolate, function_name, String); |
| 2778 } | 2782 } |
| 2779 | 2783 |
| 2780 Function& func = Function::Handle(isolate); | 2784 Function& func = Function::Handle(isolate); |
| 2781 String& tmp_name = String::Handle(isolate); | 2785 String& tmp_name = String::Handle(isolate); |
| 2782 if (obj.IsClass()) { | 2786 if (obj.IsClass()) { |
| 2783 const Class& cls = Class::Cast(obj); | 2787 const Class& cls = Class::Cast(obj); |
| 2784 | 2788 |
| 2785 // Case 1. Lookup the unmodified function name. | 2789 // Case 1. Lookup the unmodified function name. |
| 2786 func = cls.LookupFunction(func_name); | 2790 func = cls.LookupFunctionAllowPrivate(func_name); |
| 2787 | 2791 |
| 2788 // Case 2. Lookup the function without the external setter suffix | 2792 // Case 2. Lookup the function without the external setter suffix |
| 2789 // '='. Make sure to do this check after the regular lookup, so | 2793 // '='. Make sure to do this check after the regular lookup, so |
| 2790 // that we don't interfere with operator lookups (like ==). | 2794 // that we don't interfere with operator lookups (like ==). |
| 2791 if (func.IsNull() && HasExternalSetterSuffix(func_name)) { | 2795 if (func.IsNull() && HasExternalSetterSuffix(func_name)) { |
| 2792 tmp_name = RemoveExternalSetterSuffix(func_name); | 2796 tmp_name = RemoveExternalSetterSuffix(func_name); |
| 2793 tmp_name = Field::SetterName(tmp_name); | 2797 tmp_name = Field::SetterName(tmp_name); |
| 2794 func = cls.LookupFunction(tmp_name); | 2798 func = cls.LookupFunctionAllowPrivate(tmp_name); |
| 2795 } | 2799 } |
| 2796 | 2800 |
| 2797 // Case 3. Lookup the funciton with the getter prefix prepended. | 2801 // Case 3. Lookup the funciton with the getter prefix prepended. |
| 2798 if (func.IsNull()) { | 2802 if (func.IsNull()) { |
| 2799 tmp_name = Field::GetterName(func_name); | 2803 tmp_name = Field::GetterName(func_name); |
| 2800 func = cls.LookupFunction(tmp_name); | 2804 func = cls.LookupFunctionAllowPrivate(tmp_name); |
| 2801 } | 2805 } |
| 2802 | 2806 |
| 2803 // Case 4. Lookup the function with a . appended to find the | 2807 // Case 4. Lookup the function with a . appended to find the |
| 2804 // unnamed constructor. | 2808 // unnamed constructor. |
| 2805 if (func.IsNull()) { | 2809 if (func.IsNull()) { |
| 2806 tmp_name = String::Concat(func_name, Symbols::Dot()); | 2810 tmp_name = String::Concat(func_name, Symbols::Dot()); |
| 2807 func = cls.LookupFunction(tmp_name); | 2811 func = cls.LookupFunctionAllowPrivate(tmp_name); |
| 2808 } | 2812 } |
| 2809 } else if (obj.IsLibrary()) { | 2813 } else if (obj.IsLibrary()) { |
| 2810 const Library& lib = Library::Cast(obj); | 2814 const Library& lib = Library::Cast(obj); |
| 2811 | 2815 |
| 2812 // Case 1. Lookup the unmodified function name. | 2816 // Case 1. Lookup the unmodified function name. |
| 2813 func = lib.LookupFunctionAllowPrivate(func_name); | 2817 func = lib.LookupFunctionAllowPrivate(func_name); |
| 2814 | 2818 |
| 2815 // Case 2. Lookup the function without the external setter suffix | 2819 // Case 2. Lookup the function without the external setter suffix |
| 2816 // '='. Make sure to do this check after the regular lookup, so | 2820 // '='. Make sure to do this check after the regular lookup, so |
| 2817 // that we don't interfere with operator lookups (like ==). | 2821 // that we don't interfere with operator lookups (like ==). |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3292 | 3296 |
| 3293 | 3297 |
| 3294 static RawObject* ResolveConstructor(const char* current_func, | 3298 static RawObject* ResolveConstructor(const char* current_func, |
| 3295 const Class& cls, | 3299 const Class& cls, |
| 3296 const String& class_name, | 3300 const String& class_name, |
| 3297 const String& dotted_name, | 3301 const String& dotted_name, |
| 3298 int num_args) { | 3302 int num_args) { |
| 3299 // The constructor must be present in the interface. | 3303 // The constructor must be present in the interface. |
| 3300 String& constr_name = String::Handle(String::Concat(class_name, dotted_name)); | 3304 String& constr_name = String::Handle(String::Concat(class_name, dotted_name)); |
| 3301 const Function& constructor = | 3305 const Function& constructor = |
| 3302 Function::Handle(cls.LookupFunction(constr_name)); | 3306 Function::Handle(cls.LookupFunctionAllowPrivate(constr_name)); |
| 3303 if (constructor.IsNull() || | 3307 if (constructor.IsNull() || |
| 3304 (!constructor.IsConstructor() && !constructor.IsFactory())) { | 3308 (!constructor.IsConstructor() && !constructor.IsFactory())) { |
| 3305 const String& lookup_class_name = String::Handle(cls.Name()); | 3309 const String& lookup_class_name = String::Handle(cls.Name()); |
| 3306 if (!class_name.Equals(lookup_class_name)) { | 3310 if (!class_name.Equals(lookup_class_name)) { |
| 3307 // When the class name used to build the constructor name is | 3311 // When the class name used to build the constructor name is |
| 3308 // different than the name of the class in which we are doing | 3312 // different than the name of the class in which we are doing |
| 3309 // the lookup, it can be confusing to the user to figure out | 3313 // the lookup, it can be confusing to the user to figure out |
| 3310 // what's going on. Be a little more explicit for these error | 3314 // what's going on. Be a little more explicit for these error |
| 3311 // messages. | 3315 // messages. |
| 3312 const String& message = String::Handle( | 3316 const String& message = String::Handle( |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3604 CURRENT_FUNC); | 3608 CURRENT_FUNC); |
| 3605 } else if (obj.IsInstance()) { | 3609 } else if (obj.IsInstance()) { |
| 3606 // Every instance field has a getter Function. Try to find the | 3610 // Every instance field has a getter Function. Try to find the |
| 3607 // getter in any superclass and use that function to access the | 3611 // getter in any superclass and use that function to access the |
| 3608 // field. | 3612 // field. |
| 3609 const Instance& instance = Instance::Cast(obj); | 3613 const Instance& instance = Instance::Cast(obj); |
| 3610 Class& cls = Class::Handle(isolate, instance.clazz()); | 3614 Class& cls = Class::Handle(isolate, instance.clazz()); |
| 3611 while (!cls.IsNull()) { | 3615 while (!cls.IsNull()) { |
| 3612 String& getter_name = | 3616 String& getter_name = |
| 3613 String::Handle(isolate, Field::GetterName(field_name)); | 3617 String::Handle(isolate, Field::GetterName(field_name)); |
| 3614 getter = cls.LookupDynamicFunction(getter_name); | 3618 getter = cls.LookupDynamicFunctionAllowPrivate(getter_name); |
| 3615 if (!getter.IsNull()) { | 3619 if (!getter.IsNull()) { |
| 3616 break; | 3620 break; |
| 3617 } | 3621 } |
| 3618 cls = cls.SuperClass(); | 3622 cls = cls.SuperClass(); |
| 3619 } | 3623 } |
| 3620 | 3624 |
| 3621 if (getter.IsNull()) { | 3625 if (getter.IsNull()) { |
| 3622 return Api::NewError("%s: did not find instance field '%s'.", | 3626 return Api::NewError("%s: did not find instance field '%s'.", |
| 3623 CURRENT_FUNC, field_name.ToCString()); | 3627 CURRENT_FUNC, field_name.ToCString()); |
| 3624 } | 3628 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3635 if (msg != NULL) { | 3639 if (msg != NULL) { |
| 3636 return Api::NewError("%s", msg); | 3640 return Api::NewError("%s", msg); |
| 3637 } | 3641 } |
| 3638 // To access a static field we may need to use the Field or the | 3642 // To access a static field we may need to use the Field or the |
| 3639 // getter Function. | 3643 // getter Function. |
| 3640 const Class& cls = Class::Cast(obj); | 3644 const Class& cls = Class::Cast(obj); |
| 3641 field = cls.LookupStaticField(field_name); | 3645 field = cls.LookupStaticField(field_name); |
| 3642 if (field.IsNull() || FieldIsUninitialized(isolate, field)) { | 3646 if (field.IsNull() || FieldIsUninitialized(isolate, field)) { |
| 3643 const String& getter_name = | 3647 const String& getter_name = |
| 3644 String::Handle(isolate, Field::GetterName(field_name)); | 3648 String::Handle(isolate, Field::GetterName(field_name)); |
| 3645 getter = cls.LookupStaticFunction(getter_name); | 3649 getter = cls.LookupStaticFunctionAllowPrivate(getter_name); |
| 3646 } | 3650 } |
| 3647 | 3651 |
| 3648 if (!getter.IsNull()) { | 3652 if (!getter.IsNull()) { |
| 3649 // Invoke the getter and return the result. | 3653 // Invoke the getter and return the result. |
| 3650 return Api::NewHandle( | 3654 return Api::NewHandle( |
| 3651 isolate, DartEntry::InvokeStatic(getter, Object::empty_array())); | 3655 isolate, DartEntry::InvokeStatic(getter, Object::empty_array())); |
| 3652 } else if (!field.IsNull()) { | 3656 } else if (!field.IsNull()) { |
| 3653 return Api::NewHandle(isolate, field.value()); | 3657 return Api::NewHandle(isolate, field.value()); |
| 3654 } else { | 3658 } else { |
| 3655 return Api::NewError("%s: did not find static field '%s'.", | 3659 return Api::NewError("%s: did not find static field '%s'.", |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3667 if (field.IsNull()) { | 3671 if (field.IsNull()) { |
| 3668 // No field found. Check for a getter in the lib. | 3672 // No field found. Check for a getter in the lib. |
| 3669 const String& getter_name = | 3673 const String& getter_name = |
| 3670 String::Handle(isolate, Field::GetterName(field_name)); | 3674 String::Handle(isolate, Field::GetterName(field_name)); |
| 3671 getter = lib.LookupFunctionAllowPrivate(getter_name); | 3675 getter = lib.LookupFunctionAllowPrivate(getter_name); |
| 3672 } else if (FieldIsUninitialized(isolate, field)) { | 3676 } else if (FieldIsUninitialized(isolate, field)) { |
| 3673 // A field was found. Check for a getter in the field's owner classs. | 3677 // A field was found. Check for a getter in the field's owner classs. |
| 3674 const Class& cls = Class::Handle(isolate, field.owner()); | 3678 const Class& cls = Class::Handle(isolate, field.owner()); |
| 3675 const String& getter_name = | 3679 const String& getter_name = |
| 3676 String::Handle(isolate, Field::GetterName(field_name)); | 3680 String::Handle(isolate, Field::GetterName(field_name)); |
| 3677 getter = cls.LookupStaticFunction(getter_name); | 3681 getter = cls.LookupStaticFunctionAllowPrivate(getter_name); |
| 3678 } | 3682 } |
| 3679 | 3683 |
| 3680 if (!getter.IsNull()) { | 3684 if (!getter.IsNull()) { |
| 3681 // Invoke the getter and return the result. | 3685 // Invoke the getter and return the result. |
| 3682 return Api::NewHandle( | 3686 return Api::NewHandle( |
| 3683 isolate, DartEntry::InvokeStatic(getter, Object::empty_array())); | 3687 isolate, DartEntry::InvokeStatic(getter, Object::empty_array())); |
| 3684 } else if (!field.IsNull()) { | 3688 } else if (!field.IsNull()) { |
| 3685 return Api::NewHandle(isolate, field.value()); | 3689 return Api::NewHandle(isolate, field.value()); |
| 3686 } else { | 3690 } else { |
| 3687 return Api::NewError("%s: did not find top-level variable '%s'.", | 3691 return Api::NewError("%s: did not find top-level variable '%s'.", |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3730 const Instance& instance = Instance::Cast(obj); | 3734 const Instance& instance = Instance::Cast(obj); |
| 3731 Class& cls = Class::Handle(isolate, instance.clazz()); | 3735 Class& cls = Class::Handle(isolate, instance.clazz()); |
| 3732 while (!cls.IsNull()) { | 3736 while (!cls.IsNull()) { |
| 3733 field = cls.LookupInstanceField(field_name); | 3737 field = cls.LookupInstanceField(field_name); |
| 3734 if (!field.IsNull() && field.is_final()) { | 3738 if (!field.IsNull() && field.is_final()) { |
| 3735 return Api::NewError("%s: cannot set final field '%s'.", | 3739 return Api::NewError("%s: cannot set final field '%s'.", |
| 3736 CURRENT_FUNC, field_name.ToCString()); | 3740 CURRENT_FUNC, field_name.ToCString()); |
| 3737 } | 3741 } |
| 3738 String& setter_name = | 3742 String& setter_name = |
| 3739 String::Handle(isolate, Field::SetterName(field_name)); | 3743 String::Handle(isolate, Field::SetterName(field_name)); |
| 3740 setter = cls.LookupDynamicFunction(setter_name); | 3744 setter = cls.LookupDynamicFunctionAllowPrivate(setter_name); |
| 3741 if (!setter.IsNull()) { | 3745 if (!setter.IsNull()) { |
| 3742 break; | 3746 break; |
| 3743 } | 3747 } |
| 3744 cls = cls.SuperClass(); | 3748 cls = cls.SuperClass(); |
| 3745 } | 3749 } |
| 3746 | 3750 |
| 3747 if (setter.IsNull()) { | 3751 if (setter.IsNull()) { |
| 3748 return Api::NewError("%s: did not find instance field '%s'.", | 3752 return Api::NewError("%s: did not find instance field '%s'.", |
| 3749 CURRENT_FUNC, field_name.ToCString()); | 3753 CURRENT_FUNC, field_name.ToCString()); |
| 3750 } | 3754 } |
| 3751 | 3755 |
| 3752 // Invoke the setter and return the result. | 3756 // Invoke the setter and return the result. |
| 3753 const int kNumArgs = 2; | 3757 const int kNumArgs = 2; |
| 3754 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); | 3758 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); |
| 3755 args.SetAt(0, instance); | 3759 args.SetAt(0, instance); |
| 3756 args.SetAt(1, value_instance); | 3760 args.SetAt(1, value_instance); |
| 3757 return Api::NewHandle(isolate, DartEntry::InvokeDynamic(setter, args)); | 3761 return Api::NewHandle(isolate, DartEntry::InvokeDynamic(setter, args)); |
| 3758 | 3762 |
| 3759 } else if (obj.IsClass()) { | 3763 } else if (obj.IsClass()) { |
| 3760 // To access a static field we may need to use the Field or the | 3764 // To access a static field we may need to use the Field or the |
| 3761 // setter Function. | 3765 // setter Function. |
| 3762 const Class& cls = Class::Cast(obj); | 3766 const Class& cls = Class::Cast(obj); |
| 3763 field = cls.LookupStaticField(field_name); | 3767 field = cls.LookupStaticField(field_name); |
| 3764 if (field.IsNull()) { | 3768 if (field.IsNull()) { |
| 3765 String& setter_name = | 3769 String& setter_name = |
| 3766 String::Handle(isolate, Field::SetterName(field_name)); | 3770 String::Handle(isolate, Field::SetterName(field_name)); |
| 3767 setter = cls.LookupStaticFunction(setter_name); | 3771 setter = cls.LookupStaticFunctionAllowPrivate(setter_name); |
| 3768 } | 3772 } |
| 3769 | 3773 |
| 3770 if (!setter.IsNull()) { | 3774 if (!setter.IsNull()) { |
| 3771 // Invoke the setter and return the result. | 3775 // Invoke the setter and return the result. |
| 3772 const int kNumArgs = 1; | 3776 const int kNumArgs = 1; |
| 3773 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); | 3777 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); |
| 3774 args.SetAt(0, value_instance); | 3778 args.SetAt(0, value_instance); |
| 3775 const Object& result = | 3779 const Object& result = |
| 3776 Object::Handle(isolate, DartEntry::InvokeStatic(setter, args)); | 3780 Object::Handle(isolate, DartEntry::InvokeStatic(setter, args)); |
| 3777 if (result.IsError()) { | 3781 if (result.IsError()) { |
| (...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4519 } | 4523 } |
| 4520 { | 4524 { |
| 4521 NoGCScope no_gc; | 4525 NoGCScope no_gc; |
| 4522 RawObject* raw_obj = obj.raw(); | 4526 RawObject* raw_obj = obj.raw(); |
| 4523 isolate->heap()->SetPeer(raw_obj, peer); | 4527 isolate->heap()->SetPeer(raw_obj, peer); |
| 4524 } | 4528 } |
| 4525 return Api::Success(isolate); | 4529 return Api::Success(isolate); |
| 4526 } | 4530 } |
| 4527 | 4531 |
| 4528 } // namespace dart | 4532 } // namespace dart |
| OLD | NEW |