2010-02-10 6 views
1

Je m'attends à recevoir ClassVerifyErrors lors de la tentative de chargement d'une classe que j'ai générée en utilisant ASM. Une inspection plus poussée, je peux voir que le jvm est correct et que la méthode parle a une valeur MAX_STACK invalide. L'étrange chose est d'utiliser l'auto pour calculer la pile et les options locales max donc ça ne devrait pas poser de problème ... La méthode avec l'option invalide est très simple et pourtant le résultat est un mauvais bytecode. J'ai écrit une classe avec la méthode prévue et j'ai comparé ma classe asm générée avec ce que javac produit et les codes octets correspondent avec la seule erreur étant que la pile max est 0 ce qui est faux tandis que javac définit une valeur de 2.ASM (à partir d'ObjectWeb) ne calcule pas MaxStack correctement même si ClassWriter (COMPUTE_MAX + COMPUTE_STACK) est défini

Id j'aime éviter d'avoir à calculer moi-même la pile/les sections locales.

Répondre

6

La pile max et le calcul de variable peuvent produire de mauvais résultats si le bytecode n'est pas valide. Vous pouvez le vérifier en exécutant le code généré à travers le 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); 
+0

Thanx Eugene pour la réponse et l'ASM :) Mon problème a été causé par défaut de mettre fin à la méthode et la création d'une autre qui signifiait en quelque sorte l'instance générateur généré précédemment était dans un état confus . –