Skip to content
This repository was archived by the owner on May 12, 2024. It is now read-only.

Commit 49201b2

Browse files
committed
Make List.of(Object[]) copy its argument
1 parent 4347229 commit 49201b2

1 file changed

Lines changed: 39 additions & 17 deletions

File tree

  • src/main/java/net/raphimc/javadowngrader/transformer/j8/methodcallreplacer

src/main/java/net/raphimc/javadowngrader/transformer/j8/methodcallreplacer/ListOfMCR.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package net.raphimc.javadowngrader.transformer.j8.methodcallreplacer;
1919

2020
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
21+
import net.raphimc.javadowngrader.util.ASMUtil;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.Type;
2324
import org.objectweb.asm.tree.*;
@@ -90,45 +91,66 @@ public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, Strin
9091
} else {
9192
final LabelNode forStart = new LabelNode();
9293
final LabelNode forEnd = new LabelNode();
94+
final int resultIndex = ASMUtil.getFreeVarIndex(methodNode);
9395

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)
95105
replacement.add(new InsnNode(Opcodes.ICONST_0));
96-
// Object[] int(i)
106+
// Object[](input) int(i)
97107
replacement.add(forStart);
98-
// Object[] int(i)
108+
// Object[](input) int(i)
99109
replacement.add(new InsnNode(Opcodes.DUP_X1));
100-
// int(i) Object[] int(i)
110+
// int(i) Object[](input) int(i)
101111
replacement.add(new InsnNode(Opcodes.SWAP));
102-
// int(i) int(i) Object[]
112+
// int(i) int(i) Object[](input)
103113
replacement.add(new InsnNode(Opcodes.DUP_X2));
104-
// Object[] int(i) int(i) Object[]
114+
// Object[](input) int(i) int(i) Object[](input)
105115
replacement.add(new InsnNode(Opcodes.ARRAYLENGTH));
106-
// Object[] int(i) int(i) int(length)
116+
// Object[](input) int(i) int(i) int(length)
107117
replacement.add(new JumpInsnNode(Opcodes.IF_ICMPGE, forEnd));
108-
// Object[] int(i)
118+
// Object[](input) int(i)
109119
replacement.add(new InsnNode(Opcodes.DUP2));
110-
// Object[] int(i) Object[] int(i)
120+
// Object[](input) int(i) Object[](input) int(i)
111121
replacement.add(new InsnNode(Opcodes.AALOAD));
112-
// Object[] int(i) Object
122+
// Object[](input) int(i) Object
113123
replacement.add(new MethodInsnNode(
114124
Opcodes.INVOKESTATIC,
115125
"java/util/Objects",
116126
"requireNonNull",
117127
"(Ljava/lang/Object;)Ljava/lang/Object;"
118128
));
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
120140
replacement.add(new InsnNode(Opcodes.POP));
121-
// Object[] int(i)
141+
// Object[](input) int(i)
122142
replacement.add(new InsnNode(Opcodes.ICONST_1));
123-
// Object[] int(i) int
143+
// Object[](input) int(i) int
124144
replacement.add(new InsnNode(Opcodes.IADD));
125-
// Object[] int(i)
145+
// Object[](input) int(i)
126146
replacement.add(new JumpInsnNode(Opcodes.GOTO, forStart));
127147

128148
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)
132154
replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/util/Arrays", "asList", "([Ljava/lang/Object;)Ljava/util/List;"));
133155
// List
134156
}

0 commit comments

Comments
 (0)