И на удивление получилось очень-очень низко!! Я думал, что целые числа в javascript должны поддерживать больше, чем это. Конечно, этот код хорошо работает в других браузерах... Сложность в том, что я обнаружил, что пытаюсь запустить.","answerCount":1,"dateCreated":"2011-11-11","acceptedAnswer":{"@type":"Answer","text":"На случай, если кто-то наткнется на эту старую тему в поисках ответов: Мне кажется, ошибка в компиляторной части 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 и."}}}
Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: twingoceriseОтветов: 1

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

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

crashgwtblackberryparseint

Ответы

Ответ 1 · рейтинг 1 · Tangresh

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

Мне кажется, ошибка в компиляторной части 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы