Skip to main content

promise_finally_m

Function promise_finally_m 

Source
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 展開そのもの)を実行する。