Commit 527289ad authored by Chris Toshok's avatar Chris Toshok

use a ContiguousMap instead of a stringmap -> HiddenClass

when looking up a child hidden class we look up the attr in the child_index map,
then get the HiddenClass* from the children vector (at that index.)

this speeds up GC substantially by letting us visit the range from the vector as
opposed to iterating through the stringmap.
parent 3428efc2
......@@ -191,6 +191,9 @@ bool GCVisitor::isValid(void* p) {
}
void GCVisitor::visit(void* p) {
if (!p)
return;
if (isNonheapRoot(p)) {
return;
} else {
......
......@@ -474,7 +474,7 @@ HiddenClass* HiddenClass::getOrMakeChild(const std::string& attr) {
auto it = children.find(attr);
if (it != children.end())
return it->second;
return children.getMapped(it->second);
static StatCounter num_hclses("num_hidden_classes");
num_hclses.log();
......
......@@ -22,6 +22,7 @@
#include "structmember.h"
#include "codegen/irgen/future.h"
#include "core/contiguous_map.h"
#include "core/threading.h"
#include "core/types.h"
#include "gc/gc_alloc.h"
......@@ -286,7 +287,7 @@ private:
// Only makes sense for NORMAL hidden classes. Clients should access through getAttrOffsets():
llvm::StringMap<int> attr_offsets;
llvm::StringMap<HiddenClass*> children;
ContiguousMap<llvm::StringRef, HiddenClass*, llvm::StringMap<int>> children;
public:
static HiddenClass* makeRoot() {
......@@ -308,12 +309,9 @@ public:
void gc_visit(GCVisitor* visitor) {
// Visit children even for the dict-backed case, since children will just be empty
for (const auto& p : children) {
visitor->visit(p.second);
}
visitor->visitRange((void* const*)&children.vector()[0], (void* const*)&children.vector()[children.size()]);
}
// Only makes sense for NORMAL hidden classes:
const llvm::StringMap<int>& getAttrOffsets() {
assert(type == NORMAL);
......
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