feat: class 私有成员语义(字段/方法/访问器 + brand 检查 + 契约修复)

This commit is contained in:
2026-08-09 11:08:36 +08:00
parent 088b3bc976
commit 6c79dbb21c
41 changed files with 573 additions and 216 deletions
@@ -138,11 +138,7 @@ fn typed_array_to_string_is_identifiable() {
#[test]
fn typed_array_element_write_roundtrips() {
let mut vm = Vm::new();
let result = eval(
&mut vm,
"var ta = new Int32Array(2); ta[0] = 42; ta[1] = ta[0] * 2; ta[1] === 84",
)
.unwrap();
let result = eval(&mut vm, "var ta = new Int32Array(2); ta[0] = 42; ta[1] = ta[0] * 2; ta[1] === 84").unwrap();
assert!(result.as_bool());
}
@@ -156,11 +152,7 @@ fn typed_array_element_write_clamps_int8() {
#[test]
fn typed_array_out_of_bounds_write_is_ignored() {
let mut vm = Vm::new();
let result = eval(
&mut vm,
"var ta = new Int8Array(1); ta[5] = 1; ta.length === 1 && ta[5] === undefined",
)
.unwrap();
let result = eval(&mut vm, "var ta = new Int8Array(1); ta[5] = 1; ta.length === 1 && ta[5] === undefined").unwrap();
assert!(result.as_bool());
}
+5 -3
View File
@@ -363,9 +363,11 @@ fn computed_field_key_evaluated_once_at_class_definition() {
#[test]
fn computed_field_key_once_but_value_per_instance() {
let mut vm = Vm::new();
let result =
eval(&mut vm, "var n=0; class C { [++n] = ++n; } var a=new C(); var b=new C(); n*100 + a[1]*10 + b[1]")
.unwrap();
let result = eval(
&mut vm,
"var n=0; class C { [++n] = ++n; } var a=new C(); var b=new C(); n*100 + a[1]*10 + b[1]",
)
.unwrap();
assert_num(result, 323.0);
}
@@ -36,7 +36,11 @@ fn delete_non_configurable_returns_false_in_sloppy_mode() {
"delete obj.x",
])
.unwrap();
assert!(r.is_bool() && !r.as_bool(), "delete non-configurable in sloppy should return false, got {:?}", r);
assert!(
r.is_bool() && !r.as_bool(),
"delete non-configurable in sloppy should return false, got {:?}",
r
);
}
// ── 删除不存在的属性返回 true ──
@@ -27,17 +27,26 @@ fn eval(source: &str) -> String {
#[test]
fn break_runs_finally_and_exits_loop() {
assert_eq!(eval("var fin = 0; var i = 0; for (; i < 5; ) { try { break; } finally { fin = 1; } i = i + 1; } fin * 10 + i"), "10");
assert_eq!(
eval("var fin = 0; var i = 0; for (; i < 5; ) { try { break; } finally { fin = 1; } i = i + 1; } fin * 10 + i"),
"10"
);
}
#[test]
fn continue_runs_finally_every_iteration() {
assert_eq!(eval("var fin = 0; for (var i = 0; i < 5; i++) { try { continue; } finally { fin = fin + 1; } } fin"), "5");
assert_eq!(
eval("var fin = 0; for (var i = 0; i < 5; i++) { try { continue; } finally { fin = fin + 1; } } fin"),
"5"
);
}
#[test]
fn return_runs_finally() {
assert_eq!(eval("var fin = 0; function f() { try { return 1; } finally { fin = 1; } } var r = f(); r * 10 + fin"), "11");
assert_eq!(
eval("var fin = 0; function f() { try { return 1; } finally { fin = 1; } } var r = f(); r * 10 + fin"),
"11"
);
}
#[test]
@@ -47,7 +56,10 @@ fn break_inside_finally_breaks_loop() {
#[test]
fn throw_still_runs_finally() {
assert_eq!(eval("var fin = 0; function g() { try { throw 1; } finally { fin = 1; } } try { g(); } catch (e) {} fin"), "1");
assert_eq!(
eval("var fin = 0; function g() { try { throw 1; } finally { fin = 1; } } try { g(); } catch (e) {} fin"),
"1"
);
}
#[test]
@@ -101,12 +113,20 @@ fn break_in_finally_overrides_exception() {
#[test]
fn continue_in_finally_overrides_break() {
assert_eq!(eval("var log = 0; for (var i = 0; i < 3; i++) { try { break; } finally { log = log * 10 + i; continue; } } log"), "12");
assert_eq!(
eval(
"var log = 0; for (var i = 0; i < 3; i++) { try { break; } finally { log = log * 10 + i; continue; } } log"
),
"12"
);
}
#[test]
fn throw_in_finally_overrides_previous_exception() {
assert_eq!(eval("var fin = 0; try { try { throw 1; } finally { throw 2; } } catch (e) { fin = e; } fin"), "2");
assert_eq!(
eval("var fin = 0; try { try { throw 1; } finally { throw 2; } } catch (e) { fin = e; } fin"),
"2"
);
}
#[test]
@@ -143,7 +163,10 @@ fn continue_with_finally_conditionally() {
#[test]
fn normal_finally_path_still_works() {
assert_eq!(eval("var s = 0; for (var i = 0; i < 3; i++) { try { s = s + i; } finally { s = s + 10; } } s"), "33");
assert_eq!(
eval("var s = 0; for (var i = 0; i < 3; i++) { try { s = s + i; } finally { s = s + 10; } } s"),
"33"
);
}
#[test]
@@ -202,7 +225,10 @@ fn return_in_try_catch_value_path() {
#[test]
fn return_in_try_finally_runs_finally() {
assert_eq!(eval("var fin = 0; function f(){ try{ return 1 } finally{ fin = 1 } } f() * 10 + fin"), "11");
assert_eq!(
eval("var fin = 0; function f(){ try{ return 1 } finally{ fin = 1 } } f() * 10 + fin"),
"11"
);
}
#[test]