2011-02-03 50 views
5

我正在編寫自己的JVM副本,並希望測試其在一些簡單的數字操作上的行爲,例如添加,減法,數字溢出等。而不是手寫字節碼,我認爲這將是一個只需編寫簡單的Java代碼,將javac編譯成字節碼,然後在該字節碼上測試JVM即可。在javac中禁用優化?

問題是javac正在進行大量(非常合理的!)內聯優化,以防止代碼測試我想測試的內容。例如,一個測試試圖驗證對所有類型都正確處理積分溢出。這裏是一個快照:

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

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

生成.class文件有((byte)max + 1)硬編碼爲(byte) -128,這完全違背了測試點的結果。

我的問題是這樣的:有沒有辦法在javac禁用優化?我一直無法找到一個命令行開關來做到這一點,雖然也許我只是沒有看夠不夠。如果沒有辦法做到這一點,是否有另一個Java編譯器能夠在關閉所有優化的情況下進行編譯?

回答

1

許多生產編譯器,包括常見的來自Sun的javac,都會進行這種簡化,無論優化如何。

你看過Jasmin,Java字節碼'彙編'嗎?

+0

我還沒有聽說過茉莉的!這是一個非常酷的鏈接。我可能需要調查這一點。 – templatetypedef 2011-02-03 02:43:32

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.