aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcatsalty <23442547+catsalty@users.noreply.github.com>2024-07-25 19:16:23 +0800
committerGitHub <noreply@github.com>2024-07-25 19:16:23 +0800
commit6722b966e685afb225b7372e771672d1d392c333 (patch)
treef9a0a1000ee66c555f42792166a460aacd7c56a4
parent4c998e0e31b08b63eb04ac8e374c85d973e6bb09 (diff)
downloadjavassist-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.java3
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;
}
}