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

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 13472019: - Create an all static TypedDataView class which uses implicit field offset (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 20947)
+++ runtime/vm/dart_api_impl.cc (working copy)
@@ -2711,23 +2711,25 @@
START_NO_CALLBACK_SCOPE(isolate);
*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);
+ ASSERT(RawObject::IsTypedDataViewClassId(class_id));
+ const Instance& view_obj = Api::UnwrapInstanceHandle(isolate, object);
+ ASSERT(!view_obj.IsNull());
+ Smi& val = Smi::Handle();
+ val ^= TypedDataView::Length(view_obj);
+ *len = val.Value();
+ val ^= TypedDataView::OffsetInBytes(view_obj);
+ intptr_t offset_in_bytes = val.Value();
+ const Instance& obj = Instance::Handle(TypedDataView::Data(view_obj));
isolate->IncrementNoGCScopeDepth();
START_NO_CALLBACK_SCOPE(isolate);
- *data = obj.DataAddr(offset_in_bytes);
+ if (TypedData::IsTypedData(obj)) {
+ const TypedData& data_obj = TypedData::Cast(obj);
+ *data = data_obj.DataAddr(offset_in_bytes);
+ } else {
+ ASSERT(ExternalTypedData::IsExternalTypedData(obj));
+ const ExternalTypedData& data_obj = ExternalTypedData::Cast(obj);
+ *data = data_obj.DataAddr(offset_in_bytes);
+ }
}
return Api::Success(isolate);
}

Powered by Google App Engine
This is Rietveld 408576698