Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 20344) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -2333,46 +2333,57 @@ |
| 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; |
| @@ -2386,7 +2397,8 @@ |
| 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 kInvalid; |
| } |
| return GetType(class_id); |
| @@ -2582,6 +2594,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'); |
| } |
| @@ -2602,15 +2615,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. |
|
Ivan Posva
2013/03/22 04:50:01
How about making class _TypedListView known to the
siva
2013/03/25 17:20:35
I thought about this but for now choose against ad
|
| + 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); |
| } |
| @@ -2621,6 +2652,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'); |
| } |