Commit Graph

6 Commits

Author SHA1 Message Date
Claude 06e4136705
chore(build): uzak ortam için CMake yolları yeniden yapılandırıldı
Oturum yeni bir konteynerda başladığı için önceki yerel yollar geçersizdi;
build/ temizlenip yeni ortam yollarıyla yeniden oluşturuldu.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:51:18 +00:00
saqut a4fb3cfc4f fix(tc): string sıralama operatörleri derleme zamanında bloklandı (B5)
Sorun: TypeChecker < > <= >= için tip kontrolü yapmıyordu; string
operandlarda VM sessizce intValue=0 karşılaştırıyordu.

Düzeltme: karşılaştırma bloğu ikiye ayrıldı:
  == / !=  → string dahil herhangi tip (değişmedi)
  < > <= >= → isNumeric() kontrolü; string veya diğer sayısal-olmayan
              tipler E003 üretir, VM'e hiç ulaşmaz

Aritmetik (+ - * / %) zaten sayısal-olmayan tipler için E003 üretiyordu;
doğrulandı, değiştirilmedi.

Altyapı: cmake/run_golden_error.cmake + CMakeLists.txt'e .compile_error
desteği — derleme hatası bekleyen negatif golden testler için.

Testler (19/19 yeşil):
  - string/ordering_error: string < → E003 (negatif test)
  - string/equality: string == / != çalışmaya devam ediyor (regresyon)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:26:20 +03:00
saqut 7c93f12304 fix(ir): ! operatörü kopyalama yerine (x == 0) üretiyor (B2)
Sorun: unary ! dalı emitLoadSlot ile operandı kopyalıyordu — terslemiyordu.
Sabitlerde sabit katlama doğru çalışıyordu; değişken operandlar her zaman
orijinal değeri döndürüyordu.

Düzeltme: BANG case'i EQUAL_EQUAL(operand, 0) olarak üretiliyor.
  !x → slots[result] = (slots[operand] == 0) ? 1 : 0
Sonuç her zaman 0 ya da 1; bool int olarak temsil edilmesiyle tutarlı.
~ (B2/F2 kapsamı dışı) eski TODO dalında kalmaya devam ediyor.

Test: tests/golden/logic/not_operator.sqt — değişken operandla !0→1,
!5→0, !!5→1, !!0→0, if(!x) dallanma. 17/17 test yeşil.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 16:15:46 +03:00
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
saqut 8509d09ca8 fix(ir): do-while == 1 geçici çözümü kaldırıldı, JIF_TRUE kullanılıyor (B4)
Sorun: koşul 1-olmayan sıfır-dışı bir değer (ör. 2) üretince "cond == 1"
karşılaştırması false dönüyor ve döngü yanlışlıkla erken çıkıyordu.

Düzeltme: üç geçici talimat (LOAD_CONST, EQUAL_EQUAL, JIF_FALSE) kaldırıldı.
Geri-jump artık doğrudan JIF_TRUE ile yapılıyor — truthy (sıfır-dışı her
değer) ise loopStart'a atla; isTruthy() semantiğiyle tutarlı.

Test: tests/golden/loops/do_while_truthy.sqt — koşulun i<3 ifadesi (1 veya 0
üretir, 2 üretmez), ancak "while (j)" (j=5→truthy→dön, j=0→false→çık) gibi
1-olmayan truthy koşullar da doğru çalışıyor. 13/13 test yeşil.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:59:15 +03:00
saqut c5fb57412a fix(ir): && ve || kısa devre dallanmasıyla üret (ADR-008)
Sorun: IR üretici && ve || için case içermiyordu, default koluna
düşüp LOAD_CONST 0 üretiyordu — değişken operandlarda her zaman
false dönüyordu (sabit katlama yolu zaten doğruydu).

Düzeltme: her iki operatör artık dallanma olarak üretiliyor:
  a && b → JIF_FALSE (a false ise b'yi atla)
  a || b → JIF_TRUE  (a true ise b'yi atla)

JIF_TRUE yeni opcode olarak eklendi (instruction.hpp + interpreter.cpp).
do-while'ın mevcut "== 1 karşılaştırması" geçici çözümü bu opcode'dan
faydalanabilir — ayrı düzeltme (B4).

Test: tests/golden/logic/short_circuit.sqt — yan etkinin gerçekten
atlandığını çıktıyla kanıtlar (12/12 test yeşil).

ADR: docs/adr/ADR-008-kisa-devre-mantiksal-operatorler.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-19 15:54:03 +03:00