mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-22 10:01:50 +00:00
When closing the iterator, handle exceptions that occur when retrieving the return function correctly.
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
parent
3f07b5696c
commit
ca7b289dd1
2 changed files with 16 additions and 10 deletions
|
|
@ -4955,19 +4955,28 @@ NEVER_INLINE void InterpreterSlowPath::iteratorOperation(ExecutionState& state,
|
|||
bool exceptionWasThrown = state.rareData()->controlFlowRecordVector() && state.rareData()->controlFlowRecordVector()->back() && state.rareData()->controlFlowRecordVector()->back()->reason() == ControlFlowRecord::NeedsThrow;
|
||||
IteratorRecord* iteratorRecord = registerFile[code->m_iteratorCloseData.m_iterRegisterIndex].asPointerValue()->asIteratorRecord();
|
||||
Object* iterator = iteratorRecord->m_iterator;
|
||||
Value returnFunction = iterator->get(state, ObjectPropertyName(state.context()->staticStrings().stringReturn)).value(state, iterator);
|
||||
if (returnFunction.isUndefined()) {
|
||||
Value returnFunction;
|
||||
Value innerResult;
|
||||
bool innerResultHasException = false;
|
||||
try {
|
||||
returnFunction = iterator->get(state, ObjectPropertyName(state.context()->staticStrings().stringReturn)).value(state, iterator);
|
||||
} catch (const Value& e) {
|
||||
innerResult = e;
|
||||
innerResultHasException = true;
|
||||
}
|
||||
|
||||
if (!innerResultHasException && returnFunction.isUndefined()) {
|
||||
ADD_PROGRAM_COUNTER(IteratorOperation);
|
||||
return;
|
||||
}
|
||||
|
||||
Value innerResult;
|
||||
bool innerResultHasException = false;
|
||||
try {
|
||||
innerResult = Object::call(state, returnFunction, iterator, 0, nullptr);
|
||||
} catch (const Value& e) {
|
||||
innerResult = e;
|
||||
innerResultHasException = true;
|
||||
if (!innerResultHasException) {
|
||||
try {
|
||||
innerResult = Object::call(state, returnFunction, iterator, 0, nullptr);
|
||||
} catch (const Value& e) {
|
||||
innerResult = e;
|
||||
innerResultHasException = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (exceptionWasThrown) {
|
||||
|
|
|
|||
|
|
@ -507,10 +507,8 @@
|
|||
<test id="language/eval-code/direct/meth-no-pre-existing-arguments-bindings-are-present-declare-arguments"><reason>TODO</reason></test>
|
||||
<test id="language/eval-code/direct/meth-no-pre-existing-arguments-bindings-are-present-declare-arguments-and-assign"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/arrow-function/eval-var-scope-syntax-err"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/destructuring/default-expr-throws-iterator-return-get-throws"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/destructuring/keyed-destructuring-property-reference-target-evaluation-order-with-bindings"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/destructuring/target-assign-throws-iterator-return-get-throws"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/dstr/array-rest-init"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/dstr/obj-id-identifier-yield-ident-invalid"><reason>TODO</reason></test>
|
||||
<test id="language/expressions/assignment/dstr/obj-rest-non-string-computed-property-1"><reason>TODO</reason></test>
|
||||
|
|
@ -925,7 +923,6 @@
|
|||
<test id="language/statements/for-of/dstr/obj-rest-not-last-element-invalid"><reason>TODO</reason></test>
|
||||
<test id="language/statements/for-of/head-lhs-async-dot"><reason>TODO</reason></test>
|
||||
<test id="language/statements/for-of/iterator-close-non-throw-get-method-is-null"><reason>TODO</reason></test>
|
||||
<test id="language/statements/for-of/iterator-close-throw-get-method-abrupt"><reason>TODO</reason></test>
|
||||
<test id="language/statements/function/eval-var-scope-syntax-err"><reason>TODO</reason></test>
|
||||
<test id="language/statements/generators/eval-var-scope-syntax-err"><reason>TODO</reason></test>
|
||||
<test id="language/statements/generators/generator-created-after-decl-inst"><reason>TODO</reason></test>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue