2011-02-03 3 views
5

J'écris ma propre copie de la JVM et je voudrais tester son comportement sur certaines opérations numériques simples, telles que les ajouts, les soustractions, les dépassements numériques, etc. Plutôt que d'écrire le bytecode à la main, je pensais que ce serait un bonne idée de simplement écrire du code Java, javac le compiler en bytecode, puis tester la JVM sur ce bytecode.Désactivation de l'optimisation dans javac?

Le problème est que javac fait beaucoup d'optimisations en ligne (très raisonnables!) Qui empêchent le code de tester ce que je voudrais tester. Par exemple, un test tente de vérifier que les débordements intégraux sont gérés correctement pour tous les types. Voici un aperçu:

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

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

Le fichier généré .class a le résultat de ((byte)max + 1) hardcoded comme (byte) -128, qui contrecarre complètement le point de l'essai.

Ma question est la suivante: Y at-il un moyen de désactiver l'optimisation dans javac? Je n'ai pas réussi à trouver un commutateur de ligne de commande pour le faire, même si je n'ai peut-être pas regardé assez fort. S'il n'y a aucun moyen de faire cela, existe-t-il un autre compilateur Java qui a la capacité de compiler avec toutes les optimisations désactivées?

Répondre

1

De nombreux compilateurs de production, y compris le javac dérivé de Sun, effectuent ce genre de simplification, quelle que soit l'optimisation définie.

Avez-vous regardé Jasmin, le bytecode Java 'assembler'?

+0

Je ne l'ai pas entendu parler de Jasmin! C'est un lien plutôt sympa. Je dois peut-être enquêter là-dessus. – templatetypedef

3

Je pense que la plupart des optimisations auxquelles vous semblez penser sont réellement mandatées par le JLS, car elles sont constant expressions. Donc, assurez-vous que vous n'avez pas d'expressions constantes, et javac ne peut pas les optimiser.

Dans votre exemple, vous pouvez l'écrire comme ceci:

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

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