代码之家  ›  专栏  ›  技术社区  ›  mP.

ASM(来自ObjectWeb)未正确计算MaxStack,即使已设置ClassWriter(Compute_Max+Compute_Stack)

  •  1
  • mP.  · 技术社区  · 14 年前

    在尝试加载使用asm生成的类时,会遇到预期的ClassVerifyErrors。在进一步的检查中,我可以看到JVM是正确的,并且所讨论的方法具有无效的max_堆栈值。奇怪的是,正在使用自动计算堆栈和最大本地选项,所以这不应该是一个问题… 带有无效选项的方法非常简单,但结果是不好的字节码。

    我用预期的方法编写了一个类,并将我的asm生成的类与javac生成的类进行了比较,字节代码与唯一的错误是max stack为0,这是错误的,而javac将值设置为2。

    我想避免自己计算THA max堆栈/局部变量。

    1 回复  |  直到 11 年前
        1
  •  6
  •   Andreas Fester    11 年前

    如果字节码无效,最大堆栈和变量计算可能会产生错误的结果。您可以通过运行生成的代码来验证 CheckClassAdapter .

    例如,

      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);