「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?
みなさんこんにちは。
「あの人も読んでる」、第13回目の投稿です。maguro(@yusuktan)がお届けします。
さて、10月と11月は数々の技術カンファレンスが開催されました。カンファレンスの秋ですね。僕も毎週のように何かに参加して、興味のある発表を聞いたり、休憩スペースで大学院の試験勉強をしたりしていました。カンファレンスごとにテーマが違うのはもちろん、運営陣・登壇者・参加者が一体となって作り上げる雰囲気もそれぞれ異なっており、それを直に感じられるオフラインのカンファレンスは良いなと改めて感じました。
今回はそんなカンファレンスで僕が聞いた発表の中から、JavaScriptに関するものを3つご紹介していこうと思います。
JavaScriptにおけるasync/await呼び出しのスタックトレースの困難と実装
まず1つ目は、sosukesuzukiさんによるJSConf JP 2025での発表です。
SafariやBunなどの内部で使われているJavaScriptエンジンであるJavaScriptCore。ここでasync/awaitを使用すると、例外が発生したときのスタックトレースが不完全になってしまうという問題がありました。具体例として、以下の例が紹介されています。
async function foo() {
await bar();
}
async function bar() {
await 1;
throw new Error("oops");
}
foo().catch(e => console.log(e.stack));
このコードを実行したとき、プログラマとしては以下のようなスタックトレースが得られることを期待します。つまり、エラーがthrowされた箇所 bar に至るまで、どのような関数呼び出しが連なっていたのか――この例で言うと、bar が呼び出される前に foo が呼び出されていた、という事実が出力されることを期待します。
Error: oops
at bar (test.js:6:13)
at async foo (test.js:2:16)
しかし、実際には以下のように foo の情報が欠損してしまっていました。
Error: oops
at bar (test.js:6:13)
この欠損という挙動は、JavaScriptのセマンティクスを考えれば説明ができるものの、JavaScript利用者の立場からすると不便であることには変わりありません。そこでsosukesuzukiさんは、JavaScriptCoreに対して修正を加えることで、この問題に対処しようとしました。
