| Index: runtime/vm/dart_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl.cc (revision 20452)
|
| +++ runtime/vm/dart_api_impl.cc (working copy)
|
| @@ -2329,47 +2329,61 @@
|
| static Dart_TypedData_Type GetType(intptr_t class_id) {
|
| Dart_TypedData_Type type;
|
| switch (class_id) {
|
| + case kByteDataViewCid :
|
| + type = kByteData;
|
| + break;
|
| case kTypedDataInt8ArrayCid :
|
| + case kTypedDataInt8ArrayViewCid :
|
| case kExternalTypedDataInt8ArrayCid :
|
| type = kInt8;
|
| break;
|
| case kTypedDataUint8ArrayCid :
|
| + case kTypedDataUint8ArrayViewCid :
|
| case kExternalTypedDataUint8ArrayCid :
|
| type = kUint8;
|
| break;
|
| case kTypedDataUint8ClampedArrayCid :
|
| + case kTypedDataUint8ClampedArrayViewCid :
|
| case kExternalTypedDataUint8ClampedArrayCid :
|
| type = kUint8Clamped;
|
| break;
|
| case kTypedDataInt16ArrayCid :
|
| + case kTypedDataInt16ArrayViewCid :
|
| case kExternalTypedDataInt16ArrayCid :
|
| type = kInt16;
|
| break;
|
| case kTypedDataUint16ArrayCid :
|
| + case kTypedDataUint16ArrayViewCid :
|
| case kExternalTypedDataUint16ArrayCid :
|
| type = kUint16;
|
| break;
|
| case kTypedDataInt32ArrayCid :
|
| + case kTypedDataInt32ArrayViewCid :
|
| case kExternalTypedDataInt32ArrayCid :
|
| type = kInt32;
|
| break;
|
| case kTypedDataUint32ArrayCid :
|
| + case kTypedDataUint32ArrayViewCid :
|
| case kExternalTypedDataUint32ArrayCid :
|
| type = kUint32;
|
| break;
|
| case kTypedDataInt64ArrayCid :
|
| + case kTypedDataInt64ArrayViewCid :
|
| case kExternalTypedDataInt64ArrayCid :
|
| type = kInt64;
|
| break;
|
| case kTypedDataUint64ArrayCid :
|
| + case kTypedDataUint64ArrayViewCid :
|
| case kExternalTypedDataUint64ArrayCid :
|
| type = kUint64;
|
| break;
|
| case kTypedDataFloat32ArrayCid :
|
| + case kTypedDataFloat32ArrayViewCid :
|
| case kExternalTypedDataFloat32ArrayCid :
|
| type = kFloat32;
|
| break;
|
| case kTypedDataFloat64ArrayCid :
|
| + case kTypedDataFloat64ArrayViewCid :
|
| case kExternalTypedDataFloat64ArrayCid :
|
| type = kFloat64;
|
| break;
|
| @@ -2383,18 +2397,10 @@
|
|
|
| DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfTypedData(Dart_Handle object) {
|
| intptr_t class_id = Api::ClassId(object);
|
| - if (RawObject::IsTypedDataClassId(class_id)) {
|
| + if (RawObject::IsTypedDataClassId(class_id) ||
|
| + RawObject::IsTypedDataViewClassId(class_id)) {
|
| return GetType(class_id);
|
| }
|
| - Isolate* isolate = Isolate::Current();
|
| - const Library& lib =
|
| - Library::Handle(isolate->object_store()->typeddata_library());
|
| - const Class& cls =
|
| - Class::Handle(isolate,
|
| - lib.LookupClassAllowPrivate(Symbols::_ByteDataView()));
|
| - if (isolate->class_table()->At(class_id) == cls.raw()) {
|
| - return kByteData;
|
| - }
|
| return kInvalid;
|
| }
|
|
|
| @@ -2402,18 +2408,10 @@
|
| DART_EXPORT Dart_TypedData_Type Dart_GetTypeOfExternalTypedData(
|
| Dart_Handle object) {
|
| intptr_t class_id = Api::ClassId(object);
|
| - if (RawObject::IsExternalTypedDataClassId(class_id)) {
|
| + if (RawObject::IsExternalTypedDataClassId(class_id) ||
|
| + RawObject::IsTypedDataViewClassId(class_id)) {
|
| return GetType(class_id);
|
| }
|
| - Isolate* isolate = Isolate::Current();
|
| - const Library& lib =
|
| - Library::Handle(isolate->object_store()->typeddata_library());
|
| - const Class& cls =
|
| - Class::Handle(isolate,
|
| - lib.LookupClassAllowPrivate(Symbols::_ByteDataView()));
|
| - if (isolate->class_table()->At(class_id) == cls.raw()) {
|
| - return kByteData;
|
| - }
|
| return kInvalid;
|
| }
|
|
|
| @@ -2675,6 +2673,7 @@
|
| DARTSCOPE(isolate);
|
| intptr_t class_id = Api::ClassId(object);
|
| if (!RawObject::IsExternalTypedDataClassId(class_id) &&
|
| + !RawObject::IsTypedDataViewClassId(class_id) &&
|
| !RawObject::IsTypedDataClassId(class_id)) {
|
| RETURN_TYPE_ERROR(isolate, object, 'TypedData');
|
| }
|
| @@ -2695,15 +2694,33 @@
|
| Api::UnwrapExternalTypedDataHandle(isolate, object);
|
| ASSERT(!obj.IsNull());
|
| *len = obj.Length();
|
| - *data = reinterpret_cast<void*>(obj.DataAddr(0));
|
| - } else {
|
| + *data = obj.DataAddr(0);
|
| + } else if (RawObject::IsTypedDataClassId(class_id)) {
|
| // Regular typed data object, set up some GC and API callback guards.
|
| const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, object);
|
| ASSERT(!obj.IsNull());
|
| *len = obj.Length();
|
| isolate->IncrementNoGCScopeDepth();
|
| START_NO_CALLBACK_SCOPE(isolate);
|
| - *data = reinterpret_cast<void*>(obj.DataAddr(0));
|
| + *data = obj.DataAddr(0);
|
| + } else {
|
| + // typed data view object, set up some GC and API callback guards.
|
| + // TODO(asiva): Have to come up with a scheme to directly access
|
| + // the fields using offsets for a more efficient implementation.
|
| + Dart_Handle field_name = Dart_NewStringFromCString("length");
|
| + Dart_Handle field_value = Dart_GetField(object, field_name);
|
| + ASSERT(Api::IsSmi(field_value));
|
| + *len = Api::SmiValue(field_value);
|
| + field_name = Dart_NewStringFromCString("offsetInBytes");
|
| + field_value = Dart_GetField(object, field_name);
|
| + ASSERT(Api::IsSmi(field_value));
|
| + intptr_t offset_in_bytes = Api::SmiValue(field_value);
|
| + field_name = Dart_NewStringFromCString("_typeddata");
|
| + field_value = Dart_GetField(object, field_name);
|
| + const TypedData& obj = Api::UnwrapTypedDataHandle(isolate, field_value);
|
| + isolate->IncrementNoGCScopeDepth();
|
| + START_NO_CALLBACK_SCOPE(isolate);
|
| + *data = obj.DataAddr(offset_in_bytes);
|
| }
|
| return Api::Success(isolate);
|
| }
|
| @@ -2714,6 +2731,7 @@
|
| DARTSCOPE(isolate);
|
| intptr_t class_id = Api::ClassId(object);
|
| if (!RawObject::IsExternalTypedDataClassId(class_id) &&
|
| + !RawObject::IsTypedDataViewClassId(class_id) &&
|
| !RawObject::IsTypedDataClassId(class_id)) {
|
| RETURN_TYPE_ERROR(isolate, object, 'TypedData');
|
| }
|
|
|