Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef VM_BECOME_H_ | 5 #ifndef VM_BECOME_H_ |
| 6 #define VM_BECOME_H_ | 6 #define VM_BECOME_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/raw_object.h" | |
| 9 | 10 |
| 10 namespace dart { | 11 namespace dart { |
| 11 | 12 |
| 12 class Array; | 13 class Array; |
| 13 | 14 |
| 15 // Objects on the left-hand side of a become are tranformed into forwarding | |
| 16 // 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
| |
| 17 // FreeListElement. | |
|
Cutch
2016/06/02 14:09:53
I don't understand the last sentence.
| |
| 18 class ForwardingCorpse { | |
| 19 public: | |
| 20 RawObject* target() const { | |
| 21 return target_; | |
| 22 } | |
| 23 void set_target(RawObject* target) { | |
| 24 target_ = target; | |
| 25 } | |
| 26 | |
| 27 intptr_t Size() { | |
| 28 intptr_t size = RawObject::SizeTag::decode(tags_); | |
| 29 if (size != 0) return size; | |
| 30 return *SizeAddress(); | |
| 31 } | |
| 32 | |
| 33 static ForwardingCorpse* AsForwarder(uword addr, intptr_t size); | |
| 34 | |
| 35 static void InitOnce(); | |
| 36 | |
| 37 // 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.
| |
| 38 class FakeInstance { | |
| 39 public: | |
| 40 FakeInstance() { } | |
| 41 static cpp_vtable vtable() { return 0; } | |
| 42 static intptr_t InstanceSize() { return 0; } | |
| 43 static intptr_t NextFieldOffset() { return -kWordSize; } | |
| 44 static const ClassId kClassId = kForwardingCorpse; | |
| 45 static bool IsInstance() { return true; } | |
| 46 | |
| 47 private: | |
| 48 DISALLOW_ALLOCATION(); | |
| 49 DISALLOW_COPY_AND_ASSIGN(FakeInstance); | |
| 50 }; | |
| 51 | |
| 52 private: | |
| 53 // This layout mirrors the layout of RawObject. | |
| 54 uword tags_; | |
| 55 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
| |
| 56 | |
| 57 // Returns the address of the embedded size. | |
| 58 intptr_t* SizeAddress() const { | |
| 59 uword addr = reinterpret_cast<uword>(&target_) + kWordSize; | |
| 60 return reinterpret_cast<intptr_t*>(addr); | |
| 61 } | |
| 62 | |
| 63 // ForwardingCorpses cannot be allocated. Instead references to them are | |
| 64 // created using the AsForwarder factory method. | |
| 65 DISALLOW_ALLOCATION(); | |
| 66 DISALLOW_IMPLICIT_CONSTRUCTORS(ForwardingCorpse); | |
| 67 }; | |
| 68 | |
| 14 // TODO(johnmccutchan): Refactor this class so that it is not all static and | 69 // TODO(johnmccutchan): Refactor this class so that it is not all static and |
| 15 // provides utility methods for building the mapping of before and after. | 70 // provides utility methods for building the mapping of before and after. |
| 16 class Become : public AllStatic { | 71 class Become : public AllStatic { |
| 17 public: | 72 public: |
| 18 // Smalltalk's one-way bulk become (Array>>#elementsForwardIdentityTo:). | 73 // Smalltalk's one-way bulk become (Array>>#elementsForwardIdentityTo:). |
| 19 // Redirects all pointers to elements of 'before' to the corresponding element | 74 // Redirects all pointers to elements of 'before' to the corresponding element |
| 20 // in 'after'. Every element in 'before' is guaranteed to be not reachable. | 75 // in 'after'. Every element in 'before' is guaranteed to be not reachable. |
| 21 // Useful for atomically applying behavior and schema changes. | 76 // Useful for atomically applying behavior and schema changes. |
| 22 static void ElementsForwardIdentity(const Array& before, const Array& after); | 77 static void ElementsForwardIdentity(const Array& before, const Array& after); |
| 23 }; | 78 }; |
| 24 | 79 |
| 25 } // namespace dart | 80 } // namespace dart |
| 26 | 81 |
| 27 #endif // VM_BECOME_H_ | 82 #endif // VM_BECOME_H_ |
| OLD | NEW |