3

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 ブラウザーはこれらの極端な値を適切にサポートしていないようです (ビット オーバーフロー?) 例外が発生し、アプリが起動しません...

私はその解決策を見つけようとしています。ブラックベリーのためだけに GWT の integer.parseInt 実装を書き直すことを考えています。どう思いますか?他のアイデアはありますか?

4

1 に答える 1

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

于 2012-06-28T08:12:37.707 に答える