1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 00:27:43 +00:00

LibJS: Implement RegExp.prototype [ @@search ] with UTF-16 code units

This commit is contained in:
Timothy Flynn 2021-07-22 10:22:07 -04:00 committed by Linus Groh
parent 2c023157e9
commit 66c31a0c07
3 changed files with 21 additions and 13 deletions

View file

@ -787,14 +787,14 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_replace)
// 22.2.5.11 RegExp.prototype [ @@search ] ( string ), https://tc39.es/ecma262/#sec-regexp.prototype-@@search
JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_search)
{
auto string_value = vm.argument(0);
auto* regexp_object = this_object_from(vm, global_object);
if (!regexp_object)
return {};
auto string = string_value.to_string(global_object);
auto string = vm.argument(0).to_utf16_string(global_object);
if (vm.exception())
return {};
Utf16View string_view { string };
auto previous_last_index = regexp_object->get(vm.names.lastIndex);
if (vm.exception())
@ -805,7 +805,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_search)
return {};
}
auto result = regexp_exec(global_object, *regexp_object, string);
auto result = regexp_exec(global_object, *regexp_object, string_view);
if (vm.exception())
return {};

View file

@ -1085,13 +1085,16 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::search)
if (vm.exception())
return {};
}
auto s = this_object.to_string(global_object);
auto string = this_object.to_utf16_string(global_object);
if (vm.exception())
return {};
Utf16View utf16_string_view { string };
auto rx = regexp_create(global_object, regexp, js_undefined());
if (!rx)
return {};
return rx->invoke(*vm.well_known_symbol_search(), js_string(vm, s));
return rx->invoke(*vm.well_known_symbol_search(), js_string(vm, utf16_string_view));
}
// B.2.3.2.1 CreateHTML ( string, tag, attribute, value ), https://tc39.es/ecma262/#sec-createhtml

View file

@ -46,10 +46,15 @@ test("override exec with non-function", () => {
expect("test".search(re)).toBe(0);
});
// FIXME: RegExp.prototype [ @@search ] needs to support UTF-16.
// test("UTF-16", () => {
// var s = "😀";
// expect(s.search("😀")).toBe(0);
// expect(s.search("\ud83d")).toBe(0);
// expect(s.search("\ude00")).toBe(1);
// });
test("UTF-16", () => {
var s = "😀";
expect(s.search("😀")).toBe(0);
expect(s.search("\ud83d")).toBe(0);
expect(s.search("\ude00")).toBe(1);
expect(s.search("foo")).toBe(-1);
s = "\u{80}\u{160}";
expect(s.search("\u{80}")).toBe(0);
expect(s.search("\u{160}")).toBe(1);
expect(s.search("foo")).toBe(-1);
});