pub(crate) fn promise_finally_m(
it: &mut Interp,
this: Value,
a: &[Value],
) -> Result<Value, Value>Expand description
Promise.prototype.finally(cb)。以前は cb を fulfill/reject 双方で副作用として
実行するだけで戻り値/例外を完全に無視していた。仕様上は cb が例外を投げる、
または reject する Promise を返した場合、その結果が元の settle を上書きすべき
(Promise.resolve(1).finally(() => { throw 'x' }) は 1 ではなく 'x' で
reject すべき)で、これが cb に副作用以上の意味が無いという誤った前提の
静かな破壊バグだった。ネイティブ関数はクロージャで cb/this を束縛できない
ため(AbortSignal.any 等と同じ制約)、グローバルの一時変数経由で渡した上で
eval_source に組み立てた JS(仕様の finally 展開そのもの)を実行する。