mirror of
https://github.com/RGBCube/serenity
synced 2025-06-13 21:22:07 +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:
parent
f0912027ff
commit
1b43a6ef2d
3 changed files with 22 additions and 0 deletions
|
@ -139,6 +139,7 @@ class MarkedValueList;
|
||||||
class NativeFunction;
|
class NativeFunction;
|
||||||
class NativeProperty;
|
class NativeProperty;
|
||||||
class PrimitiveString;
|
class PrimitiveString;
|
||||||
|
class PropertyName;
|
||||||
class Reference;
|
class Reference;
|
||||||
class ScopeNode;
|
class ScopeNode;
|
||||||
class ScopeObject;
|
class ScopeObject;
|
||||||
|
|
|
@ -1231,6 +1231,26 @@ TriState abstract_relation(GlobalObject& global_object, bool left_first, Value l
|
||||||
return TriState::False;
|
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)
|
size_t length_of_array_like(GlobalObject& global_object, const Object& object)
|
||||||
{
|
{
|
||||||
// 7.3.18 LengthOfArrayLike, https://tc39.es/ecma262/#sec-lengthofarraylike
|
// 7.3.18 LengthOfArrayLike, https://tc39.es/ecma262/#sec-lengthofarraylike
|
||||||
|
|
|
@ -340,6 +340,7 @@ bool same_value(Value lhs, Value rhs);
|
||||||
bool same_value_zero(Value lhs, Value rhs);
|
bool same_value_zero(Value lhs, Value rhs);
|
||||||
bool same_value_non_numeric(Value lhs, Value rhs);
|
bool same_value_non_numeric(Value lhs, Value rhs);
|
||||||
TriState abstract_relation(GlobalObject&, bool left_first, 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&);
|
size_t length_of_array_like(GlobalObject&, const Object&);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue