| Index: runtime/vm/object.h
|
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h
|
| index 1cd3816d060a5d0a6342fa937f5fa189c534b7e1..828db0db1b95b7220632a5342e2abb5c7f1fe1bf 100644
|
| --- a/runtime/vm/object.h
|
| +++ b/runtime/vm/object.h
|
| @@ -331,6 +331,11 @@ CLASS_LIST_NO_OBJECT(DEFINE_CLASS_TESTER);
|
| const Script& script,
|
| const Library& lib);
|
|
|
| + static void RegisterPrivateClass(const Class& cls,
|
| + const char* cname,
|
| + const Script& script,
|
| + const Library& lib);
|
| +
|
| static RawError* Init(Isolate* isolate);
|
| static void InitFromSnapshot(Isolate* isolate);
|
| static void InitOnce();
|
| @@ -615,6 +620,9 @@ class Class : public Object {
|
| RawArray* fields() const { return raw_ptr()->fields_; }
|
| void SetFields(const Array& value) const;
|
|
|
| + // Returns true if non-static fields are defined.
|
| + bool HasInstanceFields() const;
|
| +
|
| RawArray* functions() const { return raw_ptr()->functions_; }
|
| void SetFunctions(const Array& value) const;
|
|
|
| @@ -3662,16 +3670,25 @@ class GrowableObjectArray : public Instance {
|
|
|
| class ByteArray : public Instance {
|
| public:
|
| - virtual intptr_t Length() const;
|
| + intptr_t Length() const {
|
| + ASSERT(!IsNull());
|
| + return Smi::Value(raw_ptr()->length_);
|
| + }
|
| +
|
| + static intptr_t length_offset() {
|
| + return OFFSET_OF(RawByteArray, length_);
|
| + }
|
|
|
| - static void Copy(uint8_t* dst,
|
| + virtual intptr_t ByteLength() const;
|
| +
|
| + static void Copy(void* dst,
|
| const ByteArray& src,
|
| intptr_t src_offset,
|
| intptr_t length);
|
|
|
| static void Copy(const ByteArray& dst,
|
| intptr_t dst_offset,
|
| - const uint8_t* src,
|
| + const void* src,
|
| intptr_t length);
|
|
|
| static void Copy(const ByteArray& dst,
|
| @@ -3680,166 +3697,1034 @@ class ByteArray : public Instance {
|
| intptr_t src_offset,
|
| intptr_t length);
|
|
|
| - private:
|
| + protected:
|
| virtual uint8_t* ByteAddr(intptr_t byte_offset) const;
|
|
|
| + template<typename HandleT, typename RawT>
|
| + static RawT* NewImpl(const Class& cls,
|
| + intptr_t len,
|
| + Heap::Space space);
|
| +
|
| + template<typename HandleT, typename RawT, typename ElementT>
|
| + static RawT* NewImpl(const Class& cls,
|
| + const ElementT* data,
|
| + intptr_t len,
|
| + Heap::Space space);
|
| +
|
| + template<typename HandleT, typename RawT, typename ElementT>
|
| + static RawT* NewExternalImpl(const Class& cls,
|
| + ElementT* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space);
|
| +
|
| + template<typename HandleT, typename RawT, typename ElementT>
|
| + static RawT* ReadFromImpl(SnapshotReader* reader,
|
| + intptr_t object_id,
|
| + intptr_t tags,
|
| + Snapshot::Kind kind);
|
| +
|
| + void SetLength(intptr_t value) const {
|
| + raw_ptr()->length_ = Smi::New(value);
|
| + }
|
| +
|
| + private:
|
| HEAP_OBJECT_IMPLEMENTATION(ByteArray, Instance);
|
| friend class Class;
|
| };
|
|
|
|
|
| -class InternalByteArray : public ByteArray {
|
| +class Int8Array : public ByteArray {
|
| public:
|
| - intptr_t Length() const {
|
| - ASSERT(!IsNull());
|
| - return Smi::Value(raw_ptr()->length_);
|
| + intptr_t ByteLength() const {
|
| + return Length();
|
| }
|
|
|
| - static intptr_t length_offset() {
|
| - return OFFSET_OF(RawInternalByteArray, length_);
|
| + int8_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int8_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| }
|
|
|
| static intptr_t data_offset() {
|
| return length_offset() + kWordSize;
|
| }
|
|
|
| - template<typename T>
|
| - T At(intptr_t byte_offset) const {
|
| - T* addr = Addr<T>(byte_offset);
|
| - ASSERT(Utils::IsAligned(reinterpret_cast<intptr_t>(addr), sizeof(T)));
|
| - return *addr;
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawInt8Array) == OFFSET_OF(RawInt8Array, data_));
|
| + return 0;
|
| }
|
|
|
| - template<typename T>
|
| - void SetAt(intptr_t byte_offset, T value) const {
|
| - T* addr = Addr<T>(byte_offset);
|
| - ASSERT(Utils::IsAligned(reinterpret_cast<intptr_t>(addr), sizeof(T)));
|
| - *addr = value;
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + return RoundedAllocationSize(sizeof(RawInt8Array) + len);
|
| }
|
|
|
| - template<typename T>
|
| - T UnalignedAt(intptr_t byte_offset) const {
|
| - T result;
|
| - memmove(&result, Addr<T>(byte_offset), sizeof(T));
|
| - return result;
|
| + static RawInt8Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawInt8Array* New(const int8_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| }
|
|
|
| - template<typename T>
|
| - void SetUnalignedAt(intptr_t byte_offset, T value) const {
|
| - memmove(Addr<T>(byte_offset), &value, sizeof(T));
|
| + HEAP_OBJECT_IMPLEMENTATION(Int8Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Uint8Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length();
|
| + }
|
| +
|
| + uint8_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, uint8_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| }
|
|
|
| static intptr_t InstanceSize() {
|
| - ASSERT(sizeof(RawInternalByteArray) ==
|
| - OFFSET_OF_RETURNED_VALUE(RawInternalByteArray, data));
|
| + ASSERT(sizeof(RawUint8Array) == OFFSET_OF(RawUint8Array, data_));
|
| return 0;
|
| }
|
|
|
| static intptr_t InstanceSize(intptr_t len) {
|
| - return RoundedAllocationSize(sizeof(RawInternalByteArray) + len);
|
| + return RoundedAllocationSize(sizeof(RawUint8Array) + len);
|
| }
|
|
|
| - static RawInternalByteArray* New(intptr_t len,
|
| - Heap::Space space = Heap::kNew);
|
| - static RawInternalByteArray* New(const uint8_t* data,
|
| - intptr_t len,
|
| - Heap::Space space = Heap::kNew);
|
| + static RawUint8Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawUint8Array* New(const uint8_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
|
|
| private:
|
| uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| - return Addr<uint8_t>(byte_offset);
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| }
|
|
|
| - template<typename T>
|
| - T* Addr(intptr_t byte_offset) const {
|
| - intptr_t limit = byte_offset + sizeof(T);
|
| - // TODO(iposva): Determine if we should throw an exception here.
|
| - ASSERT((byte_offset >= 0) && (limit <= Length()));
|
| - uint8_t* addr = &raw_ptr()->data()[byte_offset];
|
| - return reinterpret_cast<T*>(addr);
|
| + HEAP_OBJECT_IMPLEMENTATION(Uint8Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Int16Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| }
|
|
|
| - void SetLength(intptr_t value) const {
|
| - raw_ptr()->length_ = Smi::New(value);
|
| + int16_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int16_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawInt16Array) == OFFSET_OF(RawInt16Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawInt16Array) + data_size);
|
| + }
|
| +
|
| + static RawInt16Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawInt16Array* New(const int16_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 2;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| }
|
|
|
| - HEAP_OBJECT_IMPLEMENTATION(InternalByteArray, ByteArray);
|
| + HEAP_OBJECT_IMPLEMENTATION(Int16Array, ByteArray);
|
| + friend class ByteArray;
|
| friend class Class;
|
| };
|
|
|
|
|
| -class ExternalByteArray : public ByteArray {
|
| +class Uint16Array : public ByteArray {
|
| public:
|
| - intptr_t Length() const {
|
| - ASSERT(!IsNull());
|
| - return Smi::Value(raw_ptr()->length_);
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| }
|
|
|
| - void* GetPeer() const {
|
| - return raw_ptr()->external_data_->peer();
|
| + uint16_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| }
|
|
|
| - template<typename T>
|
| - T At(intptr_t byte_offset) const {
|
| - T* addr = Addr<T>(byte_offset);
|
| - ASSERT(Utils::IsAligned(reinterpret_cast<intptr_t>(addr), sizeof(T)));
|
| - return *addr;
|
| + void SetAt(intptr_t index, uint16_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| }
|
|
|
| - template<typename T>
|
| - void SetAt(intptr_t byte_offset, T value) const {
|
| - T* addr = Addr<T>(byte_offset);
|
| - ASSERT(Utils::IsAligned(reinterpret_cast<intptr_t>(addr), sizeof(T)));
|
| - *addr = value;
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| }
|
|
|
| - template<typename T>
|
| - T UnalignedAt(intptr_t byte_offset) const {
|
| - T result;
|
| - memmove(&result, Addr<T>(byte_offset), sizeof(T));
|
| - return result;
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawUint16Array) == OFFSET_OF(RawUint16Array, data_));
|
| + return 0;
|
| }
|
|
|
| - template<typename T>
|
| - void SetUnalignedAt(intptr_t byte_offset, T value) const {
|
| - memmove(Addr<T>(byte_offset), &value, sizeof(T));
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawUint16Array) + data_size);
|
| + }
|
| +
|
| + static RawUint16Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawUint16Array* New(const uint16_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 2;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Uint16Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Int32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int32_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int32_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| }
|
|
|
| static intptr_t InstanceSize() {
|
| - return RoundedAllocationSize(sizeof(RawExternalByteArray));
|
| + ASSERT(sizeof(RawInt32Array) == OFFSET_OF(RawInt32Array, data_));
|
| + return 0;
|
| }
|
|
|
| - static RawExternalByteArray* New(uint8_t* data,
|
| - intptr_t len,
|
| - void* peer,
|
| - Dart_PeerFinalizer callback,
|
| - Heap::Space space = Heap::kNew);
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawInt32Array) + data_size);
|
| + }
|
| +
|
| + static RawInt32Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawInt32Array* New(const int32_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
|
|
| private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| - return Addr<uint8_t>(byte_offset);
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| }
|
|
|
| - template<typename T>
|
| - T* Addr(intptr_t byte_offset) const {
|
| - intptr_t limit = byte_offset + sizeof(T);
|
| - // TODO(iposva): Determine if we should throw an exception here.
|
| - ASSERT((byte_offset >= 0) && (limit <= Length()));
|
| - uint8_t* addr = &raw_ptr()->external_data_->data()[byte_offset];
|
| - return reinterpret_cast<T*>(addr);
|
| + HEAP_OBJECT_IMPLEMENTATION(Int32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Uint32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| }
|
|
|
| - void SetLength(intptr_t value) const {
|
| - raw_ptr()->length_ = Smi::New(value);
|
| + uint32_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| }
|
|
|
| - void SetExternalData(ExternalByteArrayData* data) const {
|
| - raw_ptr()->external_data_ = data;
|
| + void SetAt(intptr_t index, uint32_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| }
|
|
|
| - static void Finalize(Dart_Handle handle, void* peer);
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawUint32Array) == OFFSET_OF(RawUint32Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawUint32Array) + data_size);
|
| + }
|
| +
|
| + static RawUint32Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawUint32Array* New(const uint32_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Uint32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Int64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int64_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int64_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawInt64Array) == OFFSET_OF(RawInt64Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawInt64Array) + data_size);
|
| + }
|
| +
|
| + static RawInt64Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawInt64Array* New(const int64_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Int64Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Uint64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * sizeof(uint64_t);
|
| + }
|
| +
|
| + uint64_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, uint64_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawUint64Array) == OFFSET_OF(RawUint64Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawUint64Array) + data_size);
|
| + }
|
| +
|
| + static RawUint64Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawUint64Array* New(const uint64_t* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Uint64Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Float32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + float At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, float value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawFloat32Array) == OFFSET_OF(RawFloat32Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawFloat32Array) + data_size);
|
| + }
|
| +
|
| + static RawFloat32Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawFloat32Array* New(const float* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Float32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class Float64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + double At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->data_[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, double value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->data_[index] = value;
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + ASSERT(sizeof(RawFloat64Array) == OFFSET_OF(RawFloat64Array, data_));
|
| + return 0;
|
| + }
|
| +
|
| + static intptr_t data_offset() {
|
| + return length_offset() + kWordSize;
|
| + }
|
| +
|
| + static intptr_t InstanceSize(intptr_t len) {
|
| + intptr_t data_size = len * kBytesPerElement;
|
| + return RoundedAllocationSize(sizeof(RawFloat64Array) + data_size);
|
| + }
|
| +
|
| + static RawFloat64Array* New(intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| + static RawFloat64Array* New(const double* data,
|
| + intptr_t len,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + return reinterpret_cast<uint8_t*>(&raw_ptr()->data_) + byte_offset;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(Float64Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalInt8Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int8_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int8_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalInt8Array));
|
| + }
|
| +
|
| + static RawExternalInt8Array* New(int8_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 1;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<int8_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalInt8Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalUint8Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + uint8_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, uint8_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalUint8Array));
|
| + }
|
| +
|
| + static RawExternalUint8Array* New(uint8_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 1;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<uint8_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalUint8Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalInt16Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int16_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int16_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalInt16Array));
|
| + }
|
| +
|
| + static RawExternalInt16Array* New(int16_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 2;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<int16_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalInt16Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalUint16Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int16_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int16_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalUint16Array));
|
| + }
|
| +
|
| + static RawExternalUint16Array* New(uint16_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 2;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<uint16_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalUint16Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalInt32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int32_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int32_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalInt32Array));
|
| + }
|
| +
|
| + static RawExternalInt32Array* New(int32_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<int32_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalInt32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalUint32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int32_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int32_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalUint32Array));
|
| + }
|
| +
|
| + static RawExternalUint32Array* New(uint32_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<uint32_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalUint32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalInt64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int64_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int64_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalInt64Array));
|
| + }
|
| +
|
| + static RawExternalInt64Array* New(int64_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<int64_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalInt64Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalUint64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + int64_t At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, int64_t value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalUint64Array));
|
| + }
|
| +
|
| + static RawExternalUint64Array* New(uint64_t* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<uint64_t>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalUint64Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalFloat32Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + float At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, float value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalFloat32Array));
|
| + }
|
| +
|
| + static RawExternalFloat32Array* New(float* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 4;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<float>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
| +
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32Array, ByteArray);
|
| + friend class ByteArray;
|
| + friend class Class;
|
| +};
|
| +
|
| +
|
| +class ExternalFloat64Array : public ByteArray {
|
| + public:
|
| + intptr_t ByteLength() const {
|
| + return Length() * kBytesPerElement;
|
| + }
|
| +
|
| + double At(intptr_t index) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + return raw_ptr()->external_data_->data()[index];
|
| + }
|
| +
|
| + void SetAt(intptr_t index, double value) const {
|
| + ASSERT((index >= 0) && (index < Length()));
|
| + raw_ptr()->external_data_->data()[index] = value;
|
| + }
|
| +
|
| + void* GetPeer() const {
|
| + return raw_ptr()->external_data_->peer();
|
| + }
|
| +
|
| + static intptr_t InstanceSize() {
|
| + return RoundedAllocationSize(sizeof(RawExternalFloat64Array));
|
| + }
|
| +
|
| + static RawExternalFloat64Array* New(double* data,
|
| + intptr_t len,
|
| + void* peer,
|
| + Dart_PeerFinalizer callback,
|
| + Heap::Space space = Heap::kNew);
|
| +
|
| + private:
|
| + static const intptr_t kBytesPerElement = 8;
|
| +
|
| + uint8_t* ByteAddr(intptr_t byte_offset) const {
|
| + ASSERT((byte_offset >= 0) && (byte_offset < ByteLength()));
|
| + uint8_t* data =
|
| + reinterpret_cast<uint8_t*>(raw_ptr()->external_data_->data());
|
| + return data + byte_offset;
|
| + }
|
| +
|
| + void SetExternalData(ExternalByteArrayData<double>* data) {
|
| + raw_ptr()->external_data_ = data;
|
| + }
|
|
|
| - HEAP_OBJECT_IMPLEMENTATION(ExternalByteArray, ByteArray);
|
| + HEAP_OBJECT_IMPLEMENTATION(ExternalFloat64Array, ByteArray);
|
| + friend class ByteArray;
|
| friend class Class;
|
| };
|
|
|
|
|