#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