Chromium Code Reviews| Index: runtime/vm/object.h |
| diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
| index 612a80b0b66b581dcdde0b5ec7a6e42abc434aac..bbf5cae2075136ebc991333fe7cf65fcfda7128c 100644 |
| --- a/runtime/vm/object.h |
| +++ b/runtime/vm/object.h |
| @@ -413,6 +413,11 @@ class Object { |
| return *zero_array_; |
| } |
| + static const ObjectPool& empty_object_pool() { |
| + ASSERT(empty_object_pool_ != NULL); |
| + return *empty_object_pool_; |
| + } |
| + |
| static const PcDescriptors& empty_descriptors() { |
| ASSERT(empty_descriptors_ != NULL); |
| return *empty_descriptors_; |
| @@ -510,6 +515,7 @@ class Object { |
| static RawClass* namespace_class() { return namespace_class_; } |
| static RawClass* code_class() { return code_class_; } |
| static RawClass* instructions_class() { return instructions_class_; } |
| + static RawClass* object_pool_class() { return object_pool_class_; } |
| static RawClass* pc_descriptors_class() { return pc_descriptors_class_; } |
| static RawClass* stackmap_class() { return stackmap_class_; } |
| static RawClass* var_descriptors_class() { return var_descriptors_class_; } |
| @@ -768,6 +774,7 @@ class Object { |
| static RawClass* namespace_class_; // Class of Namespace vm object. |
| static RawClass* code_class_; // Class of the Code vm object. |
| static RawClass* instructions_class_; // Class of the Instructions vm object. |
| + static RawClass* object_pool_class_; // Class of the ObjectPool vm object. |
| static RawClass* pc_descriptors_class_; // Class of PcDescriptors vm object. |
| static RawClass* stackmap_class_; // Class of Stackmap vm object. |
| static RawClass* var_descriptors_class_; // Class of LocalVarDescriptors. |
| @@ -792,6 +799,7 @@ class Object { |
| static TypeArguments* null_type_arguments_; |
| static Array* empty_array_; |
| static Array* zero_array_; |
| + static ObjectPool* empty_object_pool_; |
| static PcDescriptors* empty_descriptors_; |
| static LocalVarDescriptors* empty_var_descriptors_; |
| static ExceptionHandlers* empty_exception_handlers_; |
| @@ -3495,6 +3503,105 @@ class Namespace : public Object { |
| }; |
| +class ObjectPool : public Object { |
|
srdjan
2015/06/09 21:49:47
Add a brief comment above.
Florian Schneider
2015/06/10 08:26:17
Done.
|
| + public: |
| + enum EntryType { |
| + kTaggedObject, |
| + kImmediate, |
| + }; |
| + |
| + struct Entry { |
| + Entry() : raw_value_(), type_() { } |
| + explicit Entry(const Object* obj) : obj_(obj), type_(kTaggedObject) { } |
| + Entry(uword value, EntryType info) : raw_value_(value), type_(info) { } |
| + union { |
| + const Object* obj_; |
| + uword raw_value_; |
| + }; |
| + EntryType type_; |
| + }; |
| + |
| + intptr_t Length() const { |
| + return raw_ptr()->length_; |
| + } |
| + void SetLength(intptr_t value) const { |
| + StoreNonPointer(&raw_ptr()->length_, value); |
| + } |
| + |
| + RawTypedData* info_array() const { |
| + return raw_ptr()->info_array_; |
| + } |
| + |
| + void set_info_array(const TypedData& info_array) const; |
| + |
| + static intptr_t length_offset() { return OFFSET_OF(RawObjectPool, length_); } |
| + static intptr_t data_offset() { |
| + return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data); |
| + } |
| + static intptr_t element_offset(intptr_t index) { |
| + return OFFSET_OF_RETURNED_VALUE(RawObjectPool, data) |
| + + kBytesPerElement * index; |
| + } |
| + |
| + EntryType InfoAt(intptr_t index) const; |
| + void SetInfoAt(intptr_t index, EntryType info) const; |
| + |
| + RawObject* ObjectAt(intptr_t index) const { |
| + ASSERT(InfoAt(index) == kTaggedObject); |
| + return EntryAddr(index)->raw_obj_; |
| + } |
| + void SetObjectAt(intptr_t index, const Object& obj) const { |
| + ASSERT(InfoAt(index) == kTaggedObject); |
| + StorePointer(&EntryAddr(index)->raw_obj_, obj.raw()); |
| + } |
| + |
| + uword RawValueAt(intptr_t index) const { |
| + ASSERT(InfoAt(index) != kTaggedObject); |
| + return EntryAddr(index)->raw_value_; |
| + } |
| + void SetRawValueAt(intptr_t index, uword raw_value) const { |
| + ASSERT(InfoAt(index) != kTaggedObject); |
| + StoreNonPointer(&EntryAddr(index)->raw_value_, raw_value); |
| + } |
| + |
| + static intptr_t InstanceSize() { |
| + ASSERT(sizeof(RawObjectPool) == |
| + OFFSET_OF_RETURNED_VALUE(RawObjectPool, data)); |
| + return 0; |
| + } |
| + |
| + static const intptr_t kBytesPerElement = sizeof(RawObjectPool::Entry); |
| + static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; |
| + |
| + static intptr_t InstanceSize(intptr_t len) { |
| + // Ensure that variable length data is not adding to the object length. |
| + ASSERT(sizeof(RawObjectPool) == (sizeof(RawObject) + (2 * kWordSize))); |
| + ASSERT(0 <= len && len <= kMaxElements); |
| + return RoundedAllocationSize( |
| + sizeof(RawObjectPool) + (len * kBytesPerElement)); |
| + } |
| + |
| + static RawObjectPool* New(intptr_t len); |
| + |
| + static intptr_t IndexFromOffset(intptr_t offset) { |
| + return (offset + kHeapObjectTag - data_offset()) / kBytesPerElement; |
| + } |
| + |
| + void DebugPrint() const; |
| + |
| + private: |
| + RawObjectPool::Entry const* EntryAddr(intptr_t index) const { |
| + ASSERT((index >= 0) && (index < Length())); |
| + return &raw_ptr()->data()[index]; |
| + } |
| + |
| + FINAL_HEAP_OBJECT_IMPLEMENTATION(ObjectPool, Object); |
| + friend class Class; |
| + friend class Object; |
| + friend class RawObjectPool; |
| +}; |
| + |
| + |
| class Instructions : public Object { |
| public: |
| intptr_t size() const { return raw_ptr()->size_; } // Excludes HeaderSize(). |
| @@ -3502,7 +3609,7 @@ class Instructions : public Object { |
| static intptr_t code_offset() { |
| return OFFSET_OF(RawInstructions, code_); |
| } |
| - RawArray* object_pool() const { return raw_ptr()->object_pool_; } |
| + RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; } |
| static intptr_t object_pool_offset() { |
| return OFFSET_OF(RawInstructions, object_pool_); |
| } |
| @@ -3547,7 +3654,7 @@ class Instructions : public Object { |
| void set_code(RawCode* code) const { |
| StorePointer(&raw_ptr()->code_, code); |
| } |
| - void set_object_pool(RawArray* object_pool) const { |
| + void set_object_pool(RawObjectPool* object_pool) const { |
| StorePointer(&raw_ptr()->object_pool_, object_pool); |
| } |
| @@ -3899,7 +4006,7 @@ class Code : public Object { |
| const Instructions& instr = Instructions::Handle(instructions()); |
| return instr.size(); |
| } |
| - RawArray* ObjectPool() const { |
| + RawObjectPool* GetObjectPool() const { |
| const Instructions& instr = Instructions::Handle(instructions()); |
| return instr.object_pool(); |
| } |