fix: 顶层 var 读写直连全局对象属性单一真值——GDI 序言 + 声明处同步删除,类原型 session 直分防晋升克隆 identity 分裂,自增减 int 保持

This commit is contained in:
2026-09-12 15:48:32 +00:00
parent 4b807b5b90
commit 44c16cab8a
21 changed files with 447 additions and 74 deletions
@@ -27,6 +27,26 @@ fn int_sub(a: i32, b: i32) -> JsValue {
}
}
/// int 自增:结果落在 i32 范围则保 int,否则升 double(与 int_add 同族语义,
/// 保持与 ADD 路径一致的 int 保持行为)。
#[inline(always)]
fn int_inc(a: i32) -> JsValue {
match a.checked_add(1) {
Some(v) => JsValue::int(v),
None => JsValue::float(a as f64 + 1.0),
}
}
/// int 自减:结果落在 i32 范围则保 int,否则升 double(与 int_sub 同族语义,
/// 保持与 SUB 路径一致的 int 保持行为)。
#[inline(always)]
fn int_dec(a: i32) -> JsValue {
match a.checked_sub(1) {
Some(v) => JsValue::int(v),
None => JsValue::float(a as f64 - 1.0),
}
}
/// int+int 乘法:结果落在 i32 范围则保 int,否则升 double。
#[inline(always)]
fn int_mul(a: i32, b: i32) -> JsValue {
@@ -538,6 +558,12 @@ impl Vm {
self.regs[a] = result;
return Ok(());
}
if self.regs[rd].is_int() {
let result = int_inc(self.regs[rd].as_int());
self.regs[rd] = result;
self.regs[a] = result;
return Ok(());
}
let n = self.coerce_number_bounded(self.regs[rd])?;
let result = JsValue::float(n + 1.0);
self.regs[rd] = result;
@@ -554,6 +580,12 @@ impl Vm {
self.regs[rd] = self.new_bigint(v + 1);
return Ok(());
}
if self.regs[rd].is_int() {
let old = self.regs[rd];
self.regs[a] = old;
self.regs[rd] = int_inc(old.as_int());
return Ok(());
}
let n = self.coerce_number_bounded(self.regs[rd])?;
self.regs[a] = JsValue::float(n);
self.regs[rd] = JsValue::float(n + 1.0);
@@ -570,6 +602,12 @@ impl Vm {
self.regs[a] = result;
return Ok(());
}
if self.regs[rd].is_int() {
let result = int_dec(self.regs[rd].as_int());
self.regs[rd] = result;
self.regs[a] = result;
return Ok(());
}
let n = self.coerce_number_bounded(self.regs[rd])?;
let result = JsValue::float(n - 1.0);
self.regs[rd] = result;
@@ -586,6 +624,12 @@ impl Vm {
self.regs[rd] = self.new_bigint(v - 1);
return Ok(());
}
if self.regs[rd].is_int() {
let old = self.regs[rd];
self.regs[a] = old;
self.regs[rd] = int_dec(old.as_int());
return Ok(());
}
let n = self.coerce_number_bounded(self.regs[rd])?;
self.regs[a] = JsValue::float(n);
self.regs[rd] = JsValue::float(n - 1.0);