From b9c7a629f8d4c266430caec7769c8d90203c65cf Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sat, 18 Sep 2021 19:33:45 +0300 Subject: [PATCH] LibJS: Convert coerce_options_to_object() to ThrowCompletionOr --- .../LibJS/Runtime/Intl/AbstractOperations.cpp | 13 ++++++++----- .../LibJS/Runtime/Intl/AbstractOperations.h | 2 +- .../LibJS/Runtime/Intl/LocaleConstructor.cpp | 4 +--- .../Libraries/LibJS/Runtime/Intl/NumberFormat.cpp | 4 +--- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp index 7b4e0fd837..1683d7f237 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp @@ -573,9 +573,7 @@ ThrowCompletionOr supported_locales(GlobalObject& global_object, Vector< auto& vm = global_object.vm(); // 1. Set options to ? CoerceOptionsToObject(options). - auto* options_object = coerce_options_to_object(global_object, options); - if (vm.exception()) - return {}; + auto* options_object = TRY(coerce_options_to_object(global_object, options)); // 2. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). auto matcher = TRY(get_option(global_object, *options_object, vm.names.localeMatcher, Value::Type::String, { "lookup"sv, "best fit"sv }, "best fit"sv)); @@ -598,8 +596,10 @@ ThrowCompletionOr supported_locales(GlobalObject& global_object, Vector< } // 9.2.12 CoerceOptionsToObject ( options ), https://tc39.es/ecma402/#sec-coerceoptionstoobject -Object* coerce_options_to_object(GlobalObject& global_object, Value options) +ThrowCompletionOr coerce_options_to_object(GlobalObject& global_object, Value options) { + auto& vm = global_object.vm(); + // 1. If options is undefined, then if (options.is_undefined()) { // a. Return ! OrdinaryObjectCreate(null). @@ -607,7 +607,10 @@ Object* coerce_options_to_object(GlobalObject& global_object, Value options) } // 2. Return ? ToObject(options). - return options.to_object(global_object); + auto result = options.to_object(global_object); + if (auto* exception = vm.exception()) + return throw_completion(exception->value()); + return result; } // 9.2.13 GetOption ( options, property, type, values, fallback ), https://tc39.es/ecma402/#sec-getoption diff --git a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.h b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.h index 57622204e5..fd5b949d4c 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.h +++ b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.h @@ -45,7 +45,7 @@ LocaleResult resolve_locale(Vector const& requested_locales, LocaleOptio Vector lookup_supported_locales(Vector const& requested_locales); Vector best_fit_supported_locales(Vector const& requested_locales); ThrowCompletionOr supported_locales(GlobalObject&, Vector const& requested_locales, Value options); -Object* coerce_options_to_object(GlobalObject& global_object, Value options); +ThrowCompletionOr coerce_options_to_object(GlobalObject& global_object, Value options); ThrowCompletionOr get_option(GlobalObject& global_object, Object const& options, PropertyName const& property, Value::Type type, Vector const& values, Fallback fallback); Optional default_number_option(GlobalObject& global_object, Value value, int minimum, int maximum, Optional fallback); Optional get_number_option(GlobalObject& global_object, Object const& options, PropertyName const& property, int minimum, int maximum, Optional fallback); diff --git a/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp b/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp index 3919b9c094..e6e1ae778b 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/LocaleConstructor.cpp @@ -298,9 +298,7 @@ Value LocaleConstructor::construct(FunctionObject& new_target) } // 10. Set options to ? CoerceOptionsToObject(options). - auto* options = coerce_options_to_object(global_object, options_value); - if (vm.exception()) - return {}; + auto* options = TRY_OR_DISCARD(coerce_options_to_object(global_object, options_value)); // 11. Set tag to ? ApplyOptionsToTag(tag, options). if (auto applied_tag = apply_options_to_tag(global_object, tag, *options); applied_tag.has_value()) diff --git a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp index e53dd58e73..a36e360bbc 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/NumberFormat.cpp @@ -360,9 +360,7 @@ NumberFormat* initialize_number_format(GlobalObject& global_object, NumberFormat auto requested_locales = TRY_OR_DISCARD(canonicalize_locale_list(global_object, locales_value)); // 2. Set options to ? CoerceOptionsToObject(options). - auto* options = coerce_options_to_object(global_object, options_value); - if (vm.exception()) - return {}; + auto* options = TRY_OR_DISCARD(coerce_options_to_object(global_object, options_value)); // 3. Let opt be a new Record. LocaleOptions opt {};