Chromium Code Reviews| Index: runtime/vm/raw_object.h |
| diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h |
| index 488739cfbf2f115848aa9a7b095500405043f7be..2d557b5110886e8987e9dfdd3e800ae9a516834a 100644 |
| --- a/runtime/vm/raw_object.h |
| +++ b/runtime/vm/raw_object.h |
| @@ -453,9 +453,49 @@ class RawObject { |
| } |
| void Validate(Isolate* isolate) const; |
| - intptr_t VisitPointers(ObjectPointerVisitor* visitor); |
| bool FindObject(FindObjectVisitor* visitor); |
| + intptr_t VisitPointers(ObjectPointerVisitor* visitor) { |
|
erikcorry
2017/05/31 10:40:42
I think instead of duplicating the code you can ju
|
| + // Fall back to virtual variant for predefined classes |
| + intptr_t class_id = GetClassId(); |
| + if (class_id < kNumPredefinedCids) { |
| + return VisitPointersPredefined(visitor, class_id); |
| + } |
| + |
| + // Calculate the first and last raw object pointer fields. |
| + intptr_t instance_size = Size(); |
| + uword obj_addr = ToAddr(this); |
| + uword from = obj_addr + sizeof(RawObject); |
| + uword to = obj_addr + instance_size - kWordSize; |
| + |
| + // Call visitor function non-virtually |
| + visitor->VisitPointers(reinterpret_cast<RawObject**>(from), |
| + reinterpret_cast<RawObject**>(to)); |
| + |
| + return instance_size; |
| + } |
| + |
| + template <class V> |
|
erikcorry
2017/05/31 10:40:42
template <class V, bool call_virtually = false>
T
|
| + intptr_t VisitPointersNonvirtual(V* visitor) { |
|
erikcorry
2017/05/31 10:40:42
Perhaps it should be called VisitPointersTemplatiz
|
| + // Fall back to virtual variant for predefined classes |
| + intptr_t class_id = GetClassId(); |
| + if (class_id < kNumPredefinedCids) { |
| + return VisitPointersPredefined(visitor, class_id); |
| + } |
| + |
| + // Calculate the first and last raw object pointer fields. |
| + intptr_t instance_size = Size(); |
| + uword obj_addr = ToAddr(this); |
| + uword from = obj_addr + sizeof(RawObject); |
| + uword to = obj_addr + instance_size - kWordSize; |
| + |
| + // Call visitor function non-virtually |
| + visitor->V::VisitPointers(reinterpret_cast<RawObject**>(from), |
| + reinterpret_cast<RawObject**>(to)); |
| + |
| + return instance_size; |
| + } |
| + |
| static RawObject* FromAddr(uword addr) { |
| // We expect the untagged address here. |
| ASSERT((addr & kSmiTagMask) != kHeapObjectTag); |
| @@ -513,6 +553,9 @@ class RawObject { |
| kHeapObjectTag); |
| } |
| + intptr_t VisitPointersPredefined(ObjectPointerVisitor* visitor, |
| + intptr_t class_id); |
| + |
| intptr_t SizeFromClass() const; |
| intptr_t GetClassId() const { |