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

Unified Diff: runtime/vm/object.cc

Issue 12544015: Implement 'dart:typeddata' directly in the VM instead of using 'dart:scalarlist' (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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 19652)
+++ runtime/vm/object.cc (working copy)
@@ -854,117 +854,68 @@
// Pre-register the scalarlist library so the native class implementations
// can be hooked up before compiling it.
LOAD_LIBRARY(Scalarlist, scalarlist);
+ ASSERT(!lib.IsNull());
+ ASSERT(lib.raw() == Library::ScalarlistLibrary());
+#define REGISTER_SCALARLIST_CLASS(name, object_store_name) \
+ cls = Class::New<name>(); \
+ object_store->set_##object_store_name##_class(cls); \
+ RegisterPrivateClass(cls, Symbols::_##name(), lib); \
- Library& scalarlist_lib = Library::Handle(Library::ScalarlistLibrary());
- ASSERT(!scalarlist_lib.IsNull());
+ REGISTER_SCALARLIST_CLASS(Float32x4, float32x4);
+ REGISTER_SCALARLIST_CLASS(Uint32x4, uint32x4);
+ REGISTER_SCALARLIST_CLASS(Int8Array, int8_array);
+ REGISTER_SCALARLIST_CLASS(Uint8Array, uint8_array);
+ REGISTER_SCALARLIST_CLASS(Uint8ClampedArray, uint8_clamped_array);
+ REGISTER_SCALARLIST_CLASS(Int16Array, int16_array);
+ REGISTER_SCALARLIST_CLASS(Uint16Array, uint16_array);
+ REGISTER_SCALARLIST_CLASS(Int32Array, int32_array);
+ REGISTER_SCALARLIST_CLASS(Uint32Array, uint32_array);
+ REGISTER_SCALARLIST_CLASS(Int64Array, int64_array);
+ REGISTER_SCALARLIST_CLASS(Uint64Array, uint64_array);
+ REGISTER_SCALARLIST_CLASS(Float32x4Array, float32x4_array);
+ REGISTER_SCALARLIST_CLASS(Float32Array, float32_array);
+ REGISTER_SCALARLIST_CLASS(Float64Array, float64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt8Array, external_int8_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint8Array, external_uint8_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint8ClampedArray,
+ external_uint8_clamped_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt16Array, external_int16_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint16Array, external_uint16_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt32Array, external_int32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint32Array, external_uint32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt64Array, external_int64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint64Array, external_uint64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat32x4Array, external_float32x4_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat32Array, external_float32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat64Array, external_float64_array);
+#undef REGISTER_SCALARLIST_CLASS
- cls = Class::New<Float32x4>();
- object_store->set_float32x4_class(cls);
- RegisterPrivateClass(cls, Symbols::_Float32x4(), scalarlist_lib);
+ // Pre-register the typeddata library so the native class implementations
+ // can be hooked up before compiling it.
+ LOAD_LIBRARY(TypedData, typeddata);
+ ASSERT(!lib.IsNull());
+ ASSERT(lib.raw() == Library::TypedDataLibrary());
+ Array& typeddata_classes =
+ Array::Handle(Array::New(RawObject::NumberOfTypedDataClasses()));
+ int index = 0;
+#define REGISTER_TYPED_DATA_CLASS(clazz) \
+ cls = Class::NewTypedDataClass(kTypedData##clazz##Cid); \
+ index = kTypedData##clazz##Cid - kTypedDataInt8ArrayCid; \
+ typeddata_classes.SetAt(index, cls); \
+ RegisterPrivateClass(cls, Symbols::_##clazz(), lib); \
- cls = Class::New<Uint32x4>();
- object_store->set_uint32x4_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint32x4(), scalarlist_lib);
+ CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS);
+#undef REGISTER_TYPED_DATA_CLASS
+#define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \
+ cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid); \
+ index = kExternalTypedData##clazz##Cid - kTypedDataInt8ArrayCid; \
+ typeddata_classes.SetAt(index, cls); \
+ RegisterPrivateClass(cls, Symbols::_External##clazz(), lib); \
- cls = Class::New<Int8Array>();
- object_store->set_int8_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Int8Array(), scalarlist_lib);
+ CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
+#undef REGISTER_EXT_TYPED_DATA_CLASS
+ object_store->set_typeddata_classes(typeddata_classes);
- cls = Class::New<Uint8Array>();
- object_store->set_uint8_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint8Array(), scalarlist_lib);
-
- cls = Class::New<Uint8ClampedArray>();
- object_store->set_uint8_clamped_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint8ClampedArray(), scalarlist_lib);
-
- cls = Class::New<Int16Array>();
- object_store->set_int16_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Int16Array(), scalarlist_lib);
-
- cls = Class::New<Uint16Array>();
- object_store->set_uint16_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint16Array(), scalarlist_lib);
-
- cls = Class::New<Int32Array>();
- object_store->set_int32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Int32Array(), scalarlist_lib);
-
- cls = Class::New<Uint32Array>();
- object_store->set_uint32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint32Array(), scalarlist_lib);
-
- cls = Class::New<Int64Array>();
- object_store->set_int64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Int64Array(), scalarlist_lib);
-
- cls = Class::New<Uint64Array>();
- object_store->set_uint64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Uint64Array(), scalarlist_lib);
-
- cls = Class::New<Float32x4Array>();
- object_store->set_float32x4_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Float32x4Array(), scalarlist_lib);
-
- cls = Class::New<Float32Array>();
- object_store->set_float32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Float32Array(), scalarlist_lib);
-
- cls = Class::New<Float64Array>();
- object_store->set_float64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_Float64Array(), scalarlist_lib);
-
- cls = Class::New<ExternalInt8Array>();
- object_store->set_external_int8_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalInt8Array(), scalarlist_lib);
-
- cls = Class::New<ExternalUint8Array>();
- object_store->set_external_uint8_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalUint8Array(), scalarlist_lib);
-
- cls = Class::New<ExternalUint8ClampedArray>();
- object_store->set_external_uint8_clamped_array_class(cls);
- RegisterPrivateClass(cls,
- Symbols::_ExternalUint8ClampedArray(),
- scalarlist_lib);
-
- cls = Class::New<ExternalInt16Array>();
- object_store->set_external_int16_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalInt16Array(), scalarlist_lib);
-
- cls = Class::New<ExternalUint16Array>();
- object_store->set_external_uint16_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalUint16Array(), scalarlist_lib);
-
- cls = Class::New<ExternalInt32Array>();
- object_store->set_external_int32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalInt32Array(), scalarlist_lib);
-
- cls = Class::New<ExternalUint32Array>();
- object_store->set_external_uint32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalUint32Array(), scalarlist_lib);
-
- cls = Class::New<ExternalInt64Array>();
- object_store->set_external_int64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalInt64Array(), scalarlist_lib);
-
- cls = Class::New<ExternalUint64Array>();
- object_store->set_external_uint64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalUint64Array(), scalarlist_lib);
-
- cls = Class::New<ExternalFloat32x4Array>();
- object_store->set_external_float32x4_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalFloat32x4Array(),
- scalarlist_lib);
-
- cls = Class::New<ExternalFloat32Array>();
- object_store->set_external_float32_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalFloat32Array(), scalarlist_lib);
-
- cls = Class::New<ExternalFloat64Array>();
- object_store->set_external_float64_array_class(cls);
- RegisterPrivateClass(cls, Symbols::_ExternalFloat64Array(), scalarlist_lib);
-
// Set the super type of class Stacktrace to Object type so that the
// 'toString' method is implemented.
cls = object_store->stacktrace_class();
@@ -1108,84 +1059,48 @@
cls = Class::New<GrowableObjectArray>();
object_store->set_growable_object_array_class(cls);
- cls = Class::New<Float32x4>();
- object_store->set_float32x4_class(cls);
+#define REGISTER_SCALARLIST_CLASS(name, object_store_name) \
+ cls = Class::New<name>(); \
+ object_store->set_##object_store_name##_class(cls); \
- cls = Class::New<Uint32x4>();
- object_store->set_uint32x4_class(cls);
+ REGISTER_SCALARLIST_CLASS(Float32x4, float32x4);
+ REGISTER_SCALARLIST_CLASS(Uint32x4, uint32x4);
+ REGISTER_SCALARLIST_CLASS(Int8Array, int8_array);
+ REGISTER_SCALARLIST_CLASS(Uint8Array, uint8_array);
+ REGISTER_SCALARLIST_CLASS(Uint8ClampedArray, uint8_clamped_array);
+ REGISTER_SCALARLIST_CLASS(Int16Array, int16_array);
+ REGISTER_SCALARLIST_CLASS(Uint16Array, uint16_array);
+ REGISTER_SCALARLIST_CLASS(Int32Array, int32_array);
+ REGISTER_SCALARLIST_CLASS(Uint32Array, uint32_array);
+ REGISTER_SCALARLIST_CLASS(Int64Array, int64_array);
+ REGISTER_SCALARLIST_CLASS(Uint64Array, uint64_array);
+ REGISTER_SCALARLIST_CLASS(Float32x4Array, float32x4_array);
+ REGISTER_SCALARLIST_CLASS(Float32Array, float32_array);
+ REGISTER_SCALARLIST_CLASS(Float64Array, float64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt8Array, external_int8_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint8Array, external_uint8_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint8ClampedArray,
+ external_uint8_clamped_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt16Array, external_int16_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint16Array, external_uint16_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt32Array, external_int32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint32Array, external_uint32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalInt64Array, external_int64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalUint64Array, external_uint64_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat32x4Array, external_float32x4_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat32Array, external_float32_array);
+ REGISTER_SCALARLIST_CLASS(ExternalFloat64Array, external_float64_array);
+#undef REGISTER_SCALARLIST_CLASS
- cls = Class::New<Int8Array>();
- object_store->set_int8_array_class(cls);
+#define REGISTER_TYPED_DATA_CLASS(clazz) \
+ cls = Class::NewTypedDataClass(kTypedData##clazz##Cid);
+ CLASS_LIST_TYPED_DATA(REGISTER_TYPED_DATA_CLASS);
+#undef REGISTER_TYPED_DATA_CLASS
+#define REGISTER_EXT_TYPED_DATA_CLASS(clazz) \
+ cls = Class::NewExternalTypedDataClass(kExternalTypedData##clazz##Cid);
+ CLASS_LIST_TYPED_DATA(REGISTER_EXT_TYPED_DATA_CLASS);
+#undef REGISTER_EXT_TYPED_DATA_CLASS
- cls = Class::New<Uint8Array>();
- object_store->set_uint8_array_class(cls);
-
- cls = Class::New<Uint8ClampedArray>();
- object_store->set_uint8_clamped_array_class(cls);
-
- cls = Class::New<Int16Array>();
- object_store->set_int16_array_class(cls);
-
- cls = Class::New<Uint16Array>();
- object_store->set_uint16_array_class(cls);
-
- cls = Class::New<Int32Array>();
- object_store->set_int32_array_class(cls);
-
- cls = Class::New<Uint32Array>();
- object_store->set_uint32_array_class(cls);
-
- cls = Class::New<Int64Array>();
- object_store->set_int64_array_class(cls);
-
- cls = Class::New<Uint64Array>();
- object_store->set_uint64_array_class(cls);
-
- cls = Class::New<Float32x4Array>();
- object_store->set_float32x4_array_class(cls);
-
- cls = Class::New<Float32Array>();
- object_store->set_float32_array_class(cls);
-
- cls = Class::New<Float64Array>();
- object_store->set_float64_array_class(cls);
-
- cls = Class::New<ExternalInt8Array>();
- object_store->set_external_int8_array_class(cls);
-
- cls = Class::New<ExternalUint8Array>();
- object_store->set_external_uint8_array_class(cls);
-
- cls = Class::New<ExternalUint8ClampedArray>();
- object_store->set_external_uint8_clamped_array_class(cls);
-
- cls = Class::New<ExternalInt16Array>();
- object_store->set_external_int16_array_class(cls);
-
- cls = Class::New<ExternalUint16Array>();
- object_store->set_external_uint16_array_class(cls);
-
- cls = Class::New<ExternalInt32Array>();
- object_store->set_external_int32_array_class(cls);
-
- cls = Class::New<ExternalUint32Array>();
- object_store->set_external_uint32_array_class(cls);
-
- cls = Class::New<ExternalInt64Array>();
- object_store->set_external_int64_array_class(cls);
-
- cls = Class::New<ExternalUint64Array>();
- object_store->set_external_uint64_array_class(cls);
-
- cls = Class::New<ExternalFloat32x4Array>();
- object_store->set_external_float32x4_array_class(cls);
-
- cls = Class::New<ExternalFloat32Array>();
- object_store->set_external_float32_array_class(cls);
-
- cls = Class::New<ExternalFloat64Array>();
- object_store->set_external_float64_array_class(cls);
-
cls = Class::New<Integer>();
object_store->set_integer_implementation_class(cls);
@@ -2011,6 +1926,28 @@
}
+RawClass* Class::NewTypedDataClass(intptr_t class_id) {
+ ASSERT(RawObject::IsTypedDataClassId(class_id));
+ intptr_t instance_size = TypedData::InstanceSize();
+ Class& result = Class::Handle(New<TypedData>(class_id));
+ result.set_instance_size(instance_size);
+ result.set_next_field_offset(instance_size);
+ result.set_is_prefinalized();
+ return result.raw();
+}
+
+
+RawClass* Class::NewExternalTypedDataClass(intptr_t class_id) {
+ ASSERT(RawObject::IsExternalTypedDataClassId(class_id));
+ intptr_t instance_size = ExternalTypedData::InstanceSize();
+ Class& result = Class::Handle(New<ExternalTypedData>(class_id));
+ result.set_instance_size(instance_size);
+ result.set_next_field_offset(instance_size);
+ result.set_is_prefinalized();
+ return result.raw();
+}
+
+
void Class::set_name(const String& value) const {
ASSERT(value.IsSymbol());
StorePointer(&raw_ptr()->name_, value.raw());
@@ -12417,6 +12354,81 @@
}
+const intptr_t TypedData::element_size[] = {
+ 1, // kTypedDataInt8ArrayCid.
+ 1, // kTypedDataUint8ArrayCid.
+ 1, // kTypedDataUint8ClampedArrayCid.
+ 2, // kTypedDataInt16ArrayCid.
+ 2, // kTypedDataUint16ArrayCid.
+ 4, // kTypedDataInt32ArrayCid.
+ 4, // kTypedDataUint32ArrayCid.
+ 8, // kTypedDataInt64ArrayCid.
+ 8, // kTypedDataUint64ArrayCid.
+ 4, // kTypedDataFloat32ArrayCid.
+ 8, // kTypedDataFloat64ArrayCid.
+};
+
+
+RawTypedData* TypedData::New(intptr_t class_id,
+ intptr_t len,
+ Heap::Space space) {
+ // TODO(asiva): Add a check for maximum elements.
+ TypedData& result = TypedData::Handle();
+ {
+ // The len field has already been checked by the caller, we only assert
+ // here that it is within a valid range.
+ ASSERT((len >= 0) &&
+ (len < (kSmiMax / TypedData::ElementSizeInBytes(class_id))));
+ intptr_t lengthInBytes = len * ElementSizeInBytes(class_id);
+ RawObject* raw = Object::Allocate(class_id,
+ TypedData::InstanceSize(lengthInBytes),
+ space);
+ NoGCScope no_gc;
+ result ^= raw;
+ result.SetLength(len);
+ if (len > 0) {
+ memset(result.DataAddr(0), 0, lengthInBytes);
+ }
+ }
+ return result.raw();
+}
+
+
+const char* TypedData::ToCString() const {
+ return "TypedData";
+}
+
+
+FinalizablePersistentHandle* ExternalTypedData::AddFinalizer(
+ void* peer, Dart_WeakPersistentHandleFinalizer callback) const {
+ SetPeer(peer);
+ return dart::AddFinalizer(*this, peer, callback);
+}
+
+
+RawExternalTypedData* ExternalTypedData::New(intptr_t class_id,
+ uint8_t* data,
+ intptr_t len,
+ Heap::Space space) {
+ ExternalTypedData& result = ExternalTypedData::Handle();
+ {
+ RawObject* raw = Object::Allocate(class_id,
+ ExternalTypedData::InstanceSize(),
+ space);
+ NoGCScope no_gc;
+ result ^= raw;
+ result.SetLength(len);
+ result.SetData(data);
+ }
+ return result.raw();
+}
+
+
+const char* ExternalTypedData::ToCString() const {
+ return "ExternalTypedData";
+}
+
+
void ByteArray::Copy(void* dst,
const ByteArray& src,
intptr_t src_offset,
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698