Почему происходит сбой приложения GWT на blackberry OS7?

#gwt #blackberry #crash #parseint

#gwt #ежевика #сбой #parseint

Вопрос:

Я попробовал следующий код в браузере blackberry os7:

 <html>
<body>
test page
<script>
i = 0;
if(i < -2147483647) {
   alert("very low")
} 

if(i < -2147483648) {
   alert("very very low")
} 

if(i < -2147483649) {
    alert("very very very low")
}
</script></body></html>
  

И, что удивительно, результат оказался очень, очень низким!!

Я думал, что целые числа в javascript должны поддерживать нечто большее. Конечно, этот код хорошо работает в других браузерах…

Сложность в том, что я обнаружил, что попытка запустить приложение gwt на blackberry. Оно отлично работало на OS6, но не на OS7. Я отладил свой код, скомпилированный GWT, и случилось так, что реализация javascript Integer.parseInt имеет тест с использованием экстремально высокого и экстремально низкого значений int. Поскольку браузер OS7, похоже, не поддерживает эти экстремальные значения должным образом (переполнение битов?) Я получаю исключение, и мое приложение не запускается…

Я пытаюсь найти решение для этого. Я подумываю о том, чтобы переписать реализацию GWT integer.parseInt только для blackberry. что вы думаете? Есть другие идеи?

Комментарии:

1. возможно, повторная привязка была бы элегантным решением, возможно, с собственным поставщиком свойств — какая перестановка браузера используется os7?

2. На самом деле это браузер на основе webkit, так что, я думаю, это перестановка safari. Мы рассматриваем возможность повторного привязывания метода integer.parseInt() в GWT, но мы еще не нашли способ. Повторная привязка — это элегантный обходной путь, это точно. Я опубликую решение, если мы что-то найдем.

3. ах, обычная повторная привязка не работает, потому что вы не можете расширить Integer, а parseInt является статическим, верно? было бы другое решение: gwt super-sourcing. НО для этого потребуется реализовать ВСЕ функции и поля Integer. и это становится еще более сложным, если вы хотите сериализовать его (например, в асинхронных вызовах). и повторная привязка по-прежнему невозможна, поэтому новый класс используется всеми перестановками. если хотите, я с радостью дам вам больше информации об этом, но это действительно последний луч надежды.

4. Решение, которое мы нашли до сих пор, заключается в том, чтобы фактически избегать использования integer.parseInt . Это решение неприемлемо в долгосрочной перспективе, но оно позволяет нам выпустить наш продукт для blackberry. Может быть, мы можем написать что-то вроде служебного метода для вызова вместо вызова parseInt в нашем коде. Я надеюсь, что RIM знает об этом, и я надеюсь, что они исправят это как можно скорее…

Ответ №1:

На случай, если кто-нибудь наткнется на эту старую ветку в поисках ответов:

Мне кажется, ошибка в части компилятора JS-engine.

Фрагмент 1:

 var i = 0;
if (i < -2147483648) {
  console.log("less");
} else {
  console.log("greater");
}
  

Фрагмент 2:

 var i = 0;
var j = i < -2147483648;
if (j) {
  console.log("less");
} else {
  console.log("greater");
}
  

В то время как фрагмент 1 отображает ошибку, регистрируя «меньше», фрагмент 2 этого не делает.

Итак, чтобы обойти ошибку, мы проверили исходные коды GWT и скомпилировали наш собственный SDK с применением этого исправления. С тех пор у нас не было проблем с Integer.parseInt.

 diff --git a/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java         b/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
index 04a85e1..abb3e5c 100644
--- a/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
    b/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -221,9  221,10 @@ public abstract class Number implements Serializable {
     }

     int toReturn = __parseInt(s, radix);
     boolean isTooLow = toReturn < lowerBound;
     if (__isNaN(toReturn)) {
       throw NumberFormatException.forInputString(s);
-    } else if (toReturn < lowerBound || toReturn > upperBound) {
     } else if (isTooLow || toReturn > upperBound) {
       throw NumberFormatException.forInputString(s);
     }
  

Ссылка на отчет об ошибке GWT:http://code.google.com/p/google-web-toolkit/issues/detail?id=7291