fix: 异常兜底路径经 create_from_text 恢复错误类型(不塌缩普通 Error)
This commit is contained in:
@@ -155,31 +155,11 @@ pub(crate) fn invoke_native_callback<H: VmHost>(
|
|||||||
Ok(value) => NativeResult::Ok(value),
|
Ok(value) => NativeResult::Ok(value),
|
||||||
Err(err) => match vm.take_uncaught_value() {
|
Err(err) => match vm.take_uncaught_value() {
|
||||||
Some(original) => NativeResult::Err(original),
|
Some(original) => NativeResult::Err(original),
|
||||||
None => NativeResult::Err(callback_error_from_text(vm, &err)),
|
None => NativeResult::Err(crate::error::create_from_text(vm, &err)),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn callback_error_from_text<H: VmHost>(vm: &mut H, err: &str) -> JsValue {
|
|
||||||
let err = err.strip_prefix("uncaught ").unwrap_or(err);
|
|
||||||
if let Some(msg) = err.strip_prefix("TypeError: ") {
|
|
||||||
return crate::error::create_type_error(vm, msg);
|
|
||||||
}
|
|
||||||
if let Some(msg) = err.strip_prefix("ReferenceError: ") {
|
|
||||||
return crate::error::create_reference_error(vm, msg);
|
|
||||||
}
|
|
||||||
if let Some(msg) = err.strip_prefix("RangeError: ") {
|
|
||||||
return crate::error::create_range_error(vm, msg);
|
|
||||||
}
|
|
||||||
if let Some(msg) = err.strip_prefix("SyntaxError: ") {
|
|
||||||
return crate::error::create_syntax_error(vm, msg);
|
|
||||||
}
|
|
||||||
if let Some(msg) = err.strip_prefix("Error: ") {
|
|
||||||
return crate::error::create_error(vm, msg);
|
|
||||||
}
|
|
||||||
crate::error::create_error(vm, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn unexpected_tail_call_error<H: VmHost>(vm: &mut H) -> NativeResult {
|
fn unexpected_tail_call_error<H: VmHost>(vm: &mut H) -> NativeResult {
|
||||||
NativeResult::Err(crate::error::create_type_error(vm, "unexpected tail call in array callback"))
|
NativeResult::Err(crate::error::create_type_error(vm, "unexpected tail call in array callback"))
|
||||||
}
|
}
|
||||||
@@ -412,9 +392,9 @@ pub fn array_from<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
NativeResult::Ok(JsValue::from_js_object(a_ptr))
|
NativeResult::Ok(JsValue::from_js_object(a_ptr))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 引擎调用边界抛出的错误恢复为原始异常值(透传),否则按错误文本构造普通错误。
|
/// 引擎调用边界抛出的错误恢复为原始异常值(透传),否则按错误文本构造对应 kind 的错误。
|
||||||
fn from_engine_error<H: VmHost>(vm: &mut H, err: &str) -> JsValue {
|
fn from_engine_error<H: VmHost>(vm: &mut H, err: &str) -> JsValue {
|
||||||
vm.take_uncaught_value().unwrap_or_else(|| callback_error_from_text(vm, err))
|
vm.take_uncaught_value().unwrap_or_else(|| crate::error::create_from_text(vm, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 按构造函数 C 构造 Array.from 的结果对象:C 可构造时以 C.prototype 分配 `this`
|
/// 按构造函数 C 构造 Array.from 的结果对象:C 可构造时以 C.prototype 分配 `this`
|
||||||
|
|||||||
@@ -65,6 +65,32 @@ pub fn create_error<H: VmHost>(host: &mut H, msg: &str) -> JsValue {
|
|||||||
create_kind_error(host, "Error", msg)
|
create_kind_error(host, "Error", msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 从错误文本(形如 `TypeError: msg` / `ReferenceError: msg`)解析类型前缀并创建
|
||||||
|
/// 对应 kind 的错误对象;无前缀时创建普通 Error。
|
||||||
|
///
|
||||||
|
/// # 使用场景
|
||||||
|
/// 异常传播链中错误对象被降级为文本(error_text 输出、`last_uncaught_value` 被
|
||||||
|
/// 嵌套覆盖后的兜底路径)时,据此恢复错误类型,避免全部塌缩成普通 Error。
|
||||||
|
pub fn create_from_text<H: VmHost>(host: &mut H, text: &str) -> JsValue {
|
||||||
|
let text = text.strip_prefix("uncaught ").unwrap_or(text);
|
||||||
|
for (kind, prefix) in [
|
||||||
|
("TypeError", "TypeError: "),
|
||||||
|
("ReferenceError", "ReferenceError: "),
|
||||||
|
("RangeError", "RangeError: "),
|
||||||
|
("SyntaxError", "SyntaxError: "),
|
||||||
|
("URIError", "URIError: "),
|
||||||
|
("EvalError", "EvalError: "),
|
||||||
|
] {
|
||||||
|
if let Some(msg) = text.strip_prefix(prefix) {
|
||||||
|
return create_kind_error(host, kind, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let Some(msg) = text.strip_prefix("Error: ") {
|
||||||
|
return create_kind_error(host, "Error", msg);
|
||||||
|
}
|
||||||
|
create_error(host, text)
|
||||||
|
}
|
||||||
|
|
||||||
/// 创建一个带指定 message 的 ReferenceError 对象。
|
/// 创建一个带指定 message 的 ReferenceError 对象。
|
||||||
pub fn create_reference_error<H: VmHost>(host: &mut H, msg: &str) -> JsValue {
|
pub fn create_reference_error<H: VmHost>(host: &mut H, msg: &str) -> JsValue {
|
||||||
create_kind_error(host, "ReferenceError", msg)
|
create_kind_error(host, "ReferenceError", msg)
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
reject_with(vm, exc);
|
||||||
return NativeResult::Ok(promise);
|
return NativeResult::Ok(promise);
|
||||||
}
|
}
|
||||||
@@ -175,7 +175,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
reject_with(vm, exc);
|
||||||
return NativeResult::Ok(promise);
|
return NativeResult::Ok(promise);
|
||||||
}
|
}
|
||||||
@@ -205,7 +205,7 @@ fn continue_async_from_sync(vm: &mut Vm, inner: JsValue, result: Result<JsValue,
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
reject_with(vm, exc);
|
||||||
NativeResult::Ok(promise)
|
NativeResult::Ok(promise)
|
||||||
}
|
}
|
||||||
@@ -316,7 +316,7 @@ fn async_from_sync_next(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -344,7 +344,7 @@ fn async_from_sync_return(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -377,7 +377,7 @@ fn async_from_sync_throw(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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.finish_async(state_ptr, Err(exc))?;
|
||||||
self.restore_inline_state(saved);
|
self.restore_inline_state(saved);
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -248,7 +248,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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.finish_async(state_ptr, Err(exc))?;
|
||||||
self.restore_inline_state(saved);
|
self.restore_inline_state(saved);
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -390,7 +390,7 @@ fn async_await_resume_closure(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
};
|
};
|
||||||
match vm.resume_async(ctx, mode) {
|
match vm.resume_async(ctx, mode) {
|
||||||
Ok(()) => NativeResult::Ok(JsValue::undefined()),
|
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)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ impl Vm {
|
|||||||
Ok(v) => {
|
Ok(v) => {
|
||||||
oxide_builtins::error::create_error(self, &format!("async generator initialization failed: {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);
|
let kind = self.thrown_error_kind(exc);
|
||||||
unsafe { (*state_ptr).phase = AsyncGenPhase::Completed };
|
unsafe { (*state_ptr).phase = AsyncGenPhase::Completed };
|
||||||
@@ -221,7 +221,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return Err(exc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -337,7 +337,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
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);
|
return self.finish_async_gen_exc(state_ptr, saved, gen_val, exc);
|
||||||
}
|
}
|
||||||
@@ -467,7 +467,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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)
|
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) {
|
match vm.resume_async_generator(ctx) {
|
||||||
Ok(()) => NativeResult::Ok(JsValue::undefined()),
|
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)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ impl Vm {
|
|||||||
// 参数初始化抛错/异常结束:恢复调用方上下文后重新抛出。
|
// 参数初始化抛错/异常结束:恢复调用方上下文后重新抛出。
|
||||||
let exc = self.last_uncaught_value.take().unwrap_or_else(|| match result {
|
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:?}")),
|
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);
|
let kind = self.thrown_error_kind(exc);
|
||||||
unsafe { (*state_ptr).phase = GeneratorPhase::Completed };
|
unsafe { (*state_ptr).phase = GeneratorPhase::Completed };
|
||||||
@@ -296,7 +296,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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.restore_inline_state(saved);
|
||||||
self.native_call_depth -= 1;
|
self.native_call_depth -= 1;
|
||||||
let state = unsafe { &mut *state_ptr };
|
let state = unsafe { &mut *state_ptr };
|
||||||
@@ -409,7 +409,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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 };
|
let state = unsafe { &mut *state_ptr };
|
||||||
state.phase = GeneratorPhase::Completed;
|
state.phase = GeneratorPhase::Completed;
|
||||||
state.result = JsValue::undefined();
|
state.result = JsValue::undefined();
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ impl Vm {
|
|||||||
Err(e) => Err(self
|
Err(e) => Err(self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return self.reject_promise(promise, exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -415,7 +415,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -429,7 +429,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return Err(exc);
|
||||||
}
|
}
|
||||||
Ok(promise)
|
Ok(promise)
|
||||||
@@ -545,7 +545,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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]);
|
let _ = self.call_function_sync(reject, JsValue::undefined(), &[exc]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -563,7 +563,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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]);
|
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
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
let _ = vm.reject_promise(this_val, exc);
|
||||||
NativeResult::Ok(this_val)
|
NativeResult::Ok(this_val)
|
||||||
}
|
}
|
||||||
@@ -742,7 +742,7 @@ fn promise_resolve_closure(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
let _ = vm.reject_promise(promise, exc);
|
||||||
}
|
}
|
||||||
NativeResult::Ok(JsValue::undefined())
|
NativeResult::Ok(JsValue::undefined())
|
||||||
@@ -825,7 +825,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -837,7 +837,7 @@ impl Vm {
|
|||||||
Err(e) => Err(self
|
Err(e) => Err(self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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)
|
NativeResult::Err(exc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1102,7 +1102,7 @@ fn promise_static_resolve(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1121,7 +1121,7 @@ fn promise_static_resolve(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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)
|
NativeResult::Err(exc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1141,7 +1141,7 @@ fn promise_static_reject(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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)
|
NativeResult::Err(exc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1217,7 +1217,7 @@ fn perform_promise_combine(
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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]);
|
let _ = vm.call_function_sync(reject, JsValue::undefined(), &[exc]);
|
||||||
return Ok(promise);
|
return Ok(promise);
|
||||||
}
|
}
|
||||||
@@ -1415,7 +1415,7 @@ fn agg_call_resolve(vm: &mut Vm, record: JsValue, arg: JsValue) {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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 reject = agg_record_val(vm, record, AGG_REJECT_PROP);
|
||||||
let _ = vm.call_function_sync(reject, JsValue::undefined(), &[exc]);
|
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 {
|
fn agg_engine_error(vm: &mut Vm, err: &str) -> JsValue {
|
||||||
vm.last_uncaught_value
|
vm.last_uncaught_value
|
||||||
.take()
|
.take()
|
||||||
.unwrap_or_else(|| oxide_builtins::error::create_error(vm, err))
|
.unwrap_or_else(|| oxide_builtins::error::create_from_text(vm, err))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// IteratorClose:调用迭代器的 `return()`(可调用时),忽略其抛错。
|
/// IteratorClose:调用迭代器的 `return()`(可调用时),忽略其抛错。
|
||||||
@@ -1548,7 +1548,7 @@ fn aggregate_error_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
|||||||
let exc = vm
|
let exc = vm
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
return NativeResult::Err(exc);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ impl Vm {
|
|||||||
let exc = self
|
let exc = self
|
||||||
.last_uncaught_value
|
.last_uncaught_value
|
||||||
.take()
|
.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);
|
let kind = self.thrown_error_kind(exc);
|
||||||
self.exception_value = Some(exc);
|
self.exception_value = Some(exc);
|
||||||
self.pending_error_kind = Some(kind);
|
self.pending_error_kind = Some(kind);
|
||||||
|
|||||||
Reference in New Issue
Block a user