diff options
author | 2023-07-18 04:34:27 -0700 | |
---|---|---|
committer | 2023-07-18 04:35:04 -0700 | |
commit | 777ee4ececebe912a08c1ffe69546aacb6a497c7 (patch) | |
tree | 53a15abae027e3bf5cfdedc70744ce543d7f21f6 | |
parent | 661355546a4658ea927bfd70698577c1db301243 (diff) | |
download | bun-777ee4ececebe912a08c1ffe69546aacb6a497c7.tar.gz bun-777ee4ececebe912a08c1ffe69546aacb6a497c7.tar.zst bun-777ee4ececebe912a08c1ffe69546aacb6a497c7.zip |
Fixes #3669
-rw-r--r-- | src/bun.js/bindings/ScriptExecutionContext.cpp | 15 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 26 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.h | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/Worker.cpp | 5 |
4 files changed, 35 insertions, 13 deletions
diff --git a/src/bun.js/bindings/ScriptExecutionContext.cpp b/src/bun.js/bindings/ScriptExecutionContext.cpp index b7b7ef16d..f878fd9fb 100644 --- a/src/bun.js/bindings/ScriptExecutionContext.cpp +++ b/src/bun.js/bindings/ScriptExecutionContext.cpp @@ -112,24 +112,15 @@ us_socket_context_t* ScriptExecutionContext::connectedWebSocketKindClientSSL() ScriptExecutionContextIdentifier ScriptExecutionContext::generateIdentifier() { - Locker locker { allScriptExecutionContextsMapLock }; - - // ASSERT(allScriptExecutionContextsMap().contains(m_identifier)); - // allScriptExecutionContextsMap().remove(m_identifier); - return ++lastUniqueIdentifier; } void ScriptExecutionContext::regenerateIdentifier() { - Locker locker { allScriptExecutionContextsMapLock }; - - // ASSERT(allScriptExecutionContextsMap().contains(m_identifier)); - // allScriptExecutionContextsMap().remove(m_identifier); m_identifier = ++lastUniqueIdentifier; - // ASSERT(!allScriptExecutionContextsMap().contains(m_identifier)); + Locker locker { allScriptExecutionContextsMapLock }; allScriptExecutionContextsMap().add(m_identifier, this); } @@ -137,14 +128,14 @@ void ScriptExecutionContext::addToContextsMap() { Locker locker { allScriptExecutionContextsMapLock }; ASSERT(!allScriptExecutionContextsMap().contains(m_identifier)); - // allScriptExecutionContextsMap().add(m_identifier, this); + allScriptExecutionContextsMap().add(m_identifier, this); } void ScriptExecutionContext::removeFromContextsMap() { Locker locker { allScriptExecutionContextsMapLock }; ASSERT(allScriptExecutionContextsMap().contains(m_identifier)); - // allScriptExecutionContextsMap().remove(m_identifier); + allScriptExecutionContextsMap().remove(m_identifier); } ScriptExecutionContext* executionContext(JSC::JSGlobalObject* globalObject) diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index a5c96ee08..a8d14e533 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -719,6 +719,7 @@ GlobalObject::GlobalObject(JSC::VM& vm, JSC::Structure* structure, WebCore::Scri mockModule = Bun::JSMockModule::create(this); m_scriptExecutionContext = context; context->setGlobalObject(this); + context->addToContextsMap(); } GlobalObject::~GlobalObject() @@ -4472,7 +4473,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) thisObject->visitGeneratedLazyClasses<Visitor>(thisObject, visitor); visitor.append(thisObject->m_BunCommonJSModuleValue); - + thisObject->visitAdditionalChildren<Visitor>(visitor); ScriptExecutionContext* context = thisObject->scriptExecutionContext(); visitor.addOpaqueRoot(context); } @@ -4540,6 +4541,29 @@ void GlobalObject::handleRejectedPromises() DEFINE_VISIT_CHILDREN(GlobalObject); +template<typename Visitor> +void GlobalObject::visitAdditionalChildren(Visitor& visitor) +{ + GlobalObject* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + thisObject->globalEventScope->visitJSEventListeners(visitor); +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(GlobalObject); + +template<typename Visitor> +void GlobalObject::visitOutputConstraints(JSCell* cell, Visitor& visitor) +{ + auto* thisObject = jsCast<GlobalObject*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + Base::visitOutputConstraints(thisObject, visitor); + thisObject->visitAdditionalChildren(visitor); +} + +template void GlobalObject::visitOutputConstraints(JSCell*, AbstractSlotVisitor&); +template void GlobalObject::visitOutputConstraints(JSCell*, SlotVisitor&); + // void GlobalObject::destroy(JSCell* cell) // { // static_cast<Zig::GlobalObject*>(cell)->Zig::GlobalObject::~Zig::GlobalObject(); diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index c98e499b0..5df1560b0 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -154,6 +154,8 @@ public: WebCore::DOMWrapperWorld& world() { return m_world.get(); } DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + template<typename Visitor> static void visitOutputConstraints(JSCell*, Visitor&); bool worldIsNormal() const { return m_worldIsNormal; } static ptrdiff_t offsetOfWorldIsNormal() { return OBJECT_OFFSETOF(GlobalObject, m_worldIsNormal); } diff --git a/src/bun.js/bindings/webcore/Worker.cpp b/src/bun.js/bindings/webcore/Worker.cpp index fe7dc2544..4ffbc0684 100644 --- a/src/bun.js/bindings/webcore/Worker.cpp +++ b/src/bun.js/bindings/webcore/Worker.cpp @@ -351,6 +351,11 @@ void Worker::forEachWorker(const Function<Function<void(ScriptExecutionContext&) extern "C" void WebWorker__dispatchExit(Zig::GlobalObject* globalObject, Worker* worker, int32_t exitCode) { if (globalObject) { + auto* ctx = globalObject->scriptExecutionContext(); + if (ctx) { + ctx->removeFromContextsMap(); + } + auto& vm = globalObject->vm(); if (JSC::JSObject* obj = JSC::jsDynamicCast<JSC::JSObject*>(globalObject->moduleLoader())) { |