diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2019-12-14 09:58:06 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2019-12-17 06:25:29 -0500 |
commit | dd1cbde1569e823e5e76e8c3ef0ecba66408719d (patch) | |
tree | e55301983fb9558565871d43675ae24df8b784f3 /js | |
parent | 63eee6325ea72fae191b50ea2a23c46758c063e6 (diff) | |
download | UXP-dd1cbde1569e823e5e76e8c3ef0ecba66408719d.tar UXP-dd1cbde1569e823e5e76e8c3ef0ecba66408719d.tar.gz UXP-dd1cbde1569e823e5e76e8c3ef0ecba66408719d.tar.lz UXP-dd1cbde1569e823e5e76e8c3ef0ecba66408719d.tar.xz UXP-dd1cbde1569e823e5e76e8c3ef0ecba66408719d.zip |
Bug 1364608 - Stash rval in AsyncIteratorClose.
Tag #1287
Diffstat (limited to 'js')
-rw-r--r-- | js/src/frontend/BytecodeEmitter.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index f16450db9..f629c86e5 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -5365,7 +5365,14 @@ BytecodeEmitter::emitIteratorClose(IteratorKind iterKind /* = IteratorKind::Sync checkTypeSet(JSOP_CALL); if (iterKind == IteratorKind::Async) { - if (!emitAwait()) // ... ... RESULT + if (completionKind != CompletionKind::Throw) { + // Await clobbers rval, so save the current rval. + if (!emit1(JSOP_GETRVAL)) // ... ... RESULT RVAL + return false; + if (!emit1(JSOP_SWAP)) // ... ... RVAL RESULT + return false; + } + if (!emitAwait()) // ... ... RVAL? RESULT return false; } @@ -5395,8 +5402,15 @@ BytecodeEmitter::emitIteratorClose(IteratorKind iterKind /* = IteratorKind::Sync if (!emit1(JSOP_POP)) // ... RESULT return false; } else { - if (!emitCheckIsObj(CheckIsObjectKind::IteratorReturn)) // ... RESULT + if (!emitCheckIsObj(CheckIsObjectKind::IteratorReturn)) // ... RVAL? RESULT return false; + + if (iterKind == IteratorKind::Async) { + if (!emit1(JSOP_SWAP)) // ... RESULT RVAL + return false; + if (!emit1(JSOP_SETRVAL)) // ... RESULT + return false; + } } if (!ifReturnMethodIsDefined.emitElse()) |