mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 14:25: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:
parent
aa25fb8875
commit
ebd510ef5e
2 changed files with 6 additions and 2 deletions
|
@ -59,6 +59,8 @@ Value StringConstructor::call(Interpreter& interpreter)
|
||||||
{
|
{
|
||||||
if (!interpreter.argument_count())
|
if (!interpreter.argument_count())
|
||||||
return js_string(interpreter, "");
|
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);
|
auto* string = interpreter.argument(0).to_primitive_string(interpreter);
|
||||||
if (interpreter.exception())
|
if (interpreter.exception())
|
||||||
return {};
|
return {};
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
describe("correct behavior", () => {
|
describe("correct behavior", () => {
|
||||||
test("basic functionality", () => {
|
test("basic functionality", () => {
|
||||||
const s1 = Symbol("baz");
|
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(s1.toString()).toBe("Symbol(baz)");
|
||||||
// expect(s2.toString()).toBe("Symbol(qux)");
|
expect(String(s1)).toBe("Symbol(baz)");
|
||||||
|
expect(s2.toString()).toBe("Symbol(qux)");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue