1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:27:43 +00: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
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()); return JS::Value(&sheet.global_object());
} }
} else { } else {
auto index = name_value.to_length(global_object); auto index = TRY_OR_DISCARD(name_value.to_length(global_object));
if (vm.exception())
return {};
if (index < workbook.sheets().size()) if (index < workbook.sheets().size())
return JS::Value(&workbook.sheets()[index].global_object()); 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& vm = global_object.vm();
auto result = TRY(object.get(vm.names.length)); auto result = TRY(object.get(vm.names.length));
auto length = result.to_length(global_object); return result.to_length(global_object);
if (auto* exception = vm.exception())
return throw_completion(exception->value());
return length;
} }
// 7.3.19 CreateListFromArrayLike ( obj [ , elementTypes ] ), https://tc39.es/ecma262/#sec-createlistfromarraylike // 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")). // 5. Let len be ? ToLength(? Get(O, "length")).
auto length = TRY(object->get(vm.names.length)).to_length(global_object); auto length_value = TRY(object->get(vm.names.length));
if (auto* exception = vm.exception()) auto length = TRY(length_value.to_length(global_object));
return throw_completion(exception->value());
// 6. Let k be 0. // 6. Let k be 0.
// 7. Repeat, while k < len, // 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& vm = global_object.vm();
auto last_index = TRY(regexp_object.get(vm.names.lastIndex)).to_length(global_object); auto last_index_value = TRY(regexp_object.get(vm.names.lastIndex));
if (auto* exception = vm.exception()) auto last_index = TRY(last_index_value.to_length(global_object));
return throw_completion(exception->value());
last_index = advance_string_index(string, last_index, unicode); last_index = advance_string_index(string, last_index, unicode);
TRY(regexp_object.set(vm.names.lastIndex, Value(last_index), Object::ShouldThrowExceptions::Yes)); 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. // FIXME: This should try using internal slots [[RegExpMatcher]], [[OriginalFlags]], etc.
auto& vm = global_object.vm(); auto& vm = global_object.vm();
auto last_index = TRY_OR_DISCARD(regexp_object.get(vm.names.lastIndex)).to_length(global_object); auto last_index_value = TRY_OR_DISCARD(regexp_object.get(vm.names.lastIndex));
if (vm.exception()) auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
return {};
auto& regex = regexp_object.regex(); auto& regex = regexp_object.regex();
bool global = regex.options().has_flag_set(ECMAScriptFlags::Global); bool global = regex.options().has_flag_set(ECMAScriptFlags::Global);
@ -457,9 +455,8 @@ JS_DEFINE_NATIVE_FUNCTION(RegExpPrototype::symbol_match_all)
if (vm.exception()) if (vm.exception())
return {}; return {};
auto* matcher = TRY_OR_DISCARD(matcher_value.to_object(global_object)); 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); auto last_index_value = TRY_OR_DISCARD(regexp_object->get(vm.names.lastIndex));
if (vm.exception()) auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
return {};
TRY_OR_DISCARD(matcher->set(vm.names.lastIndex, Value(last_index), Object::ShouldThrowExceptions::Yes)); 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; continue;
} }
auto last_index = TRY_OR_DISCARD(splitter->get(vm.names.lastIndex)).to_length(global_object); // 'e' in the spec. auto last_index_value = TRY_OR_DISCARD(splitter->get(vm.names.lastIndex));
if (vm.exception()) auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object)); // 'e' in the spec.
return {};
last_index = min(last_index, string_view.length_in_code_units()); last_index = min(last_index, string_view.length_in_code_units());
if (last_index == last_match_end) { 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_value = TRY_OR_DISCARD(match_object->get(0));
auto match_string = TRY_OR_DISCARD(match_string_value.to_string(global_object)); auto match_string = TRY_OR_DISCARD(match_string_value.to_string(global_object));
if (match_string.is_empty()) { if (match_string.is_empty()) {
auto last_index = TRY_OR_DISCARD(iterator->regexp_object().get(vm.names.lastIndex)).to_length(global_object); auto last_index_value = TRY_OR_DISCARD(iterator->regexp_object().get(vm.names.lastIndex));
if (vm.exception()) auto last_index = TRY_OR_DISCARD(last_index_value.to_length(global_object));
return {};
last_index = advance_string_index(iterator->string().view(), last_index, iterator->unicode()); 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& vm = global_object.vm();
auto string_length = string.length_in_code_units(); auto string_length = string.length_in_code_units();
auto max_length = vm.argument(0).to_length(global_object); auto max_length = TRY_OR_DISCARD(vm.argument(0).to_length(global_object));
if (vm.exception())
return {};
if (max_length <= string_length) if (max_length <= string_length)
return js_string(vm, move(string)); 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 // 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& vm = global_object.vm();
auto len = to_integer_or_infinity(global_object); auto len = to_integer_or_infinity(global_object);
if (vm.exception()) if (auto* exception = vm.exception())
return {}; return throw_completion(exception->value());
if (len <= 0) if (len <= 0)
return 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. // 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); vm.throw_exception<RangeError>(global_object, ErrorType::InvalidIndex);
return {}; return {};
} }
auto index = Value(integer_index).to_length(global_object); auto index = MUST(Value(integer_index).to_length(global_object));
VERIFY(!vm.exception());
if (integer_index != index) { if (integer_index != index) {
vm.throw_exception<RangeError>(global_object, ErrorType::InvalidIndex); vm.throw_exception<RangeError>(global_object, ErrorType::InvalidIndex);
return {}; return {};

View file

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