重新排序LabelNodes会导致其偏移量陷入Java ASM

时间:2017-11-13 20:22:52

标签: java bytecode java-bytecode-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计算帧数时,它会在ArrayIndexOutOfBoundsException处抛出org.objectweb.asm.ClassReader.createDebugLabel。在createDebugLabel中,ASM尝试访问偏移65539处的标签,从而崩溃。我可以通过使用新的LabelNode替换up我移动的LabelNode来解决此问题,但这意味着我还必须更新引用它的所有指令。为什么会出现问题?

EDIT1 | CheckClassAdapter返回以下转储:

<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不应该存在,但我该如何解决?

1 个答案:

答案 0 :(得分:0)

已解决: MethodNode.localVariables - &gt;在重新排序其指令节点后,start / end标签未形成区域。我不得不手动更新每个变量。