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

LibJS: Evaluate replacement value before searching source string

The String.prototype.replace spec requires evaluating the replacement
value (if it is not a function) before searching the source string.

Fixes 4 test262 tests.
This commit is contained in:
Timothy Flynn 2021-07-06 10:49:36 -04:00 committed by Linus Groh
parent 65003241e4
commit 81fec49ac3
4 changed files with 67 additions and 0 deletions

View file

@ -286,6 +286,16 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_replace)
if (vm.exception())
return {};
if (!replace_value.is_function()) {
auto replace_string = replace_value.to_string(global_object);
if (vm.exception())
return {};
replace_value = js_string(vm, move(replace_string));
if (vm.exception())
return {};
}
auto global_value = rx->get(vm.names.global);
if (vm.exception())
return {};

View file

@ -800,6 +800,17 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::replace)
auto search_string = search_value.to_string(global_object);
if (vm.exception())
return {};
if (!replace_value.is_function()) {
auto replace_string = replace_value.to_string(global_object);
if (vm.exception())
return {};
replace_value = js_string(vm, move(replace_string));
if (vm.exception())
return {};
}
Optional<size_t> position = string.find(search_string);
if (!position.has_value())
return js_string(vm, string);
@ -877,6 +888,16 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::replace_all)
if (vm.exception())
return {};
if (!replace_value.is_function()) {
auto replace_string = replace_value.to_string(global_object);
if (vm.exception())
return {};
replace_value = js_string(vm, move(replace_string));
if (vm.exception())
return {};
}
Vector<size_t> match_positions;
size_t advance_by = max(1u, search_string.length());
auto position = string.find(search_string);