diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2025-03-31 13:37:37 +0200 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2025-03-31 13:37:37 +0200 |
commit | 0d7aaed71c8ddd0c2d2da5cbbfc82a6600985a2b (patch) | |
tree | 1382546436b352db8ac817c4dcb96bf3673ebc84 /quickjs.c | |
parent | 2634856087f735741d5d811677c285d9427e645d (diff) | |
download | quickjs-0d7aaed71c8ddd0c2d2da5cbbfc82a6600985a2b.tar.gz quickjs-0d7aaed71c8ddd0c2d2da5cbbfc82a6600985a2b.zip |
ensure that JS_IteratorNext() returns JS_UNDEFINED when done = TRUE (#394)
Diffstat (limited to 'quickjs.c')
-rw-r--r-- | quickjs.c | 21 |
1 files changed, 10 insertions, 11 deletions
@@ -15107,6 +15107,7 @@ static JSValue JS_IteratorNext2(JSContext *ctx, JSValueConst enum_obj, return JS_EXCEPTION; } +/* Note: always return JS_UNDEFINED when *pdone = TRUE. */ static JSValue JS_IteratorNext(JSContext *ctx, JSValueConst enum_obj, JSValueConst method, int argc, JSValueConst *argv, BOOL *pdone) @@ -15117,9 +15118,13 @@ static JSValue JS_IteratorNext(JSContext *ctx, JSValueConst enum_obj, obj = JS_IteratorNext2(ctx, enum_obj, method, argc, argv, &done); if (JS_IsException(obj)) goto fail; - if (done != 2) { - *pdone = done; + if (likely(done == 0)) { + *pdone = FALSE; return obj; + } else if (done != 2) { + JS_FreeValue(ctx, obj); + *pdone = TRUE; + return JS_UNDEFINED; } else { done_val = JS_GetProperty(ctx, obj, JS_ATOM_done); if (JS_IsException(done_val)) @@ -37510,10 +37515,8 @@ static JSValue js_object_fromEntries(JSContext *ctx, JSValueConst this_val, item = JS_IteratorNext(ctx, iter, next_method, 0, NULL, &done); if (JS_IsException(item)) goto fail; - if (done) { - JS_FreeValue(ctx, item); + if (done) break; - } key = JS_UNDEFINED; value = JS_UNDEFINED; @@ -46550,10 +46553,8 @@ static JSValue js_map_constructor(JSContext *ctx, JSValueConst new_target, item = JS_IteratorNext(ctx, iter, next_method, 0, NULL, &done); if (JS_IsException(item)) goto fail; - if (done) { - JS_FreeValue(ctx, item); + if (done) break; - } if (is_set) { ret = JS_Call(ctx, adder, obj, 1, (JSValueConst *)&item); if (JS_IsException(ret)) { @@ -52686,10 +52687,8 @@ static JSValue js_array_from_iterator(JSContext *ctx, uint32_t *plen, val = JS_IteratorNext(ctx, iter, next_method, 0, NULL, &done); if (JS_IsException(val)) goto fail; - if (done) { - JS_FreeValue(ctx, val); + if (done) break; - } if (JS_CreateDataPropertyUint32(ctx, arr, k, val, JS_PROP_THROW) < 0) goto fail; k++; |