diff options
Diffstat (limited to '')
-rw-r--r-- | js/src/vm/ShapeZone.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/js/src/vm/ShapeZone.cpp b/js/src/vm/ShapeZone.cpp new file mode 100644 index 0000000000..760fde2e69 --- /dev/null +++ b/js/src/vm/ShapeZone.cpp @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* JS symbol tables. */ + +#include "vm/ShapeZone.h" + +#include "gc/Marking-inl.h" +#include "vm/Shape-inl.h" + +using namespace js; + +void ShapeZone::fixupPropMapShapeTableAfterMovingGC() { + for (PropMapShapeSet::Enum e(propMapShapes); !e.empty(); e.popFront()) { + SharedShape* shape = MaybeForwarded(e.front().unbarrieredGet()); + SharedPropMap* map = shape->propMapMaybeForwarded(); + BaseShape* base = MaybeForwarded(shape->base()); + + PropMapShapeSet::Lookup lookup(base, shape->numFixedSlots(), map, + shape->propMapLength(), + shape->objectFlags()); + e.rekeyFront(lookup, shape); + } +} + +#ifdef JSGC_HASH_TABLE_CHECKS +void ShapeZone::checkTablesAfterMovingGC() { + // Assert that the moving GC worked and that nothing is left in the tables + // that points into the nursery, and that the hash table entries are + // discoverable. + + for (auto r = initialPropMaps.all(); !r.empty(); r.popFront()) { + SharedPropMap* map = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(map); + + InitialPropMapHasher::Lookup lookup(map->getKey(0), + map->getPropertyInfo(0)); + InitialPropMapSet::Ptr ptr = initialPropMaps.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } + + for (auto r = baseShapes.all(); !r.empty(); r.popFront()) { + BaseShape* base = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(base); + + BaseShapeHasher::Lookup lookup(base->clasp(), base->realm(), base->proto()); + BaseShapeSet::Ptr ptr = baseShapes.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } + + for (auto r = initialShapes.all(); !r.empty(); r.popFront()) { + SharedShape* shape = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(shape); + + using Lookup = InitialShapeHasher::Lookup; + Lookup lookup(shape->getObjectClass(), shape->realm(), shape->proto(), + shape->numFixedSlots(), shape->objectFlags()); + InitialShapeSet::Ptr ptr = initialShapes.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } + + for (auto r = propMapShapes.all(); !r.empty(); r.popFront()) { + SharedShape* shape = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(shape); + + using Lookup = PropMapShapeHasher::Lookup; + Lookup lookup(shape->base(), shape->numFixedSlots(), shape->propMap(), + shape->propMapLength(), shape->objectFlags()); + PropMapShapeSet::Ptr ptr = propMapShapes.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } + + for (auto r = proxyShapes.all(); !r.empty(); r.popFront()) { + ProxyShape* shape = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(shape); + + using Lookup = ProxyShapeHasher::Lookup; + Lookup lookup(shape->getObjectClass(), shape->realm(), shape->proto(), + shape->objectFlags()); + ProxyShapeSet::Ptr ptr = proxyShapes.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } + + for (auto r = wasmGCShapes.all(); !r.empty(); r.popFront()) { + WasmGCShape* shape = r.front().unbarrieredGet(); + CheckGCThingAfterMovingGC(shape); + + using Lookup = WasmGCShapeHasher::Lookup; + Lookup lookup(shape->getObjectClass(), shape->realm(), shape->proto(), + shape->recGroup(), shape->objectFlags()); + WasmGCShapeSet::Ptr ptr = wasmGCShapes.lookup(lookup); + MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front()); + } +} +#endif // JSGC_HASH_TABLE_CHECKS + +ShapeZone::ShapeZone(Zone* zone) + : baseShapes(zone), + initialPropMaps(zone), + initialShapes(zone), + propMapShapes(zone), + proxyShapes(zone), + wasmGCShapes(zone) {} + +void ShapeZone::purgeShapeCaches(JS::GCContext* gcx) { + for (Shape* shape : shapesWithCache) { + MaybeForwarded(shape)->purgeCache(gcx); + } + shapesWithCache.clearAndFree(); +} + +void ShapeZone::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, + size_t* initialPropMapTable, + size_t* shapeTables) { + *shapeTables += baseShapes.sizeOfExcludingThis(mallocSizeOf); + *initialPropMapTable += initialPropMaps.sizeOfExcludingThis(mallocSizeOf); + *shapeTables += initialShapes.sizeOfExcludingThis(mallocSizeOf); + *shapeTables += propMapShapes.sizeOfExcludingThis(mallocSizeOf); + *shapeTables += proxyShapes.sizeOfExcludingThis(mallocSizeOf); + *shapeTables += wasmGCShapes.sizeOfExcludingThis(mallocSizeOf); + *shapeTables += shapesWithCache.sizeOfExcludingThis(mallocSizeOf); +} |