test: 补 import defer 读目标与内联 catch 回归单测

This commit is contained in:
2026-10-09 15:46:40 +00:00
parent b240cbd305
commit 8c0bdf89a6
2 changed files with 71 additions and 0 deletions
+46
View File
@@ -1175,4 +1175,50 @@ mod tests {
let state = deferred_state(ns_obj).expect("deferred state 应存活");
assert_eq!(state.error.unwrap().as_js_object_ptr(), err_ptr, "error 指针应稳定");
}
#[test]
fn deferred_ns_read_target_falls_back_for_non_object_namespace() {
let (mut vm, fn_val) = vm_with_function();
// 模块函数返回非对象(42):求值成功后 [[Namespace]] 为非对象值。
vm.set_reg(1, fn_val);
vm.set_reg(2, JsValue::undefined());
let ns_val = module_defer_object(&mut vm, &[0, 1, 2]).unwrap();
let ns_ptr = ns_val.as_js_object_ptr();
// 模拟求值完成:[[Evaluated]] 置真、[[Namespace]] 为非对象值 42。
{
let ns_obj = unsafe { &*ns_ptr };
let state = deferred_state_mut(ns_obj).expect("deferred state 应已安装");
state.evaluated = true;
state.namespace = JsValue::int(42);
}
// 权威读目标回落对象自身(预注册占位槽),非对象 [[Namespace]] 不作读目标。
let ns_obj = unsafe { &*ns_ptr };
let target = deferred_ns_read_target(ns_obj);
assert!(
std::ptr::eq(target as *const JsObject, ns_ptr as *const JsObject),
"非对象 [[Namespace]] 应回落对象自身"
);
}
#[test]
fn deferred_ns_read_target_returns_real_ns_for_object_namespace() {
let (mut vm, fn_val) = vm_with_function();
// 真实 ns 对象(求值成功且 [[Namespace]] 为对象,mixed 形态)。
let real_ns = vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null()));
let real_ns_val = JsValue::from_js_object(real_ns);
vm.set_reg(1, fn_val);
vm.set_reg(2, real_ns_val);
let ns_val = module_defer_object(&mut vm, &[0, 1, 2]).unwrap();
let ns_ptr = ns_val.as_js_object_ptr();
// 权威读目标返回真实 ns(活值与真实槽位在真实 ns 条目表)。
let ns_obj = unsafe { &*ns_ptr };
let target = deferred_ns_read_target(ns_obj);
assert!(
std::ptr::eq(target as *const JsObject, real_ns as *const JsObject),
"对象 [[Namespace]] 应返回真实 ns"
);
}
}
+25
View File
@@ -2057,4 +2057,29 @@ mod tests {
let ns = unsafe { &*ns_ptr };
assert!(!oxide_builtins::module::deferred_state(ns).unwrap().evaluated, "symbol-like 键不应触发求值");
}
#[test]
fn inline_bytecode_body_catch_captures_native_throw() {
let (mut vm, _fn_val) = deferred_vm_with_function();
// 字节码函数:try 体内调 native(JSON.parse 抛 SyntaxError),catch 捕获原值。
// 经 call_function_sync(inline 路径,native_call_depth > 0)调用,钉住
// raise_call_error 深度 >0 物化 + 内联体内 try 处理器捕获路径。
let f = vm
.create_dynamic_function(&[], "try { JSON.parse('not json'); } catch (e) { return e; }", false, false)
.expect("create function");
let result = vm.call_function_sync(f, JsValue::undefined(), &[]).expect("f 应正常返回");
// 捕获值应为原 SyntaxError 对象(物化后由体内 catch 捕获,非空/非 undefined)。
assert!(result.is_object(), "捕获值应为错误对象");
let err_ptr = result.as_js_object_ptr();
assert!(!err_ptr.is_null());
let err = unsafe { &*err_ptr };
let name_si = vm.kernel_core.perm_interner().intern("name").0;
let name = vm.ordinary_get(err, name_si, result).expect("read name");
let expected = JsValue::perm_string(
vm.kernel_core
.perm_interner()
.string_ptr(vm.kernel_core.perm_interner().intern("SyntaxError").0),
);
assert_eq!(name, expected, "捕获值应为 SyntaxError");
}
}