Skip to content

Commit

Permalink
Fix regexp split with zero-length capture group (#566)
Browse files Browse the repository at this point in the history
The expected result of `"ab".split(/(c)*/)[1]` is `undefined` but
was in fact `"undefined"` due to unintentional stringification.

Fixes: #565
  • Loading branch information
bnoordhuis authored Sep 30, 2024
1 parent e156452 commit 1eb9608
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
7 changes: 6 additions & 1 deletion quickjs.c
Original file line number Diff line number Diff line change
Expand Up @@ -43835,9 +43835,14 @@ static JSValue js_regexp_Symbol_split(JSContext *ctx, JSValue this_val,
if (js_get_length64(ctx, &numberOfCaptures, z))
goto exception;
for(i = 1; i < numberOfCaptures; i++) {
sub = JS_ToStringFree(ctx, JS_GetPropertyInt64(ctx, z, i));
sub = JS_GetPropertyInt64(ctx, z, i);
if (JS_IsException(sub))
goto exception;
if (!JS_IsUndefined(sub)) {
sub = JS_ToStringFree(ctx, sub);
if (JS_IsException(sub))
goto exception;
}
if (JS_DefinePropertyValueInt64(ctx, A, lengthA++, sub, JS_PROP_C_W_E | JS_PROP_THROW) < 0)
goto exception;
if (lengthA == lim)
Expand Down
2 changes: 2 additions & 0 deletions tests/test_builtin.js
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,8 @@ function test_regexp()
assert(a, ["a", undefined]);
a = /(?:|[\w])+([0-9])/.exec("123a23");
assert(a, ["123a23", "3"]);
a = "ab".split(/(c)*/);
assert(a, ["a", undefined, "b"]);
}

function test_symbol()
Expand Down

0 comments on commit 1eb9608

Please sign in to comment.