From 586f10b6e17a36b045377988205230b29892be0f Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sat, 17 Apr 2021 01:46:48 +0300 Subject: [PATCH] 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 --- Userland/Libraries/LibJS/Runtime/Value.cpp | 4 ++-- Userland/Libraries/LibJS/Tests/operators/in-operator-basic.js | 4 +++- 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(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", () => {