ASM (von ObjectWeb) nicht maxstack Berechnung korrekt, obwohl ClassWriter (COMPUTE_MAX + COMPUTE_STACK) gesetzt

StackOverflow https://stackoverflow.com/questions/2235493

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.

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top