From ebd510ef5e577d248024466407515edb96b834b6 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 21 Aug 2020 21:41:43 -0400 Subject: [PATCH] LibJS: Allow conversion from Symbol to String via explicit String() call https://tc39.es/ecma262/#sec-string-constructor-string-value has an explicit special case for Symbols allowing this: If NewTarget is undefined and Type(value) is Symbol, return SymbolDescriptiveString(value). --- Libraries/LibJS/Runtime/StringConstructor.cpp | 2 ++ .../Tests/builtins/Symbol/Symbol.prototype.toString.js | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Libraries/LibJS/Runtime/StringConstructor.cpp b/Libraries/LibJS/Runtime/StringConstructor.cpp index 7ab381e257..1edc7a141f 100644 --- a/Libraries/LibJS/Runtime/StringConstructor.cpp +++ b/Libraries/LibJS/Runtime/StringConstructor.cpp @@ -59,6 +59,8 @@ Value StringConstructor::call(Interpreter& interpreter) { if (!interpreter.argument_count()) return js_string(interpreter, ""); + if (interpreter.argument(0).is_symbol()) + return js_string(interpreter, interpreter.argument(0).as_symbol().to_string()); auto* string = interpreter.argument(0).to_primitive_string(interpreter); if (interpreter.exception()) return {}; diff --git a/Libraries/LibJS/Tests/builtins/Symbol/Symbol.prototype.toString.js b/Libraries/LibJS/Tests/builtins/Symbol/Symbol.prototype.toString.js index 734b7a2191..4a95fe2397 100644 --- a/Libraries/LibJS/Tests/builtins/Symbol/Symbol.prototype.toString.js +++ b/Libraries/LibJS/Tests/builtins/Symbol/Symbol.prototype.toString.js @@ -1,10 +1,12 @@ describe("correct behavior", () => { test("basic functionality", () => { const s1 = Symbol("baz"); - // const s2 = Symbol.for("qux"); + const s2 = Symbol.for("qux"); + // Explicit conversions to string are fine, but implicit toString via concatenation throws. expect(s1.toString()).toBe("Symbol(baz)"); - // expect(s2.toString()).toBe("Symbol(qux)"); + expect(String(s1)).toBe("Symbol(baz)"); + expect(s2.toString()).toBe("Symbol(qux)"); }); });