1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 18:17:34 +00:00

LibJS: Port Value::get_method() to GCPtr

This commit is contained in:
Linus Groh 2023-04-13 15:41:29 +02:00 committed by Andreas Kling
parent 9279b0780d
commit b33b0d60e6
13 changed files with 36 additions and 36 deletions

View file

@ -887,7 +887,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
if (!@js_name@@js_suffix@.is_object()) if (!@js_name@@js_suffix@.is_object())
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, @js_name@@js_suffix@.to_string_without_side_effects())); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, @js_name@@js_suffix@.to_string_without_side_effects()));
auto* iterator_method@recursion_depth@ = TRY(@js_name@@js_suffix@.get_method(vm, vm.well_known_symbol_iterator())); auto iterator_method@recursion_depth@ = TRY(@js_name@@js_suffix@.get_method(vm, vm.well_known_symbol_iterator()));
if (!iterator_method@recursion_depth@) if (!iterator_method@recursion_depth@)
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotIterable, TRY_OR_THROW_OOM(vm, @js_name@@js_suffix@.to_string_without_side_effects())); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotIterable, TRY_OR_THROW_OOM(vm, @js_name@@js_suffix@.to_string_without_side_effects()));
)~~~"); )~~~");
@ -1169,7 +1169,7 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
if (sequence_type) { if (sequence_type) {
// 1. Let method be ? GetMethod(V, @@iterator). // 1. Let method be ? GetMethod(V, @@iterator).
union_generator.append(R"~~~( union_generator.append(R"~~~(
auto* method = TRY(@js_name@@js_suffix@.get_method(vm, vm.well_known_symbol_iterator())); auto method = TRY(@js_name@@js_suffix@.get_method(vm, vm.well_known_symbol_iterator()));
)~~~"); )~~~");
// 2. If method is not undefined, return the result of creating a sequence of that type from V and method. // 2. If method is not undefined, return the result of creating a sequence of that type from V and method.

View file

@ -894,7 +894,7 @@ ThrowCompletionOr<void> GetMethod::execute_impl(Bytecode::Interpreter& interpret
{ {
auto& vm = interpreter.vm(); auto& vm = interpreter.vm();
auto identifier = interpreter.current_executable().get_identifier(m_property); auto identifier = interpreter.current_executable().get_identifier(m_property);
auto* method = TRY(interpreter.accumulator().get_method(vm, identifier)); auto method = TRY(interpreter.accumulator().get_method(vm, identifier));
interpreter.accumulator() = method ?: js_undefined(); interpreter.accumulator() = method ?: js_undefined();
return {}; return {};
} }

View file

@ -1401,7 +1401,7 @@ ThrowCompletionOr<GCPtr<FunctionObject>> get_dispose_method(VM& vm, Value value,
// 2. Else, // 2. Else,
// a. Let method be ? GetMethod(V, @@dispose). // a. Let method be ? GetMethod(V, @@dispose).
return GCPtr<FunctionObject> { TRY(value.get_method(vm, vm.well_known_symbol_dispose())) }; return TRY(value.get_method(vm, vm.well_known_symbol_dispose()));
} }
// 2.1.5 Dispose ( V, hint, method ), https://tc39.es/proposal-explicit-resource-management/#sec-dispose // 2.1.5 Dispose ( V, hint, method ), https://tc39.es/proposal-explicit-resource-management/#sec-dispose

View file

@ -112,7 +112,7 @@ JS_DEFINE_NATIVE_FUNCTION(AsyncFromSyncIteratorPrototype::return_)
// 5. Let return be Completion(GetMethod(syncIterator, "return")). // 5. Let return be Completion(GetMethod(syncIterator, "return")).
// 6. IfAbruptRejectPromise(return, promiseCapability). // 6. IfAbruptRejectPromise(return, promiseCapability).
auto* return_method = TRY_OR_REJECT(vm, promise_capability, Value(sync_iterator).get_method(vm, vm.names.return_)); auto return_method = TRY_OR_REJECT(vm, promise_capability, Value(sync_iterator).get_method(vm, vm.names.return_));
// 7. If return is undefined, then // 7. If return is undefined, then
if (return_method == nullptr) { if (return_method == nullptr) {
@ -165,7 +165,7 @@ JS_DEFINE_NATIVE_FUNCTION(AsyncFromSyncIteratorPrototype::throw_)
// 5. Let throw be Completion(GetMethod(syncIterator, "throw")). // 5. Let throw be Completion(GetMethod(syncIterator, "throw")).
// 6. IfAbruptRejectPromise(throw, promiseCapability). // 6. IfAbruptRejectPromise(throw, promiseCapability).
auto* throw_method = TRY_OR_REJECT(vm, promise_capability, Value(sync_iterator).get_method(vm, vm.names.throw_)); auto throw_method = TRY_OR_REJECT(vm, promise_capability, Value(sync_iterator).get_method(vm, vm.names.throw_));
// 7. If throw is undefined, then // 7. If throw is undefined, then
if (throw_method == nullptr) { if (throw_method == nullptr) {

View file

@ -24,12 +24,12 @@ ThrowCompletionOr<Iterator> get_iterator(VM& vm, Value value, IteratorHint hint,
// a. If hint is async, then // a. If hint is async, then
if (hint == IteratorHint::Async) { if (hint == IteratorHint::Async) {
// i. Set method to ? GetMethod(obj, @@asyncIterator). // i. Set method to ? GetMethod(obj, @@asyncIterator).
auto* async_method = TRY(value.get_method(vm, vm.well_known_symbol_async_iterator())); auto async_method = TRY(value.get_method(vm, vm.well_known_symbol_async_iterator()));
// ii. If method is undefined, then // ii. If method is undefined, then
if (async_method == nullptr) { if (async_method == nullptr) {
// 1. Let syncMethod be ? GetMethod(obj, @@iterator). // 1. Let syncMethod be ? GetMethod(obj, @@iterator).
auto* sync_method = TRY(value.get_method(vm, vm.well_known_symbol_iterator())); auto sync_method = TRY(value.get_method(vm, vm.well_known_symbol_iterator()));
// 2. Let syncIteratorRecord be ? GetIterator(obj, sync, syncMethod). // 2. Let syncIteratorRecord be ? GetIterator(obj, sync, syncMethod).
auto sync_iterator_record = TRY(get_iterator(vm, value, IteratorHint::Sync, sync_method)); auto sync_iterator_record = TRY(get_iterator(vm, value, IteratorHint::Sync, sync_method));
@ -139,7 +139,7 @@ static Completion iterator_close_impl(VM& vm, Iterator const& iterator_record, C
// 4. If innerResult.[[Type]] is normal, then // 4. If innerResult.[[Type]] is normal, then
if (!inner_result.is_error()) { if (!inner_result.is_error()) {
// a. Let return be innerResult.[[Value]]. // a. Let return be innerResult.[[Value]].
auto* return_method = get_method_result.value(); auto return_method = get_method_result.value();
// b. If return is undefined, return ? completion. // b. If return is undefined, return ? completion.
if (!return_method) if (!return_method)

View file

@ -464,7 +464,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::match)
auto this_object = TRY(require_object_coercible(vm, vm.this_value())); auto this_object = TRY(require_object_coercible(vm, vm.this_value()));
auto regexp = vm.argument(0); auto regexp = vm.argument(0);
if (!regexp.is_nullish()) { if (!regexp.is_nullish()) {
if (auto* matcher = TRY(regexp.get_method(vm, vm.well_known_symbol_match()))) if (auto matcher = TRY(regexp.get_method(vm, vm.well_known_symbol_match())))
return TRY(call(vm, *matcher, regexp, this_object)); return TRY(call(vm, *matcher, regexp, this_object));
} }
@ -488,7 +488,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::match_all)
if (!flags_string.contains('g')) if (!flags_string.contains('g'))
return vm.throw_completion<TypeError>(ErrorType::StringNonGlobalRegExp); return vm.throw_completion<TypeError>(ErrorType::StringNonGlobalRegExp);
} }
if (auto* matcher = TRY(regexp.get_method(vm, vm.well_known_symbol_match_all()))) if (auto matcher = TRY(regexp.get_method(vm, vm.well_known_symbol_match_all())))
return TRY(call(vm, *matcher, regexp, this_object)); return TRY(call(vm, *matcher, regexp, this_object));
} }
@ -613,7 +613,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::replace)
auto replace_value = vm.argument(1); auto replace_value = vm.argument(1);
if (!search_value.is_nullish()) { if (!search_value.is_nullish()) {
if (auto* replacer = TRY(search_value.get_method(vm, vm.well_known_symbol_replace()))) if (auto replacer = TRY(search_value.get_method(vm, vm.well_known_symbol_replace())))
return TRY(call(vm, *replacer, search_value, this_object, replace_value)); return TRY(call(vm, *replacer, search_value, this_object, replace_value));
} }
@ -665,7 +665,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::replace_all)
return vm.throw_completion<TypeError>(ErrorType::StringNonGlobalRegExp); return vm.throw_completion<TypeError>(ErrorType::StringNonGlobalRegExp);
} }
auto* replacer = TRY(search_value.get_method(vm, vm.well_known_symbol_replace())); auto replacer = TRY(search_value.get_method(vm, vm.well_known_symbol_replace()));
if (replacer) if (replacer)
return TRY(call(vm, *replacer, search_value, this_object, replace_value)); return TRY(call(vm, *replacer, search_value, this_object, replace_value));
} }
@ -722,7 +722,7 @@ JS_DEFINE_NATIVE_FUNCTION(StringPrototype::search)
auto this_object = TRY(require_object_coercible(vm, vm.this_value())); auto this_object = TRY(require_object_coercible(vm, vm.this_value()));
auto regexp = vm.argument(0); auto regexp = vm.argument(0);
if (!regexp.is_nullish()) { if (!regexp.is_nullish()) {
if (auto* searcher = TRY(regexp.get_method(vm, vm.well_known_symbol_search()))) if (auto searcher = TRY(regexp.get_method(vm, vm.well_known_symbol_search())))
return TRY(call(vm, *searcher, regexp, this_object)); return TRY(call(vm, *searcher, regexp, this_object));
} }

View file

@ -139,7 +139,7 @@ ThrowCompletionOr<Vector<String>> calendar_fields(VM& vm, Object& calendar, Vect
ThrowCompletionOr<Object*> calendar_merge_fields(VM& vm, Object& calendar, Object& fields, Object& additional_fields) ThrowCompletionOr<Object*> calendar_merge_fields(VM& vm, Object& calendar, Object& fields, Object& additional_fields)
{ {
// 1. Let mergeFields be ? GetMethod(calendar, "mergeFields"). // 1. Let mergeFields be ? GetMethod(calendar, "mergeFields").
auto* merge_fields = TRY(Value(&calendar).get_method(vm, vm.names.mergeFields)); auto merge_fields = TRY(Value(&calendar).get_method(vm, vm.names.mergeFields));
// 2. If mergeFields is undefined, then // 2. If mergeFields is undefined, then
if (!merge_fields) { if (!merge_fields) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org> * Copyright (c) 2021-2023, Linus Groh <linusg@serenityos.org>
* Copyright (c) 2021, Luke Wilde <lukew@serenityos.org> * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org>
* *
* SPDX-License-Identifier: BSD-2-Clause * SPDX-License-Identifier: BSD-2-Clause
@ -678,10 +678,10 @@ ThrowCompletionOr<DateDurationRecord> unbalance_duration_relative(VM& vm, double
} }
// b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // b. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// c. Let dateUntil be ? GetMethod(calendar, "dateUntil"). // c. Let dateUntil be ? GetMethod(calendar, "dateUntil").
auto* date_until = TRY(Value(calendar).get_method(vm, vm.names.dateUntil)); auto date_until = TRY(Value(calendar).get_method(vm, vm.names.dateUntil));
// d. Repeat, while years ≠ 0, // d. Repeat, while years ≠ 0,
while (years != 0) { while (years != 0) {
@ -719,7 +719,7 @@ ThrowCompletionOr<DateDurationRecord> unbalance_duration_relative(VM& vm, double
} }
// b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // b. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// c. Repeat, while years ≠ 0, // c. Repeat, while years ≠ 0,
while (years != 0) { while (years != 0) {
@ -762,7 +762,7 @@ ThrowCompletionOr<DateDurationRecord> unbalance_duration_relative(VM& vm, double
} }
// ii. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // ii. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// iii. Repeat, while years ≠ 0, // iii. Repeat, while years ≠ 0,
while (years != 0) { while (years != 0) {
@ -856,7 +856,7 @@ ThrowCompletionOr<DateDurationRecord> balance_duration_relative(VM& vm, double y
// 10. If largestUnit is "year", then // 10. If largestUnit is "year", then
if (largest_unit == "year"sv) { if (largest_unit == "year"sv) {
// a. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // a. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd));
// b. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear, dateAdd). // b. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneYear, dateAdd).
auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_year, date_add)); auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_year, date_add));
@ -922,7 +922,7 @@ ThrowCompletionOr<DateDurationRecord> balance_duration_relative(VM& vm, double y
new_relative_to = TRY(calendar_date_add(vm, calendar, relative_to, *one_year, nullptr, date_add)); new_relative_to = TRY(calendar_date_add(vm, calendar, relative_to, *one_year, nullptr, date_add));
// k. Let dateUntil be ? GetMethod(calendar, "dateUntil"). // k. Let dateUntil be ? GetMethod(calendar, "dateUntil").
auto* date_until = TRY(Value(&calendar).get_method(vm, vm.names.dateUntil)); auto date_until = TRY(Value(&calendar).get_method(vm, vm.names.dateUntil));
// l. Let untilOptions be OrdinaryObjectCreate(null). // l. Let untilOptions be OrdinaryObjectCreate(null).
auto until_options = Object::create(realm, nullptr); auto until_options = Object::create(realm, nullptr);
@ -966,7 +966,7 @@ ThrowCompletionOr<DateDurationRecord> balance_duration_relative(VM& vm, double y
// 11. Else if largestUnit is "month", then // 11. Else if largestUnit is "month", then
else if (largest_unit == "month"sv) { else if (largest_unit == "month"sv) {
// a. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // a. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd));
// b. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth, dateAdd). // b. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneMonth, dateAdd).
auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month, date_add)); auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_month, date_add));
@ -1004,7 +1004,7 @@ ThrowCompletionOr<DateDurationRecord> balance_duration_relative(VM& vm, double y
VERIFY(largest_unit == "week"sv); VERIFY(largest_unit == "week"sv);
// b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // b. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd));
// c. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek, dateAdd). // c. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek, dateAdd).
auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_week, date_add)); auto move_result = TRY(move_relative_date(vm, calendar, *relative_to, *one_week, date_add));
@ -1094,7 +1094,7 @@ ThrowCompletionOr<DurationRecord> add_duration(VM& vm, double years1, double mon
auto* date_duration2 = MUST(create_temporal_duration(vm, years2, months2, weeks2, days2, 0, 0, 0, 0, 0, 0)); auto* date_duration2 = MUST(create_temporal_duration(vm, years2, months2, weeks2, days2, 0, 0, 0, 0, 0, 0));
// d. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // d. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(&calendar).get_method(vm, vm.names.dateAdd));
// e. Let intermediate be ? CalendarDateAdd(calendar, relativeTo, dateDuration1, undefined, dateAdd). // e. Let intermediate be ? CalendarDateAdd(calendar, relativeTo, dateDuration1, undefined, dateAdd).
auto* intermediate = TRY(calendar_date_add(vm, calendar, &relative_to, *date_duration1, nullptr, date_add)); auto* intermediate = TRY(calendar_date_add(vm, calendar, &relative_to, *date_duration1, nullptr, date_add));
@ -1282,7 +1282,7 @@ ThrowCompletionOr<RoundedDuration> round_duration(VM& vm, double years, double m
auto* years_duration = MUST(create_temporal_duration(vm, years, 0, 0, 0, 0, 0, 0, 0, 0, 0)); auto* years_duration = MUST(create_temporal_duration(vm, years, 0, 0, 0, 0, 0, 0, 0, 0, 0));
// b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // b. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// c. Let yearsLater be ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd). // c. Let yearsLater be ? CalendarDateAdd(calendar, relativeTo, yearsDuration, undefined, dateAdd).
auto* years_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_duration, nullptr, date_add)); auto* years_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_duration, nullptr, date_add));
@ -1372,7 +1372,7 @@ ThrowCompletionOr<RoundedDuration> round_duration(VM& vm, double years, double m
auto* years_months = MUST(create_temporal_duration(vm, years, months, 0, 0, 0, 0, 0, 0, 0, 0)); auto* years_months = MUST(create_temporal_duration(vm, years, months, 0, 0, 0, 0, 0, 0, 0, 0));
// b. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // b. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// c. Let yearsMonthsLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonths, undefined, dateAdd). // c. Let yearsMonthsLater be ? CalendarDateAdd(calendar, relativeTo, yearsMonths, undefined, dateAdd).
auto* years_months_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_months, nullptr, date_add)); auto* years_months_later = TRY(calendar_date_add(vm, *calendar, relative_to, *years_months, nullptr, date_add));
@ -1449,7 +1449,7 @@ ThrowCompletionOr<RoundedDuration> round_duration(VM& vm, double years, double m
auto* one_week = MUST(create_temporal_duration(vm, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0)); auto* one_week = MUST(create_temporal_duration(vm, 0, 0, sign, 0, 0, 0, 0, 0, 0, 0));
// c. Let dateAdd be ? GetMethod(calendar, "dateAdd"). // c. Let dateAdd be ? GetMethod(calendar, "dateAdd").
auto* date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd)); auto date_add = TRY(Value(calendar).get_method(vm, vm.names.dateAdd));
// d. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek, dateAdd). // d. Let moveResult be ? MoveRelativeDate(calendar, relativeTo, oneWeek, dateAdd).
auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_week, date_add)); auto move_result = TRY(move_relative_date(vm, *calendar, *relative_to, *one_week, date_add));

View file

@ -329,7 +329,7 @@ ThrowCompletionOr<Object*> to_temporal_time_zone(VM& vm, Value temporal_time_zon
ThrowCompletionOr<double> get_offset_nanoseconds_for(VM& vm, Value time_zone, Instant& instant) ThrowCompletionOr<double> get_offset_nanoseconds_for(VM& vm, Value time_zone, Instant& instant)
{ {
// 1. Let getOffsetNanosecondsFor be ? GetMethod(timeZone, "getOffsetNanosecondsFor"). // 1. Let getOffsetNanosecondsFor be ? GetMethod(timeZone, "getOffsetNanosecondsFor").
auto* get_offset_nanoseconds_for = TRY(time_zone.get_method(vm, vm.names.getOffsetNanosecondsFor)); auto get_offset_nanoseconds_for = TRY(time_zone.get_method(vm, vm.names.getOffsetNanosecondsFor));
// 2. Let offsetNanoseconds be ? Call(getOffsetNanosecondsFor, timeZone, « instant »). // 2. Let offsetNanoseconds be ? Call(getOffsetNanosecondsFor, timeZone, « instant »).
auto offset_nanoseconds_value = TRY(call(vm, get_offset_nanoseconds_for, time_zone, &instant)); auto offset_nanoseconds_value = TRY(call(vm, get_offset_nanoseconds_for, time_zone, &instant));

View file

@ -81,7 +81,7 @@ JS_DEFINE_NATIVE_FUNCTION(TypedArrayConstructor::from)
} }
// 5. Let usingIterator be ? GetMethod(source, @@iterator). // 5. Let usingIterator be ? GetMethod(source, @@iterator).
auto* using_iterator = TRY(source.get_method(vm, vm.well_known_symbol_iterator())); auto using_iterator = TRY(source.get_method(vm, vm.well_known_symbol_iterator()));
// 6. If usingIterator is not undefined, then // 6. If usingIterator is not undefined, then
if (using_iterator) { if (using_iterator) {

View file

@ -508,7 +508,7 @@ ThrowCompletionOr<Value> Value::to_primitive(VM& vm, PreferredType preferred_typ
// 1. If input is an Object, then // 1. If input is an Object, then
if (is_object()) { if (is_object()) {
// a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive). // a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).
auto* exotic_to_primitive = TRY(get_method(vm, vm.well_known_symbol_to_primitive())); auto exotic_to_primitive = TRY(get_method(vm, vm.well_known_symbol_to_primitive()));
// b. If exoticToPrim is not undefined, then // b. If exoticToPrim is not undefined, then
if (exotic_to_primitive) { if (exotic_to_primitive) {
@ -1228,7 +1228,7 @@ ThrowCompletionOr<Value> Value::get(VM& vm, PropertyKey const& property_key) con
} }
// 7.3.11 GetMethod ( V, P ), https://tc39.es/ecma262/#sec-getmethod // 7.3.11 GetMethod ( V, P ), https://tc39.es/ecma262/#sec-getmethod
ThrowCompletionOr<FunctionObject*> Value::get_method(VM& vm, PropertyKey const& property_key) const ThrowCompletionOr<GCPtr<FunctionObject>> Value::get_method(VM& vm, PropertyKey const& property_key) const
{ {
// 1. Assert: IsPropertyKey(P) is true. // 1. Assert: IsPropertyKey(P) is true.
VERIFY(property_key.is_valid()); VERIFY(property_key.is_valid());
@ -1245,7 +1245,7 @@ ThrowCompletionOr<FunctionObject*> Value::get_method(VM& vm, PropertyKey const&
return vm.throw_completion<TypeError>(ErrorType::NotAFunction, TRY_OR_THROW_OOM(vm, function.to_string_without_side_effects())); return vm.throw_completion<TypeError>(ErrorType::NotAFunction, TRY_OR_THROW_OOM(vm, function.to_string_without_side_effects()));
// 5. Return func. // 5. Return func.
return &function.as_function(); return function.as_function();
} }
// 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators
@ -2062,7 +2062,7 @@ ThrowCompletionOr<Value> instance_of(VM& vm, Value value, Value target)
return vm.throw_completion<TypeError>(ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, target.to_string_without_side_effects())); return vm.throw_completion<TypeError>(ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, target.to_string_without_side_effects()));
// 2. Let instOfHandler be ? GetMethod(target, @@hasInstance). // 2. Let instOfHandler be ? GetMethod(target, @@hasInstance).
auto* instance_of_handler = TRY(target.get_method(vm, vm.well_known_symbol_has_instance())); auto instance_of_handler = TRY(target.get_method(vm, vm.well_known_symbol_has_instance()));
// 3. If instOfHandler is not undefined, then // 3. If instOfHandler is not undefined, then
if (instance_of_handler) { if (instance_of_handler) {

View file

@ -392,7 +392,7 @@ public:
bool to_boolean() const; bool to_boolean() const;
ThrowCompletionOr<Value> get(VM&, PropertyKey const&) const; ThrowCompletionOr<Value> get(VM&, PropertyKey const&) const;
ThrowCompletionOr<FunctionObject*> get_method(VM&, PropertyKey const&) const; ThrowCompletionOr<GCPtr<FunctionObject>> get_method(VM&, PropertyKey const&) const;
ErrorOr<String> to_string_without_side_effects() const; ErrorOr<String> to_string_without_side_effects() const;

View file

@ -55,7 +55,7 @@ static JS::ThrowCompletionOr<Vector<String>> convert_value_to_sequence_of_string
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, value.to_string_without_side_effects())); return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAnObject, TRY_OR_THROW_OOM(vm, value.to_string_without_side_effects()));
// 2. Let method be ? GetMethod(V, @@iterator). // 2. Let method be ? GetMethod(V, @@iterator).
auto* method = TRY(value.get_method(vm, vm.well_known_symbol_iterator())); auto method = TRY(value.get_method(vm, vm.well_known_symbol_iterator()));
// 3. If method is undefined, throw a TypeError. // 3. If method is undefined, throw a TypeError.
if (!method) if (!method)