diff options
author | Linus Groh <mail@linusgroh.de> | 2022-08-21 16:14:51 +0100 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-08-23 13:58:30 +0100 |
commit | f0b793db7420aaaeb5693777f407317f8205b7b1 (patch) | |
tree | e5f59ac441720c700f0091e87606edafa090fbd3 /Userland/Libraries/LibJS | |
parent | d74f8039eb26f7956e02b4ae091a24338d127f1f (diff) | |
download | serenity-f0b793db7420aaaeb5693777f407317f8205b7b1.zip |
LibJS: Replace GlobalObject with VM in RegExp AOs [Part 9/19]
Diffstat (limited to 'Userland/Libraries/LibJS')
8 files changed, 40 insertions, 44 deletions
diff --git a/Userland/Libraries/LibJS/Bytecode/Op.cpp b/Userland/Libraries/LibJS/Bytecode/Op.cpp index 9835c15bf8..566b7ef1aa 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Op.cpp @@ -243,10 +243,12 @@ ThrowCompletionOr<void> NewObject::execute_impl(Bytecode::Interpreter& interpret ThrowCompletionOr<void> NewRegExp::execute_impl(Bytecode::Interpreter& interpreter) const { + auto& vm = interpreter.vm(); + auto source = interpreter.current_executable().get_string(m_source_index); auto flags = interpreter.current_executable().get_string(m_flags_index); - interpreter.accumulator() = TRY(regexp_create(interpreter.global_object(), js_string(interpreter.vm(), source), js_string(interpreter.vm(), flags))); + interpreter.accumulator() = TRY(regexp_create(vm, js_string(vm, source), js_string(vm, flags))); return {}; } diff --git a/Userland/Libraries/LibJS/Runtime/RegExpConstructor.cpp b/Userland/Libraries/LibJS/Runtime/RegExpConstructor.cpp index deabb831a7..c95ca2c937 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpConstructor.cpp @@ -52,7 +52,6 @@ ThrowCompletionOr<Value> RegExpConstructor::call() ThrowCompletionOr<Object*> RegExpConstructor::construct(FunctionObject&) { auto& vm = this->vm(); - auto& global_object = this->global_object(); auto pattern = vm.argument(0); auto flags = vm.argument(1); @@ -83,7 +82,7 @@ ThrowCompletionOr<Object*> RegExpConstructor::construct(FunctionObject&) flags_value = flags; } - return TRY(regexp_create(global_object, pattern_value, flags_value)); + return TRY(regexp_create(vm, pattern_value, flags_value)); } // 22.2.4.2 get RegExp [ @@species ], https://tc39.es/ecma262/#sec-get-regexp-@@species diff --git a/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp b/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp index 8465df5fee..1af4e908c0 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp @@ -154,10 +154,8 @@ void RegExpObject::initialize(Realm& realm) } // 22.2.3.2.2 RegExpInitialize ( obj, pattern, flags ), https://tc39.es/ecma262/#sec-regexpinitialize -ThrowCompletionOr<RegExpObject*> RegExpObject::regexp_initialize(GlobalObject& global_object, Value pattern, Value flags) +ThrowCompletionOr<RegExpObject*> RegExpObject::regexp_initialize(VM& vm, Value pattern, Value flags) { - auto& vm = global_object.vm(); - String f; if (flags.is_undefined()) { f = String::empty(); @@ -205,11 +203,11 @@ String RegExpObject::escape_regexp_pattern() const } // 22.2.3.2.4 RegExpCreate ( P, F ), https://tc39.es/ecma262/#sec-regexpcreate -ThrowCompletionOr<RegExpObject*> regexp_create(GlobalObject& global_object, Value pattern, Value flags) +ThrowCompletionOr<RegExpObject*> regexp_create(VM& vm, Value pattern, Value flags) { - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); auto* regexp_object = RegExpObject::create(realm); - return TRY(regexp_object->regexp_initialize(global_object, pattern, flags)); + return TRY(regexp_object->regexp_initialize(vm, pattern, flags)); } } diff --git a/Userland/Libraries/LibJS/Runtime/RegExpObject.h b/Userland/Libraries/LibJS/Runtime/RegExpObject.h index 799535c6c7..e90d26da00 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpObject.h +++ b/Userland/Libraries/LibJS/Runtime/RegExpObject.h @@ -14,7 +14,7 @@ namespace JS { -ThrowCompletionOr<RegExpObject*> regexp_create(GlobalObject&, Value pattern, Value flags); +ThrowCompletionOr<RegExpObject*> regexp_create(VM&, Value pattern, Value flags); Result<regex::RegexOptions<ECMAScriptFlags>, String> regex_flags_from_string(StringView flags); struct ParseRegexPatternError { @@ -42,7 +42,7 @@ public: RegExpObject(Object& prototype); RegExpObject(Regex<ECMA262> regex, String pattern, String flags, Object& prototype); - ThrowCompletionOr<RegExpObject*> regexp_initialize(GlobalObject&, Value pattern, Value flags); + ThrowCompletionOr<RegExpObject*> regexp_initialize(VM&, Value pattern, Value flags); String escape_regexp_pattern() const; virtual void initialize(Realm&) override; diff --git a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp index ceda008dc5..99b05b8b1b 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp @@ -52,10 +52,8 @@ void RegExpPrototype::initialize(Realm& realm) } // Non-standard abstraction around steps used by multiple prototypes. -static ThrowCompletionOr<void> increment_last_index(GlobalObject& global_object, Object& regexp_object, Utf16View const& string, bool unicode) +static ThrowCompletionOr<void> increment_last_index(VM& vm, Object& regexp_object, Utf16View const& string, bool unicode) { - auto& vm = global_object.vm(); - // Let thisIndex be ℝ(? ToLength(? Get(rx, "lastIndex"))). auto last_index_value = TRY(regexp_object.get(vm.names.lastIndex)); auto last_index = TRY(last_index_value.to_length(vm)); @@ -80,9 +78,9 @@ struct Match { }; // 22.2.5.2.7 GetMatchIndexPair ( S, match ), https://tc39.es/ecma262/#sec-getmatchindexpair -static Value get_match_index_par(GlobalObject& global_object, Utf16View const& string, Match const& match) +static Value get_match_index_par(VM& vm, Utf16View const& string, Match const& match) { - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); // 1. Assert: match.[[StartIndex]] is an integer value ≥ 0 and ≤ the length of S. VERIFY(match.start_index <= string.length_in_code_units()); @@ -96,7 +94,7 @@ static Value get_match_index_par(GlobalObject& global_object, Utf16View const& s } // 22.2.5.2.8 MakeMatchIndicesIndexPairArray ( S, indices, groupNames, hasGroups ), https://tc39.es/ecma262/#sec-makematchindicesindexpairarray -static Value make_match_indices_index_pair_array(GlobalObject& global_object, Utf16View const& string, Vector<Optional<Match>> const& indices, HashMap<FlyString, Match> const& group_names, bool has_groups) +static Value make_match_indices_index_pair_array(VM& vm, Utf16View const& string, Vector<Optional<Match>> const& indices, HashMap<FlyString, Match> const& group_names, bool has_groups) { // Note: This implementation differs from the spec, but has the same behavior. // @@ -112,8 +110,7 @@ static Value make_match_indices_index_pair_array(GlobalObject& global_object, Ut // Therefore, this implementation tracks the group names without the assertion that the group // names align with the indices. The end result is the same. - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); // 1. Let n be the number of elements in indices. // 2. Assert: n < 2^32-1. @@ -142,14 +139,14 @@ static Value make_match_indices_index_pair_array(GlobalObject& global_object, Ut // i. Let matchIndicesArray be undefined. auto match_indices_array = js_undefined(); if (match_indices.has_value()) - match_indices_array = get_match_index_par(global_object, string, *match_indices); + match_indices_array = get_match_index_par(vm, string, *match_indices); // d. Perform ! CreateDataPropertyOrThrow(A, ! ToString(i), matchIndicesArray). MUST(array->create_data_property_or_throw(i, match_indices_array)); } for (auto const& entry : group_names) { - auto match_indices_array = get_match_index_par(global_object, string, entry.value); + auto match_indices_array = get_match_index_par(vm, string, entry.value); // e. If i > 0 and groupNames[i - 1] is not undefined, then // i. Assert: groups is not undefined. @@ -166,10 +163,9 @@ static Value make_match_indices_index_pair_array(GlobalObject& global_object, Ut } // 22.2.5.2.2 RegExpBuiltinExec ( R, S ), https://tc39.es/ecma262/#sec-regexpbuiltinexec -static ThrowCompletionOr<Value> regexp_builtin_exec(GlobalObject& global_object, RegExpObject& regexp_object, Utf16String string) +static ThrowCompletionOr<Value> regexp_builtin_exec(VM& vm, RegExpObject& regexp_object, Utf16String string) { - auto& vm = global_object.vm(); - auto& realm = *global_object.associated_realm(); + auto& realm = *vm.current_realm(); // 1. Let length be the length of S. // 2. Let lastIndex be ℝ(? ToLength(? Get(R, "lastIndex"))). @@ -344,7 +340,7 @@ static ThrowCompletionOr<Value> regexp_builtin_exec(GlobalObject& global_object, // 33. If hasIndices is true, then if (has_indices) { // a. Let indicesArray be MakeMatchIndicesIndexPairArray(S, indices, groupNames, hasGroups). - auto indices_array = make_match_indices_index_pair_array(global_object, string.view(), indices, group_names, has_groups); + auto indices_array = make_match_indices_index_pair_array(vm, string.view(), indices, group_names, has_groups); // b. Perform ! CreateDataProperty(A, "indices", indicesArray). MUST(array->create_data_property(vm.names.indices, indices_array)); } @@ -358,9 +354,10 @@ static ThrowCompletionOr<Value> regexp_builtin_exec(GlobalObject& global_object, } // 22.2.5.2.1 RegExpExec ( R, S ), https://tc39.es/ecma262/#sec-regexpexec -ThrowCompletionOr<Value> regexp_exec(GlobalObject& global_object, Object& regexp_object, Utf16String string) +ThrowCompletionOr<Value> regexp_exec(VM& vm, Object& regexp_object, Utf16String string) { - auto& vm = global_object.vm(); + auto& realm = *vm.current_realm(); + auto& global_object = realm.global_object(); // 1. Let exec be ? Get(R, "exec"). auto exec = TRY(regexp_object.get(vm.names.exec)); @@ -383,7 +380,7 @@ ThrowCompletionOr<Value> regexp_exec(GlobalObject& global_object, Object& regexp return vm.throw_completion<TypeError>(ErrorType::NotAnObjectOfType, "RegExp"); // 4. Return ? RegExpBuiltinExec(R, S). - return regexp_builtin_exec(global_object, static_cast<RegExpObject&>(regexp_object), move(string)); + return regexp_builtin_exec(vm, static_cast<RegExpObject&>(regexp_object), move(string)); } // 22.2.5.2.3 AdvanceStringIndex ( S, index, unicode ), https://tc39.es/ecma262/#sec-advancestringindex @@ -448,7 +445,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::exec) auto string = TRY(vm.argument(0).to_utf16_string(vm)); // 4. Return ? RegExpBuiltinExec(R, S). - return TRY(regexp_builtin_exec(global_object, *regexp_object, move(string))); + return TRY(regexp_builtin_exec(vm, *regexp_object, move(string))); } // 22.2.5.4 get RegExp.prototype.flags, https://tc39.es/ecma262/#sec-get-regexp.prototype.flags @@ -508,7 +505,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_match) // 5. If global is false, then if (!global) { // a. Return ? RegExpExec(rx, S). - return TRY(regexp_exec(global_object, *regexp_object, move(string))); + return TRY(regexp_exec(vm, *regexp_object, move(string))); } // 6. Else, @@ -533,7 +530,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_match) // g. Repeat, while (true) { // i. Let result be ? RegExpExec(rx, S). - auto result_value = TRY(regexp_exec(global_object, *regexp_object, string)); + auto result_value = TRY(regexp_exec(vm, *regexp_object, string)); // ii. If result is null, then if (result_value.is_null()) { @@ -560,7 +557,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_match) // 3. If matchStr is the empty String, then if (match_str.is_empty()) { // Steps 3a-3c are implemented by increment_last_index. - TRY(increment_last_index(global_object, *regexp_object, string.view(), full_unicode)); + TRY(increment_last_index(vm, *regexp_object, string.view(), full_unicode)); } // 4. Set n to n + 1. @@ -660,7 +657,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_replace) // 11. Repeat, while done is false, while (true) { // a. Let result be ? RegExpExec(rx, S). - auto result = TRY(regexp_exec(global_object, *regexp_object, string)); + auto result = TRY(regexp_exec(vm, *regexp_object, string)); // b. If result is null, set done to true. if (result.is_null()) @@ -684,7 +681,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_replace) // 2. If matchStr is the empty String, then if (match_str.is_empty()) { // Steps 2a-2c are implemented by increment_last_index. - TRY(increment_last_index(global_object, *regexp_object, string.view(), full_unicode)); + TRY(increment_last_index(vm, *regexp_object, string.view(), full_unicode)); } } @@ -826,7 +823,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_search) } // 6. Let result be ? RegExpExec(rx, S). - auto result = TRY(regexp_exec(global_object, *regexp_object, move(string))); + auto result = TRY(regexp_exec(vm, *regexp_object, move(string))); // 7. Let currentLastIndex be ? Get(rx, "lastIndex"). auto current_last_index = TRY(regexp_object->get(vm.names.lastIndex)); @@ -918,7 +915,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_split) // 16. If size is 0, then if (string.is_empty()) { // a. Let z be ? RegExpExec(splitter, S). - auto result = TRY(regexp_exec(global_object, *splitter, string)); + auto result = TRY(regexp_exec(vm, *splitter, string)); // b. If z is not null, return A. if (!result.is_null()) @@ -943,7 +940,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_split) TRY(splitter->set(vm.names.lastIndex, Value(next_search_from), Object::ShouldThrowExceptions::Yes)); // b. Let z be ? RegExpExec(splitter, S). - auto result = TRY(regexp_exec(global_object, *splitter, string)); + auto result = TRY(regexp_exec(vm, *splitter, string)); // c. If z is null, set q to AdvanceStringIndex(S, q, unicodeMatching). if (result.is_null()) { @@ -1036,7 +1033,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::test) auto string = TRY(vm.argument(0).to_utf16_string(vm)); // 4. Let match be ? RegExpExec(R, string). - auto match = TRY(regexp_exec(global_object, *regexp_object, move(string))); + auto match = TRY(regexp_exec(vm, *regexp_object, move(string))); // 5. If match is not null, return true; else return false. return Value(!match.is_null()); @@ -1091,7 +1088,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::compile) // b. Let F be flags. // 5. Return ? RegExpInitialize(O, P, F). - return TRY(regexp_object->regexp_initialize(global_object, pattern, flags)); + return TRY(regexp_object->regexp_initialize(vm, pattern, flags)); } } diff --git a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.h b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.h index 6aa0da074a..4eea613c89 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/RegExpPrototype.h @@ -12,7 +12,7 @@ namespace JS { -ThrowCompletionOr<Value> regexp_exec(GlobalObject& global_object, Object& regexp_object, Utf16String string); +ThrowCompletionOr<Value> regexp_exec(VM&, Object& regexp_object, Utf16String string); size_t advance_string_index(Utf16View const& string, size_t index, bool unicode); class RegExpPrototype final : public PrototypeObject<RegExpPrototype, RegExpObject> { diff --git a/Userland/Libraries/LibJS/Runtime/RegExpStringIteratorPrototype.cpp b/Userland/Libraries/LibJS/Runtime/RegExpStringIteratorPrototype.cpp index ee6cfbf9aa..95cfd18f82 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpStringIteratorPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpStringIteratorPrototype.cpp @@ -37,7 +37,7 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpStringIteratorPrototype::next) if (iterator->done()) return create_iterator_result_object(vm, js_undefined(), true); - auto match = TRY(regexp_exec(global_object, iterator->regexp_object(), iterator->string())); + auto match = TRY(regexp_exec(vm, iterator->regexp_object(), iterator->string())); if (match.is_null()) { iterator->set_done(); diff --git a/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp b/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp index da499788ec..c541597866 100644 --- a/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/StringPrototype.cpp @@ -796,7 +796,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::match) auto string = TRY(this_object.to_utf16_string(vm)); - auto* rx = TRY(regexp_create(global_object, regexp, js_undefined())); + auto* rx = TRY(regexp_create(vm, regexp, js_undefined())); return TRY(Value(rx).invoke(vm, *vm.well_known_symbol_match(), js_string(vm, move(string)))); } @@ -820,7 +820,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::match_all) auto string = TRY(this_object.to_utf16_string(vm)); - auto* rx = TRY(regexp_create(global_object, regexp, js_string(vm, "g"))); + auto* rx = TRY(regexp_create(vm, regexp, js_string(vm, "g"))); return TRY(Value(rx).invoke(vm, *vm.well_known_symbol_match_all(), js_string(vm, move(string)))); } @@ -972,7 +972,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::search) auto string = TRY(this_object.to_utf16_string(vm)); - auto* rx = TRY(regexp_create(global_object, regexp, js_undefined())); + auto* rx = TRY(regexp_create(vm, regexp, js_undefined())); return TRY(Value(rx).invoke(vm, *vm.well_known_symbol_search(), js_string(vm, move(string)))); } |