我正在使用带有Tomcat 8和JDK 8的ASM 5.0.3字节代码库。所讨论的目标应用程序是 Tomcat 8示例websocket应用程序。我收到java.lang.VerifyError: Operand stack overflow Exception
。
(请注意,使用JDK 7和8的Tomcat 7 websocket应用程序不会出现此问题。)
我比较了注入前的字节码和注入后的字节码,以下是观察结果:
broadcast
类的websocket/chat/ChatAnnotation
方法,因为我注入了一个额外的局部变量,该变量也保存在堆栈中。 换句话说,locals
是正确的,但stack
不正确。
下一步,我比较了Tomcat 7与Tomcat 8的ChatAnnotation.java
的源代码。它们的主要区别在于Java 8版本的Type Inference的使用,如下面的屏幕截图所示:
一旦我更改了Java 8示例源代码以删除类型推断(即使用显式声明的类型),问题就消失了。
问题:在ASM中,我应该如何处理Java 8类型的推断,以便获得正确的stackmap?
EDIT#1 还使用Java 1.7重新编译了有问题的类,没有任何代码更改,问题就消失了。 ASM 5.0.3是否错误地计算了特定java类的Max Stack?