fix(node:vm): propagate async context tracking flag to NodeVMGlobalObject (#26542)

When a `SyntheticModule` callback was wrapped in an `AsyncContextFrame`
on the main globalObject (where async context tracking is enabled),
evaluating it on a `NodeVMGlobalObject` would crash because the tracking
flag wasn't propagated.

`AsyncContextFrame::call` checks `isAsyncContextTrackingEnabled()` to
decide whether to unwrap the frame — without the flag, it takes the fast
path and tries to call the `AsyncContextFrame` wrapper directly, which
is not callable.

The async context data (`m_asyncContextData`) was already shared between
parent and `NodeVMGlobalObject`, but the tracking flag was missing. This
adds propagation of `isAsyncContextTrackingEnabled` alongside the data.

**Repro:** `react-email` v5.2.5 preview server crashes when rendering a
template because it imports `node:async_hooks` (enabling async context
tracking) and uses `node:vm` `SyntheticModule` for module evaluation.

Fixes #26540

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Dylan Conway
2026-01-28 21:40:55 -08:00
committed by GitHub
parent 1bfe5c6b37
commit fc4624c672
2 changed files with 3 additions and 1 deletions

View File

@@ -799,6 +799,8 @@ void NodeVMGlobalObject::finishCreation(JSC::VM& vm)
auto* parentGlobalObject = defaultGlobalObject(this);
if (parentGlobalObject && parentGlobalObject->m_asyncContextData) {
m_asyncContextData.set(vm, this, parentGlobalObject->m_asyncContextData.get());
if (parentGlobalObject->isAsyncContextTrackingEnabled())
setAsyncContextTrackingEnabled(true);
}
}

View File

@@ -44,4 +44,4 @@
"undefined != ": 0,
"undefined == ": 0,
"usingnamespace": 0
}
}