我一直在使用一些asm(使用Minecraft Forge的Transform类,但它不应该相关),但是我一直在使用NoClassDefFoundError和NullPointerException崩溃。我已经缩小了问题和理论解决方案的范围。
我正在尝试在操作数23处注入代码,但代码是包含跳转到代码中已存在于别处(在操作数68处)的标签。 (m是methodNode)
m.instructions.insert(m.instructions.get(23), ConfigPatch1());
要注入的代码:
InsnList toInject = new InsnList();
toInject.add(new VarInsnNode(ALOAD, 0));
toInject.add(new InsnNode(ICONST_0));
toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C"));
toInject.add(new IntInsnNode(BIPUSH, 33));
toInject.add(new JumpInsnNode(IF_ICMPEQ, 68sLabelNode));
return toInject;
最后一个添加应该在操作数68处具有LabelNode的标签。 我尝试过使用:
(LabelNode) m.instructions.get(68)
但后来我得到了“堆栈错误的操作数”错误;似乎表明演员阵容很糟糕。 get返回一个AbstractInsnNode。
如何从操作数68中获取LabelNode,以便在注射时使用它?
谢谢StackOverflow!
答案 0 :(得分:0)
我不确定,但我认为你可以创建一个新的LabelNode并在指令#68之前插入它,然后跳转到它。
此外,使用InstructionAdapter比使用new
直接创建说明更方便。