From ab1c0a384d23824e842d3c88c68011104f8be2e9 Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Sun, 7 May 2023 00:43:59 +0800 Subject: [PATCH] Issue #2234 - Part 1: Create async function wrapper when instantiating module functions This excludes the change that removes "excessive" rooting from the Lambda* methods in Interpreter.cpp. Based on https://bugzilla.mozilla.org/show_bug.cgi?id=1382306 --- js/src/builtin/ModuleObject.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/js/src/builtin/ModuleObject.cpp b/js/src/builtin/ModuleObject.cpp index 194959cf31..3fc195499f 100644 --- a/js/src/builtin/ModuleObject.cpp +++ b/js/src/builtin/ModuleObject.cpp @@ -12,6 +12,8 @@ #include "gc/Policy.h" #include "gc/Tracer.h" #include "vm/SelfHosting.h" +#include "vm/AsyncFunction.h" +#include "vm/AsyncIteration.h" #include "jsobjinlines.h" #include "jsscriptinlines.h" @@ -954,15 +956,24 @@ ModuleObject::instantiateFunctionDeclarations(JSContext* cx, HandleModuleObject RootedModuleEnvironmentObject env(cx, &self->initialEnvironment()); RootedFunction fun(cx); + RootedObject obj(cx); RootedValue value(cx); for (const auto& funDecl : *funDecls) { fun = funDecl.fun; - RootedObject obj(cx, Lambda(cx, fun, env)); + obj = Lambda(cx, fun, env); if (!obj) return false; - value = ObjectValue(*fun); + if (fun->isAsync()) { + if (fun->isStarGenerator()) { + obj = WrapAsyncGenerator(cx, obj.as()); + } else { + obj = WrapAsyncFunction(cx, obj.as()); + } + } + + value = ObjectValue(*obj); if (!SetProperty(cx, env, funDecl.name->asPropertyName(), value)) return false; }