ASM (à partir ObjectWeb) ne pas calculer correctement MaxStack même si ClassWriter (COMPUTE_MAX + COMPUTE_STACK) est réglé

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

Question

Je reçois ClassVerifyErrors attendus lors d'une tentative de charger une classe que j'ai généré en utilisant ASM. Sur une inspection plus poussée, je peux voir que la machine virtuelle Java est correcte et que la méthode parle a une valeur MAX_STACK non valide. La chose étrange est auto emploie le calcul de la pile et les options locales max donc cela ne devrait pas être un problème ... La méthode avec l'option non valide est très simple et pourtant le résultat est mauvais bytecode.

J'ai écrit une classe avec la méthode prévue et comparé mon asm produit de classe contre ce javac produit et les codes d'octets matchup avec la seule erreur étant la pile max est 0 ce qui est faux en javac définit une valeur de 2.

Id comme pour éviter d'avoir à calculer tha pile max / locaux me.

Était-ce utile?

La solution

pile Max et calcul variables peuvent produire des résultats erronés si bytecode est pas valide. Vous pouvez vérifier que en exécutant le code généré creux CheckClassAdapter .

Par exemple,

  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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top