summaryrefslogtreecommitdiffstats
path: root/js/src/vm/ShapeZone.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--js/src/vm/ShapeZone.cpp125
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);
+}