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/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
11 #include "vm/class_finalizer.h" | 11 #include "vm/class_finalizer.h" |
12 #include "vm/compiler.h" | 12 #include "vm/compiler.h" |
13 #include "vm/dart.h" | 13 #include "vm/dart.h" |
14 #include "vm/dart_api_impl.h" | 14 #include "vm/dart_api_impl.h" |
15 #include "vm/dart_api_message.h" | 15 #include "vm/dart_api_message.h" |
16 #include "vm/dart_api_state.h" | 16 #include "vm/dart_api_state.h" |
17 #include "vm/dart_entry.h" | 17 #include "vm/dart_entry.h" |
18 #include "vm/debuginfo.h" | 18 #include "vm/debuginfo.h" |
19 #include "vm/exceptions.h" | 19 #include "vm/exceptions.h" |
20 #include "vm/flags.h" | 20 #include "vm/flags.h" |
21 #include "vm/growable_array.h" | 21 #include "vm/growable_array.h" |
22 #include "vm/message.h" | 22 #include "vm/message.h" |
23 #include "vm/message_handler.h" | 23 #include "vm/message_handler.h" |
24 #include "vm/native_entry.h" | 24 #include "vm/native_entry.h" |
25 #include "vm/object.h" | 25 #include "vm/object.h" |
26 #include "vm/object_store.h" | 26 #include "vm/object_store.h" |
27 #include "vm/port.h" | 27 #include "vm/port.h" |
28 #include "vm/resolver.h" | 28 #include "vm/resolver.h" |
| 29 #include "vm/reusable_handles.h" |
29 #include "vm/stack_frame.h" | 30 #include "vm/stack_frame.h" |
30 #include "vm/symbols.h" | 31 #include "vm/symbols.h" |
31 #include "vm/timer.h" | 32 #include "vm/timer.h" |
32 #include "vm/unicode.h" | 33 #include "vm/unicode.h" |
33 #include "vm/verifier.h" | 34 #include "vm/verifier.h" |
34 #include "vm/version.h" | 35 #include "vm/version.h" |
35 | 36 |
36 namespace dart { | 37 namespace dart { |
37 | 38 |
38 DECLARE_FLAG(bool, print_class_table); | 39 DECLARE_FLAG(bool, print_class_table); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); | 256 reinterpret_cast<RawExternalTwoByteString*>(raw_obj)->ptr(); |
256 ExternalStringData<uint16_t>* data = raw_string->external_data_; | 257 ExternalStringData<uint16_t>* data = raw_string->external_data_; |
257 *peer = data->peer(); | 258 *peer = data->peer(); |
258 return true; | 259 return true; |
259 } | 260 } |
260 } | 261 } |
261 return false; | 262 return false; |
262 } | 263 } |
263 | 264 |
264 | 265 |
| 266 void Api::SetWeakHandleReturnValue(NativeArguments* args, |
| 267 Dart_WeakPersistentHandle retval) { |
| 268 args->SetReturnUnsafe( |
| 269 reinterpret_cast<FinalizablePersistentHandle*>(retval)->raw()); |
| 270 } |
| 271 |
| 272 |
265 // --- Handles --- | 273 // --- Handles --- |
266 | 274 |
267 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { | 275 DART_EXPORT bool Dart_IsError(Dart_Handle handle) { |
268 return RawObject::IsErrorClassId(Api::ClassId(handle)); | 276 return RawObject::IsErrorClassId(Api::ClassId(handle)); |
269 } | 277 } |
270 | 278 |
271 | 279 |
272 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) { | 280 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) { |
273 return Api::ClassId(object) == kApiErrorCid; | 281 return Api::ClassId(object) == kApiErrorCid; |
274 } | 282 } |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 // --- Objects ---- | 1133 // --- Objects ---- |
1126 | 1134 |
1127 DART_EXPORT Dart_Handle Dart_Null() { | 1135 DART_EXPORT Dart_Handle Dart_Null() { |
1128 Isolate* isolate = Isolate::Current(); | 1136 Isolate* isolate = Isolate::Current(); |
1129 CHECK_ISOLATE_SCOPE(isolate); | 1137 CHECK_ISOLATE_SCOPE(isolate); |
1130 return Api::Null(); | 1138 return Api::Null(); |
1131 } | 1139 } |
1132 | 1140 |
1133 | 1141 |
1134 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { | 1142 DART_EXPORT bool Dart_IsNull(Dart_Handle object) { |
1135 return Api::ClassId(object) == kNullCid; | 1143 return Api::UnwrapHandle(object) == Object::null(); |
1136 } | 1144 } |
1137 | 1145 |
1138 | 1146 |
1139 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, | 1147 DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, |
1140 bool* value) { | 1148 bool* value) { |
1141 Isolate* isolate = Isolate::Current(); | 1149 Isolate* isolate = Isolate::Current(); |
1142 DARTSCOPE(isolate); | 1150 DARTSCOPE(isolate); |
1143 CHECK_CALLBACK_STATE(isolate); | 1151 CHECK_CALLBACK_STATE(isolate); |
1144 const Instance& expected = | 1152 const Instance& expected = |
1145 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj1)); | 1153 Instance::CheckedHandle(isolate, Api::UnwrapHandle(obj1)); |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 utf16_array[i] = static_cast<uint16_t>(str_obj.CharAt(i)); | 1843 utf16_array[i] = static_cast<uint16_t>(str_obj.CharAt(i)); |
1836 } | 1844 } |
1837 } | 1845 } |
1838 return Api::Null(); | 1846 return Api::Null(); |
1839 } | 1847 } |
1840 return Api::NewHandle(isolate, | 1848 return Api::NewHandle(isolate, |
1841 str_obj.MakeExternal(array, length, peer, cback)); | 1849 str_obj.MakeExternal(array, length, peer, cback)); |
1842 } | 1850 } |
1843 | 1851 |
1844 | 1852 |
| 1853 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, |
| 1854 intptr_t* char_size, |
| 1855 intptr_t* str_len, |
| 1856 void** peer) { |
| 1857 Isolate* isolate = Isolate::Current(); |
| 1858 DARTSCOPE(isolate); |
| 1859 const String& str = Api::UnwrapStringHandle(isolate, object); |
| 1860 if (str.IsNull()) { |
| 1861 RETURN_TYPE_ERROR(isolate, object, String); |
| 1862 } |
| 1863 if (str.IsExternal()) { |
| 1864 *peer = str.GetPeer(); |
| 1865 ASSERT(*peer != NULL); |
| 1866 } else { |
| 1867 *peer = NULL; |
| 1868 } |
| 1869 *char_size = str.CharSize(); |
| 1870 *str_len = str.Length(); |
| 1871 return Api::Success(); |
| 1872 } |
| 1873 |
| 1874 |
1845 // --- Lists --- | 1875 // --- Lists --- |
1846 | 1876 |
1847 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { | 1877 DART_EXPORT Dart_Handle Dart_NewList(intptr_t length) { |
1848 Isolate* isolate = Isolate::Current(); | 1878 Isolate* isolate = Isolate::Current(); |
1849 DARTSCOPE(isolate); | 1879 DARTSCOPE(isolate); |
1850 CHECK_LENGTH(length, Array::kMaxElements); | 1880 CHECK_LENGTH(length, Array::kMaxElements); |
1851 CHECK_CALLBACK_STATE(isolate); | 1881 CHECK_CALLBACK_STATE(isolate); |
1852 return Api::NewHandle(isolate, Array::New(length)); | 1882 return Api::NewHandle(isolate, Array::New(length)); |
1853 } | 1883 } |
1854 | 1884 |
(...skipping 1761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3616 "%s: invalid index %d passed in to access native instance field", | 3646 "%s: invalid index %d passed in to access native instance field", |
3617 CURRENT_FUNC, fld_index); | 3647 CURRENT_FUNC, fld_index); |
3618 } | 3648 } |
3619 if (value == NULL) { | 3649 if (value == NULL) { |
3620 RETURN_NULL_ERROR(value); | 3650 RETURN_NULL_ERROR(value); |
3621 } | 3651 } |
3622 *value = instance.GetNativeField(isolate, fld_index); | 3652 *value = instance.GetNativeField(isolate, fld_index); |
3623 return Api::Success(); | 3653 return Api::Success(); |
3624 } | 3654 } |
3625 | 3655 |
| 3656 |
3626 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, | 3657 DART_EXPORT Dart_Handle Dart_GetNativeReceiver(Dart_NativeArguments args, |
3627 intptr_t* value) { | 3658 intptr_t* value) { |
3628 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 3659 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
3629 Isolate* isolate = arguments->isolate(); | 3660 Isolate* isolate = arguments->isolate(); |
3630 DARTSCOPE(isolate); | 3661 CHECK_ISOLATE(isolate); |
3631 const Object& obj = Object::Handle(isolate, arguments->NativeArgAt(0)); | 3662 ReusableObjectHandleScope reused_obj_handle(isolate); |
| 3663 Object& obj = reused_obj_handle.Handle(); |
| 3664 obj = arguments->NativeArgAt(0); |
3632 intptr_t cid = obj.GetClassId(); | 3665 intptr_t cid = obj.GetClassId(); |
3633 if (cid <= kNumPredefinedCids) { | 3666 if (cid <= kNumPredefinedCids) { |
3634 if (cid == kNullCid) { | 3667 if (cid == kNullCid) { |
3635 return Api::NewError("%s expects receiver argument to be non-null.", | 3668 return Api::NewError("%s expects receiver argument to be non-null.", |
3636 CURRENT_FUNC); | 3669 CURRENT_FUNC); |
3637 } | 3670 } |
3638 return Api::NewError("%s expects receiver argument to be of" | 3671 return Api::NewError("%s expects receiver argument to be of" |
3639 " type Instance.", CURRENT_FUNC); | 3672 " type Instance.", CURRENT_FUNC); |
3640 } | 3673 } |
3641 const Instance& instance = Instance::Cast(obj); | 3674 const Instance& instance = Instance::Cast(obj); |
3642 ASSERT(instance.IsValidNativeIndex(0)); | 3675 ASSERT(instance.IsValidNativeIndex(0)); |
3643 if (value == NULL) { | 3676 if (value == NULL) { |
3644 RETURN_NULL_ERROR(value); | 3677 RETURN_NULL_ERROR(value); |
3645 } | 3678 } |
3646 *value = instance.GetNativeField(isolate, 0); | 3679 *value = instance.GetNativeField(isolate, 0); |
3647 return Api::Success(); | 3680 return Api::Success(); |
3648 } | 3681 } |
3649 | 3682 |
3650 | 3683 |
| 3684 DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, |
| 3685 int arg_index, |
| 3686 void** peer) { |
| 3687 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 3688 Isolate* isolate = arguments->isolate(); |
| 3689 CHECK_ISOLATE(isolate); |
| 3690 ReusableObjectHandleScope reused_obj_handle(isolate); |
| 3691 Object& obj = reused_obj_handle.Handle(); |
| 3692 obj = arguments->NativeArgAt(arg_index); |
| 3693 intptr_t cid = obj.GetClassId(); |
| 3694 if (RawObject::IsExternalStringClassId(cid)) { |
| 3695 const String& str = String::Cast(obj); |
| 3696 *peer = str.GetPeer(); |
| 3697 ASSERT(*peer != NULL); |
| 3698 return Api::Success(); |
| 3699 } |
| 3700 *peer = NULL; |
| 3701 if (RawObject::IsStringClassId(cid)) { |
| 3702 return Api::NewHandle(isolate, obj.raw()); |
| 3703 } |
| 3704 return Api::NewError("%s expects argument to be of" |
| 3705 " type String.", CURRENT_FUNC); |
| 3706 } |
| 3707 |
| 3708 |
3651 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, | 3709 DART_EXPORT void Dart_SetReturnValue(Dart_NativeArguments args, |
3652 Dart_Handle retval) { | 3710 Dart_Handle retval) { |
3653 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 3711 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
3654 Isolate* isolate = arguments->isolate(); | 3712 Isolate* isolate = arguments->isolate(); |
3655 CHECK_ISOLATE(isolate); | 3713 CHECK_ISOLATE(isolate); |
3656 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { | 3714 if ((retval != Api::Null()) && (!Api::IsInstance(retval))) { |
3657 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); | 3715 const Object& ret_obj = Object::Handle(Api::UnwrapHandle(retval)); |
3658 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", | 3716 FATAL1("Return value check failed: saw '%s' expected a dart Instance.", |
3659 ret_obj.ToCString()); | 3717 ret_obj.ToCString()); |
3660 } | 3718 } |
3661 ASSERT(retval != 0); | 3719 ASSERT(retval != 0); |
3662 Api::SetReturnValue(arguments, retval); | 3720 Api::SetReturnValue(arguments, retval); |
3663 } | 3721 } |
3664 | 3722 |
3665 | 3723 |
| 3724 DART_EXPORT void Dart_SetWeakHandleReturnValue(Dart_NativeArguments args, |
| 3725 Dart_WeakPersistentHandle rval) { |
| 3726 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 3727 Isolate* isolate = arguments->isolate(); |
| 3728 CHECK_ISOLATE(isolate); |
| 3729 ASSERT(isolate->api_state() != NULL && |
| 3730 (isolate->api_state()->IsValidWeakPersistentHandle(rval) || |
| 3731 isolate->api_state()->IsValidPrologueWeakPersistentHandle(rval))); |
| 3732 Api::SetWeakHandleReturnValue(arguments, rval); |
| 3733 } |
| 3734 |
| 3735 |
3666 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, | 3736 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, |
3667 bool retval) { | 3737 bool retval) { |
3668 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 3738 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
3669 arguments->SetReturn(retval ? Bool::True() : Bool::False()); | 3739 arguments->SetReturn(retval ? Bool::True() : Bool::False()); |
3670 } | 3740 } |
3671 | 3741 |
3672 | 3742 |
3673 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, | 3743 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, |
3674 intptr_t retval) { | 3744 intptr_t retval) { |
3675 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 3745 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4166 } | 4236 } |
4167 { | 4237 { |
4168 NoGCScope no_gc; | 4238 NoGCScope no_gc; |
4169 RawObject* raw_obj = obj.raw(); | 4239 RawObject* raw_obj = obj.raw(); |
4170 isolate->heap()->SetPeer(raw_obj, peer); | 4240 isolate->heap()->SetPeer(raw_obj, peer); |
4171 } | 4241 } |
4172 return Api::Success(); | 4242 return Api::Success(); |
4173 } | 4243 } |
4174 | 4244 |
4175 } // namespace dart | 4245 } // namespace dart |
OLD | NEW |