saqut
|
450f16008f
|
fix(ir): break/continue IR üretimi — döngü bağlamı yığını (B3)
Sorun: break ve continue için hiçbir opcode üretilmiyordu (TODO).
Düzeltme: her döngüye girerken LoopContext yığına push'lanır, çıkınca
pop'lanır. break/continue JMP -1 yazar, instruction indeksi bağlamda
toplanır. Döngü üretimi bitince tüm pending jump'lar doğru hedefe patch'lenir:
- break → her döngü türünde OUT (döngü sonu)
- continue while/do-while → LOOP_START / COND_LABEL
- continue for → C_LABEL (güncelleme başı, koşula DEĞİL)
(aksi halde i++ atlanır → sonsuz döngü)
İç içe döngülerde yığının en üstü en içteki bağlamdır; inner break/continue
dıştaki döngüyü etkilemez.
Testler (16/16 yeşil):
- for_break_continue: continue'nun i++'ı atlamadığını kanıtlar
- while_break_continue: while break/continue
- nested_break: inner break dış döngüyü etkilemiyor
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-06-19 16:09:57 +03:00 |