Browse Source

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 :^)
Linus Groh 4 năm trước cách đây
mục cha
commit
31f5797e89

+ 16 - 0
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)
 {

+ 2 - 0
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