diff options
author | Idan Horowitz <idan.horowitz@gmail.com> | 2021-04-17 01:46:48 +0300 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2021-04-17 00:59:36 +0200 |
commit | 586f10b6e17a36b045377988205230b29892be0f (patch) | |
tree | 56c8c87acc7be8da2cb3ee7ebcf0c68244286dab /Userland/Libraries | |
parent | 7744048d0fde1602b8bb68b98d821358ca32c480 (diff) | |
download | serenity-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.cpp | 4 | ||||
-rw-r--r-- | 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<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", () => { |