| 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" |
| (...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1848 // different signature classes for closures. | 1848 // different signature classes for closures. |
| 1849 Isolate* isolate = Isolate::Current(); | 1849 Isolate* isolate = Isolate::Current(); |
| 1850 CHECK_ISOLATE(isolate); | 1850 CHECK_ISOLATE(isolate); |
| 1851 ReusableObjectHandleScope reused_obj_handle(isolate); | 1851 ReusableObjectHandleScope reused_obj_handle(isolate); |
| 1852 const Instance& closure_obj = | 1852 const Instance& closure_obj = |
| 1853 Api::UnwrapInstanceHandle(reused_obj_handle, object); | 1853 Api::UnwrapInstanceHandle(reused_obj_handle, object); |
| 1854 return (!closure_obj.IsNull() && closure_obj.IsClosure()); | 1854 return (!closure_obj.IsNull() && closure_obj.IsClosure()); |
| 1855 } | 1855 } |
| 1856 | 1856 |
| 1857 | 1857 |
| 1858 DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) { |
| 1859 TRACE_API_CALL(CURRENT_FUNC); |
| 1860 intptr_t cid = Api::ClassId(handle); |
| 1861 return RawObject::IsTypedDataClassId(cid) || |
| 1862 RawObject::IsExternalTypedDataClassId(cid); |
| 1863 } |
| 1864 |
| 1865 |
| 1866 DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) { |
| 1867 TRACE_API_CALL(CURRENT_FUNC); |
| 1868 return Api::ClassId(handle) == kByteBufferCid; |
| 1869 } |
| 1870 |
| 1871 |
| 1858 // --- Instances ---- | 1872 // --- Instances ---- |
| 1859 | 1873 |
| 1860 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { | 1874 DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) { |
| 1861 Isolate* isolate = Isolate::Current(); | 1875 Isolate* isolate = Isolate::Current(); |
| 1862 DARTSCOPE(isolate); | 1876 DARTSCOPE(isolate); |
| 1863 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(instance)); | 1877 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(instance)); |
| 1864 if (obj.IsNull()) { | 1878 if (obj.IsNull()) { |
| 1865 return Api::NewHandle(isolate, isolate->object_store()->null_type()); | 1879 return Api::NewHandle(isolate, isolate->object_store()->null_type()); |
| 1866 } | 1880 } |
| 1867 if (!obj.IsInstance()) { | 1881 if (!obj.IsInstance()) { |
| (...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3079 Object& result = Object::Handle(isolate); | 3093 Object& result = Object::Handle(isolate); |
| 3080 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot(), 1); | 3094 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot(), 1); |
| 3081 ASSERT(!result.IsNull()); | 3095 ASSERT(!result.IsNull()); |
| 3082 ASSERT(result.IsFunction()); | 3096 ASSERT(result.IsFunction()); |
| 3083 const Function& factory = Function::Cast(result); | 3097 const Function& factory = Function::Cast(result); |
| 3084 ASSERT(!factory.IsConstructor()); | 3098 ASSERT(!factory.IsConstructor()); |
| 3085 | 3099 |
| 3086 // Create the argument list. | 3100 // Create the argument list. |
| 3087 const Array& args = Array::Handle(isolate, Array::New(2)); | 3101 const Array& args = Array::Handle(isolate, Array::New(2)); |
| 3088 // Factories get type arguments. | 3102 // Factories get type arguments. |
| 3089 args.SetAt(0, TypeArguments::Handle(isolate)); | 3103 args.SetAt(0, Object::null_type_arguments()); |
| 3090 args.SetAt(1, Smi::Handle(isolate, Smi::New(length))); | 3104 args.SetAt(1, Smi::Handle(isolate, Smi::New(length))); |
| 3091 | 3105 |
| 3092 // Invoke the constructor and return the new object. | 3106 // Invoke the constructor and return the new object. |
| 3093 result = DartEntry::InvokeFunction(factory, args); | 3107 result = DartEntry::InvokeFunction(factory, args); |
| 3094 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); | 3108 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); |
| 3095 return Api::NewHandle(isolate, result.raw()); | 3109 return Api::NewHandle(isolate, result.raw()); |
| 3096 } | 3110 } |
| 3097 | 3111 |
| 3098 | 3112 |
| 3099 static Dart_Handle NewTypedData(Isolate* isolate, | 3113 static Dart_Handle NewTypedData(Isolate* isolate, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3129 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot_view(), 3); | 3143 result = GetByteDataConstructor(isolate, Symbols::ByteDataDot_view(), 3); |
| 3130 ASSERT(!result.IsNull()); | 3144 ASSERT(!result.IsNull()); |
| 3131 ASSERT(result.IsFunction()); | 3145 ASSERT(result.IsFunction()); |
| 3132 const Function& factory = Function::Cast(result); | 3146 const Function& factory = Function::Cast(result); |
| 3133 ASSERT(!factory.IsConstructor()); | 3147 ASSERT(!factory.IsConstructor()); |
| 3134 | 3148 |
| 3135 // Create the argument list. | 3149 // Create the argument list. |
| 3136 const intptr_t num_args = 3; | 3150 const intptr_t num_args = 3; |
| 3137 const Array& args = Array::Handle(isolate, Array::New(num_args + 1)); | 3151 const Array& args = Array::Handle(isolate, Array::New(num_args + 1)); |
| 3138 // Factories get type arguments. | 3152 // Factories get type arguments. |
| 3139 args.SetAt(0, TypeArguments::Handle(isolate)); | 3153 args.SetAt(0, Object::null_type_arguments()); |
| 3140 const ExternalTypedData& array = | 3154 const ExternalTypedData& array = |
| 3141 Api::UnwrapExternalTypedDataHandle(isolate, ext_data); | 3155 Api::UnwrapExternalTypedDataHandle(isolate, ext_data); |
| 3142 args.SetAt(1, array); | 3156 args.SetAt(1, array); |
| 3143 Smi& smi = Smi::Handle(isolate); | 3157 Smi& smi = Smi::Handle(isolate); |
| 3144 smi = Smi::New(0); | 3158 smi = Smi::New(0); |
| 3145 args.SetAt(2, smi); | 3159 args.SetAt(2, smi); |
| 3146 smi = Smi::New(length); | 3160 smi = Smi::New(length); |
| 3147 args.SetAt(3, smi); | 3161 args.SetAt(3, smi); |
| 3148 | 3162 |
| 3149 // Invoke the constructor and return the new object. | 3163 // Invoke the constructor and return the new object. |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3269 length); | 3283 length); |
| 3270 default: | 3284 default: |
| 3271 return Api::NewError("%s expects argument 'type' to be of" | 3285 return Api::NewError("%s expects argument 'type' to be of" |
| 3272 " 'external TypedData'", CURRENT_FUNC); | 3286 " 'external TypedData'", CURRENT_FUNC); |
| 3273 } | 3287 } |
| 3274 UNREACHABLE(); | 3288 UNREACHABLE(); |
| 3275 return Api::Null(); | 3289 return Api::Null(); |
| 3276 } | 3290 } |
| 3277 | 3291 |
| 3278 | 3292 |
| 3293 static RawObject* GetByteBufferConstructor(Isolate* isolate, |
| 3294 const String& class_name, |
| 3295 const String& constructor_name, |
| 3296 intptr_t num_args) { |
| 3297 const Library& lib = |
| 3298 Library::Handle(isolate->object_store()->typed_data_library()); |
| 3299 ASSERT(!lib.IsNull()); |
| 3300 const Class& cls = Class::Handle( |
| 3301 isolate, lib.LookupClassAllowPrivate(class_name)); |
| 3302 ASSERT(!cls.IsNull()); |
| 3303 return ResolveConstructor(CURRENT_FUNC, |
| 3304 cls, |
| 3305 class_name, |
| 3306 constructor_name, |
| 3307 num_args); |
| 3308 } |
| 3309 |
| 3310 |
| 3311 DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) { |
| 3312 Isolate* isolate = Isolate::Current(); |
| 3313 DARTSCOPE(isolate); |
| 3314 intptr_t class_id = Api::ClassId(typed_data); |
| 3315 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
| 3316 !RawObject::IsTypedDataViewClassId(class_id) && |
| 3317 !RawObject::IsTypedDataClassId(class_id)) { |
| 3318 RETURN_TYPE_ERROR(isolate, typed_data, 'TypedData'); |
| 3319 } |
| 3320 Object& result = Object::Handle(isolate); |
| 3321 result = GetByteBufferConstructor(isolate, |
| 3322 Symbols::_ByteBuffer(), |
| 3323 Symbols::_ByteBufferDot_New(), |
| 3324 1); |
| 3325 ASSERT(!result.IsNull()); |
| 3326 ASSERT(result.IsFunction()); |
| 3327 const Function& factory = Function::Cast(result); |
| 3328 ASSERT(!factory.IsConstructor()); |
| 3329 |
| 3330 // Create the argument list. |
| 3331 const Array& args = Array::Handle(isolate, Array::New(2)); |
| 3332 // Factories get type arguments. |
| 3333 args.SetAt(0, Object::null_type_arguments()); |
| 3334 const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(typed_data)); |
| 3335 args.SetAt(1, obj); |
| 3336 |
| 3337 // Invoke the factory constructor and return the new object. |
| 3338 result = DartEntry::InvokeFunction(factory, args); |
| 3339 ASSERT(result.IsInstance() || result.IsNull() || result.IsError()); |
| 3340 return Api::NewHandle(isolate, result.raw()); |
| 3341 } |
| 3342 |
| 3343 |
| 3279 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, | 3344 DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, |
| 3280 Dart_TypedData_Type* type, | 3345 Dart_TypedData_Type* type, |
| 3281 void** data, | 3346 void** data, |
| 3282 intptr_t* len) { | 3347 intptr_t* len) { |
| 3283 Isolate* isolate = Isolate::Current(); | 3348 Isolate* isolate = Isolate::Current(); |
| 3284 DARTSCOPE(isolate); | 3349 DARTSCOPE(isolate); |
| 3285 intptr_t class_id = Api::ClassId(object); | 3350 intptr_t class_id = Api::ClassId(object); |
| 3286 if (!RawObject::IsExternalTypedDataClassId(class_id) && | 3351 if (!RawObject::IsExternalTypedDataClassId(class_id) && |
| 3287 !RawObject::IsTypedDataViewClassId(class_id) && | 3352 !RawObject::IsTypedDataViewClassId(class_id) && |
| 3288 !RawObject::IsTypedDataClassId(class_id)) { | 3353 !RawObject::IsTypedDataClassId(class_id)) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3349 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); | 3414 RETURN_TYPE_ERROR(isolate, object, 'TypedData'); |
| 3350 } | 3415 } |
| 3351 if (!RawObject::IsExternalTypedDataClassId(class_id)) { | 3416 if (!RawObject::IsExternalTypedDataClassId(class_id)) { |
| 3352 isolate->DecrementNoGCScopeDepth(); | 3417 isolate->DecrementNoGCScopeDepth(); |
| 3353 END_NO_CALLBACK_SCOPE(isolate); | 3418 END_NO_CALLBACK_SCOPE(isolate); |
| 3354 } | 3419 } |
| 3355 return Api::Success(); | 3420 return Api::Success(); |
| 3356 } | 3421 } |
| 3357 | 3422 |
| 3358 | 3423 |
| 3424 DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle object) { |
| 3425 Isolate* isolate = Isolate::Current(); |
| 3426 CHECK_ISOLATE(isolate); |
| 3427 intptr_t class_id = Api::ClassId(object); |
| 3428 if (class_id != kByteBufferCid) { |
| 3429 RETURN_TYPE_ERROR(isolate, object, 'ByteBuffer'); |
| 3430 } |
| 3431 const Instance& instance = Api::UnwrapInstanceHandle(isolate, object); |
| 3432 ASSERT(!instance.IsNull()); |
| 3433 return Api::NewHandle(isolate, ByteBuffer::Data(instance)); |
| 3434 } |
| 3435 |
| 3436 |
| 3359 // --- Invoking Constructors, Methods, and Field accessors --- | 3437 // --- Invoking Constructors, Methods, and Field accessors --- |
| 3360 | 3438 |
| 3361 static RawObject* ResolveConstructor(const char* current_func, | 3439 static RawObject* ResolveConstructor(const char* current_func, |
| 3362 const Class& cls, | 3440 const Class& cls, |
| 3363 const String& class_name, | 3441 const String& class_name, |
| 3364 const String& constr_name, | 3442 const String& constr_name, |
| 3365 int num_args) { | 3443 int num_args) { |
| 3366 // The constructor must be present in the interface. | 3444 // The constructor must be present in the interface. |
| 3367 const Function& constructor = | 3445 const Function& constructor = |
| 3368 Function::Handle(cls.LookupFunctionAllowPrivate(constr_name)); | 3446 Function::Handle(cls.LookupFunctionAllowPrivate(constr_name)); |
| (...skipping 1839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5208 | 5286 |
| 5209 | 5287 |
| 5210 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( | 5288 DART_EXPORT void Dart_RegisterRootServiceRequestCallback( |
| 5211 const char* name, | 5289 const char* name, |
| 5212 Dart_ServiceRequestCallback callback, | 5290 Dart_ServiceRequestCallback callback, |
| 5213 void* user_data) { | 5291 void* user_data) { |
| 5214 Service::RegisterRootEmbedderCallback(name, callback, user_data); | 5292 Service::RegisterRootEmbedderCallback(name, callback, user_data); |
| 5215 } | 5293 } |
| 5216 | 5294 |
| 5217 } // namespace dart | 5295 } // namespace dart |
| OLD | NEW |