StructureChain.cpp [plain text]
#include "config.h"
#include "StructureChain.h"
#include "JSCInlines.h"
namespace JSC {
const ClassInfo StructureChain::s_info = { "StructureChain", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(StructureChain) };
StructureChain::StructureChain(VM& vm, Structure* structure, StructureID* vector)
: Base(vm, structure)
, m_vector(vm, this, vector)
{
}
StructureChain* StructureChain::create(VM& vm, JSObject* head)
{
size_t size = 0;
for (JSObject* current = head; current; current = current->structure(vm)->storedPrototypeObject(current))
++size;
++size; size_t bytes = (Checked<size_t>(size) * sizeof(StructureID)).unsafeGet();
StructureID* vector = static_cast<StructureID*>(vm.jsValueGigacageAuxiliarySpace.allocateNonVirtual(vm, bytes, nullptr, AllocationFailureMode::Assert));
memset(vector, 0, bytes);
StructureChain* chain = new (NotNull, allocateCell<StructureChain>(vm.heap)) StructureChain(vm, vm.structureChainStructure.get(), vector);
chain->finishCreation(vm, head);
return chain;
}
void StructureChain::finishCreation(VM& vm, JSObject* head)
{
Base::finishCreation(vm);
size_t i = 0;
for (JSObject* current = head; current; current = current->structure(vm)->storedPrototypeObject(current)) {
Structure* structure = current->structure(vm);
m_vector.get()[i++] = structure->id();
vm.heap.writeBarrier(this);
}
}
void StructureChain::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
StructureChain* thisObject = jsCast<StructureChain*>(cell);
ASSERT_GC_OBJECT_INHERITS(thisObject, info());
Base::visitChildren(thisObject, visitor);
visitor.markAuxiliary(thisObject->m_vector.get());
VM& vm = visitor.vm();
for (auto* current = thisObject->m_vector.get(); *current; ++current) {
StructureID structureID = *current;
Structure* structure = vm.getStructure(structureID);
visitor.appendUnbarriered(structure);
}
}
}