да это понятно :) ну вот допустим 0xFFFFFFFF выглядит для Си-шника как int32/uint32 - а для Dart с его интами это int33 :)
Если вдаваться в подробности, у нас пирамида внутренних представлений выглядит так smi -> mint -> bigint.
Smi = Machine Word Size - 1 bit (int31 on 32-bit, int63 on 64-bit)
Mint = boxed int64
Bigint = понятное дело "бесконечный".
Поэтому когда кто-то делает значение типа 0xFFFFFFFF в 32-bit Dart VM его таращит в Mint и информация о его пределах теряется. Вот отсюда и все проблемы.
Нужно как я в ишуе писал делать нормальный range profiling на бинарных операциях - тогда получится хороший код генерировать.
no subject
Date: 2014-11-10 04:02 pm (UTC)Если вдаваться в подробности, у нас пирамида внутренних представлений выглядит так smi -> mint -> bigint.
Smi = Machine Word Size - 1 bit (int31 on 32-bit, int63 on 64-bit)
Mint = boxed int64
Bigint = понятное дело "бесконечный".
Поэтому когда кто-то делает значение типа 0xFFFFFFFF в 32-bit Dart VM его таращит в Mint и информация о его пределах теряется. Вот отсюда и все проблемы.
Нужно как я в ишуе писал делать нормальный range profiling на бинарных операциях - тогда получится хороший код генерировать.