为什么GWT应用程序在黑莓OS7上崩溃?

时间:2011-11-11 18:28:37

标签: gwt blackberry crash 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应用程序。它在OS6上运行良好但在OS7上运行不正常。我调试了由GWT编译的代码,并且发生了Integer.parseInt的javascript实现使用int的极高和极低的测试。由于OS7浏览器似乎没有正确支持这些极端值(位溢出?),我得到一个异常,我的应用程序无法启动......

我正在努力寻找解决方案。我正在考虑为blackberry重写GWT integer.parseInt实现。你怎么看?还有其他想法吗?

1 个答案:

答案 0 :(得分: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通过记录“less”来显示错误,但代码段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