summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authorIdan Horowitz <idan.horowitz@gmail.com>2021-04-17 01:46:48 +0300
committerLinus Groh <mail@linusgroh.de>2021-04-17 00:59:36 +0200
commit586f10b6e17a36b045377988205230b29892be0f (patch)
tree56c8c87acc7be8da2cb3ee7ebcf0c68244286dab /Userland/Libraries
parent7744048d0fde1602b8bb68b98d821358ca32c480 (diff)
downloadserenity-586f10b6e17a36b045377988205230b29892be0f.zip
LibJS: Accept symbol property in the `in` operator
This is used by discord.com and allowed by the specification: https://tc39.es/ecma262/#sec-relational-operators-runtime-semantics-evaluation
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibJS/Runtime/Value.cpp4
-rw-r--r--Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js4
2 files changed, 5 insertions, 3 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Value.cpp b/Userland/Libraries/LibJS/Runtime/Value.cpp
index 9f498f0c59..c59440c697 100644
--- a/Userland/Libraries/LibJS/Runtime/Value.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Value.cpp
@@ -1020,10 +1020,10 @@ Value in(GlobalObject& global_object, Value lhs, Value rhs)
global_object.vm().throw_exception<TypeError>(global_object, ErrorType::InOperatorWithObject);
return {};
}
- auto lhs_string = lhs.to_string(global_object);
+ auto lhs_string_or_symbol = StringOrSymbol::from_value(global_object, lhs);
if (global_object.vm().exception())
return {};
- return Value(rhs.as_object().has_property(lhs_string));
+ return Value(rhs.as_object().has_property(lhs_string_or_symbol));
}
Value instance_of(GlobalObject& global_object, Value lhs, Value rhs)
diff --git a/Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js b/Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js
index 1deec41f76..a036171c27 100644
--- a/Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js
+++ b/Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js
@@ -1,10 +1,12 @@
test("in operator with objects", () => {
- const o = { foo: "bar", bar: undefined };
+ const sym = Symbol();
+ const o = { foo: "bar", bar: undefined, [sym]: "qux" };
expect("" in o).toBeFalse();
expect("foo" in o).toBeTrue();
expect("bar" in o).toBeTrue();
expect("baz" in o).toBeFalse();
expect("toString" in o).toBeTrue();
+ expect(sym in o).toBeTrue();
});
test("in operator with arrays", () => {