Bug 1343481 - Part 4: Add Add GeneratorObject.{isAfterYield,isAfterAwait}. r=shu

This commit is contained in:
Tooru Fujisawa 2017-03-01 20:40:05 +09:00
Родитель c6a69a3c6c
Коммит 242fbfe0d7
2 изменённых файлов: 38 добавлений и 0 удалений

Просмотреть файл

@ -376,3 +376,34 @@ js::CheckStarGeneratorResumptionValue(JSContext* cx, HandleValue v)
return true;
}
bool
GeneratorObject::isAfterYield()
{
return isAfterYieldOrAwait(JSOP_YIELD);
}
bool
GeneratorObject::isAfterAwait()
{
return isAfterYieldOrAwait(JSOP_AWAIT);
}
bool
GeneratorObject::isAfterYieldOrAwait(JSOp op)
{
if (isClosed() || isClosing() || isRunning())
return false;
JSScript* script = callee().nonLazyScript();
jsbytecode* code = script->code();
uint32_t nextOffset = script->yieldAndAwaitOffsets()[yieldAndAwaitIndex()];
if (code[nextOffset] != JSOP_DEBUGAFTERYIELD)
return false;
uint32_t offset = nextOffset - JSOP_YIELD_LENGTH;
MOZ_ASSERT(code[offset] == JSOP_INITIALYIELD || code[offset] == JSOP_YIELD ||
code[offset] == JSOP_AWAIT);
return code[offset] == op;
}

Просмотреть файл

@ -179,6 +179,13 @@ class GeneratorObject : public NativeObject
setFixedSlot(NEWTARGET_SLOT, NullValue());
}
bool isAfterYield();
bool isAfterAwait();
private:
bool isAfterYieldOrAwait(JSOp op);
public:
static size_t offsetOfCalleeSlot() {
return getFixedSlotOffset(CALLEE_SLOT);
}