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

Unified Diff: runtime/vm/object.h

Issue 9195031: Add ByteArray interface and provide internal and external implementations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: fewer templates Created 8 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
Index: runtime/vm/object.h
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 908fa31126a7888f0aa56d774836839a1a3c97b3..e46a620472548bac204de7c169a2ac9fd49975f6 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -3242,19 +3242,38 @@ class ImmutableArray : public Array {
};
-class ByteBuffer : public Instance {
+class ByteArray : public Instance {
+ public:
+ virtual intptr_t Length() const;
+
+ private:
+ HEAP_OBJECT_IMPLEMENTATION(ByteArray, Instance);
+ friend class Class;
+};
+
+
+class InternalByteArray : public ByteArray {
public:
intptr_t Length() const {
ASSERT(!IsNull());
return Smi::Value(raw_ptr()->length_);
}
+ static intptr_t length_offset() {
+ return OFFSET_OF(RawInternalByteArray, length_);
+ }
+
+ 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;
}
+
template<typename T>
void SetAt(intptr_t byte_offset, T value) const {
T* addr = Addr<T>(byte_offset);
@@ -3268,20 +3287,87 @@ class ByteBuffer : public Instance {
memmove(&result, Addr<T>(byte_offset), sizeof(T));
return result;
}
+
template<typename T>
void SetUnalignedAt(intptr_t byte_offset, T value) const {
memmove(Addr<T>(byte_offset), &value, sizeof(T));
}
- virtual bool Equals(const Instance& other) const;
+ static intptr_t InstanceSize() {
+ ASSERT(sizeof(RawInternalByteArray) ==
+ OFFSET_OF_RETURNED_VALUE(RawInternalByteArray, data));
+ return 0;
+ }
+
+ static intptr_t InstanceSize(intptr_t len) {
+ return RoundedAllocationSize(sizeof(RawInternalByteArray) + len);
+ }
+
+ static RawInternalByteArray* New(intptr_t len,
+ Heap::Space space = Heap::kNew);
+ static RawInternalByteArray* New(const uint8_t* characters,
Ivan Posva 2012/01/25 23:49:57 characters?
cshapiro 2012/01/26 02:25:42 Well, they are characters in the C sense. That is
+ intptr_t len,
+ Heap::Space space = Heap::kNew);
+
+ private:
+ 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);
+ }
+
+ void SetLength(intptr_t value) {
+ raw_ptr()->length_ = Smi::New(value);
+ }
+
+ HEAP_OBJECT_IMPLEMENTATION(InternalByteArray, ByteArray);
+ friend class Class;
+};
+
+
+class ExternalByteArray : public ByteArray {
+ public:
+ intptr_t Length() const {
+ ASSERT(!IsNull());
+ return Smi::Value(raw_ptr()->length_);
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ template<typename T>
+ T UnalignedAt(intptr_t byte_offset) const {
+ T result;
+ memmove(&result, Addr<T>(byte_offset), sizeof(T));
+ return result;
+ }
+
+ template<typename T>
+ void SetUnalignedAt(intptr_t byte_offset, T value) const {
+ memmove(Addr<T>(byte_offset), &value, sizeof(T));
+ }
static intptr_t InstanceSize() {
- return RoundedAllocationSize(sizeof(RawByteBuffer));
+ return RoundedAllocationSize(sizeof(RawExternalByteArray));
}
- static RawByteBuffer* New(uint8_t* data,
- intptr_t len,
- Heap::Space space = Heap::kNew);
+ static RawExternalByteArray* New(uint8_t* data,
+ intptr_t len,
+ Heap::Space space = Heap::kNew);
private:
template<typename T>
@@ -3301,7 +3387,7 @@ class ByteBuffer : public Instance {
raw_ptr()->data_ = data;
}
- HEAP_OBJECT_IMPLEMENTATION(ByteBuffer, Instance);
+ HEAP_OBJECT_IMPLEMENTATION(ExternalByteArray, ByteArray);
friend class Class;
};

Powered by Google App Engine
This is Rietveld 408576698