Merhaba. D'nin kaynak kodlarını okuyorum yaklaşık 3 aydır. Gıdım gıdım :D
Lexer'da bir kısma denk geldim. Bu kısımda signed integer overflow yazıyordu. Bunun integer overflow'dan farkı nedir? Neden unsigned integer overflow gibi bir yakalama mekanizması yok. Kodlarda hatırladığım kadarıyla unsigned case yapısı vardı ancak yakalamıyordu.
https://github.com/D-Programming-Language/dmd/blob/master/src/lexer.d#L1987
case FLAGS_decimal | FLAGS_long:
if (n & 0x8000000000000000L)
{
if (!err)
{
error("signed integer overflow");
err = true;
}
result = TOKuns64v;
}
else
result = TOKint64v;
break;
Burada yaptığı şey yani FLAGS_decimal neden kullanılıyor?
Burada anlamam gereken şey derleyiciye ya da D ile derlenen programa "n & 0x8000000000000000L" şeklinde bir değer yollarsam overflow mu olacak? Gerçi burada err=true olmuş
Bu err kısmı öncelikle şurada tanımlı:
final TOK number(Token* t)
{
int base = 10;
const(char)* start = p;
uint c;
uinteger_t n = 0; // unsigned >=64 bit integer type
int d;
bool err = false;
Merak ettiğim şey err = true olunca engelleyici bir mekanizma çalışıyor mu? Çalışıyor ise err=true; nereye ne yolluyor? Nasıl bakabilirim?
Mesela integer overflow yakalama mekanizmasına bir goto ile yollama var sanırım.
Ldone:
if (overflow && !err)
{
error("integer overflow");
err = true;
}
Buradaki Ldone: kısmından anladığım kadarıyla.
Ancak ne overflow bool değeri ne de err bool değeri bir yerlerde bir şeyler değiştiriyor görünmüyor. Sadece true ya da false yapılıyor. Nereyi etkilediğini anlamadım.
Büyük dosyalarda kafam karışıyor. Kodları yazmak değil de okumak baya zevkli. Ancak not defterim doldu taştı D notlarıyla.
Umarım bu sorularım anlamsız ya da manasız değildir :(
Teşekkürler
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]