Java 8 ASM-visitMaxs的错误计算-Java 8类型推断

Java 8 ASM-visitMaxs的错误计算-Java 8类型推断,java-8,java-bytecode-asm,Java 8,Java Bytecode Asm,我将ASM5.0.3字节代码库与Tomcat 8和JDK 8一起使用。所讨论的目标应用程序是Tomcat8示例websocket应用程序。我得到java.lang.VerifyError:操作数堆栈溢出异常 (请注意,这个问题在使用JDK 7和JDK 8的Tomcat 7 websocket应用程序中没有表现出来。) 我比较了注入前字节码和注入后字节码,观察结果如下: 在字节码注入之后,我希望看到websocket/chat/chatnotation类的broadcast方法的mv.visit

我将ASM5.0.3字节代码库与Tomcat 8和JDK 8一起使用。所讨论的目标应用程序是Tomcat8示例websocket应用程序。我得到
java.lang.VerifyError:操作数堆栈溢出异常

(请注意,这个问题在使用JDK 7和JDK 8的Tomcat 7 websocket应用程序中没有表现出来。)

我比较了注入前字节码和注入后字节码,观察结果如下:

  • 在字节码注入之后,我希望看到
    websocket/chat/chatnotation
    类的
    broadcast
    方法的mv.visitmax(6,6),因为我注入了一个额外的局部变量,该变量也保存在堆栈中
  • 相反,我看到的是mv.visitmax(0,6)。差异如下面的屏幕截图所示:
换句话说,
局部变量
是正确的,但是
堆栈
是不正确的

  • Tomcat7的相同比较看起来不错。after字节码输出显示正确的mv.VISITMAX(6,6)
作为下一步,我比较了Tomcat7和Tomcat8的
chatnotation.java
源代码。它们的主要区别在于Java 8版本的类型推断用法,如下面的屏幕截图所示:

一旦我更改了Java8示例源代码以删除类型推断(即使用显式声明的类型),问题就消失了

问题:在ASM中,我应该如何处理Java 8类型推断以便获得正确的堆栈映射

编辑#1
同样,在没有任何代码更改的情况下,用Java1.7重新编译有问题的类,问题就消失了。ASM 5.0.3是否错误地计算了特定java类的最大堆栈?

由于ASM不解析源代码,因此类型推断与之无关。所以在ASM中没有“处理类型推断”的方法,因为根本就没有这样的东西。无论如何,为visitMaxs提供正确参数的责任在于方法的调用方,而不是ASM。嗨,Holger,thaks,谢谢你的观点。还注意到,重新编译有问题的类解决了这个问题。似乎ASM以正确的方式处理了“Java8类型推断”。