Skip to content

Commit 6c9a4da

Browse files
Fix: Promote unary minus result to float when it exceeds INT_MAX.
1 parent 5b655c8 commit 6c9a4da

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

compiler/src/modules/vm/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ impl<'a> VM<'a> {
128128

129129
pub(crate) fn to_val(&mut self, v: &Value) -> Result<Val, VmErr> {
130130
Ok(match v {
131-
Value::Int(i) => Val::int(*i),
131+
Value::Int(i) => Val::int_checked(*i).unwrap_or_else(|| Val::float(*i as f64)),
132132
Value::Float(f) => Val::float(*f),
133133
Value::Bool(b) => Val::bool(*b),
134134
Value::None => Val::none(),
@@ -310,7 +310,14 @@ impl<'a> VM<'a> {
310310
}
311311
OpCode::Minus => {
312312
let v = self.pop()?;
313-
if v.is_int() { self.push(Val::int(-v.as_int())); }
313+
if v.is_int() {
314+
let r = -(v.as_int() as i128);
315+
self.push(if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 {
316+
Val::int(r as i64)
317+
} else {
318+
Val::float(r as f64)
319+
});
320+
}
314321
else if v.is_float() { self.push(Val::float(-v.as_float())); }
315322
else { return Err(VmErr::Type("unary -".into())); }
316323
}

compiler/tests/cases/vm_cases.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,5 +180,6 @@
180180
{"src": "print(2**47 * 2)", "output": ["281474976710656"], "result": "None"},
181181
{"src": "a = 140737488355328\nprint(-a - 1)", "output": ["-140737488355329"], "result": "None"},
182182
{"src": "print(-(-(2**47)))", "output": ["140737488355328"], "result": "None"},
183-
{"src": "a = 140737488355327\nb = 1\nr = 0\nfor i in range(10):\n r = a + b\nprint(r)", "output": ["140737488355328"], "result": "None"}
183+
{"src": "a = 140737488355327\nb = 1\nr = 0\nfor i in range(10):\n r = a + b\nprint(r)", "output": ["140737488355328"], "result": "None"},
184+
{"src": "x = -140737488355328\nprint(-x)", "output": ["140737488355328"], "result": "None"}
184185
]

0 commit comments

Comments
 (0)