Skip to content

Commit e8b01b9

Browse files
Fix: Prevent float coercion on BigInt overflow in fast-path.
1 parent 823fb93 commit e8b01b9

File tree

2 files changed

+6
-6
lines changed

2 files changed

+6
-6
lines changed

compiler/src/modules/vm/mod.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,18 @@ impl<'a> VM<'a> {
155155
let a = self.stack[len - 2];
156156
let b = self.stack[len - 1];
157157
let result = match fast {
158+
FastOp::AddFloat if a.is_float() && b.is_float() => Val::float(a.as_float() + b.as_float()),
158159
FastOp::AddInt if a.is_int() && b.is_int() => {
159160
let r = a.as_int() as i128 + b.as_int() as i128;
160-
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { Val::float(r as f64) }
161+
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { return Ok(false); }
161162
}
162-
FastOp::AddFloat if a.is_float() && b.is_float() => Val::float(a.as_float() + b.as_float()),
163163
FastOp::SubInt if a.is_int() && b.is_int() => {
164164
let r = a.as_int() as i128 - b.as_int() as i128;
165-
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { Val::float(r as f64) }
165+
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { return Ok(false); }
166166
}
167-
FastOp::SubFloat if a.is_float() && b.is_float() => Val::float(a.as_float() - b.as_float()),
168167
FastOp::MulInt if a.is_int() && b.is_int() => {
169168
let r = a.as_int() as i128 * b.as_int() as i128;
170-
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { Val::float(r as f64) }
169+
if r >= Val::INT_MIN as i128 && r <= Val::INT_MAX as i128 { Val::int(r as i64) } else { return Ok(false); }
171170
}
172171
FastOp::MulFloat if a.is_float() && b.is_float() => Val::float(a.as_float() * b.as_float()),
173172
FastOp::LtInt if a.is_int() && b.is_int() => Val::bool(a.as_int() < b.as_int()),

compiler/tests/cases/vm_cases.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,5 +210,6 @@
210210
{"src": "x = 2**63\nprint(-x)", "output": ["-9223372036854775808"], "result": "None"},
211211
{"src": "print(abs(-2**100))", "output": ["1267650600228229401496703205376"], "result": "None"},
212212
{"src": "print(int(2**100))", "output": ["1267650600228229401496703205376"], "result": "None"},
213-
{"src": "x = 99999999999999999999\nprint(x)", "output": ["99999999999999999999"], "result": "None"}
213+
{"src": "x = 99999999999999999999\nprint(x)", "output": ["99999999999999999999"], "result": "None"},
214+
{"src": "scale = 1\nfor _ in range(110):\n scale = scale * 10\nterm_a = scale // 5\nprint(term_a)", "output": ["20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], "result": "None"}
214215
]

0 commit comments

Comments
 (0)