diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2019-12-13 20:59:32 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2019-12-17 06:25:25 -0500 |
commit | d0d9a4f43dbd58c694c706b17996157fede20bdf (patch) | |
tree | db9e4dce1b1c92b477720f1eba9a9ec04b3f8e2d /js/src/frontend | |
parent | 79b5eb14bc5f8495d20147957cda5f4e5fc8186a (diff) | |
download | UXP-d0d9a4f43dbd58c694c706b17996157fede20bdf.tar UXP-d0d9a4f43dbd58c694c706b17996157fede20bdf.tar.gz UXP-d0d9a4f43dbd58c694c706b17996157fede20bdf.tar.lz UXP-d0d9a4f43dbd58c694c706b17996157fede20bdf.tar.xz UXP-d0d9a4f43dbd58c694c706b17996157fede20bdf.zip |
Bug 1316098 - Optimize out result object allocation for await/return in async function.
Tag #1287
Diffstat (limited to 'js/src/frontend')
-rw-r--r-- | js/src/frontend/BytecodeEmitter.cpp | 25 | ||||
-rw-r--r-- | js/src/frontend/BytecodeEmitter.h | 1 | ||||
-rw-r--r-- | js/src/frontend/SharedContext.h | 2 |
3 files changed, 24 insertions, 4 deletions
diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 77a480bff..a98016d63 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -8552,7 +8552,7 @@ bool BytecodeEmitter::emitYield(ParseNode* pn) { MOZ_ASSERT(sc->isFunctionBox()); - MOZ_ASSERT(pn->getOp() == JSOP_YIELD || pn->getOp() == JSOP_AWAIT); + MOZ_ASSERT(pn->getOp() == JSOP_YIELD); bool needsIteratorResult = sc->asFunctionBox()->needsIteratorResult(); if (needsIteratorResult) { @@ -8574,13 +8574,28 @@ BytecodeEmitter::emitYield(ParseNode* pn) if (!emitGetDotGenerator()) return false; - if (!emitYieldOp(pn->getOp())) + if (!emitYieldOp(JSOP_YIELD)) return false; return true; } bool +BytecodeEmitter::emitAwait(ParseNode* pn) +{ + MOZ_ASSERT(sc->isFunctionBox()); + MOZ_ASSERT(pn->getOp() == JSOP_AWAIT); + + if (!emitTree(pn->pn_kid)) + return false; + if (!emitGetDotGenerator()) + return false; + if (!emitYieldOp(JSOP_AWAIT)) + return false; + return true; +} + +bool BytecodeEmitter::emitYieldStar(ParseNode* iter) { MOZ_ASSERT(sc->isFunctionBox()); @@ -10630,11 +10645,15 @@ BytecodeEmitter::emitTree(ParseNode* pn, ValueUsage valueUsage /* = ValueUsage:: break; case PNK_YIELD: - case PNK_AWAIT: if (!emitYield(pn)) return false; break; + case PNK_AWAIT: + if (!emitAwait(pn)) + return false; + break; + case PNK_STATEMENTLIST: if (!emitStatementList(pn)) return false; diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index 08638f48a..f3f78df16 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -613,6 +613,7 @@ struct MOZ_STACK_CLASS BytecodeEmitter MOZ_MUST_USE bool emitYield(ParseNode* pn); MOZ_MUST_USE bool emitYieldOp(JSOp op); MOZ_MUST_USE bool emitYieldStar(ParseNode* iter); + MOZ_MUST_USE bool emitAwait(ParseNode* pn); MOZ_MUST_USE bool emitPropLHS(ParseNode* pn); MOZ_MUST_USE bool emitPropOp(ParseNode* pn, JSOp op); diff --git a/js/src/frontend/SharedContext.h b/js/src/frontend/SharedContext.h index 2d478308e..8a5f6c0bd 100644 --- a/js/src/frontend/SharedContext.h +++ b/js/src/frontend/SharedContext.h @@ -553,7 +553,7 @@ class FunctionBox : public ObjectBox, public SharedContext } bool needsIteratorResult() const { - return isStarGenerator() || isAsync(); + return isStarGenerator(); } bool isAsync() const { return asyncKind() == AsyncFunction; } |