From dc6471f96e20f9fc9ec1beba8c5d5d71609070f1 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 10 Aug 2026 20:00:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20await=20=E7=BB=8F=20promise=5Fresolve=20?= =?UTF-8?q?=E6=8C=89=20constructor=20=E6=9F=A5=E8=AF=A2=E5=8C=85=E8=A3=85?= =?UTF-8?q?=E8=A2=AB=E7=AD=89=E5=BE=85=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/async_func.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/crates/oxide_vm/src/async_func.rs b/crates/oxide_vm/src/async_func.rs index 76856080..ab50fda2 100644 --- a/crates/oxide_vm/src/async_func.rs +++ b/crates/oxide_vm/src/async_func.rs @@ -297,7 +297,7 @@ impl Vm { /// `await` dispatch:PromiseResolve 包装被等待值、登记恢复反应,置挂起信号。 /// /// # 副作用 - /// - 被等待值为原生 Promise 时直接复用,否则建新 promise 并 PromiseResolve。 + /// - 被等待值经 `promise_resolve` 包装(含 `constructor` 查询与 thenable 委托)。 /// - 经 `perform_promise_then` 登记 fulfill/reject 恢复反应(微任务入队)。 /// - 异步生成器内(`async_gen_dispatch`)登记异步生成器恢复闭包并置 /// `async_gen_suspended`;普通异步函数走 `async_suspended`。 @@ -309,7 +309,9 @@ impl Vm { /// await 核心:PromiseResolve 包装被等待值、登记恢复反应,置挂起信号。 /// /// # 副作用 - /// - 被等待值为原生 Promise 时直接复用,否则建新 promise 并 PromiseResolve。 + /// - 被等待值经 `promise_resolve` 包装:原生 Promise 按其 `constructor` + /// 查询决定直接复用或重包装,thenable 委托结算;包装失败(constructor + /// getter / 结算抛错)时构造 rejected promise 承接异常。 /// - 经 `perform_promise_then` 登记 fulfill/reject 恢复反应(微任务入队)。 /// - 异步生成器内(`async_gen_dispatch`)登记异步生成器恢复闭包并置 /// `async_gen_suspended`;普通异步函数走 `async_suspended`。 @@ -318,12 +320,13 @@ impl Vm { Some(c) => c, None => return Err("AWAIT executed outside async function".into()), }; - let promise = if self.is_promise_value(value) { - value - } else { - let (p, _, _) = self.new_promise_capability(); - let _ = self.resolve_promise(p, value); - p + let promise = match self.promise_resolve(value) { + Ok(p) => p, + Err(exc) => { + let (p, _, _) = self.new_promise_capability(); + let _ = self.reject_promise(p, exc); + p + } }; if self.async_gen_dispatch { let fulfill_fn = self.make_async_gen_await_resume_fn(ctx, false);