Repository navigation
Commit e2bb4ca
committed
fix(d5): resolve forward-returns iteratively, not recursively
The SCC pass and the param fixpoint are iterative, but resolve_return was
left recursive — one Python frame per forward-return hop. With the depth
cap gone, a long but acyclic chain of `ReturnSkeleton("forward")` wrappers
recurses to Python's default limit and raises RecursionError. The bridge
catches a solve() exception by dropping to an EMPTY MOS, so one deep
wrapper chain would disable interprocedural ownership summaries for the
entire input rather than just that one return chain. (Codex P2.)
A return has at most one forward target, so resolution is a linked-list
walk: chase the forward edges to a terminal / extern / cycle, then
propagate the value back up applying the aliasOf-through-forward degrade
at each hop. Behaviour is identical to the recursive version (same memo,
same cycle -> unknown, same aliasOf rule); it just no longer grows the
call stack.
Adds deep-chain (N=3000, past the recursion limit) regression tests for
both the forward-return and forward-param chains.
ownership 42/42, ownir bridge 194/194, mypy --strict, ruff — all green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019846YSZ35c7CdkWQ1qX5gm1 parent 3260062 commit e2bb4ca
2 files changed
Lines changed: 64 additions & 29 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
318 | 318 | | |
319 | 319 | | |
320 | 320 | | |
321 | | - | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
322 | 327 | | |
323 | 328 | | |
324 | | - | |
325 | | - | |
326 | | - | |
327 | | - | |
| 329 | + | |
328 | 330 | | |
329 | | - | |
330 | | - | |
331 | | - | |
332 | | - | |
333 | | - | |
334 | | - | |
335 | | - | |
336 | | - | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
337 | 354 | | |
338 | 355 | | |
339 | | - | |
340 | | - | |
341 | | - | |
342 | | - | |
343 | | - | |
344 | | - | |
345 | | - | |
346 | | - | |
347 | | - | |
348 | | - | |
349 | | - | |
350 | | - | |
351 | | - | |
352 | | - | |
353 | | - | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
354 | 374 | | |
355 | 375 | | |
356 | 376 | | |
| |||
362 | 382 | | |
363 | 383 | | |
364 | 384 | | |
365 | | - | |
| 385 | + | |
366 | 386 | | |
367 | 387 | | |
368 | 388 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
142 | 157 | | |
143 | 158 | | |
144 | 159 | | |
| |||
0 commit comments