diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 5fd70527ee3e..a72764df1c3f 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -116,6 +116,7 @@ BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent, tryNoteList(cx), scopeNoteList(cx), resumeOffsetList(cx), + numYields(0), typesetCount(0), hasSingletons(false), hasTryFinally(false), @@ -2219,11 +2220,8 @@ BytecodeEmitter::emitYieldOp(JSOp op) return false; } - - if (op == JSOP_AWAIT) { - resumeOffsetList.numAwaits++; - } else { - resumeOffsetList.numYields++; + if (op == JSOP_INITIALYIELD || op == JSOP_YIELD) { + numYields++; } uint32_t resumeIndex; diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index fd501024ade8..052f7c5d013f 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -100,9 +100,7 @@ struct CGScopeNoteList { struct CGResumeOffsetList { Vector list; - uint32_t numYields; - uint32_t numAwaits; - explicit CGResumeOffsetList(JSContext* cx) : list(cx), numYields(0), numAwaits(0) {} + explicit CGResumeOffsetList(JSContext* cx) : list(cx) {} MOZ_MUST_USE bool append(uint32_t offset) { return list.append(offset); } size_t length() const { return list.length(); } @@ -209,6 +207,9 @@ struct MOZ_STACK_CLASS BytecodeEmitter // code array). CGResumeOffsetList resumeOffsetList; + // Number of yield instructions emitted. Does not include JSOP_AWAIT. + uint32_t numYields; + uint16_t typesetCount; /* Number of JOF_TYPESET opcodes generated */ bool hasSingletons:1; /* script contains singleton initializer JSOP_OBJECT */ diff --git a/js/src/frontend/ForOfLoopControl.cpp b/js/src/frontend/ForOfLoopControl.cpp index c40c646c6d20..4b1e5687fda1 100644 --- a/js/src/frontend/ForOfLoopControl.cpp +++ b/js/src/frontend/ForOfLoopControl.cpp @@ -32,7 +32,7 @@ ForOfLoopControl::emitBeginCodeNeedingIteratorClose(BytecodeEmitter* bce) } MOZ_ASSERT(numYieldsAtBeginCodeNeedingIterClose_ == UINT32_MAX); - numYieldsAtBeginCodeNeedingIterClose_ = bce->resumeOffsetList.numYields; + numYieldsAtBeginCodeNeedingIterClose_ = bce->numYields; return true; } @@ -86,7 +86,7 @@ ForOfLoopControl::emitEndCodeNeedingIteratorClose(BytecodeEmitter* bce) // If any yields were emitted, then this for-of loop is inside a star // generator and must handle the case of Generator.return. Like in // yield*, it is handled with a finally block. - uint32_t numYieldsEmitted = bce->resumeOffsetList.numYields; + uint32_t numYieldsEmitted = bce->numYields; if (numYieldsEmitted > numYieldsAtBeginCodeNeedingIterClose_) { if (!tryCatch_->emitFinally()) { return false;