diff --git a/Userland/Libraries/LibJS/Runtime/ArrayConstructor.cpp b/Userland/Libraries/LibJS/Runtime/ArrayConstructor.cpp index 52bcaa3343..4956552fee 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayConstructor.cpp @@ -213,7 +213,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::from) JS_DEFINE_NATIVE_FUNCTION(ArrayConstructor::is_array) { auto value = vm.argument(0); - return Value(value.is_array(global_object)); + return Value(TRY_OR_DISCARD(value.is_array(global_object))); } // 23.1.2.3 Array.of ( ...items ), https://tc39.es/ecma262/#sec-array.of diff --git a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp index c732d4e8ed..7e4718d84f 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp @@ -107,9 +107,7 @@ static Object* array_species_create(GlobalObject& global_object, Object& origina { auto& vm = global_object.vm(); - auto is_array = Value(&original_array).is_array(global_object); - if (vm.exception()) - return {}; + auto is_array = TRY_OR_DISCARD(Value(&original_array).is_array(global_object)); if (!is_array) { auto array = Array::create(global_object, length); @@ -593,7 +591,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat) size_t n = 0; // 23.1.3.1.1 IsConcatSpreadable ( O ), https://tc39.es/ecma262/#sec-isconcatspreadable - auto is_concat_spreadable = [&vm, &global_object](Value const& val) { + auto is_concat_spreadable = [&vm, &global_object](Value const& val) -> bool { if (!val.is_object()) { return false; } @@ -608,7 +606,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat) if (!spreadable.is_undefined()) return spreadable.to_boolean(); - return val.is_array(global_object); + return TRY_OR_DISCARD(val.is_array(global_object)); }; auto append_to_new_array = [&vm, &is_concat_spreadable, &new_array, &global_object, &n](Value arg) { @@ -1895,7 +1893,7 @@ static size_t flatten_into_array(GlobalObject& global_object, Object& new_array, return {}; } - if (depth > 0 && value.is_array(global_object)) { + if (depth > 0 && TRY_OR_DISCARD(value.is_array(global_object))) { if (vm.did_reach_stack_space_limit()) { vm.throw_exception(global_object, ErrorType::CallStackSizeExceeded); return {}; diff --git a/Userland/Libraries/LibJS/Runtime/JSONObject.cpp b/Userland/Libraries/LibJS/Runtime/JSONObject.cpp index 887d7b0faf..568037eeff 100644 --- a/Userland/Libraries/LibJS/Runtime/JSONObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/JSONObject.cpp @@ -54,9 +54,7 @@ String JSONObject::stringify_impl(GlobalObject& global_object, Value value, Valu if (replacer.as_object().is_function()) { state.replacer_function = &replacer.as_function(); } else { - auto is_array = replacer.is_array(global_object); - if (vm.exception()) - return {}; + auto is_array = TRY_OR_DISCARD(replacer.is_array(global_object)); if (is_array) { auto& replacer_object = replacer.as_object(); auto replacer_length = TRY_OR_DISCARD(length_of_array_like(global_object, replacer_object)); @@ -200,9 +198,7 @@ String JSONObject::serialize_json_property(GlobalObject& global_object, Stringif return {}; } if (value.is_object() && !value.is_function()) { - auto is_array = value.is_array(global_object); - if (vm.exception()) - return {}; + auto is_array = TRY_OR_DISCARD(value.is_array(global_object)); if (is_array) { auto result = serialize_json_array(global_object, state, static_cast(value.as_object())); if (vm.exception()) @@ -479,9 +475,7 @@ Value JSONObject::internalize_json_property(GlobalObject& global_object, Object* if (vm.exception()) return {}; if (value.is_object()) { - auto is_array = value.is_array(global_object); - if (vm.exception()) - return {}; + auto is_array = TRY_OR_DISCARD(value.is_array(global_object)); auto& value_object = value.as_object(); auto process_property = [&](const PropertyName& key) { diff --git a/Userland/Libraries/LibJS/Runtime/ObjectPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ObjectPrototype.cpp index f70dd8cd53..fef4b6992b 100644 --- a/Userland/Libraries/LibJS/Runtime/ObjectPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ObjectPrototype.cpp @@ -87,9 +87,7 @@ JS_DEFINE_NATIVE_FUNCTION(ObjectPrototype::to_string) VERIFY(object); // 4. Let isArray be ? IsArray(O). - auto is_array = Value(object).is_array(global_object); - if (vm.exception()) - return {}; + auto is_array = TRY_OR_DISCARD(Value(object).is_array(global_object)); String builtin_tag; diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index 46837c96da..6729c96a2f 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -192,8 +192,10 @@ static String double_to_string(double d) } // 7.2.2 IsArray ( argument ), https://tc39.es/ecma262/#sec-isarray -bool Value::is_array(GlobalObject& global_object) const +ThrowCompletionOr Value::is_array(GlobalObject& global_object) const { + auto& vm = global_object.vm(); + if (!is_object()) return false; auto& object = as_object(); @@ -201,11 +203,8 @@ bool Value::is_array(GlobalObject& global_object) const return true; if (is(object)) { auto& proxy = static_cast(object); - if (proxy.is_revoked()) { - auto& vm = global_object.vm(); - vm.throw_exception(global_object, ErrorType::ProxyRevoked); - return false; - } + if (proxy.is_revoked()) + return vm.throw_completion(global_object, ErrorType::ProxyRevoked); return Value(&proxy.target()).is_array(global_object); } return false; diff --git a/Userland/Libraries/LibJS/Runtime/Value.h b/Userland/Libraries/LibJS/Runtime/Value.h index 895a83c2d1..e61d37b0a4 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.h +++ b/Userland/Libraries/LibJS/Runtime/Value.h @@ -62,7 +62,7 @@ public: bool is_bigint() const { return m_type == Type::BigInt; }; bool is_nullish() const { return is_null() || is_undefined(); } bool is_cell() const { return is_string() || is_accessor() || is_object() || is_bigint() || is_symbol(); } - bool is_array(GlobalObject&) const; + ThrowCompletionOr is_array(GlobalObject&) const; bool is_function() const; bool is_constructor() const; bool is_regexp(GlobalObject&) const;