Skip to content

Commit

Permalink
Fixes #3669
Browse files Browse the repository at this point in the history
  • Loading branch information
Jarred-Sumner committed Jul 18, 2023
1 parent 6613555 commit 777ee4e
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 13 deletions.
15 changes: 3 additions & 12 deletions src/bun.js/bindings/ScriptExecutionContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,39 +112,30 @@ 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);
}

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)
Expand Down
26 changes: 25 additions & 1 deletion src/bun.js/bindings/ZigGlobalObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions src/bun.js/bindings/ZigGlobalObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ class GlobalObject : public JSC::JSGlobalObject {
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); }
Expand Down
5 changes: 5 additions & 0 deletions src/bun.js/bindings/webcore/Worker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())) {
Expand Down

0 comments on commit 777ee4e

Please sign in to comment.