Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(220)

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 12937010: Handle TypedDataView objects in Dart_TypedDataAcquireData and (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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');
}

Powered by Google App Engine
This is Rietveld 408576698