Commit 592f854c authored by Rudi Chen's avatar Rudi Chen

Redundantly visit some fields of hidden classes that weren't visited.

parent ee5286c1
...@@ -68,6 +68,7 @@ class GCVisitorNoRedundancy : public GCVisitor { ...@@ -68,6 +68,7 @@ class GCVisitorNoRedundancy : public GCVisitor {
virtual void visitRangeRedundant(void* const* start, void* const* end) { visitRange(start, end); } virtual void visitRangeRedundant(void* const* start, void* const* end) { visitRange(start, end); }
virtual void visitPotentialRedundant(void* p) { visitPotential(p); } virtual void visitPotentialRedundant(void* p) { visitPotential(p); }
virtual void visitPotentialRangeRedundant(void* const* start, void* const* end) { visitPotentialRange(start, end); } virtual void visitPotentialRangeRedundant(void* const* start, void* const* end) { visitPotentialRange(start, end); }
virtual bool shouldVisitRedundants() { return true; }
}; };
} }
} }
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
// Files outside of the gc/ folder should only import gc.h or gc_alloc.h // Files outside of the gc/ folder should only import gc.h or gc_alloc.h
// which are the "public" memory management interface. // which are the "public" memory management interface.
// Some code is only useful towards an effort to implement a
// moving gc, gate behind this flag for now.
#define MOVING_GC 0
#define GC_KEEP_ALIVE(t) asm volatile("" : : "X"(t)) #define GC_KEEP_ALIVE(t) asm volatile("" : : "X"(t))
#define TRACE_GC_MARKING 0 #define TRACE_GC_MARKING 0
......
...@@ -32,13 +32,23 @@ void HiddenClass::gc_visit(GCVisitor* visitor) { ...@@ -32,13 +32,23 @@ void HiddenClass::gc_visit(GCVisitor* visitor) {
visitor->visitRange((void* const*)&children.vector()[0], (void* const*)&children.vector()[children.size()]); visitor->visitRange((void* const*)&children.vector()[0], (void* const*)&children.vector()[children.size()]);
visitor->visit(attrwrapper_child); visitor->visit(attrwrapper_child);
// We don't need to visit the keys of the 'children' map, since the children should have those as entries if (children.empty()) {
// in the attr_offssets map.
// Also, if we have any children, we can skip scanning our attr_offsets map, since it will be a subset
// of our child's map.
if (children.empty())
for (auto p : attr_offsets) for (auto p : attr_offsets)
visitor->visit(p.first); visitor->visit(p.first);
} else {
#if MOVING_GC
// If we have any children, the attr_offsets map will be a subset of the child's map.
for (const auto& p : attr_offsets)
visitor->visitRedundant(p.first);
#endif
}
#if MOVING_GC
// The children should have the entries of the keys of the 'children' map in the attr_offsets map.
for (const auto& p : children) {
visitor->visitRedundant(p.first);
}
#endif
} }
void HiddenClass::appendAttribute(BoxedString* attr) { void HiddenClass::appendAttribute(BoxedString* attr) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment