JSConf JP

JavaScriptにおけるasync/await呼び出しのスタックトレースの困難と実装

セッショントラックBJapanese

お手元のChromeで以下のコードを実行してみてください!(もちろんしなくてもいいですよ)

async function foo(x) { await bar(x); }
async function bar(x) { await baz(x); }
async function baz(x) {
    await x;
    throw new Error("error from baz");
}
foo(3).catch(e => { console.log(e.stack); });

こんなスタックトレースが表示されたでしょう!

Error: error from baz
    at baz (<anonymous>:9:11)
    at async bar (<anonymous>:5:5)
    at async foo (<anonymous>:2:5)

うんうん、当たり前ですね。...本当に当たり前ですか!?

実は、JSエンジンの側から見ると、このようなasync/awaitが連なった関数呼び出しの中でエラーが発生した時にちゃんとスタックトレースを作るのって難しいんです。 このセッションでは、実際にJSCでのこの機能の開発に関わっている経験から、なぜこのようなスタックトレースを生成するのが難しいのか、そしてJSエンジンはどのように対応しているのかについて解説します。