1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-10 18:10:56 +09:00

LibJS: Convert to_length() to ThrowCompletionOr

This commit is contained in:
Idan Horowitz 2021-10-17 23:57:37 +03:00
parent 750da61c0f
commit aad12b050b
Notes: sideshowbarker 2024-07-18 02:12:15 +09:00
8 changed files with 20 additions and 34 deletions

View file

@ -425,9 +425,7 @@ JS_DEFINE_NATIVE_FUNCTION(WorkbookObject::sheet)
return JS::Value(&sheet.global_object());
}
} else {
auto index = name_value.to_length(global_object);
if (vm.exception())
return {};
auto index = TRY_OR_DISCARD(name_value.to_length(global_object));
if (index < workbook.sheets().size())
return JS::Value(&workbook.sheets()[index].global_object());
}

View file

@ -79,10 +79,7 @@ ThrowCompletionOr<size_t> length_of_array_like(GlobalObject& global_object, Obje
{
auto& vm = global_object.vm();
auto result = TRY(object.get(vm.names.length));
auto length = result.to_length(global_object);
if (auto* exception = vm.exception())
return throw_completion(exception->value());
return length;
return result.to_length(global_object);
}
// 7.3.19 CreateListFromArrayLike ( obj [ , elementTypes ] ), https://tc39.es/ecma262/#sec-createlistfromarraylike

View file

@ -212,9 +212,8 @@ ThrowCompletionOr<Vector<String>> canonicalize_locale_list(GlobalObject& global_
}
// 5. Let len be ? ToLength(? Get(O, "length")).
auto length = TRY(object->get(vm.names.length)).to_length(global_object);
if (auto* exception = vm.exception())
return throw_completion(exception->value());
auto length_value = TRY(object->get(vm.names.length));
auto length = TRY(length_value.to_length(global_object));
// 6. Let k be 0.
// 7. Repeat, while k < len,

View file

@ -72,9 +72,8 @@ static ThrowCompletionOr<void> increment_last_index(GlobalObject& global_object,
{
auto& vm = global_object.vm();
auto last_index = TRY(regexp_object.get(vm.names.lastIndex)).to_length(global_object);
if (auto* exception = vm.exception())
return throw_completion(exception->value());
auto last_index_value = TRY(regexp_object.get(vm.names.lastIndex));
auto last_index = TRY(last_index_value.to_length(global_object));
last_index = advance_string_index(string, last_index, unicode);
TRY(regexp_object.set(vm.names.lastIndex, Value(last_index), Object::ShouldThrowExceptions::Yes));
@ -154,9 +153,8 @@ static Value regexp_builtin_exec(GlobalObject& global_object, RegExpObject& rege
// FIXME: This should try using internal slots [[RegExpMatcher]], [[OriginalFlags]], etc.
auto& vm = global_object.vm();
auto last_index = TRY_OR_DISCARD(regexp_object.get(vm.names.lastIndex)).to_length(global_object);
if (vm.exception())
return {};
auto last_index_value = TRY_OR_DISCARD(regexp_object.get(vm.names.lastIndex));
auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
auto& regex = regexp_object.regex();
bool global = regex.options().has_flag_set(ECMAScriptFlags::Global);
@ -457,9 +455,8 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_match_all)
if (vm.exception())
return {};
auto* matcher = TRY_OR_DISCARD(matcher_value.to_object(global_object));
auto last_index = TRY_OR_DISCARD(regexp_object->get(vm.names.lastIndex)).to_length(global_object);
if (vm.exception())
return {};
auto last_index_value = TRY_OR_DISCARD(regexp_object->get(vm.names.lastIndex));
auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
TRY_OR_DISCARD(matcher->set(vm.names.lastIndex, Value(last_index), Object::ShouldThrowExceptions::Yes));
@ -668,9 +665,8 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_split)
continue;
}
auto last_index = TRY_OR_DISCARD(splitter->get(vm.names.lastIndex)).to_length(global_object); // 'e' in the spec.
if (vm.exception())
return {};
auto last_index_value = TRY_OR_DISCARD(splitter->get(vm.names.lastIndex));
auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object)); // 'e' in the spec.
last_index = min(last_index, string_view.length_in_code_units());
if (last_index == last_match_end) {

View file

@ -58,9 +58,8 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpStringIteratorPrototype::next)
auto match_string_value = TRY_OR_DISCARD(match_object->get(0));
auto match_string = TRY_OR_DISCARD(match_string_value.to_string(global_object));
if (match_string.is_empty()) {
auto last_index = TRY_OR_DISCARD(iterator->regexp_object().get(vm.names.lastIndex)).to_length(global_object);
if (vm.exception())
return {};
auto last_index_value = TRY_OR_DISCARD(iterator->regexp_object().get(vm.names.lastIndex));
auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
last_index = advance_string_index(iterator->string().view(), last_index, iterator->unicode());

View file

@ -468,9 +468,7 @@ static Value pad_string(GlobalObject& global_object, Utf16String string, PadPlac
auto& vm = global_object.vm();
auto string_length = string.length_in_code_units();
auto max_length = vm.argument(0).to_length(global_object);
if (vm.exception())
return {};
auto max_length = TRY_OR_DISCARD(vm.argument(0).to_length(global_object));
if (max_length <= string_length)
return js_string(vm, move(string));

View file

@ -692,13 +692,13 @@ ThrowCompletionOr<u8> Value::to_u8_clamp(GlobalObject& global_object) const
}
// 7.1.20 ToLength ( argument ), https://tc39.es/ecma262/#sec-tolength
size_t Value::to_length(GlobalObject& global_object) const
ThrowCompletionOr<size_t> Value::to_length(GlobalObject& global_object) const
{
auto& vm = global_object.vm();
auto len = to_integer_or_infinity(global_object);
if (vm.exception())
return {};
if (auto* exception = vm.exception())
return throw_completion(exception->value());
if (len <= 0)
return 0;
// FIXME: The spec says that this function's output range is 0 - 2^53-1. But we don't want to overflow the size_t.
@ -720,8 +720,7 @@ size_t Value::to_index(GlobalObject& global_object) const
vm.throw_exception<RangeError>(global_object, ErrorType::InvalidIndex);
return {};
}
auto index = Value(integer_index).to_length(global_object);
VERIFY(!vm.exception());
auto index = MUST(Value(integer_index).to_length(global_object));
if (integer_index != index) {
vm.throw_exception<RangeError>(global_object, ErrorType::InvalidIndex);
return {};

View file

@ -322,7 +322,7 @@ public:
ThrowCompletionOr<i8> to_i8(GlobalObject&) const;
ThrowCompletionOr<u8> to_u8(GlobalObject&) const;
ThrowCompletionOr<u8> to_u8_clamp(GlobalObject&) const;
size_t to_length(GlobalObject&) const;
ThrowCompletionOr<size_t> to_length(GlobalObject&) const;
size_t to_index(GlobalObject&) const;
double to_integer_or_infinity(GlobalObject&) const;
bool to_boolean() const;