fix: 异常兜底路径经 create_from_text 恢复错误类型(不塌缩普通 Error)

This commit is contained in:
2026-08-10 20:19:51 +08:00
parent 9ba5821568
commit a968b89658
8 changed files with 65 additions and 59 deletions
+6 -6
View File
@@ -163,7 +163,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
reject_with(vm, exc);
return NativeResult::Ok(promise);
}
@@ -175,7 +175,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
reject_with(vm, exc);
return NativeResult::Ok(promise);
}
@@ -205,7 +205,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
reject_with(vm, exc);
NativeResult::Ok(promise)
}
@@ -316,7 +316,7 @@ fn async_from_sync_next(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
return NativeResult::Err(exc);
}
};
@@ -344,7 +344,7 @@ fn async_from_sync_return(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
return NativeResult::Err(exc);
}
};
@@ -377,7 +377,7 @@ fn async_from_sync_throw(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
return NativeResult::Err(exc);
}
};
+3 -3
View File
@@ -167,7 +167,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
self.finish_async(state_ptr, Err(exc))?;
self.restore_inline_state(saved);
Ok(())
@@ -248,7 +248,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
self.finish_async(state_ptr, Err(exc))?;
self.restore_inline_state(saved);
Ok(())
@@ -390,7 +390,7 @@ fn async_await_resume_closure(vm: &mut Vm, args: &[u8]) -> NativeResult {
};
match vm.resume_async(ctx, mode) {
Ok(()) => NativeResult::Ok(JsValue::undefined()),
Err(e) => NativeResult::Err(oxide_builtins::error::create_error(vm, &e)),
Err(e) => NativeResult::Err(oxide_builtins::error::create_from_text(vm, &e)),
}
}
+5 -5
View File
@@ -176,7 +176,7 @@ impl Vm {
Ok(v) => {
oxide_builtins::error::create_error(self, &format!("async generator initialization failed: {v:?}"))
}
Err(e) => oxide_builtins::error::create_error(self, &e),
Err(e) => oxide_builtins::error::create_from_text(self, &e),
});
let kind = self.thrown_error_kind(exc);
unsafe { (*state_ptr).phase = AsyncGenPhase::Completed };
@@ -221,7 +221,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
return Err(exc);
}
}
@@ -337,7 +337,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
self.restore_async_gen_flags(prev_ctx, prev_gen_ctx, prev_gd, prev_ad, prev_agd);
return self.finish_async_gen_exc(state_ptr, saved, gen_val, exc);
}
@@ -467,7 +467,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
self.finish_async_gen_exc(state_ptr, saved, gen_val, exc)
}
}
@@ -629,7 +629,7 @@ fn async_gen_await_resume_closure(vm: &mut Vm, args: &[u8]) -> NativeResult {
}
match vm.resume_async_generator(ctx) {
Ok(()) => NativeResult::Ok(JsValue::undefined()),
Err(e) => NativeResult::Err(oxide_builtins::error::create_error(vm, &e)),
Err(e) => NativeResult::Err(oxide_builtins::error::create_from_text(vm, &e)),
}
}
+3 -3
View File
@@ -187,7 +187,7 @@ impl Vm {
// 参数初始化抛错/异常结束:恢复调用方上下文后重新抛出。
let exc = self.last_uncaught_value.take().unwrap_or_else(|| match result {
Ok(v) => oxide_builtins::error::create_error(self, &format!("generator initialization failed: {v:?}")),
Err(e) => oxide_builtins::error::create_error(self, &e),
Err(e) => oxide_builtins::error::create_from_text(self, &e),
});
let kind = self.thrown_error_kind(exc);
unsafe { (*state_ptr).phase = GeneratorPhase::Completed };
@@ -296,7 +296,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
self.restore_inline_state(saved);
self.native_call_depth -= 1;
let state = unsafe { &mut *state_ptr };
@@ -409,7 +409,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
let state = unsafe { &mut *state_ptr };
state.phase = GeneratorPhase::Completed;
state.result = JsValue::undefined();
+18 -18
View File
@@ -212,7 +212,7 @@ impl Vm {
Err(e) => Err(self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e))),
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e))),
}
}
@@ -327,7 +327,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
return self.reject_promise(promise, exc);
}
};
@@ -415,7 +415,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
return Err(exc);
}
};
@@ -429,7 +429,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
return Err(exc);
}
Ok(promise)
@@ -545,7 +545,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
let _ = self.call_function_sync(reject, JsValue::undefined(), &[exc]);
}
}
@@ -563,7 +563,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
let _ = self.call_function_sync(reject, JsValue::undefined(), &[exc]);
}
}
@@ -713,7 +713,7 @@ fn promise_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
let _ = vm.reject_promise(this_val, exc);
NativeResult::Ok(this_val)
}
@@ -742,7 +742,7 @@ fn promise_resolve_closure(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
let _ = vm.reject_promise(promise, exc);
}
NativeResult::Ok(JsValue::undefined())
@@ -825,7 +825,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e));
return Err(exc);
}
};
@@ -837,7 +837,7 @@ impl Vm {
Err(e) => Err(self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, &e))),
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, &e))),
}
}
@@ -1082,7 +1082,7 @@ fn promise_finally_handler(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
NativeResult::Err(exc)
}
}
@@ -1102,7 +1102,7 @@ fn promise_static_resolve(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
return NativeResult::Err(exc);
}
};
@@ -1121,7 +1121,7 @@ fn promise_static_resolve(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
NativeResult::Err(exc)
}
}
@@ -1141,7 +1141,7 @@ fn promise_static_reject(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
NativeResult::Err(exc)
}
}
@@ -1217,7 +1217,7 @@ fn perform_promise_combine(
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
let _ = vm.call_function_sync(reject, JsValue::undefined(), &[exc]);
return Ok(promise);
}
@@ -1415,7 +1415,7 @@ fn agg_call_resolve(vm: &mut Vm, record: JsValue, arg: JsValue) {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
let reject = agg_record_val(vm, record, AGG_REJECT_PROP);
let _ = vm.call_function_sync(reject, JsValue::undefined(), &[exc]);
}
@@ -1425,7 +1425,7 @@ fn agg_call_resolve(vm: &mut Vm, record: JsValue, arg: JsValue) {
fn agg_engine_error(vm: &mut Vm, err: &str) -> JsValue {
vm.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, err))
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, err))
}
/// IteratorClose:调用迭代器的 `return()`(可调用时),忽略其抛错。
@@ -1548,7 +1548,7 @@ fn aggregate_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
let exc = vm
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, &e));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, &e));
return NativeResult::Err(exc);
}
};
+1 -1
View File
@@ -437,7 +437,7 @@ impl Vm {
let exc = self
.last_uncaught_value
.take()
.unwrap_or_else(|| oxide_builtins::error::create_error(self, err));
.unwrap_or_else(|| oxide_builtins::error::create_from_text(self, err));
let kind = self.thrown_error_kind(exc);
self.exception_value = Some(exc);
self.pending_error_kind = Some(kind);