Skip to content

Commit aede65d

Browse files
committed
[GR-78747] Fix iterator closing for Array.from and collection constructors.
PullRequest: js/3887
2 parents 4d5b9b6 + 5cfa11d commit aede65d

3 files changed

Lines changed: 31 additions & 39 deletions

File tree

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/ArrayFunctionBuiltins.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -305,23 +305,23 @@ protected Object arrayFromIterable(Object thisObj, Object items, Object usingIte
305305

306306
private Object arrayFromIteratorRecord(Object obj, IteratorRecord iteratorRecord, Object mapFn, Object thisArg, boolean mapping) {
307307
long k = 0;
308-
try {
309-
while (true) {
310-
Object next = iteratorStep(iteratorRecord);
311-
if (next == Boolean.FALSE) {
312-
setLength(obj, k);
313-
return obj;
314-
}
315-
Object mapped = getIteratorValue(next);
308+
while (true) {
309+
Object next = iteratorStep(iteratorRecord);
310+
if (next == Boolean.FALSE) {
311+
setLength(obj, k);
312+
return obj;
313+
}
314+
Object mapped = getIteratorValue(next);
315+
try {
316316
if (mapping) {
317317
mapped = callMapFn(thisArg, mapFn, mapped, JSRuntime.positiveLongToIntOrDouble(k));
318318
}
319319
writeOwn(obj, k, mapped);
320320
k++;
321+
} catch (AbstractTruffleException ex) {
322+
iteratorCloseAbrupt(iteratorRecord);
323+
throw ex; // should be executed by iteratorClose
321324
}
322-
} catch (AbstractTruffleException ex) {
323-
iteratorCloseAbrupt(iteratorRecord);
324-
throw ex; // should be executed by iteratorClose
325325
}
326326
}
327327

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/builtins/ConstructorBuiltins.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3009,24 +3009,24 @@ protected final JSObject constructMapFromIterable(JSDynamicObject newTarget, Obj
30093009
}
30103010
IteratorRecord iter = getIteratorNode.execute(node, iterable);
30113011

3012-
try {
3013-
while (true) {
3014-
Object next = iteratorStep(iter);
3015-
if (next == Boolean.FALSE) {
3016-
break;
3017-
}
3018-
Object nextItem = getIteratorValue(next);
3012+
while (true) {
3013+
Object next = iteratorStep(iter);
3014+
if (next == Boolean.FALSE) {
3015+
break;
3016+
}
3017+
Object nextItem = getIteratorValue(next);
3018+
try {
30193019
if (!isObjectNode.executeBoolean(nextItem)) {
30203020
errorBranch.enter(node);
30213021
throw Errors.createTypeErrorIteratorResultNotObject(nextItem, this);
30223022
}
30233023
Object k = readElementNode.executeWithTargetAndIndex(nextItem, 0);
30243024
Object v = readElementNode.executeWithTargetAndIndex(nextItem, 1);
30253025
call(mapObj, adder, k, v);
3026+
} catch (AbstractTruffleException ex) {
3027+
iteratorCloseAbrupt(iter);
3028+
throw ex;
30263029
}
3027-
} catch (AbstractTruffleException ex) {
3028-
iteratorCloseAbrupt(iter);
3029-
throw ex;
30303030
}
30313031

30323032
return mapObj;
@@ -3074,18 +3074,18 @@ protected JSObject constructSetFromIterable(JSDynamicObject newTarget, Object it
30743074
}
30753075
IteratorRecord iter = getIteratorNode.execute(node, iterable);
30763076

3077-
try {
3078-
while (true) {
3079-
Object next = iteratorStep(iter);
3080-
if (next == Boolean.FALSE) {
3081-
break;
3082-
}
3083-
Object nextValue = getIteratorValue(next);
3077+
while (true) {
3078+
Object next = iteratorStep(iter);
3079+
if (next == Boolean.FALSE) {
3080+
break;
3081+
}
3082+
Object nextValue = getIteratorValue(next);
3083+
try {
30843084
call(setObj, adder, nextValue);
3085+
} catch (AbstractTruffleException ex) {
3086+
iteratorCloseAbrupt(iter);
3087+
throw ex;
30853088
}
3086-
} catch (AbstractTruffleException ex) {
3087-
iteratorCloseAbrupt(iter);
3088-
throw ex;
30893089
}
30903090

30913091
return setObj;

graal-js/test/test262.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,10 +2256,6 @@
22562256
"STAGING" : "PASS"
22572257
},
22582258
"comment" : "nonextensible-applies-to-private proposal"
2259-
}, {
2260-
"filePath" : "staging/sm/Array/from-iterator-close.js",
2261-
"status" : "FAIL",
2262-
"comment" : "new failures 2025-01-23"
22632259
}, {
22642260
"filePath" : "staging/sm/Array/length-truncate-nonconfigurable-sparse.js",
22652261
"status" : "SKIP",
@@ -2334,10 +2330,6 @@
23342330
"filePath" : "staging/sm/lexical-environment/block-scoped-functions-deprecated-redecl.js",
23352331
"status" : "FAIL",
23362332
"comment" : "new failures 2025-01-23"
2337-
}, {
2338-
"filePath" : "staging/sm/Map/constructor-iterator-close.js",
2339-
"status" : "FAIL",
2340-
"comment" : "new failures 2025-01-23"
23412333
}, {
23422334
"filePath" : "staging/sm/Math/exp-exact.js",
23432335
"status" : "PASS",

0 commit comments

Comments
 (0)