Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/twocore/frontend/js/lower.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -4473,7 +4473,9 @@ fn is_wellknown_symbol(name: String) -> Bool {
| "search"
| "split"
| "isConcatSpreadable"
| "unscopables" -> True
| "unscopables"
| "dispose"
| "asyncDispose" -> True
_ -> False
}
}
Expand Down
31 changes: 31 additions & 0 deletions test/js_compiler_test.gleam
Original file line number Diff line number Diff line change
Expand Up @@ -6851,3 +6851,34 @@ pub fn array_map_thisarg_arrow_unaffected_test() {
val("[1, 2, 3].map((x) => x * 2, { k: 9 }).join(',')")
|> should.equal(dyn("2,4,6"))
}

// ==== Symbol (wave 13) ====

// Explicit Resource Management (ES2026) adds two well-known Symbols, `Symbol.dispose`
// (§ Symbol.dispose) and `Symbol.asyncDispose`. Like every other well-known Symbol they
// must EXIST as fixed unique values: `typeof` is "symbol", each is `===` only to itself,
// and the two are distinct from each other and from other well-known Symbols.
pub fn symbol_dispose_wellknown_test() {
val("typeof Symbol.dispose") |> should.equal(dyn("symbol"))
val("typeof Symbol.asyncDispose") |> should.equal(dyn("symbol"))
val("Symbol.dispose === Symbol.dispose") |> should.equal(dyn(True))
val("Symbol.asyncDispose === Symbol.asyncDispose") |> should.equal(dyn(True))
val("Symbol.dispose === Symbol.asyncDispose") |> should.equal(dyn(False))
val("Symbol.dispose === Symbol.iterator") |> should.equal(dyn(False))
}

// §20.4.2.7 Symbol.keyFor: a well-known Symbol was NOT created via the global
// registry (`Symbol.for`), so it has no registered key — `Symbol.keyFor` returns
// undefined for it. (test262: built-ins/Symbol/{dispose,asyncDispose}/no-key.js.)
pub fn symbol_dispose_not_in_registry_test() {
let m =
compile(
"function f(){ return Symbol.keyFor(Symbol.dispose) === undefined; }",
)
call(m, "f", []) |> should.equal(dyn(True))
let n =
compile(
"function f(){ return Symbol.keyFor(Symbol.asyncDispose) === undefined; }",
)
call(n, "f", []) |> should.equal(dyn(True))
}
Loading