diff options
author | Idan Horowitz <idan.horowitz@gmail.com> | 2021-06-10 23:50:48 +0300 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-06-10 22:44:26 +0100 |
commit | b041108a1e4afc72905be9b60285890ddf41ad48 (patch) | |
tree | 886a481e1b9b744a89ed05a445817700709e453f | |
parent | 4531f689ff2fa976ffcbfadd329a1b3c903c00af (diff) | |
download | serenity-b041108a1e4afc72905be9b60285890ddf41ad48.zip |
LibJS: Explicitly return and accept a Function* in species_constructor
The second argument (the default constructor) and the return value have
to be constructors (as a result functions), so we can require that
explicitly by using appropriate types.
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/Value.cpp | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibJS/Runtime/Value.h | 2 |
3 files changed, 5 insertions, 5 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp b/Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp index 61043c7fe7..b1bddfed4c 100644 --- a/Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/PromisePrototype.cpp @@ -89,7 +89,7 @@ JS_DEFINE_NATIVE_FUNCTION(PromisePrototype::finally) } else { // 27.2.5.3.1 Then Finally Functions, https://tc39.es/ecma262/#sec-thenfinallyfunctions auto* then_finally_function = NativeFunction::create(global_object, "", [constructor_handle = make_handle(constructor), on_finally_handle = make_handle(&on_finally.as_function())](auto& vm, auto& global_object) -> Value { - auto& constructor = const_cast<Object&>(*constructor_handle.cell()); + auto& constructor = const_cast<Function&>(*constructor_handle.cell()); auto& on_finally = const_cast<Function&>(*on_finally_handle.cell()); auto value = vm.argument(0); auto result = vm.call(on_finally, js_undefined()); @@ -107,7 +107,7 @@ JS_DEFINE_NATIVE_FUNCTION(PromisePrototype::finally) // 27.2.5.3.2 Catch Finally Functions, https://tc39.es/ecma262/#sec-catchfinallyfunctions auto* catch_finally_function = NativeFunction::create(global_object, "", [constructor_handle = make_handle(constructor), on_finally_handle = make_handle(&on_finally.as_function())](auto& vm, auto& global_object) -> Value { - auto& constructor = const_cast<Object&>(*constructor_handle.cell()); + auto& constructor = const_cast<Function&>(*constructor_handle.cell()); auto& on_finally = const_cast<Function&>(*on_finally_handle.cell()); auto reason = vm.argument(0); auto result = vm.call(on_finally, js_undefined()); diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index df4429f66f..ded9689eaf 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -1387,7 +1387,7 @@ size_t length_of_array_like(GlobalObject& global_object, const Object& object) } // 7.3.22 SpeciesConstructor, https://tc39.es/ecma262/#sec-speciesconstructor -Object* species_constructor(GlobalObject& global_object, const Object& object, Object& default_constructor) +Function* species_constructor(GlobalObject& global_object, const Object& object, Function& default_constructor) { auto& vm = global_object.vm(); auto constructor = object.get(vm.names.constructor).value_or(js_undefined()); @@ -1403,7 +1403,7 @@ Object* species_constructor(GlobalObject& global_object, const Object& object, O if (species.is_nullish()) return &default_constructor; if (species.is_constructor()) - return &species.as_object(); + return &species.as_function(); vm.throw_exception<TypeError>(global_object, ErrorType::NotAConstructor, species.to_string_without_side_effects()); return nullptr; } diff --git a/Userland/Libraries/LibJS/Runtime/Value.h b/Userland/Libraries/LibJS/Runtime/Value.h index 601ebe3164..654992c5f0 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.h +++ b/Userland/Libraries/LibJS/Runtime/Value.h @@ -372,7 +372,7 @@ bool same_value_non_numeric(Value lhs, Value rhs); TriState abstract_relation(GlobalObject&, bool left_first, Value lhs, Value rhs); Function* get_method(GlobalObject& global_object, Value, const PropertyName&); size_t length_of_array_like(GlobalObject&, const Object&); -Object* species_constructor(GlobalObject&, const Object&, Object& default_constructor); +Function* species_constructor(GlobalObject&, const Object&, Function& default_constructor); Value require_object_coercible(GlobalObject&, Value); MarkedValueList create_list_from_array_like(GlobalObject&, Value, AK::Function<Result<void, ErrorType>(Value)> = {}); |