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

Unified Diff: runtime/vm/raw_object.h

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.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 {

Powered by Google App Engine
This is Rietveld 408576698