2018-11 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
⭕ Modules layering/naming for WebAssembly, for "consensus, ready to merge" WebAssembly の Modules のための PR。
今のところ Source Text Module Records のみがサイクルに入ることが出来るが、これを Cyclic Module Record として切り出して、STMR を CMR のサブクラスとして定義すると WebAssembly の方でも CMR を扱えるようになる。また ECMAScript と WebAssembly の Modules の用語を合わせるというリクエスト。
反応としてはよさそうなので確認されたらマージされそう。
前回の meeting の続き。
ES Modules では namespace が静的に解決されるので、CommonJS Modules のように動的に export する namespace を指定できない。現状の仕様だと
code: (js)
import {name} from "./cjs.js";
に対して、先に "Instantiate" phase で name を待ち構えているので、そのあたりの仕様を変更しようという PR。
Atomics API の順番についてのバグ修正。強い修正と弱い修正の提案がなされたが、弱い方で同意が得られたらしい。
IsRegExp は @@match があるオブジェクトについては無条件で true を返す仕様になっており、それをやるなら RegExp 関連の Symbol をちゃんとすべて見るか、むしろ全く見ないかにしたほうがいいっていう PR(PR 自体は後者)。
Webの互換性の確認がされたら入るっぽい。
前回の meeting の続き。
ついに Edge の ChakraCore でも Array#sort が安定化して、すべての実装で安定ソートになったので仕様に盛り込もうという PR。同意が得られたので最新のブラウザ環境と IE だと安定だとみなしてよさそう。
……以前 ES Discuss では @@isStable を導入したほうが判定できてよいのではないかみたいな話がされてたけど、そのへんの話はなさそう。
Stage 4 (ES2019)
Symbol を作る時の引数に入れるデバッグ用の description は、取り出したいときには Symbol#toString を加工するしかなかったが、Symbol#description の getter で取れるようにする提案。Stage 4 になった。
実装依存だった Function#toString が "[native code]" を返すのをちゃんと仕様にまとめたやつ。Stage 4 になった。
Stage 3
ファイル頭の #! をちゃんとコメント扱いするやつ。Stage 3 になった。
Intl.NumberFormat で扱える単位系を増やす提案。無事 Stage 3 になった。
Stage 2
initializer kind の decorator が入った。
code: (js)
class MyElement extends HTMLElement {
@set onclick = () => { /* … */ }
}
/// ↓
class MyElement extends HTMLElement {
constructor() {
this.onclick = () => { /* … */ }
}
}
このまま行けば来年1月に Stage 3 になる?
Intl.DateTimeFormat に dateStyle, timeStyle の options を追加する提案。無事 Stage 2 になった。
この前の TC39 meeting の Breakout Sessions にて話されたらしい。
今までは WeakRefs を作った時に同時に GC 後の後処理も渡すような仕様だったが、新しい方ではそれらを分けるようになってる。便利そう。
code: (ts)
class WeakRef {
constructor(target: Object);
deref(): Object;
}
class FinalizationGroup {
constructor(cleanupCallback: (items: Iterator) => void);
register(target: Object, holdings: any, unregisterToken?: any): void;
unregister(unregisterToken: any): boolean;
cleanupSome(cleanupCallback: (items: Iterator) => void);
}
WeakRefs が入ると JavaScript 側でオブジェクトが GC された時に関連する WebAssembly の memory を free することが出来るようになるので早く欲しい。
Stage 1
注目されているもののあんまり議論されてなかったのでこれからどうするかを話されたみたい。
Dynamic Import の提案に追加する形で
code: (js)
asset Foo from "foo";
という構文の提案。そして Dynamic Import の import() の引数に渡すことが出来るようにする。
code: (js)
async function Bar() {
let foo = await import(Foo);
}
import と違い、asset で宣言されたときには特に読み込みは行われず、AssetReference というオブジェクトを生成する。それを import() に食わせるようにすることで管理をしやすくしたり、ライブラリなどにそのまま AssetReference を渡したりできる。
また将来的に画像の読み込みが
code: (js)
asset Logo from "./logo.gif";
async function loadLogo() {
let img = document.createElement("img");
img.src = URL.createObjectURL(Logo);
return img;
}
みたいな拡張がなされるのもよいのではとのこと。webpack が要らなくなるので欲しい。Stage 1 になった。
その他
DOM ベースの XSS 脆弱性をなんとかするために、ECMAScript に仕様を追加する過去の提案(消えた)。
例えば
code: (webidl)
interface TrustedHTML {
static TrustedHTML createFromLiteral(LiteralString html);
};
こんな感じの函数があった時に引数にリテラルが入っている場合(TrustedHTML.createFromLiteral("Literal string!"))は問題なく実行されるが、そうでない場合(TrustedHTML.createFromLiteral(formField.value))は TypeError を投げるみたいなことがしたいらしい。
別の方法で解決できるよねとのことで champion が降りたのでそのまま消えた。
ここで例に挙げられている Trusted Types 自体は Content Security Policy で使えるようにするらしい。
タグ付きテンプレートでは、呼ばれる函数側はちゃんとテンプレートとして呼ばれたかが判定できないが、それを判定できるようにする提案。セキュリティ用。
Private State の再考としてあげられたが、コンセンサスが得られなかったので提案としてはなくなる。
WebAssembly と JavaScript とのやり取りで Typed Object というインターフェスを用意してはどうかが Breakout Sessions で議論された。
各実装がどれだけ ECMAScript に則った実装になっているかどうかの指標としての test262 がサイトとして見やすい形で公開された。ChakraCore は頑張ってほしい。
総括
今回は無事 Array#sort が安定ソート化し、Intl 周りの提案が進み順調だったように思う。
また Stage 1 の大量発生に対して3日目に Breakout Sessions として分かれて議論することを試みており、放置されがちな提案もちゃんと Stage が進むようになってくれることを願う。