2023-11 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
Provide source text to HostEnsureCanCompileStrings PR #3222 (slides) | Nicolò Ribaudo, Philip Chimento eval などの函数に文字列が渡されたときに HostEnsureCanCompileStrings が実行される。これにソーステキストを渡すことで、CSP などで安全な eval を許可出来るようにする提案。
例えば以下のように直接リテラルを実行する場合安全と言える。
code: js
let realm = new ShadowRealm();
realm.evaluate(`
delete Math.random;
delete Date.now;
`);
CSP 側としては script-src ディレクティブに unsafe-hashes-eval を追加する形になりそう。
https://gyazo.com/d053890c3f33acba0addb432d0c7220b
Allow users to specify rounding based on cash denominations in common use PR #839 | Ben Allen 通貨に対する桁の仕様は ISO 4217 と CLDR がある。現状 Intl.NumberFormat で使われる CurrentDigits は ISO 4217 で定められた仕様を元に定義されているが、実装としては Firefox は ISO 4217 ベースで、V8 は CLDR ベースとなっている。また HTML Standard も CLDR ベースとなっている。
Stage 4 (ES2024)
無事 Stage 4 になった 🎉
無事 Stage 4 になった 🎉
Stage 3
正規表現の部分式で i (ignoreCase), m (multiline) そして s (dotAll) フラグを対応する提案。
code: js
const re1 = /^a-z(?-i:a-z)$/i; re1.test("ab"); // true
re1.test("Ab"); // true
re1.test("aB"); // false
re2.test("ab"); // true
re2.test("Ab"); // true
re2.test("aB"); // false
仕様テキストを ES2024 v (unicodeSets) フラグに合わせて更新したとのこと。
前回の -u-fw について修正が入る。
IETF で IXDTF が承認された。
Normative Change として閏年の扱いについて議論されている。{PlainMonthDay,PlainYearMonth}.prototype.toPlainDate の "overflow" オプションのデフォルトを "reject" から "constrain" に変えることで2月29日生まれの人でもデフォルトでは例外なく実行できるようになった。
code: js
const birthday = Temporal.PlainMonthDay.from("2-29");
// Current: throws an Exception
birthday.toPlainDate({ year: 2030 });
また各ランタイムにおける test262 の結果は以下の通り。
https://gyazo.com/9eda5f45d11a54005c111628bd7d3017
Intl.DurationFormat stage 3 update and normative PRs (slides) | Ben Allen いくつかの細かい Normative Changes があった。
Decorators normative update re: extra initializers (PR) | Kristen Hewell Garrett 複数の Decorators がついている場合、その初期化順はメソッド定義とインスタンス変数の定義で異なっている。そのためインスタンス変数に函数を定義する際に、Decorators の実装が大変になってしまう。
code: js
// It's not possible to ensure that both a and b behave the same
class Foo {
@foo @bar @baz
a() {
console.log('test')
}
@foo @bar @baz
b = () => {
console.log('test')
}
}
これを解決するために accessor と field デコレーターに [[ExtraInitializers]] を追加する Normative Change。承認された。
Iterator helpers web compat continuation (backup PR) | Michael Ficarra & Shu-yu Guo 結果的に Normative Change が入った。
経緯は別の記事に書いた。
Stage 2
WebIDL 的には [Exposed=*] となっている API が ShadowRealm に実装されることとなった。
import defer に対して export ... from でも同様な機能を追加したい話が出ている。
ストリーム周りが引き続き議論中。
Stage 1
どういう API にするか具体的に決まったとのこと。
code: js
for (const val of Iterator.zip([
])) {
}
for (const val of Iterator.zip({
})) {
console.log(val); // => { a: 1, b: 4, c: 7 }, { a: 2, b: 5, c: 8 }, { a: 3, b: 6, c: 9 }
}
また受け取った Iterators のサイズが異なるときに例外を投げるかどうかをオプションで指定できる。
どういう API にするか議論中。
https://gyazo.com/3cfee9a553132e5f58541d824638a12c
ネガティブインデックスについて [a[^i] のシンタックスを追加する話が出ている。また ArrayLike に対してや代入についてどうするか議論されている。
code: js
Decimal stage 1 update & request for feedback (slide) | Jesse Alama co-champion として Oracle の方が入られた。プリミティブからオブジェクトになった今、ライブラリとしてではなくネイティブに実装するメリットがあるのかどうか議論された。
Top-level await によってモジュールが非同期として扱えるようになったことにより予期せぬバグを引き起こしている。例えば以下のようなブラウザ拡張で some-module.js が非同期の場合、先に chrome.runtime.onInstalled.addListener が実行されてしまう。
code: js
import './some-module.js';
chrome.runtime.onInstalled.addListener(function () {
// open welcome page
});
これを解決するためにモジュールが同期的に実行されるかどうかのアサート処理を入れる提案。シンタックスは決まっていないが例えば一例として以下のようになる(assert キーワードは使えないだろうけど)。
code: js
// a must sync but b don't have to
import 'a' assert { sync: true };
import 'b';
Stage 1 になった。
Math.sum を追加する提案。今のところ実装依存だが Kahan の加算アルゴリズムがいいのではないかとしている。
以前 Stage 1 Math Extensions で自分が Kahan の加算アルゴリズムを提案したけど、新たに別提案として進める感じなのだろうか?
Stage 1 になった。
Stage 0
以前提案されていた arr[^i] を Stage 1 Slice Notation に取り込みたい話。
URL.canParse 同様に JSON にも似たようなものを生やす提案。リジェクトされた。
Withdrawn
V8 と SpiderMonkey からコストと利益のトレードオフが不明瞭という指摘があった。この提案は廃止となった。
Operator Overloading ありきの提案だったためこちらも廃止となった。
その他
continuation of the new stage discussion (slides) Stage 2.7 が生まれた。
Stop Coercing Things (pt 3) (slides) 今後追加される API について、boolean を除いてオブジェクトから暗黙的型変換されず、プリミティブ間の変換も制限される。
FAQ のリポジトリが誕生した。
Recruiting people interested in JSX to join the matrix room | Jack Works Requesting collaborators for writing and publishing a paper on the TC39 Process at IEEE | Mikhail Barash
TG4 proposals process (doc, slides) | Nicolò Ribaudo present TCQ reloaded update and get initial feedback | Christian Ulbrich
総括