| Index: runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl.cc (revision 38347)
|
| +++ runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -1855,6 +1855,20 @@
|
| }
|
|
|
|
|
| +DART_EXPORT bool Dart_IsTypedData(Dart_Handle handle) {
|
| + TRACE_API_CALL(CURRENT_FUNC);
|
| + intptr_t cid = Api::ClassId(handle);
|
| + return RawObject::IsTypedDataClassId(cid) ||
|
| + RawObject::IsExternalTypedDataClassId(cid);
|
| +}
|
| +
|
| +
|
| +DART_EXPORT bool Dart_IsByteBuffer(Dart_Handle handle) {
|
| + TRACE_API_CALL(CURRENT_FUNC);
|
| + return Api::ClassId(handle) == kByteBufferCid;
|
| +}
|
| +
|
| +
|
| // --- Instances ----
|
|
|
| DART_EXPORT Dart_Handle Dart_InstanceGetType(Dart_Handle instance) {
|
| @@ -3086,7 +3100,7 @@
|
| // Create the argument list.
|
| const Array& args = Array::Handle(isolate, Array::New(2));
|
| // Factories get type arguments.
|
| - args.SetAt(0, TypeArguments::Handle(isolate));
|
| + args.SetAt(0, Object::null_type_arguments());
|
| args.SetAt(1, Smi::Handle(isolate, Smi::New(length)));
|
|
|
| // Invoke the constructor and return the new object.
|
| @@ -3136,7 +3150,7 @@
|
| const intptr_t num_args = 3;
|
| const Array& args = Array::Handle(isolate, Array::New(num_args + 1));
|
| // Factories get type arguments.
|
| - args.SetAt(0, TypeArguments::Handle(isolate));
|
| + args.SetAt(0, Object::null_type_arguments());
|
| const ExternalTypedData& array =
|
| Api::UnwrapExternalTypedDataHandle(isolate, ext_data);
|
| args.SetAt(1, array);
|
| @@ -3276,6 +3290,57 @@
|
| }
|
|
|
|
|
| +static RawObject* GetByteBufferConstructor(Isolate* isolate,
|
| + const String& class_name,
|
| + const String& constructor_name,
|
| + intptr_t num_args) {
|
| + const Library& lib =
|
| + Library::Handle(isolate->object_store()->typed_data_library());
|
| + ASSERT(!lib.IsNull());
|
| + const Class& cls = Class::Handle(
|
| + isolate, lib.LookupClassAllowPrivate(class_name));
|
| + ASSERT(!cls.IsNull());
|
| + return ResolveConstructor(CURRENT_FUNC,
|
| + cls,
|
| + class_name,
|
| + constructor_name,
|
| + num_args);
|
| +}
|
| +
|
| +
|
| +DART_EXPORT Dart_Handle Dart_NewByteBuffer(Dart_Handle typed_data) {
|
| + Isolate* isolate = Isolate::Current();
|
| + DARTSCOPE(isolate);
|
| + intptr_t class_id = Api::ClassId(typed_data);
|
| + if (!RawObject::IsExternalTypedDataClassId(class_id) &&
|
| + !RawObject::IsTypedDataViewClassId(class_id) &&
|
| + !RawObject::IsTypedDataClassId(class_id)) {
|
| + RETURN_TYPE_ERROR(isolate, typed_data, 'TypedData');
|
| + }
|
| + Object& result = Object::Handle(isolate);
|
| + result = GetByteBufferConstructor(isolate,
|
| + Symbols::_ByteBuffer(),
|
| + Symbols::_ByteBufferDot_New(),
|
| + 1);
|
| + ASSERT(!result.IsNull());
|
| + ASSERT(result.IsFunction());
|
| + const Function& factory = Function::Cast(result);
|
| + ASSERT(!factory.IsConstructor());
|
| +
|
| + // Create the argument list.
|
| + const Array& args = Array::Handle(isolate, Array::New(2));
|
| + // Factories get type arguments.
|
| + args.SetAt(0, Object::null_type_arguments());
|
| + const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(typed_data));
|
| + args.SetAt(1, obj);
|
| +
|
| + // Invoke the factory constructor and return the new object.
|
| + result = DartEntry::InvokeFunction(factory, args);
|
| + ASSERT(result.IsInstance() || result.IsNull() || result.IsError());
|
| + return Api::NewHandle(isolate, result.raw());
|
| +}
|
| +
|
| +
|
| DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object,
|
| Dart_TypedData_Type* type,
|
| void** data,
|
| @@ -3356,6 +3421,19 @@
|
| }
|
|
|
|
|
| +DART_EXPORT Dart_Handle Dart_GetDataFromByteBuffer(Dart_Handle object) {
|
| + Isolate* isolate = Isolate::Current();
|
| + CHECK_ISOLATE(isolate);
|
| + intptr_t class_id = Api::ClassId(object);
|
| + if (class_id != kByteBufferCid) {
|
| + RETURN_TYPE_ERROR(isolate, object, 'ByteBuffer');
|
| + }
|
| + const Instance& instance = Api::UnwrapInstanceHandle(isolate, object);
|
| + ASSERT(!instance.IsNull());
|
| + return Api::NewHandle(isolate, ByteBuffer::Data(instance));
|
| +}
|
| +
|
| +
|
| // --- Invoking Constructors, Methods, and Field accessors ---
|
|
|
| static RawObject* ResolveConstructor(const char* current_func,
|
|
|