1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-22 14:55:07 +00:00

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).
This commit is contained in:
Nico Weber 2020-08-21 21:41:43 -04:00 committed by Andreas Kling
parent aa25fb8875
commit ebd510ef5e
2 changed files with 6 additions and 2 deletions

View file

@ -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 {};

View file

@ -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)");
});
});