2011-02-03 22 views
5

私は自分のJVMのコピーを作成していますが、追加、減算、数値のオーバーフローなどの単純な数値演算でその動作をテストしたいと思います。バイトコードを手作業で書くのではなく、単純なJavaコードを書くだけの良いアイデアは、javacをコンパイルしてバイトコードにしてから、そのバイトコードでJVMをテストしてください。javacで最適化を無効にしますか?

問題は、javacが、私がテストしたいものをコードからテストするのを妨げる多くの(非常に賢明な!)インライン最適化を行っていることです。たとえば、1つのテストでは、積分オーバーフローがすべてのタイプに対して正しく処理されているかどうかを検証しようとします。

byte min = (byte)-128; 
byte max = (byte) 127; 

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly. 

生成.classファイルが完全にテストのポイントを敗北(byte) -128、としてハード((byte)max + 1)の結果があります。ここでは1つのスナップショットです。

質問:javacで最適化を無効にする方法はありますか?私はこれを行うためのコマンドラインスイッチを見つけることができませんでしたが、おそらく私はちょうど十分に見苦しくはありませんでした。これを行う方法がない場合は、すべての最適化をオフにしてコンパイルできる別のJavaコンパイラがありますか?

答えて

1

一般的なSunの派生版javacを含む多くのプロダクションコンパイラは、最適化が設定されていても、このような単純化を行います。

あなたはJasmin、Javaバイトコード 'アセンブラ'を見ましたか?

+0

:あなたの例では

、あなたはこのようにそれを書くこと!それはかなりクールなリンクです。私はこれを調べなければならないかもしれない。 – templatetypedef

3

の最適化は、実際にはJLSによって義務づけられているようだと思います。これらはconstant expressionsです。したがって、定数式がないことを確認し、javacでそれらを最適化することはできません。私はジャスミンの聞いたことがない

byte min = new Byte((byte)-128).byteValue(); 
byte max = new Byte((byte) 127).byteValue(); 

assertTrue((byte)(max + 1) == min); // Should overflow and work correctly. 
関連する問題