diff --git a/js/src/frontend/BytecodeCompiler.cpp b/js/src/frontend/BytecodeCompiler.cpp index 7b6ccb38c..1309e4d1f 100644 --- a/js/src/frontend/BytecodeCompiler.cpp +++ b/js/src/frontend/BytecodeCompiler.cpp @@ -636,7 +636,7 @@ BytecodeCompiler::compileFunctionBody(MutableHandleFunction fun, ParseNode* fn; do { Directives newDirectives = directives; - fn = parser->standaloneFunctionBody(fun, formals, generatorKind, directives, + fn = parser->standaloneFunctionBody(fun, formals, generatorKind, SyncFunction, directives, &newDirectives, enclosingStaticScope); if (!fn && !handleParseFailure(newDirectives)) return false; @@ -797,7 +797,7 @@ frontend::CompileLazyFunction(JSContext* cx, Handle lazy, const cha Rooted fun(cx, lazy->functionNonDelazifying()); MOZ_ASSERT(!lazy->isLegacyGenerator()); - ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->strict(), lazy->generatorKind()); + ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->strict(), lazy->generatorKind(), lazy->asyncKind()); if (!pn) return false; diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index ad565285b..6e5fd4a77 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -1143,6 +1143,7 @@ ParseNode* Parser::standaloneFunctionBody(HandleFunction fun, Handle formals, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives, HandleObject enclosingStaticScope) @@ -1158,7 +1159,7 @@ Parser::standaloneFunctionBody(HandleFunction fun, return null(); fn->pn_body = argsbody; - FunctionBox* funbox = newFunctionBox(fn, fun, inheritedDirectives, generatorKind, SyncFunction, + FunctionBox* funbox = newFunctionBox(fn, fun, inheritedDirectives, generatorKind, asyncKind, enclosingStaticScope); if (!funbox) return null(); @@ -1609,7 +1610,8 @@ struct BindData template JSFunction* Parser::newFunction(HandleAtom atom, FunctionSyntaxKind kind, - GeneratorKind generatorKind, HandleObject proto) + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, + HandleObject proto) { MOZ_ASSERT_IF(kind == Statement, atom != nullptr); @@ -2718,11 +2720,12 @@ Parser::templateLiteral(YieldHandling yieldHandling) return nodeList; } +/* ::functionDefinition */ template typename ParseHandler::Node Parser::functionDef(InHandling inHandling, YieldHandling yieldHandling, HandlePropertyName funName, FunctionSyntaxKind kind, - GeneratorKind generatorKind, InvokedPrediction invoked, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, InvokedPrediction invoked, Node* assignmentForAnnexBOut) { MOZ_ASSERT_IF(kind == Statement, funName); @@ -2753,7 +2756,7 @@ Parser::functionDef(InHandling inHandling, YieldHandling yieldHand if (!proto) return null(); } - RootedFunction fun(context, newFunction(funName, kind, generatorKind, proto)); + RootedFunction fun(context, newFunction(funName, kind, generatorKind, asyncKind, proto)); if (!fun) return null(); @@ -2768,7 +2771,7 @@ Parser::functionDef(InHandling inHandling, YieldHandling yieldHand tokenStream.tell(&start); while (true) { - if (functionArgsAndBody(inHandling, pn, fun, kind, generatorKind, directives, + if (functionArgsAndBody(inHandling, pn, fun, kind, generatorKind, asyncKind, directives, &newDirectives)) { break; @@ -2852,18 +2855,19 @@ Parser::finishFunctionDefinition(Node pn, FunctionBox* funbo return true; } +/* ::trySyntaxParseInnerFunction */ template <> bool Parser::functionArgsAndBody(InHandling inHandling, ParseNode* pn, HandleFunction fun, FunctionSyntaxKind kind, - GeneratorKind generatorKind, + GeneratorKind generatorKind, FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives) { ParseContext* outerpc = pc; // Create box for fun->object early to protect against last-ditch GC. - FunctionBox* funbox = newFunctionBox(pn, fun, pc, inheritedDirectives, generatorKind, SyncFunction); + FunctionBox* funbox = newFunctionBox(pn, fun, pc, inheritedDirectives, generatorKind, asyncKind); if (!funbox) return false; @@ -2957,13 +2961,14 @@ bool Parser::functionArgsAndBody(InHandling inHandling, Node pn, HandleFunction fun, FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives) { ParseContext* outerpc = pc; // Create box for fun->object early to protect against last-ditch GC. - FunctionBox* funbox = newFunctionBox(pn, fun, pc, inheritedDirectives, generatorKind, SyncFunction); + FunctionBox* funbox = newFunctionBox(pn, fun, pc, inheritedDirectives, generatorKind, asyncKind); if (!funbox) return false; @@ -3007,7 +3012,8 @@ Parser::appendToCallSiteObj(Node callSiteObj) template <> ParseNode* Parser::standaloneLazyFunction(HandleFunction fun, bool strict, - GeneratorKind generatorKind) + GeneratorKind generatorKind, + FunctionAsyncKind asyncKind) { MOZ_ASSERT(checkOptionsCalled); @@ -3022,7 +3028,7 @@ Parser::standaloneLazyFunction(HandleFunction fun, bool strict RootedObject enclosing(context, fun->lazyScript()->enclosingScope()); Directives directives(/* strict = */ strict); - FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, SyncFunction, enclosing); + FunctionBox* funbox = newFunctionBox(pn, fun, directives, generatorKind, asyncKind, enclosing); if (!funbox) return null(); funbox->length = fun->nargs() - fun->hasRest(); @@ -3230,7 +3236,7 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling Node assignmentForAnnexB; Node fun = functionDef(InAllowed, yieldHandling, name, Statement, generatorKind, - PredictUninvoked, &assignmentForAnnexB); + SyncFunction, PredictUninvoked, &assignmentForAnnexB); if (!fun) return null(); @@ -3288,7 +3294,7 @@ Parser::functionExpr(InvokedPrediction invoked) } YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; - return functionDef(InAllowed, yieldHandling, name, Expression, generatorKind, invoked); + return functionDef(InAllowed, yieldHandling, name, Expression, generatorKind, SyncFunction, invoked); } /* @@ -7752,7 +7758,7 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl if (!tokenStream.peekToken(&ignored, TokenStream::Operand)) return null(); - Node arrowFunc = functionDef(inHandling, yieldHandling, nullptr, Arrow, NotGenerator); + Node arrowFunc = functionDef(inHandling, yieldHandling, nullptr, Arrow, NotGenerator, SyncFunction); if (!arrowFunc) return null(); @@ -8630,7 +8636,7 @@ Parser::generatorComprehensionLambda(GeneratorKind comprehensionKi } RootedFunction fun(context, newFunction(/* atom = */ nullptr, Expression, - comprehensionKind, proto)); + comprehensionKind, SyncFunction, proto)); if (!fun) return null(); @@ -9876,7 +9882,7 @@ Parser::methodDefinition(YieldHandling yieldHandling, PropertyType { FunctionSyntaxKind kind = FunctionSyntaxKindFromPropertyType(propType); GeneratorKind generatorKind = GeneratorKindFromPropertyType(propType); - return functionDef(InAllowed, yieldHandling, funName, kind, generatorKind); + return functionDef(InAllowed, yieldHandling, funName, kind, generatorKind, SyncFunction); } template diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 921fe280a..6e2e83f5c 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -612,7 +612,7 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter * a function expression). */ JSFunction* newFunction(HandleAtom atom, FunctionSyntaxKind kind, GeneratorKind generatorKind, - HandleObject proto); + FunctionAsyncKind asyncKind, HandleObject proto); bool generateBlockId(JSObject* staticScope, uint32_t* blockIdOut) { if (blockScopes.length() == StmtInfoPC::BlockIdLimit) { @@ -679,12 +679,15 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter // Generator constructors. Node standaloneFunctionBody(HandleFunction fun, Handle formals, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives, HandleObject enclosingStaticScope); // Parse a function, given only its arguments and body. Used for lazily // parsed functions. - Node standaloneLazyFunction(HandleFunction fun, bool strict, GeneratorKind generatorKind); + Node standaloneLazyFunction(HandleFunction fun, bool strict, + GeneratorKind generatorKind, + FunctionAsyncKind asyncKind); /* * Parse a function body. Pass StatementListBody if the body is a list of @@ -882,10 +885,12 @@ class Parser : private JS::AutoGCRooter, public StrictModeGetter Node functionDef(InHandling inHandling, YieldHandling uieldHandling, HandlePropertyName name, FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, InvokedPrediction invoked = PredictUninvoked, Node* assignmentForAnnexBOut = nullptr); bool functionArgsAndBody(InHandling inHandling, Node pn, HandleFunction fun, FunctionSyntaxKind kind, GeneratorKind generatorKind, + FunctionAsyncKind asyncKind, Directives inheritedDirectives, Directives* newDirectives); Node unaryOpExpr(YieldHandling yieldHandling, ParseNodeKind kind, JSOp op, uint32_t begin);