2011-11-11 17 views
3

私は、BlackBerry OS7ブラウザ上で次のコードを試してみました:GWTアプリケーションがブラックベリー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実装をブラックベリーのために書き直すことを考えています。どう思いますか?他のアイデア?

+0

は多分再バインドは多分自分の財産プロバイダで、エレガントな解決策になる - OS7が使用するブラウザの順列は何ですか? – MarioP

+0

これは実際にWebkitベースのブラウザなので、私が推測するサファリの順列です。私たちはGWTでinteger.parseInt()メソッドを再バインドすることを検討していますが、まだ方法が見つかりませんでした。 Rebindingは、確かにエレガントな回避策です。私たちが何かを見つけたら解決策を投稿します。 – twingocerise

+0

ああ、Integerを拡張することができないため、通常の再バインドは機能しません。また、parseIntは静的です。もう一つの解決策があります:スーパーソーシングを行うこと。しかし、それはIntegerのすべての関数とフィールドを実装する必要があります。シリアライズする場合(非同期呼び出しなど)にはさらに複雑になります。まだ再バインディングが不可能なので、新しいクラスはすべての順列で使用されます。もし望めば、私はあなたにそれについてもっと情報を与えてくれるでしょうが、それは本当に希望の最後の光線です。 – MarioP

答えて

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には問題がありませんでした。 GWTのバグレポートへ

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); 
    } 

リンク:http://code.google.com/p/google-web-toolkit/issues/detail?id=7291

関連する問題