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'); |
} |