[ASM] Копирование InsnList

Версия Minecraft
1.1+
7,099
324
1,510
Вопрос не совсем по моддингу, но связан с созданием кормодов, так что вроде не оффтоп.
InsnList - это представление последовательности инструкций байткода, если че.
У него нет метода для создания копии.
Попытался перебирать все ноды текущего листа и копировать в новый, чтобы получить копию.
Но оно че-то не работает, npe кидает

Java:
public static InsnList copy(InsnList insnList) {
    InsnList r = new InsnList();
    
    for (int i = 0; i < insnList.size(); i++)
        r.add(insnList.get(i)/[I].clone(new HashMap<>())[/I]/);

    return r;
}

Как правильно копировать этот список?
Заранее спасибо
 
Краш-лог
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at org.objectweb.asm.tree.InsnList.toArray(InsnList.java:199)
at org.objectweb.asm.tree.InsnList.get(InsnList.java:110)
Краш-лог:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at org.objectweb.asm.tree.InsnList.toArray(InsnList.java:199)
	at org.objectweb.asm.tree.InsnList.get(InsnList.java:110)
Решение
Java:
public static Map<LabelNode, LabelNode> cloneLabels(InsnList insns) {
        HashMap<LabelNode, LabelNode> labelMap = new HashMap<LabelNode, LabelNode>();
        for (AbstractInsnNode insn = insns.getFirst(); insn != null; insn = insn.getNext()) {
            if (insn.getType() == 8) {
                labelMap.put((LabelNode) insn, new LabelNode());
            }
        }
        return labelMap;
    }

    public static InsnList cloneInsnList(InsnList insns) {
        return cloneInsnList(cloneLabels(insns), insns);
    }

    public static InsnList cloneInsnList(Map<LabelNode, LabelNode> labelMap, InsnList insns) {
        InsnList clone = new InsnList();
        for (AbstractInsnNode insn = insns.getFirst(); insn != null; insn...
3,005
192
592
А у него вроде есть метод адд с аргументом таким же как и класс (InsnList), это разве не то?
 
7,099
324
1,510
Все методы, добавляющие один лист в другой очищают лист из аргумента, таким образом копии не получается
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Java:
public static Map<LabelNode, LabelNode> cloneLabels(InsnList insns) {
        HashMap<LabelNode, LabelNode> labelMap = new HashMap<LabelNode, LabelNode>();
        for (AbstractInsnNode insn = insns.getFirst(); insn != null; insn = insn.getNext()) {
            if (insn.getType() == 8) {
                labelMap.put((LabelNode) insn, new LabelNode());
            }
        }
        return labelMap;
    }

    public static InsnList cloneInsnList(InsnList insns) {
        return cloneInsnList(cloneLabels(insns), insns);
    }

    public static InsnList cloneInsnList(Map<LabelNode, LabelNode> labelMap, InsnList insns) {
        InsnList clone = new InsnList();
        for (AbstractInsnNode insn = insns.getFirst(); insn != null; insn = insn.getNext()) {
            clone.add(insn.clone(labelMap));
        }

        return clone;
    }
 
Сверху