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

Unified Diff: runtime/vm/raw_object.cc

Issue 2908353002: Nonvirtual pointer visitor in GCs (Closed)
Patch Set: Separated user-defined classes case so it can be inlined Created 3 years, 7 months 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/raw_object.cc
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 66fee3e09bd9dfc9d908e6f1470415df55d6b873..edbe107a46d23d83c71b9ace3b0924e431970e1d 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -219,73 +219,68 @@ intptr_t RawObject::SizeFromClass() const {
}
-intptr_t RawObject::VisitPointers(ObjectPointerVisitor* visitor) {
+intptr_t RawObject::VisitPointersPredefined(ObjectPointerVisitor* visitor,
+ intptr_t class_id) {
+ ASSERT(class_id < kNumPredefinedCids);
+
intptr_t size = 0;
// Only reasonable to be called on heap objects.
ASSERT(IsHeapObject());
- // Read the necessary data out of the class before visting the class itself.
- intptr_t class_id = GetClassId();
-
- if (class_id < kNumPredefinedCids) {
- switch (class_id) {
+ switch (class_id) {
#define RAW_VISITPOINTERS(clazz) \
case k##clazz##Cid: { \
Raw##clazz* raw_obj = reinterpret_cast<Raw##clazz*>(this); \
size = Raw##clazz::Visit##clazz##Pointers(raw_obj, visitor); \
break; \
}
- CLASS_LIST_NO_OBJECT(RAW_VISITPOINTERS)
+ CLASS_LIST_NO_OBJECT(RAW_VISITPOINTERS)
#undef RAW_VISITPOINTERS
#define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##Cid:
- CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
- RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(this);
- size = RawTypedData::VisitTypedDataPointers(raw_obj, visitor);
- break;
- }
+ CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
+ RawTypedData* raw_obj = reinterpret_cast<RawTypedData*>(this);
+ size = RawTypedData::VisitTypedDataPointers(raw_obj, visitor);
+ break;
+ }
#undef RAW_VISITPOINTERS
#define RAW_VISITPOINTERS(clazz) case kExternalTypedData##clazz##Cid:
- CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
- RawExternalTypedData* raw_obj =
- reinterpret_cast<RawExternalTypedData*>(this);
- size = RawExternalTypedData::VisitExternalTypedDataPointers(raw_obj,
- visitor);
- break;
- }
+ CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS) {
+ RawExternalTypedData* raw_obj =
+ reinterpret_cast<RawExternalTypedData*>(this);
+ size = RawExternalTypedData::VisitExternalTypedDataPointers(raw_obj,
+ visitor);
+ break;
+ }
#undef RAW_VISITPOINTERS
#define RAW_VISITPOINTERS(clazz) case kTypedData##clazz##ViewCid:
- CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS)
- case kByteDataViewCid:
- case kByteBufferCid: {
- RawInstance* raw_obj = reinterpret_cast<RawInstance*>(this);
- size = RawInstance::VisitInstancePointers(raw_obj, visitor);
- break;
- }
+ CLASS_LIST_TYPED_DATA(RAW_VISITPOINTERS)
+ case kByteDataViewCid:
+ case kByteBufferCid: {
+ RawInstance* raw_obj = reinterpret_cast<RawInstance*>(this);
+ size = RawInstance::VisitInstancePointers(raw_obj, visitor);
+ break;
+ }
#undef RAW_VISITPOINTERS
- case kFreeListElement: {
- uword addr = RawObject::ToAddr(this);
- FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
- size = element->Size();
- break;
- }
- case kForwardingCorpse: {
- uword addr = RawObject::ToAddr(this);
- ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
- size = forwarder->Size();
- break;
- }
- case kNullCid:
- size = Size();
- break;
- default:
- OS::Print("Class Id: %" Pd "\n", class_id);
- UNREACHABLE();
- break;
+ case kFreeListElement: {
+ uword addr = RawObject::ToAddr(this);
+ FreeListElement* element = reinterpret_cast<FreeListElement*>(addr);
+ size = element->Size();
+ break;
}
- } else {
- RawInstance* raw_obj = reinterpret_cast<RawInstance*>(this);
- size = RawInstance::VisitInstancePointers(raw_obj, visitor);
+ case kForwardingCorpse: {
+ uword addr = RawObject::ToAddr(this);
+ ForwardingCorpse* forwarder = reinterpret_cast<ForwardingCorpse*>(addr);
+ size = forwarder->Size();
+ break;
+ }
+ case kNullCid:
+ size = Size();
+ break;
+ default:
+ OS::Print("Class Id: %" Pd "\n", class_id);
+ UNREACHABLE();
+ break;
}
ASSERT(size != 0);

Powered by Google App Engine
This is Rietveld 408576698