Chromium Code Reviews| Index: runtime/vm/become.h |
| diff --git a/runtime/vm/become.h b/runtime/vm/become.h |
| index 977355364628c4bea80a24bbcbd8883a8af5ea7f..109e5880cae021c37811caec4b5ab220e317a294 100644 |
| --- a/runtime/vm/become.h |
| +++ b/runtime/vm/become.h |
| @@ -6,11 +6,66 @@ |
| #define VM_BECOME_H_ |
| #include "vm/allocation.h" |
| +#include "vm/raw_object.h" |
| namespace dart { |
| class Array; |
| +// Objects on the left-hand side of a become are tranformed into forwarding |
| +// corpses pointing to the right-hand side. Compare the representation of a |
|
Cutch
2016/06/02 14:09:53
you talk about "right-hand" side in the comment th
rmacnak
2016/06/02 17:57:06
Changed to
Objects that are a source in a become
|
| +// FreeListElement. |
|
Cutch
2016/06/02 14:09:53
I don't understand the last sentence.
|
| +class ForwardingCorpse { |
| + public: |
| + RawObject* target() const { |
| + return target_; |
| + } |
| + void set_target(RawObject* target) { |
| + target_ = target; |
| + } |
| + |
| + intptr_t Size() { |
| + intptr_t size = RawObject::SizeTag::decode(tags_); |
| + if (size != 0) return size; |
| + return *SizeAddress(); |
| + } |
| + |
| + static ForwardingCorpse* AsForwarder(uword addr, intptr_t size); |
| + |
| + static void InitOnce(); |
| + |
| + // Used to allocate class for free list elements in Object::InitOnce. |
|
siva
2016/06/02 00:23:36
"free list elements" => "forwarding corpse element
rmacnak
2016/06/02 17:57:06
Done.
|
| + class FakeInstance { |
| + public: |
| + FakeInstance() { } |
| + static cpp_vtable vtable() { return 0; } |
| + static intptr_t InstanceSize() { return 0; } |
| + static intptr_t NextFieldOffset() { return -kWordSize; } |
| + static const ClassId kClassId = kForwardingCorpse; |
| + static bool IsInstance() { return true; } |
| + |
| + private: |
| + DISALLOW_ALLOCATION(); |
| + DISALLOW_COPY_AND_ASSIGN(FakeInstance); |
| + }; |
| + |
| + private: |
| + // This layout mirrors the layout of RawObject. |
| + uword tags_; |
| + RawObject* target_; |
|
siva
2016/06/02 00:23:36
Why did you do it this way instead of adding a Raw
rmacnak
2016/06/02 17:57:06
As discussed offline, this follows the precedent o
|
| + |
| + // Returns the address of the embedded size. |
| + intptr_t* SizeAddress() const { |
| + uword addr = reinterpret_cast<uword>(&target_) + kWordSize; |
| + return reinterpret_cast<intptr_t*>(addr); |
| + } |
| + |
| + // ForwardingCorpses cannot be allocated. Instead references to them are |
| + // created using the AsForwarder factory method. |
| + DISALLOW_ALLOCATION(); |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(ForwardingCorpse); |
| +}; |
| + |
| // TODO(johnmccutchan): Refactor this class so that it is not all static and |
| // provides utility methods for building the mapping of before and after. |
| class Become : public AllStatic { |