Что-то не так с javascript unsigned shift operator на iPad?

Я случайно столкнулся с тем, что кажется очень странной ошибкой в ​​JavaScript-движке Safari на iPad.

Беззнаковый оператор сдвига → > предполагается побитовым сдвигом справа. Я испытал некоторые ошибки в script, которые отлично работали на других платформах, разделили его и закончили с этим:

<html><head><script type='text/javascript'>

var one = 1;

function Zero()
{
    return one*0;
}

function Strange()
{
     return one = (Zero()+1) >>> 0;
}

var s = 'A bunch of ones: '; // except on iPad :(
for (var i=0; i<200; i++) 
{
     s += Strange()+' ';
}
document.write(s);

</script></head><body></body></html>

Живая демонстрация

Как ни странно, он правильно генерирует группу из них, но в какой-то момент что-то ломается, и оно только выводит нули с этого момента.

Очевидно, что → > 0 здесь бессмысленно (сдвиг по нулевым местам обычно ничего не делает, хотя он мог бы заставить целое число стать без знака, если javascript сделал это различие). Это просто для демонстрации проблемы, если вы опустите → > 0, она не появляется. В моей реальной ситуации были разные числа и более сложные выражения, но одно и то же: все работает до нескольких итераций, затем что-то "ломается", а переменные внезапно становятся и остаются нулевыми даже после последующих вычислений, которые действительно должны сделать они отличны от нуля.

Прекрасно работает в браузерах для Android и ПК. Странный ха?

Ответ 1

Не "реальный" ответ, но, возможно, полезный, предполагающий (как кажется ОЧЕНЬ вероятным), что это просто ошибка в компиляторе Apple JIT: этот поток StackOverflow (Отключение JIT в Safari 6, чтобы обойти серьезные Javascript JIT-ошибки) рассказывает о том, как отключить JIT для вашего кода. В основном,

Оберните выражение о нарушении в блок try-catch do-nothing.

У меня нет устройства iOS для тестирования, но разве это проблема? Можете ли вы применить такой же способ обхода к исходному коду?

function Strange()
{
    try
    {
        return one = (Zero()+1) >>> 0;
    }
    catch (e) { throw e }
}

Ответ 2

Для записи описанное ошибочное поведение, похоже, не происходит в Mobile Safari 5.0.2, запущенном на iOS 4.2.1