Skip to content

Commit 26b082e

Browse files
Fix(vm): Propagate all outer-scope slots into call frames, not only functions.
1 parent e8b01b9 commit 26b082e

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

compiler/main.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
def fac(n):
2+
r = 1
3+
for i in range(2, n + 1):
4+
r *= i
5+
return r
6+
7+
def isqrt(n):
8+
if n == 0: return 0
9+
x = n
10+
for _ in range(300):
11+
y = (x + n // x) // 2
12+
if y >= x:
13+
return x
14+
x = y
15+
return x
16+
17+
def pi(digits):
18+
terms = digits // 14 + 3
19+
C3 = 640320 ** 3
20+
21+
S_num = 0
22+
S_den = 1
23+
24+
for k in range(terms):
25+
a = fac(6*k) * (13591409 + 545140134 * k)
26+
b = fac(3*k) * fac(k)**3 * C3**k
27+
if k % 2 == 0:
28+
S_num = S_num * b + a * S_den
29+
else:
30+
S_num = S_num * b - a * S_den
31+
S_den = S_den * b
32+
33+
scale = 10 ** (digits + 20)
34+
sq = isqrt(10005 * scale * scale)
35+
return 426880 * sq * S_den // (S_num * scale) // 10**20
36+
37+
print(pi(1000))

compiler/src/modules/parser/expr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
370370
self.eat(TokenType::Colon);
371371

372372
let saved_chunk = core::mem::take(&mut self.chunk);
373-
let saved_ver = core::mem::take(&mut self.ssa_versions);
374-
self.ssa_versions = hashbrown::HashMap::new();
373+
let saved_ver = core::mem::take(&mut self.ssa_versions);
374+
self.ssa_versions = saved_ver.clone();
375375
for p in &params {
376376
self.ssa_versions.insert(p.clone(), 0);
377377
}

compiler/src/modules/parser/literals.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
319319

320320
let saved_chunk = core::mem::take(&mut self.chunk);
321321
let saved_ver = core::mem::take(&mut self.ssa_versions);
322-
self.ssa_versions = HashMap::new();
322+
self.ssa_versions = saved_ver.clone();
323323

324324
self.compile_block();
325325

@@ -426,7 +426,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
426426
let saved_chunk = core::mem::take(&mut self.chunk);
427427
let saved_ver = core::mem::take(&mut self.ssa_versions);
428428

429-
self.ssa_versions = HashMap::new();
429+
self.ssa_versions = saved_ver.clone();
430430
for p in params {
431431
self.ssa_versions.insert(p.clone(), 0);
432432
}

compiler/src/modules/vm/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -540,10 +540,8 @@ impl<'a> VM<'a> {
540540
}
541541
for (si, sv) in slots.iter().enumerate() {
542542
if let Some(v) = sv {
543-
if v.is_heap() {
544-
if let HeapObj::Func(_, _) = self.heap.get(*v) {
545-
if let Some(&bs) = body_map.get(chunk.names[si].as_str()) { fn_slots[bs] = Some(*v); }
546-
}
543+
if let Some(&bs) = body_map.get(chunk.names[si].as_str()) {
544+
if fn_slots[bs].is_none() { fn_slots[bs] = Some(*v); }
547545
}
548546
}
549547
}

compiler/tests/cases/vm_cases.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,5 +211,6 @@
211211
{"src": "print(abs(-2**100))", "output": ["1267650600228229401496703205376"], "result": "None"},
212212
{"src": "print(int(2**100))", "output": ["1267650600228229401496703205376"], "result": "None"},
213213
{"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"}
214+
{"src": "scale = 1\nfor _ in range(110):\n scale = scale * 10\nterm_a = scale // 5\nprint(term_a)", "output": ["20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"], "result": "None"},
215+
{"src": "x = 42\ndef f():\n return x\nprint(f())", "output": ["42"], "result": "None"}
215216
]

0 commit comments

Comments
 (0)