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

Unified Diff: runtime/vm/object.h

Issue 8429027: Add an external array type to support typed arrays. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Make loads and stores byte relative Created 9 years, 1 month 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 d5e8434356f4ab5049afcb8106f22f4c46fd7f69..5ae0ee4606bf58b8559f51e6f9f48abd87a26ade 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2783,6 +2783,68 @@ class ImmutableArray : public Array {
};
+class ByteBuffer : public Instance {
+ public:
+ intptr_t Length() const {
+ ASSERT(!IsNull());
+ return Smi::Value(raw_ptr()->length_);
+ }
+
+ template<typename T>
+ T At(intptr_t byte_offset) const {
+ ASSERT(Utils::IsAligned(byte_offset, sizeof(T)));
+ return *Addr<T>(byte_offset);
+ }
+ template<typename T>
+ void SetAt(intptr_t byte_offset, T value) const {
+ ASSERT(Utils::IsAligned(byte_offset, sizeof(T)));
+ *Addr<T>(byte_offset) = 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));
+ }
+
+ virtual bool Equals(const Instance& other) const;
+
+ static intptr_t InstanceSize() {
+ return RoundedAllocationSize(sizeof(RawByteBuffer));
+ }
+
+ static RawByteBuffer* New(uint8_t* data,
+ 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);
+ }
+
+ void SetData(uint8_t* data) const {
+ raw_ptr()->data_ = data;
+ }
+
+ HEAP_OBJECT_IMPLEMENTATION(ByteBuffer, Instance);
+ friend class Class;
+};
+
+
class Closure : public Instance {
public:
RawFunction* function() const { return raw_ptr()->function_; }

Powered by Google App Engine
This is Rietveld 408576698