重新排序 LabelNodes 会导致它们在 Java ASM 中的偏移量混乱
Reordering LabelNodes causes their offset to mess up in Java ASM
我有以下示例代码:
Label L1654589030
Line 3, L1654589030
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
Label L466002798
我执行基本转换,重新排序指令和标签并插入两个 GOTO
指令:
GOTO L1654589030
Label L466002798
RETURN
Label L1654589030
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
GOTO L466002798
但是,当 ASM 正在计算帧时,它会在 org.objectweb.asm.ClassReader.createDebugLabel
处抛出一个 ArrayIndexOutOfBoundsException
。在 createDebugLabel
中,ASM 尝试访问偏移量 65539
处的标签,因此崩溃。我可以通过用新的 LabelNode
替换我移动的 up
的 LabelNode
来解决这个问题,但这意味着我还必须更新所有引用它的说明。为什么会出现问题?
EDIT1 | CheckClassAdapter
returns 以下转储:
<init>()V
00000 Main : : GOTO L0
00001 Main : : L1
00002 Main : : FRAME FULL [com/company/Main] []
00003 Main : : RETURN
00004 Main : : L0
00005 Main : : FRAME FULL [U] []
00006 Main : : ALOAD 0
00007 Main : Main : INVOKESPECIAL java/lang/Object.<init> ()V
00008 Main : : GOTO L1
FRAME FULL
不应该存在,但我该如何解决?
已解决: MethodNode.localVariables
-> start
/ end
标签在我对它们的指令节点重新排序后没有形成一个区域。我不得不手动更新每个变量。
我有以下示例代码:
Label L1654589030
Line 3, L1654589030
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
Label L466002798
我执行基本转换,重新排序指令和标签并插入两个 GOTO
指令:
GOTO L1654589030
Label L466002798
RETURN
Label L1654589030
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
GOTO L466002798
但是,当 ASM 正在计算帧时,它会在 org.objectweb.asm.ClassReader.createDebugLabel
处抛出一个 ArrayIndexOutOfBoundsException
。在 createDebugLabel
中,ASM 尝试访问偏移量 65539
处的标签,因此崩溃。我可以通过用新的 LabelNode
替换我移动的 up
的 LabelNode
来解决这个问题,但这意味着我还必须更新所有引用它的说明。为什么会出现问题?
EDIT1 | CheckClassAdapter
returns 以下转储:
<init>()V
00000 Main : : GOTO L0
00001 Main : : L1
00002 Main : : FRAME FULL [com/company/Main] []
00003 Main : : RETURN
00004 Main : : L0
00005 Main : : FRAME FULL [U] []
00006 Main : : ALOAD 0
00007 Main : Main : INVOKESPECIAL java/lang/Object.<init> ()V
00008 Main : : GOTO L1
FRAME FULL
不应该存在,但我该如何解决?
已解决: MethodNode.localVariables
-> start
/ end
标签在我对它们的指令节点重新排序后没有形成一个区域。我不得不手动更新每个变量。