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

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: wrap another native, tweak whitespace 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 a38364bece56598f1e624f31892308d68220e8ac..493b29b39907d8409880967fc7404360ba808ec0 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2794,6 +2794,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)));
Ivan Posva 2011/11/16 22:50:01 Shouldn't this check for (base_address + byte_offs
cshapiro 2011/11/17 03:17:02 It depends on whether the base address will ever b
+ return *Addr<T>(byte_offset);
+ }
+ template<typename T>
+ void SetAt(intptr_t byte_offset, T value) const {
+ ASSERT(Utils::IsAligned(byte_offset, sizeof(T)));
Ivan Posva 2011/11/16 22:50:01 ditto
cshapiro 2011/11/17 03:17:02 Done.
+ *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