Chromium Code Reviews| Index: runtime/vm/object.cc |
| =================================================================== |
| --- runtime/vm/object.cc (revision 19594) |
| +++ 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,77 @@ |
| } |
| +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(); |
| + { |
| + intptr_t lengthInBytes = len * ElementSizeInBytes(class_id); |
|
Ivan Posva
2013/03/07 08:53:31
How are we assuring this multiplication does not o
siva
2013/03/07 21:47:43
The native code in typeddata.c has a lengthCheck a
|
| + 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, |