|
18 | 18 | package net.raphimc.javadowngrader.transformer.j8.methodcallreplacer; |
19 | 19 |
|
20 | 20 | import net.raphimc.javadowngrader.transformer.MethodCallReplacer; |
| 21 | +import net.raphimc.javadowngrader.util.ASMUtil; |
21 | 22 | import org.objectweb.asm.Opcodes; |
22 | 23 | import org.objectweb.asm.Type; |
23 | 24 | import org.objectweb.asm.tree.*; |
@@ -90,45 +91,66 @@ public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, Strin |
90 | 91 | } else { |
91 | 92 | final LabelNode forStart = new LabelNode(); |
92 | 93 | final LabelNode forEnd = new LabelNode(); |
| 94 | + final int resultIndex = ASMUtil.getFreeVarIndex(methodNode); |
93 | 95 |
|
94 | | - // Object[] |
| 96 | + // Object[](input) |
| 97 | + replacement.add(new InsnNode(Opcodes.DUP)); |
| 98 | + // Object[](input) Object[](input) |
| 99 | + replacement.add(new InsnNode(Opcodes.ARRAYLENGTH)); |
| 100 | + // Object[](input) int(length) |
| 101 | + replacement.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Object")); |
| 102 | + // Object[](input) Object[](result) |
| 103 | + replacement.add(new VarInsnNode(Opcodes.ASTORE, resultIndex)); |
| 104 | + // Object[](input) |
95 | 105 | replacement.add(new InsnNode(Opcodes.ICONST_0)); |
96 | | - // Object[] int(i) |
| 106 | + // Object[](input) int(i) |
97 | 107 | replacement.add(forStart); |
98 | | - // Object[] int(i) |
| 108 | + // Object[](input) int(i) |
99 | 109 | replacement.add(new InsnNode(Opcodes.DUP_X1)); |
100 | | - // int(i) Object[] int(i) |
| 110 | + // int(i) Object[](input) int(i) |
101 | 111 | replacement.add(new InsnNode(Opcodes.SWAP)); |
102 | | - // int(i) int(i) Object[] |
| 112 | + // int(i) int(i) Object[](input) |
103 | 113 | replacement.add(new InsnNode(Opcodes.DUP_X2)); |
104 | | - // Object[] int(i) int(i) Object[] |
| 114 | + // Object[](input) int(i) int(i) Object[](input) |
105 | 115 | replacement.add(new InsnNode(Opcodes.ARRAYLENGTH)); |
106 | | - // Object[] int(i) int(i) int(length) |
| 116 | + // Object[](input) int(i) int(i) int(length) |
107 | 117 | replacement.add(new JumpInsnNode(Opcodes.IF_ICMPGE, forEnd)); |
108 | | - // Object[] int(i) |
| 118 | + // Object[](input) int(i) |
109 | 119 | replacement.add(new InsnNode(Opcodes.DUP2)); |
110 | | - // Object[] int(i) Object[] int(i) |
| 120 | + // Object[](input) int(i) Object[](input) int(i) |
111 | 121 | replacement.add(new InsnNode(Opcodes.AALOAD)); |
112 | | - // Object[] int(i) Object |
| 122 | + // Object[](input) int(i) Object |
113 | 123 | replacement.add(new MethodInsnNode( |
114 | 124 | Opcodes.INVOKESTATIC, |
115 | 125 | "java/util/Objects", |
116 | 126 | "requireNonNull", |
117 | 127 | "(Ljava/lang/Object;)Ljava/lang/Object;" |
118 | 128 | )); |
119 | | - // Object[] int(i) Object |
| 129 | + // Object[](input) int(i) Object |
| 130 | + replacement.add(new InsnNode(Opcodes.DUP2)); |
| 131 | + // Object[](input) int(i) Object int(i) Object |
| 132 | + replacement.add(new VarInsnNode(Opcodes.ALOAD, resultIndex)); |
| 133 | + // Object[](input) int(i) Object int(i) Object Object[](result) |
| 134 | + replacement.add(new InsnNode(Opcodes.DUP_X2)); |
| 135 | + // Object[](input) int(i) Object Object[](result) int(i) Object Object[](result) |
| 136 | + replacement.add(new InsnNode(Opcodes.POP)); |
| 137 | + // Object[](input) int(i) Object Object[](result) int(i) Object |
| 138 | + replacement.add(new InsnNode(Opcodes.AASTORE)); |
| 139 | + // Object[](input) int(i) Object |
120 | 140 | replacement.add(new InsnNode(Opcodes.POP)); |
121 | | - // Object[] int(i) |
| 141 | + // Object[](input) int(i) |
122 | 142 | replacement.add(new InsnNode(Opcodes.ICONST_1)); |
123 | | - // Object[] int(i) int |
| 143 | + // Object[](input) int(i) int |
124 | 144 | replacement.add(new InsnNode(Opcodes.IADD)); |
125 | | - // Object[] int(i) |
| 145 | + // Object[](input) int(i) |
126 | 146 | replacement.add(new JumpInsnNode(Opcodes.GOTO, forStart)); |
127 | 147 |
|
128 | 148 | replacement.add(forEnd); |
129 | | - // Object[] int(i) |
130 | | - replacement.add(new InsnNode(Opcodes.POP)); |
131 | | - // Object[] |
| 149 | + // Object[](input) int(i) |
| 150 | + replacement.add(new InsnNode(Opcodes.POP2)); |
| 151 | + // |
| 152 | + replacement.add(new VarInsnNode(Opcodes.ALOAD, resultIndex)); |
| 153 | + // Object[](result) |
132 | 154 | replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Arrays", "asList", "([Ljava/lang/Object;)Ljava/util/List;")); |
133 | 155 | // List |
134 | 156 | } |
|
0 commit comments