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:
Seonghyun Kim 2026-01-05 17:16:56 +09:00
commit ca7b289dd1
2 changed files with 16 additions and 10 deletions

View file

@ -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) {

View file

@ -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>