Commit 04c6b19
Fix TCOMutRec: two-phase mutual recursion TCO and let-binding reorder
Implement two-phase mutual TCO for where-bound functions that are both
self-recursive and call their parent (tco3 pattern: g calls g and f).
Phase 1 wraps the parent in a while loop and modifies g's $tco_loop so
g→f calls become parent var assignments. Phase 2 is standard TCO on g.
Uses $__tco_done for the parent's done flag to avoid shadowing by g's
local $tco_done.
Also fix let-expression binding ordering: add reorder_where_bindings to
both Expr::Let codegen paths, fixing ntco4 where g=h(x) was emitted
before h's definition.
Removes TCOMutRec from known_node_failures (now empty). All 393 fixture
tests pass with 0 node failures, build_from_sources passes 7096/7096.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>1 parent d370316 commit 04c6b19
8 files changed
Lines changed: 745 additions & 311 deletions
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5831 | 5831 | | |
5832 | 5832 | | |
5833 | 5833 | | |
| 5834 | + | |
5834 | 5835 | | |
5835 | 5836 | | |
5836 | 5837 | | |
| |||
6275 | 6276 | | |
6276 | 6277 | | |
6277 | 6278 | | |
| 6279 | + | |
6278 | 6280 | | |
6279 | 6281 | | |
6280 | 6282 | | |
| |||
6980 | 6982 | | |
6981 | 6983 | | |
6982 | 6984 | | |
| 6985 | + | |
6983 | 6986 | | |
6984 | 6987 | | |
6985 | 6988 | | |
| |||
12017 | 12020 | | |
12018 | 12021 | | |
12019 | 12022 | | |
| 12023 | + | |
| 12024 | + | |
12020 | 12025 | | |
12021 | 12026 | | |
12022 | 12027 | | |
| |||
12026 | 12031 | | |
12027 | 12032 | | |
12028 | 12033 | | |
| 12034 | + | |
12029 | 12035 | | |
12030 | 12036 | | |
12031 | 12037 | | |
12032 | 12038 | | |
| 12039 | + | |
| 12040 | + | |
12033 | 12041 | | |
12034 | 12042 | | |
12035 | | - | |
| 12043 | + | |
12036 | 12044 | | |
12037 | 12045 | | |
12038 | | - | |
| 12046 | + | |
| 12047 | + | |
| 12048 | + | |
12039 | 12049 | | |
12040 | 12050 | | |
12041 | 12051 | | |
12042 | | - | |
| 12052 | + | |
| 12053 | + | |
| 12054 | + | |
12043 | 12055 | | |
12044 | | - | |
| 12056 | + | |
12045 | 12057 | | |
12046 | 12058 | | |
12047 | | - | |
12048 | | - | |
| 12059 | + | |
| 12060 | + | |
12049 | 12061 | | |
12050 | 12062 | | |
12051 | | - | |
12052 | | - | |
| 12063 | + | |
| 12064 | + | |
12053 | 12065 | | |
12054 | 12066 | | |
12055 | 12067 | | |
12056 | | - | |
| 12068 | + | |
12057 | 12069 | | |
12058 | 12070 | | |
12059 | | - | |
| 12071 | + | |
12060 | 12072 | | |
12061 | 12073 | | |
12062 | 12074 | | |
12063 | 12075 | | |
12064 | 12076 | | |
12065 | | - | |
| 12077 | + | |
| 12078 | + | |
| 12079 | + | |
| 12080 | + | |
| 12081 | + | |
| 12082 | + | |
| 12083 | + | |
| 12084 | + | |
| 12085 | + | |
| 12086 | + | |
| 12087 | + | |
| 12088 | + | |
12066 | 12089 | | |
12067 | 12090 | | |
12068 | 12091 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
750 | 750 | | |
751 | 751 | | |
752 | 752 | | |
753 | | - | |
754 | 753 | | |
755 | 754 | | |
756 | 755 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
372 | 372 | | |
373 | 373 | | |
374 | 374 | | |
375 | | - | |
376 | | - | |
377 | | - | |
378 | | - | |
379 | | - | |
380 | | - | |
381 | | - | |
382 | | - | |
383 | | - | |
384 | | - | |
385 | | - | |
386 | | - | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
392 | | - | |
393 | | - | |
394 | | - | |
395 | | - | |
| 375 | + | |
| 376 | + | |
396 | 377 | | |
397 | 378 | | |
398 | 379 | | |
| |||
Lines changed: 28 additions & 12 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
10 | 23 | | |
11 | 24 | | |
12 | 25 | | |
| |||
91 | 104 | | |
92 | 105 | | |
93 | 106 | | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
106 | 121 | | |
107 | 122 | | |
108 | 123 | | |
| |||
274 | 289 | | |
275 | 290 | | |
276 | 291 | | |
| 292 | + | |
277 | 293 | | |
278 | 294 | | |
279 | 295 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
15 | 22 | | |
16 | 23 | | |
17 | 24 | | |
18 | 25 | | |
19 | 26 | | |
20 | 27 | | |
21 | 28 | | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
22 | 36 | | |
23 | 37 | | |
24 | 38 | | |
| |||
86 | 100 | | |
87 | 101 | | |
88 | 102 | | |
| 103 | + | |
89 | 104 | | |
90 | 105 | | |
91 | 106 | | |
| |||
0 commit comments