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

Я попробовал следующий код в браузере 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 только для ежевики. Как вы думаете? Любые другие идеи?


person twingocerise    schedule 11.11.2011    source источник
comment
возможно, перепривязка была бы элегантным решением, может быть, с собственным поставщиком свойств - какая перестановка браузера используется в os7?   -  person MarioP    schedule 11.11.2011
comment
На самом деле это браузер на основе webkit, так что, я думаю, это перестановка сафари. Мы рассматриваем перепривязку метода integer.parseInt() в GWT, но пока не нашли способа. Перепривязка — это элегантный обходной путь, это точно. Я опубликую решение, если мы что-то нашли.   -  person twingocerise    schedule 14.11.2011
comment
ах, обычное перепривязывание не работает, потому что вы не можете расширить Integer, а parseInt является статическим, верно? было бы другое решение: gwt super-sourcing. НО, это потребует от вас реализации ВСЕХ функций и полей Integer. и становится еще сложнее, если вы хотите его сериализовать (например, в асинхронных вызовах). и повторная привязка по-прежнему невозможна, поэтому новый класс используется всеми перестановками. если хотите, я с радостью дам вам больше информации об этом, но это действительно последний луч надежды.   -  person MarioP    schedule 16.11.2011
comment
Решение, которое мы нашли до сих пор, состоит в том, чтобы фактически избегать использования integer.parseInt. Это решение неприемлемо в долгосрочной перспективе, но оно позволяет нам выпустить наш продукт для Blackberry. Может быть, мы можем написать своего рода служебный метод для вызова вместо вызова parseInt в нашем коде. Я надеюсь, что RIM знает об этом, и я надеюсь, что они исправят это как можно скорее...   -  person twingocerise    schedule 18.11.2011


Ответы (1)


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

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

Фрагмент 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

person Tangresh    schedule 28.06.2012