Retrieve RegExp 'g' flag in spec conformant way (#92)

This commit is contained in:
Ben Noordhuis 2023-11-19 17:26:03 +01:00 committed by GitHub
parent b56cbb143c
commit 4727e40ac8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 20 deletions

View file

@ -40489,7 +40489,7 @@ static JSValue js_regexp_Symbol_match(JSContext *ctx, JSValueConst this_val,
{ {
// [Symbol.match](str) // [Symbol.match](str)
JSValueConst rx = this_val; JSValueConst rx = this_val;
JSValue A, S, result, matchStr; JSValue A, S, flags, result, matchStr;
int global, n, fullUnicode, isEmpty; int global, n, fullUnicode, isEmpty;
JSString *p; JSString *p;
@ -40497,16 +40497,23 @@ static JSValue js_regexp_Symbol_match(JSContext *ctx, JSValueConst this_val,
return JS_ThrowTypeErrorNotAnObject(ctx); return JS_ThrowTypeErrorNotAnObject(ctx);
A = JS_UNDEFINED; A = JS_UNDEFINED;
flags = JS_UNDEFINED;
result = JS_UNDEFINED; result = JS_UNDEFINED;
matchStr = JS_UNDEFINED; matchStr = JS_UNDEFINED;
S = JS_ToString(ctx, argv[0]); S = JS_ToString(ctx, argv[0]);
if (JS_IsException(S)) if (JS_IsException(S))
goto exception; goto exception;
global = JS_ToBoolFree(ctx, JS_GetProperty(ctx, rx, JS_ATOM_global)); flags = JS_GetProperty(ctx, rx, JS_ATOM_flags);
if (global < 0) if (JS_IsException(flags))
goto exception; goto exception;
flags = JS_ToStringFree(ctx, flags);
if (JS_IsException(flags))
goto exception;
p = JS_VALUE_GET_STRING(flags);
// TODO(bnoordhuis) query 'u' flag the same way?
global = (-1 != string_indexof_char(p, 'g', 0));
if (!global) { if (!global) {
A = JS_RegExpExec(ctx, rx, S); A = JS_RegExpExec(ctx, rx, S);
} else { } else {
@ -40550,12 +40557,14 @@ static JSValue js_regexp_Symbol_match(JSContext *ctx, JSValueConst this_val,
} }
} }
JS_FreeValue(ctx, result); JS_FreeValue(ctx, result);
JS_FreeValue(ctx, flags);
JS_FreeValue(ctx, S); JS_FreeValue(ctx, S);
return A; return A;
exception: exception:
JS_FreeValue(ctx, A); JS_FreeValue(ctx, A);
JS_FreeValue(ctx, result); JS_FreeValue(ctx, result);
JS_FreeValue(ctx, flags);
JS_FreeValue(ctx, S); JS_FreeValue(ctx, S);
return JS_EXCEPTION; return JS_EXCEPTION;
} }
@ -40798,8 +40807,8 @@ static JSValue js_regexp_Symbol_replace(JSContext *ctx, JSValueConst this_val,
// [Symbol.replace](str, rep) // [Symbol.replace](str, rep)
JSValueConst rx = this_val, rep = argv[1]; JSValueConst rx = this_val, rep = argv[1];
JSValueConst args[6]; JSValueConst args[6];
JSValue str, rep_val, matched, tab, rep_str, namedCaptures, res; JSValue flags, str, rep_val, matched, tab, rep_str, namedCaptures, res;
JSString *sp, *rp; JSString *p, *sp, *rp;
StringBuffer b_s, *b = &b_s; StringBuffer b_s, *b = &b_s;
ValueBuffer v_b, *results = &v_b; ValueBuffer v_b, *results = &v_b;
int nextSourcePosition, n, j, functionalReplace, is_global, fullUnicode; int nextSourcePosition, n, j, functionalReplace, is_global, fullUnicode;
@ -40815,6 +40824,7 @@ static JSValue js_regexp_Symbol_replace(JSContext *ctx, JSValueConst this_val,
rep_val = JS_UNDEFINED; rep_val = JS_UNDEFINED;
matched = JS_UNDEFINED; matched = JS_UNDEFINED;
tab = JS_UNDEFINED; tab = JS_UNDEFINED;
flags = JS_UNDEFINED;
rep_str = JS_UNDEFINED; rep_str = JS_UNDEFINED;
namedCaptures = JS_UNDEFINED; namedCaptures = JS_UNDEFINED;
@ -40831,10 +40841,18 @@ static JSValue js_regexp_Symbol_replace(JSContext *ctx, JSValueConst this_val,
goto exception; goto exception;
rp = JS_VALUE_GET_STRING(rep_val); rp = JS_VALUE_GET_STRING(rep_val);
} }
fullUnicode = 0;
is_global = JS_ToBoolFree(ctx, JS_GetProperty(ctx, rx, JS_ATOM_global)); flags = JS_GetProperty(ctx, rx, JS_ATOM_flags);
if (is_global < 0) if (JS_IsException(flags))
goto exception; goto exception;
flags = JS_ToStringFree(ctx, flags);
if (JS_IsException(flags))
goto exception;
p = JS_VALUE_GET_STRING(flags);
// TODO(bnoordhuis) query 'u' flag the same way?
fullUnicode = 0;
is_global = (-1 != string_indexof_char(p, 'g', 0));
if (is_global) { if (is_global) {
fullUnicode = JS_ToBoolFree(ctx, JS_GetProperty(ctx, rx, JS_ATOM_unicode)); fullUnicode = JS_ToBoolFree(ctx, JS_GetProperty(ctx, rx, JS_ATOM_unicode));
if (fullUnicode < 0) if (fullUnicode < 0)
@ -40968,6 +40986,7 @@ done1:
value_buffer_free(results); value_buffer_free(results);
JS_FreeValue(ctx, rep_val); JS_FreeValue(ctx, rep_val);
JS_FreeValue(ctx, matched); JS_FreeValue(ctx, matched);
JS_FreeValue(ctx, flags);
JS_FreeValue(ctx, tab); JS_FreeValue(ctx, tab);
JS_FreeValue(ctx, rep_str); JS_FreeValue(ctx, rep_str);
JS_FreeValue(ctx, namedCaptures); JS_FreeValue(ctx, namedCaptures);

View file

@ -37,18 +37,6 @@ test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-r
test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a different error constructor with the same name test262/test/built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js:20: strict mode: Test262Error: Expected a ReferenceError but got a different error constructor with the same name
test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier
test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: strict mode: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier test262/test/built-ins/RegExp/lookahead-quantifier-match-groups.js:27: strict mode: Test262Error: Expected [a, abc] and [a, undefined] to have the same contents. ? quantifier
test262/test/built-ins/RegExp/prototype/Symbol.match/flags-tostring-error.js:22: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.match/flags-tostring-error.js:22: strict mode: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.match/get-flags-err.js:23: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.match/get-flags-err.js:23: strict mode: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.match/get-unicode-error.js:22: Test262Error: Expected a Test262Error to be thrown but no exception was thrown at all
test262/test/built-ins/RegExp/prototype/Symbol.match/get-unicode-error.js:22: strict mode: Test262Error: Expected a Test262Error to be thrown but no exception was thrown at all
test262/test/built-ins/RegExp/prototype/Symbol.replace/flags-tostring-error.js:26: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.replace/flags-tostring-error.js:26: strict mode: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.replace/get-flags-err.js:27: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.replace/get-flags-err.js:27: strict mode: Test262Error: Expected a CustomError but got a Test262Error
test262/test/built-ins/RegExp/prototype/Symbol.replace/get-unicode-error.js:26: Test262Error: Expected a Test262Error to be thrown but no exception was thrown at all
test262/test/built-ins/RegExp/prototype/Symbol.replace/get-unicode-error.js:26: strict mode: Test262Error: Expected a Test262Error to be thrown but no exception was thrown at all
test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js:62: Test262Error: String.prototype.localeCompare considers ö (\u006f\u0308) ≠ ö (\u00f6). test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js:62: Test262Error: String.prototype.localeCompare considers ö (\u006f\u0308) ≠ ö (\u00f6).
test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js:62: strict mode: Test262Error: String.prototype.localeCompare considers ö (\u006f\u0308) ≠ ö (\u00f6). test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js:62: strict mode: Test262Error: String.prototype.localeCompare considers ö (\u006f\u0308) ≠ ö (\u00f6).
test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js:30: TypeError: out-of-bound numeric index (Testing with Float64Array.) test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js:30: TypeError: out-of-bound numeric index (Testing with Float64Array.)