2014-02-07 3 views
1

Я вычисляю случайные цвета для своего приложения. Они находятся в формате rgba, и я тестировал различные версии для раскраски. Сейчас я хочу полностью непрозрачные кубики, но так как это может изменить я реализовали окраску, как это:Dartium crash on integer shift

  int r = rnd.nextInt(255); 
      int g = rnd.nextInt(255); 
      int b = rnd.nextInt(255); 
      int a = 255; 
      int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | ((a & 0xFF) << 24); 

код прямо сейчас повторяется в течение прибл. 13 000 кубиков. Или я должен сказать, что так будет. Потому что dartium падает («Aw, Snap! Что-то пошло не так, пока вы показываете эту веб-страницу»). Ради «wtf», если я установил точку останова на a = 255; и до продолжения удаления этой точки останова работает и отображается правильно. Я должен сказать, что прямо сейчас, чтобы точно найти проблему, я вообще не использую цвет, ее просто передают как параметр другой функции, которая не использует ее. Если я не передам его функции, нет сбоя, я думаю, потому что он полностью оптимизирован.

Ну, чтобы сделать вещи даже страннее следующая строка работает:

int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | 0xFF000000; 

Это должно быть технически такой же. Даже дальнейшее тестирование дало следующие результаты: Если a < 64 в первой версии -> нет аварии. Если a >= 64 -> авария.

И для устранения путаницы: int a = rnd.nextInt(255);, который дает значения> = 64 работы каждый раз с первой версией.

/EDIT: И еще одна версия, которая не откажет:

  int r = rnd.nextInt(255); 
      int g = rnd.nextInt(255); 
      int b = rnd.nextInt(255); 
      int a = 0xFF.toInt(); 
      int color = (r & 0xFF) | ((g & 0xFF) << 8) | ((b & 0xFF) << 16) | ((a & 0xFF) << 24); 

/EDIT2: Я открыл вопрос о проекте, чтобы держать в синхронизации, вот ссылка: https://code.google.com/p/dart/issues/detail?id=16633

Я просто ничего не вижу или это довольно нежелательное поведение?

+0

Как говорится, «Иногда такие сюрпризы случаются в Дарт, не часто, а регулярно. Главное, всегда здесь быть готовым к этому». Предупрежден - значит вооружен. – mezoni

ответ

1

Это похоже на ошибку VM.

Пожалуйста, проверьте последнюю версию, если проблема по-прежнему сохраняется, и в противном случае укажите ошибку (http://dartbug.com/new).

спасибо!