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

Unified Diff: runtime/vm/object.h

Issue 12093071: - Change the layout of external typed array objects to avoid the extra indirection when accessing e… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 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/intrinsifier_x64.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.h
===================================================================
--- runtime/vm/object.h (revision 17875)
+++ runtime/vm/object.h (working copy)
@@ -30,6 +30,7 @@
class Closure;
class Code;
class DeoptInstr;
+class FinalizablePersistentHandle;
class LocalScope;
class Symbols;
@@ -1895,7 +1896,7 @@
void SetPrivateKey(const String& value) const;
static RawTokenStream* New();
- static void DataFinalizer(void *peer);
+ static void DataFinalizer(Dart_Handle handle, void *peer);
FINAL_HEAP_OBJECT_IMPLEMENTATION(TokenStream, Object);
friend class Class;
@@ -4750,6 +4751,11 @@
virtual intptr_t ByteLength() const;
+ virtual void* GetPeer() const { return NULL; }
+
+ FinalizablePersistentHandle* AddFinalizer(
+ void* peer, Dart_WeakPersistentHandleFinalizer callback) const;
+
static void Copy(void* dst,
const ByteArray& src,
intptr_t src_offset,
@@ -4768,6 +4774,7 @@
protected:
virtual uint8_t* ByteAddr(intptr_t byte_offset) const;
+ virtual void SetPeer(void* peer) const { }
template<typename HandleT, typename RawT>
static RawT* NewImpl(intptr_t class_id,
@@ -4784,8 +4791,6 @@
static RawT* NewExternalImpl(intptr_t class_id,
ElementT* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space);
template<typename HandleT, typename RawT, typename ElementT>
@@ -5385,20 +5390,20 @@
int8_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int8_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ int8_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 1;
@@ -5411,24 +5416,29 @@
return RoundedAllocationSize(sizeof(RawExternalInt8Array));
}
+ static intptr_t data_offset() {
+ return OFFSET_OF(RawExternalInt8Array, data_);
+ }
+
static RawExternalInt8Array* New(int8_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<int8_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(int8_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt8Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5443,20 +5453,20 @@
uint8_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, uint8_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ uint8_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 1;
@@ -5469,28 +5479,30 @@
return RoundedAllocationSize(sizeof(RawExternalUint8Array));
}
- static intptr_t external_data_offset() {
- return OFFSET_OF(RawExternalUint8Array, external_data_);
+ static intptr_t data_offset() {
+ return OFFSET_OF(RawExternalUint8Array, data_);
}
static RawExternalUint8Array* New(uint8_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<uint8_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(uint8_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
HEAP_OBJECT_IMPLEMENTATION(ExternalUint8Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5502,8 +5514,6 @@
public:
static RawExternalUint8ClampedArray* New(uint8_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
@@ -5521,20 +5531,20 @@
int16_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int16_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ int16_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 2;
@@ -5549,22 +5559,23 @@
static RawExternalInt16Array* New(int16_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<int16_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(int16_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt16Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5579,20 +5590,20 @@
int16_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int16_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ uint16_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 2;
@@ -5607,22 +5618,23 @@
static RawExternalUint16Array* New(uint16_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<uint16_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(uint16_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint16Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5637,20 +5649,20 @@
int32_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int32_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ int32_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 4;
@@ -5665,22 +5677,23 @@
static RawExternalInt32Array* New(int32_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<int32_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(int32_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt32Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5695,20 +5708,20 @@
int32_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int32_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ uint32_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 4;
@@ -5723,22 +5736,23 @@
static RawExternalUint32Array* New(uint32_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<uint32_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(uint32_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint32Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5753,20 +5767,20 @@
int64_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int64_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ int64_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 8;
@@ -5781,22 +5795,23 @@
static RawExternalInt64Array* New(int64_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<int64_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(int64_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalInt64Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5811,20 +5826,20 @@
int64_t At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, int64_t value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ uint64_t* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 8;
@@ -5839,22 +5854,23 @@
static RawExternalUint64Array* New(uint64_t* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<uint64_t>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(uint64_t* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalUint64Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5869,20 +5885,20 @@
float At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, float value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ float* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 4;
@@ -5897,22 +5913,23 @@
static RawExternalFloat32Array* New(float* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<float>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(float* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat32Array, ByteArray);
friend class ByteArray;
friend class Class;
@@ -5927,20 +5944,20 @@
double At(intptr_t index) const {
ASSERT((index >= 0) && (index < Length()));
- return raw_ptr()->external_data_->data()[index];
+ return raw_ptr()->data_[index];
}
void SetAt(intptr_t index, double value) const {
ASSERT((index >= 0) && (index < Length()));
- raw_ptr()->external_data_->data()[index] = value;
+ raw_ptr()->data_[index] = value;
}
- void* GetData() const {
- return raw_ptr()->external_data_->data();
+ double* GetData() const {
+ return raw_ptr()->data_;
}
void* GetPeer() const {
- return raw_ptr()->external_data_->peer();
+ return raw_ptr()->peer_;
}
static const intptr_t kBytesPerElement = 8;
@@ -5955,22 +5972,23 @@
static RawExternalFloat64Array* New(double* data,
intptr_t len,
- void* peer,
- Dart_PeerFinalizer callback,
Heap::Space space = Heap::kNew);
private:
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());
+ uint8_t* data = reinterpret_cast<uint8_t*>(raw_ptr()->data_);
return data + byte_offset;
}
- void SetExternalData(ExternalByteArrayData<double>* data) {
- raw_ptr()->external_data_ = data;
+ void SetData(double* data) const {
+ raw_ptr()->data_ = data;
}
+ void SetPeer(void* peer) const {
+ raw_ptr()->peer_ = peer;
+ }
+
FINAL_HEAP_OBJECT_IMPLEMENTATION(ExternalFloat64Array, ByteArray);
friend class ByteArray;
friend class Class;
« no previous file with comments | « runtime/vm/intrinsifier_x64.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698