perf: member 复合写路径接入 IC 写命中(depth 0)消除每次 DashMap 查询与回写

set_member_prop 增加 ic_set_hit_own(仅接受 depth==0 槽,跳过读侧学习的
原型条目防原型污染)命中直写槽,ext_pc 由 read_member_prop 显式带出消除
隐式 pc 契约;写新属性 miss 分支(IC_SET 分发 + member 写)统一改
CreateDataProperty 快路径(保留原型链 setter/readonly 检查),砍掉
ordinary_set 全链路的重复查询与 shape 转换开销。
This commit is contained in:
2026-08-15 08:16:49 +08:00
parent abeab6f216
commit aa4c28cdf0
7 changed files with 361 additions and 52 deletions
+18 -18
View File
@@ -126,10 +126,10 @@ impl Vm {
};
let receiver = self.regs[rd];
let obj = unsafe { &mut *obj_ptr };
let prop_val = self.read_member_prop(obj, prop_name_si, receiver)?;
let (prop_val, ext_pc) = self.read_member_prop(obj, prop_name_si, receiver)?;
let n = self.coerce_number_bounded(prop_val)?;
let new_val = JsValue::float(n + 1.0);
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
self.regs[a] = new_val;
Ok(())
}
@@ -141,10 +141,10 @@ impl Vm {
};
let receiver = self.regs[rd];
let obj = unsafe { &mut *obj_ptr };
let prop_val = self.read_member_prop(obj, prop_name_si, receiver)?;
let (prop_val, ext_pc) = self.read_member_prop(obj, prop_name_si, receiver)?;
let n = self.coerce_number_bounded(prop_val)?;
let new_val = JsValue::float(n - 1.0);
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
self.regs[a] = new_val;
Ok(())
}
@@ -187,7 +187,7 @@ impl Vm {
return Ok(());
};
let receiver = self.regs[rd];
let prop_raw = {
let (prop_raw, ext_pc) = {
let obj = unsafe { &mut *obj_ptr };
self.read_member_prop(obj, prop_name_si, receiver)?
};
@@ -203,7 +203,7 @@ impl Vm {
JsValue::float(ln + rn)
};
let obj = unsafe { &mut *obj_ptr };
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
self.regs[a] = new_val;
Ok(())
}
@@ -219,16 +219,16 @@ impl Vm {
return Ok(());
};
let receiver = self.regs[rd];
let ln = {
let (ln, ext_pc) = {
let obj = unsafe { &mut *obj_ptr };
let prop_val = self.read_member_prop(obj, prop_name_si, receiver)?;
self.coerce_number_bounded(prop_val)?
let (prop_val, ext_pc) = self.read_member_prop(obj, prop_name_si, receiver)?;
(self.coerce_number_bounded(prop_val)?, ext_pc)
};
let rn = self.coerce_number_bounded(self.regs[a])?;
let new_val = JsValue::float(op(ln, rn));
self.regs[a] = new_val;
let obj = unsafe { &mut *obj_ptr };
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
Ok(())
}
@@ -243,16 +243,16 @@ impl Vm {
return Ok(());
};
let receiver = self.regs[rd];
let ln = {
let (ln, ext_pc) = {
let obj = unsafe { &mut *obj_ptr };
let prop_val = self.read_member_prop(obj, prop_name_si, receiver)?;
self.coerce_int32_bounded(prop_val)?
let (prop_val, ext_pc) = self.read_member_prop(obj, prop_name_si, receiver)?;
(self.coerce_int32_bounded(prop_val)?, ext_pc)
};
let rn = self.coerce_int32_bounded(self.regs[a])?;
let new_val = JsValue::int(op(ln, rn));
self.regs[a] = new_val;
let obj = unsafe { &mut *obj_ptr };
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
Ok(())
}
@@ -265,10 +265,10 @@ impl Vm {
return Ok(());
};
let receiver = self.regs[rd];
let ln = {
let (ln, ext_pc) = {
let obj = unsafe { &mut *obj_ptr };
let prop_val = self.read_member_prop(obj, prop_name_si, receiver)?;
self.coerce_int32_bounded(prop_val)?
let (prop_val, ext_pc) = self.read_member_prop(obj, prop_name_si, receiver)?;
(self.coerce_int32_bounded(prop_val)?, ext_pc)
};
let shift = self.coerce_uint32_bounded(self.regs[a])? & 0x1F;
let new_val = if !is_right {
@@ -285,7 +285,7 @@ impl Vm {
};
self.regs[a] = new_val;
let obj = unsafe { &mut *obj_ptr };
self.set_member_prop(obj, prop_name_si, new_val, receiver)?;
self.set_member_prop(obj, prop_name_si, new_val, receiver, ext_pc)?;
Ok(())
}
}