perf: 常量字符串键计算成员折叠走 IC 静态路径

This commit is contained in:
2026-08-14 10:20:32 +08:00
parent 7f7a8c3b66
commit 1a62af5485
7 changed files with 390 additions and 80 deletions
+34
View File
@@ -43,6 +43,40 @@ fn eval_object_missing_property() {
assert_eq!(eval("({a:1}).b"), "undefined");
}
#[test]
fn eval_computed_const_string_key_folds_to_ic() {
// 常量字符串键折叠为 IC 静态路径:读写/复合/模板键/链式访问语义不变。
assert_eq!(eval("var o={a:1}; o[\"a\"]"), "1");
assert_eq!(eval("var o={a:1}; o[\"a\"]=2, o.a"), "2");
assert_eq!(eval("var o={a:1}; o[\"a\"] += 1, o.a"), "2");
assert_eq!(eval("var o={a:1}; o[`a`]"), "1");
assert_eq!(eval("var o={a:{b:4}}; o[\"a\"][\"b\"]"), "4");
assert_eq!(eval("var o={a:2}; o?.[\"a\"]"), "2");
assert_eq!(eval("var o={a:1}; o[\"a\"]++, o.a"), "2");
assert_eq!(eval("var o={a:1}; o[\"a\"] &&= 5, o.a"), "5");
assert_eq!(eval("var p={a:null}; p[\"a\"] ??= 5, p.a"), "5");
}
#[test]
fn eval_computed_const_key_dynamic_keys_stay_dynamic() {
// 动态变量键 / 数字键维持 DYNAMIC 路径,语义一致。
assert_eq!(eval("var s=\"a\", o={a:9}; o[s]"), "9");
assert_eq!(eval("var arr=[1,2]; arr[\"0\"]"), "1");
assert_eq!(eval("var arr=[1,2]; arr[0]=7, arr[0]"), "7");
}
#[test]
fn eval_computed_const_key_method_call_keeps_this() {
// 方法调用接收者折叠:this 绑定保留。
assert_eq!(eval("var o={m(){return this.x}, x:5}; o[\"m\"]()"), "5");
}
#[test]
fn eval_computed_const_key_proto_write() {
// 写 __proto__ 键走拦截路径,原型语义不变。
assert_eq!(eval("var o={}; o[\"__proto__\"]={b:3}, o.b"), "3");
}
#[test]
fn eval_member_inc_post() {
assert_eq!(eval("var obj={x:1}; obj.x++; obj.x"), "2");