summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-06-26 19:17:28 +0100
committerLinus Groh <mail@linusgroh.de>2021-06-26 19:17:28 +0100
commit31f5797e89c368318438b97c2f625e0e3170d11e (patch)
tree8b2f10c690c45c9c45c134fc83662c862fc8ba77
parentdbda5a9a4ccfa3ab8e2e913800559f95dde48291 (diff)
downloadserenity-31f5797e89c368318438b97c2f625e0e3170d11e.zip
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 :^)
-rw-r--r--Userland/Libraries/LibJS/Runtime/Value.cpp16
-rw-r--r--Userland/Libraries/LibJS/Runtime/Value.h2
2 files changed, 18 insertions, 0 deletions
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