diff options
author | catsalty <23442547+catsalty@users.noreply.github.com> | 2024-07-25 19:16:23 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-25 19:16:23 +0800 |
commit | 6722b966e685afb225b7372e771672d1d392c333 (patch) | |
tree | f9a0a1000ee66c555f42792166a460aacd7c56a4 | |
parent | 4c998e0e31b08b63eb04ac8e374c85d973e6bb09 (diff) | |
download | javassist-6722b966e685afb225b7372e771672d1d392c333.tar.gz javassist-6722b966e685afb225b7372e771672d1d392c333.zip |
[bugfix]fix TransformCallToStatic with invokeinterface or invokedynamic
Replacing invokeinterface or invokedynamic with invokestatic will result in a missing instruction. This solution can fix the problem.
Reference document:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokestatic
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokeinterface
-rw-r--r-- | src/main/javassist/convert/TransformCallToStatic.java | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/main/javassist/convert/TransformCallToStatic.java b/src/main/javassist/convert/TransformCallToStatic.java index 6f1dfef3..a7b435d7 100644 --- a/src/main/javassist/convert/TransformCallToStatic.java +++ b/src/main/javassist/convert/TransformCallToStatic.java @@ -23,6 +23,9 @@ public class TransformCallToStatic extends TransformCall { } iterator.writeByte(Opcode.INVOKESTATIC, pos); iterator.write16bit(newIndex, pos + 1); + if (c == Opcode.INVOKEINTERFACE || c == Opcode.INVOKEDYNAMIC) { + iterator.writeByte(0, pos + 3); + } return pos; } } |