ASM (da ObjectWeb) non calcolando MaxStack correttamente anche se ClassWriter (COMPUTE_MAX + COMPUTE_STACK) è impostato

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

Domanda

Io sono sempre ClassVerifyErrors previsti quando si tenta di caricare una classe che ho generato utilizzando ASM. Su ulteriori controlli posso vedere che la JVM sia corretta e che il metodo sta parlando ha un valore MAX_STACK valido. La cosa strana è sto usando l'auto calcolare la pila e opzioni max locali quindi questo non dovrebbe essere un problema ... Il metodo con l'opzione non valida è molto semplice, eppure il risultato è male bytecode.

ho scritto una classe con il metodo previsto e rispetto il mio asm generato classe contro ciò che javac produce ei codici di byte matchup con l'unico errore è la pila max è 0 che è sbagliato, mentre javac imposta un valore di 2.

Id come per evitare di dover calcolare tha pila max / gente del posto me stesso.

È stato utile?

Soluzione

Max stack e calcolo variabile può produrre i risultati sbagliati se bytecode non è valido. È possibile verificare che eseguendo codice generato attraverso gli CheckClassAdapter .

Ad esempio,

  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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top