#45 — BAND, BOR, SHL, SHR (binary) ve BNOT (unary ~) opcode'ları eklendi.
Bileşik atama &=, |=, <<=, >>= destekleniyor.
Sabit katlama güncellendi. ^ (XOR) CARET çakışması nedeniyle atlandı.
#38 — LOAD_GLOBAL / STORE_GLOBAL opcode'ları eklendi (Seçenek A: gerçek global slot).
IRProgram.globalCount + globalNames; Interpreter.globalSlots_.
Global init ifadeleri main'in başında üretiliyor.
Tüm fonksiyonlar global alana erişebilir.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Teşhis (a): Sadece %= unutulmuş — +=, -=, *=, /= doğru çalışıyordu.
PERCENT_EQUAL MOD opcode'una yönlendirildi; sıfıra mod runtime hatası
zaten interpreter'da mevcut, yeni kod gerekmedi.
CMakeLists.txt'e .runtime_error uzantısı eklendi (çalışma zamanı
hatası golden testleri için; aynı run_golden_error.cmake altyapısı).
Testler: compound_mod (17%5=2 zinciri) + mod_by_zero (runtime hata).
21/21 geçti.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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>
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>
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>