ASM (von ObjectWeb) nicht maxstack Berechnung korrekt, obwohl ClassWriter (COMPUTE_MAX + COMPUTE_STACK) gesetzt
-
19-09-2019 - |
Frage
Ich erhalte erwartet ClassVerifyErrors beim Versuch, eine Klasse zu laden i generiert haben ASM. Ich kann auf weitere Inspektion sehen, dass die JVM korrekt ist, und dass das Verfahren spricht hat über einen ungültigen max_stack Wert. Das Merkwürdige ist, ist mit dem Auto berechnet der Stapel und max lokale Optionen so dass dies kein Problem sein sollte ... Das Verfahren mit der ungültigen Option ist sehr einfach und doch das Ergebnis ist schlecht Bytecode.
Ich habe eine Klasse mit der beabsichtigten Methode geschrieben und meine asm generierte Klasse verglichen, was javac erzeugt und der Byte-Codes matchup mit dem einzigen Fehler die maximale Stack zu sein, ist 0, die falsch ist, während Javac einen Wert von 2 einstellt.
wie Id vermeiden Tha max Stapel / Einheimischen selbst berechnen zu müssen.
Lösung
Max-Stack und variable Berechnung kann die falschen Ergebnissen führen, wenn Bytecode nicht gültig ist. Sie können das überprüfen, indem Sie generierten Code Trog der Lauf CheckClassAdapter .
Beispiel:
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);