From 31f5797e89c368318438b97c2f625e0e3170d11e Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 26 Jun 2021 19:17:28 +0100 Subject: [PATCH] LibJS: Implement the GetV() abstract operation Like Get(), but with any value instead of an object - it's calling ToObject() for us and passes the value to [[Get]]() as the receiver. This will be used in GetMethod() (and a couple of other places, which can be updated over time). I also tried something new here: adding the three steps from the spec as inline comments :^) --- Userland/Libraries/LibJS/Runtime/Value.cpp | 16 ++++++++++++++++ Userland/Libraries/LibJS/Runtime/Value.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp index a640ccc58c..35a1d18a0b 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.cpp +++ b/Userland/Libraries/LibJS/Runtime/Value.cpp @@ -789,6 +789,22 @@ double Value::to_integer_or_infinity(GlobalObject& global_object) const return integer; } +// 7.3.3 GetV ( V, P ), https://tc39.es/ecma262/#sec-getv +Value Value::get(GlobalObject& global_object, PropertyName const& property_name) const +{ + auto& vm = global_object.vm(); + + // 1. Assert: IsPropertyKey(P) is true. + + // 2. Let O be ? ToObject(V). + auto* object = to_object(global_object); + if (vm.exception()) + return {}; + + // 3. Return ? O.[[Get]](P, V). + return object->get(property_name, *this); +} + // 13.10 Relational Operators, https://tc39.es/ecma262/#sec-relational-operators Value greater_than(GlobalObject& global_object, Value lhs, Value rhs) { diff --git a/Userland/Libraries/LibJS/Runtime/Value.h b/Userland/Libraries/LibJS/Runtime/Value.h index e178c04e9a..e7217af3ba 100644 --- a/Userland/Libraries/LibJS/Runtime/Value.h +++ b/Userland/Libraries/LibJS/Runtime/Value.h @@ -287,6 +287,8 @@ public: double to_integer_or_infinity(GlobalObject&) const; bool to_boolean() const; + Value get(GlobalObject&, PropertyName const&) const; + String to_string_without_side_effects() const; Value value_or(Value fallback) const