1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:38:11 +00:00

LibJS: Implement the GetMethod abstract operation

https://tc39.es/ecma262/#sec-getmethod

We have bunch of duplicated on-demand versions of this, let's do it
properly.
This commit is contained in:
Linus Groh 2021-03-02 18:04:13 +01:00 committed by Andreas Kling
parent f0912027ff
commit 1b43a6ef2d
3 changed files with 22 additions and 0 deletions

View file

@ -1231,6 +1231,26 @@ TriState abstract_relation(GlobalObject& global_object, bool left_first, Value l
return TriState::False;
}
Function* get_method(GlobalObject& global_object, Value value, const PropertyName& property_name)
{
// 7.3.10 GetMethod, https://tc39.es/ecma262/#sec-getmethod
auto& vm = global_object.vm();
auto* object = value.to_object(global_object);
if (vm.exception())
return nullptr;
auto property_value = object->get(property_name);
if (vm.exception())
return nullptr;
if (property_value.is_empty() || property_value.is_nullish())
return nullptr;
if (!property_value.is_function()) {
vm.throw_exception<TypeError>(global_object, ErrorType::NotAFunction, property_value.to_string_without_side_effects());
return nullptr;
}
return &property_value.as_function();
}
size_t length_of_array_like(GlobalObject& global_object, const Object& object)
{
// 7.3.18 LengthOfArrayLike, https://tc39.es/ecma262/#sec-lengthofarraylike