author | Tooru Fujisawa <arai_a@mac.com> |
Wed, 01 Mar 2017 20:40:05 +0900 | |
changeset 345225 | 616903dd928563c67134208132320f43e38249e0 |
parent 345224 | 53a92e2f749e1263e72e0d38089758948d5d720a |
child 345226 | be60a3cf158e177f70a3f48d7904c0267676fe47 |
push id | 87542 |
push user | arai_a@mac.com |
push date | Wed, 01 Mar 2017 11:40:31 +0000 |
treeherder | mozilla-inbound@bf3219269a11 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | shu |
bugs | 1343481 |
milestone | 54.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
js/src/vm/GeneratorObject.cpp | file | annotate | diff | comparison | revisions | |
js/src/vm/GeneratorObject.h | file | annotate | diff | comparison | revisions |
--- a/js/src/vm/GeneratorObject.cpp +++ b/js/src/vm/GeneratorObject.cpp @@ -371,8 +371,39 @@ js::CheckStarGeneratorResumptionValue(JS return false; if (!prop.isNativeProperty()) return false; if (!prop.shape()->hasDefaultGetter()) return false; 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; +}
--- a/js/src/vm/GeneratorObject.h +++ b/js/src/vm/GeneratorObject.h @@ -174,16 +174,23 @@ class GeneratorObject : public NativeObj setFixedSlot(CALLEE_SLOT, NullValue()); setFixedSlot(ENV_CHAIN_SLOT, NullValue()); setFixedSlot(ARGS_OBJ_SLOT, NullValue()); setFixedSlot(EXPRESSION_STACK_SLOT, NullValue()); setFixedSlot(YIELD_AND_AWAIT_INDEX_SLOT, NullValue()); setFixedSlot(NEWTARGET_SLOT, NullValue()); } + bool isAfterYield(); + bool isAfterAwait(); + +private: + bool isAfterYieldOrAwait(JSOp op); + +public: static size_t offsetOfCalleeSlot() { return getFixedSlotOffset(CALLEE_SLOT); } static size_t offsetOfEnvironmentChainSlot() { return getFixedSlotOffset(ENV_CHAIN_SLOT); } static size_t offsetOfArgsObjSlot() { return getFixedSlotOffset(ARGS_OBJ_SLOT);