Skip to content

Commit 48e3e19

Browse files
committed
calling Symbol.for with a primitive never throws
1 parent 4ff88d0 commit 48e3e19

File tree

4 files changed

+54
-1
lines changed

4 files changed

+54
-1
lines changed

internal/bundler_tests/bundler_dce_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4977,3 +4977,33 @@ func TestDCEOfSymbolCtorCall(t *testing.T) {
49774977
},
49784978
})
49794979
}
4980+
4981+
func TestDCEOfSymbolForCall(t *testing.T) {
4982+
dce_suite.expectBundled(t, bundled{
4983+
files: map[string]string{
4984+
"/entry.js": `
4985+
const y0 = Symbol.for(undefined)
4986+
const y1 = Symbol.for(null)
4987+
const y2 = Symbol.for(true)
4988+
const y3 = Symbol.for(123)
4989+
const y4 = Symbol.for(123n)
4990+
const y5 = Symbol.for('abc')
4991+
const y6 = Symbol.for(/* @__PURE__ */ (() => Math.random() < 0.5)() ? 'x' : 'y')
4992+
4993+
const n0 = Symbol.for()
4994+
const n1 = Symbol.for({})
4995+
const n2 = Symbol.for(/./)
4996+
const n3 = Symbol.for(() => 0)
4997+
const n4 = Symbol.for(x)
4998+
const n5 = new Symbol.for('abc')
4999+
const n6 = Symbol.for(1, 2, 3)
5000+
const n7 = Symbol.for((() => Math.random() < 0.5)() ? 'x' : 'y')
5001+
`,
5002+
},
5003+
entryPaths: []string{"/entry.js"},
5004+
options: config.Options{
5005+
Mode: config.ModeBundle,
5006+
AbsOutputFile: "/out.js",
5007+
},
5008+
})
5009+
}

internal/bundler_tests/snapshots/snapshots_dce.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,19 @@ var n4 = new Symbol("abc");
675675
var n5 = Symbol(1, 2, 3);
676676
var n6 = /* @__PURE__ */ Symbol((() => Math.random() < 0.5)() ? "x" : "y");
677677

678+
================================================================================
679+
TestDCEOfSymbolForCall
680+
---------- /out.js ----------
681+
// entry.js
682+
var n0 = Symbol.for();
683+
var n1 = Symbol.for({});
684+
var n2 = Symbol.for(/./);
685+
var n3 = Symbol.for(() => 0);
686+
var n4 = Symbol.for(x);
687+
var n5 = new Symbol.for("abc");
688+
var n6 = Symbol.for(1, 2, 3);
689+
var n7 = /* @__PURE__ */ Symbol.for((() => Math.random() < 0.5)() ? "x" : "y");
690+
678691
================================================================================
679692
TestDCEOfSymbolInstances
680693
---------- /out/class.js ----------

internal/js_parser/js_parser.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15266,6 +15266,16 @@ func (p *parser) visitExprInOut(expr js_ast.Expr, in exprIn) (js_ast.Expr, exprO
1526615266
}
1526715267
}
1526815268

15269+
case "for":
15270+
// Calling "Symbol.for()" with a primitive will never throw
15271+
if id, ok := t.Target.Data.(*js_ast.EIdentifier); ok {
15272+
if symbol := &p.symbols[id.Ref.InnerIndex]; symbol.Kind == ast.SymbolUnbound && symbol.OriginalName == "Symbol" {
15273+
if js_ast.KnownPrimitiveType(e.Args[0].Data) != js_ast.PrimitiveUnknown {
15274+
e.CanBeUnwrappedIfUnused = true
15275+
}
15276+
}
15277+
}
15278+
1526915279
case "create":
1527015280
// Recognize "Object.create()" calls
1527115281
if id, ok := t.Target.Data.(*js_ast.EIdentifier); ok {

scripts/decorator-tests.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
var __create = Object.create;
22
var __defProp = Object.defineProperty;
33
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4-
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
4+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
55
var __typeError = (msg) => {
66
throw TypeError(msg);
77
};

0 commit comments

Comments
 (0)