重新排序 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 替换我移动的 upLabelNode 来解决这个问题,但这意味着我还必须更新所有引用它的说明。为什么会出现问题?

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 标签在我对它们的指令节点重新排序后没有形成一个区域。我不得不手动更新每个变量。