Skip to content

Commit 0925ff1

Browse files
committed
Fix bad classloading for ProtocolLib
1 parent d3c9fa0 commit 0925ff1

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed

arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderAdapter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private void implementIntf(ClassNode node) {
114114
list.add(new TypeInsnNode(Opcodes.NEW, config));
115115
list.add(new InsnNode(Opcodes.DUP));
116116
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
117-
list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(RemappingClassLoader.class), "needRemap", Type.getMethodDescriptor(Type.getType(boolean.class), Type.getType(ClassLoader.class))));
117+
list.add(new MethodInsnNode(Opcodes.INVOKESTATIC, node.name, "needRemap", Type.getMethodDescriptor(Type.getType(boolean.class), Type.getType(ClassLoader.class))));
118118
list.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, config, "<init>", "(Z)V"));
119119
list.add(new VarInsnNode(Opcodes.ALOAD, 0));
120120
list.add(new InsnNode(Opcodes.SWAP));
@@ -134,6 +134,7 @@ private void implementIntf(ClassNode node) {
134134
node.fields.add(remapper);
135135
node.fields.add(remapConfig);
136136
node.methods.add(getRemapper);
137+
RemappingClassLoader.implementNeedRemap(node);
137138
node.methods.add(getConfig);
138139
node.interfaces.add(Type.getInternalName(RemappingClassLoader.class));
139140
}

arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/RemappingClassLoader.java

+69-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package io.izzel.arclight.common.mod.util.remapper;
22

3+
import org.objectweb.asm.Opcodes;
4+
import org.objectweb.asm.Type;
5+
import org.objectweb.asm.tree.*;
6+
37
public interface RemappingClassLoader {
48

59
ClassLoaderRemapper getRemapper();
@@ -18,16 +22,73 @@ static boolean needRemap(ClassLoader cl) {
1822
// Removing redirect for PlatformClassLoader since only classes
1923
// in the standard library are loaded by PlatformClassLoader.
2024
// They are always related only to JDK we're using.
21-
var now = cl;
22-
final var needed = RemappingClassLoader.class.getClassLoader();
23-
do {
24-
if (now == ClassLoader.getSystemClassLoader() || now == needed) {
25+
for (; cl != null; cl = cl.getParent()) {
26+
if (cl == ClassLoader.getSystemClassLoader()) {
2527
return true;
26-
} else if (now == ClassLoader.getPlatformClassLoader() || now == null) {
27-
return false;
2828
}
29-
now = now.getParent();
30-
} while (now != null);
29+
}
3130
return false;
3231
}
32+
33+
// Bytecode version of the above code
34+
static void implementNeedRemap(ClassNode node) {
35+
MethodNode needRemap = new MethodNode(
36+
Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC,
37+
"needRemap",
38+
Type.getMethodDescriptor(Type.getType(boolean.class), Type.getType(ClassLoader.class)),
39+
null, null
40+
);
41+
var l = needRemap.instructions;
42+
{
43+
var label0 = new LabelNode();
44+
l.add(label0);
45+
l.add(new LineNumberNode(-101, label0));
46+
if (node.version >= Opcodes.V1_6) {
47+
l.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null));
48+
}
49+
l.add(new VarInsnNode(Opcodes.ALOAD, 0));
50+
51+
var label1 = new LabelNode();
52+
l.add(new JumpInsnNode(Opcodes.IFNULL, label1));
53+
54+
var label2 = new LabelNode();
55+
l.add(label2);
56+
l.add(new LineNumberNode(-102, label2));
57+
l.add(new VarInsnNode(Opcodes.ALOAD, 0));
58+
l.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/ClassLoader", "getSystemClassLoader", "()Ljava/lang/ClassLoader;", false));
59+
60+
var label3 = new LabelNode();
61+
l.add(new JumpInsnNode(Opcodes.IF_ACMPNE, label3));
62+
63+
var label4 = new LabelNode();
64+
l.add(label4);
65+
l.add(new LineNumberNode(-103, label4));
66+
l.add(new InsnNode(Opcodes.ICONST_1));
67+
l.add(new InsnNode(Opcodes.IRETURN));
68+
69+
l.add(label3);
70+
l.add(new LineNumberNode(-101, label3));
71+
if (node.version >= Opcodes.V1_6) {
72+
l.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null));
73+
}
74+
l.add(new VarInsnNode(Opcodes.ALOAD, 0));
75+
l.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/ClassLoader", "getParent", "()Ljava/lang/ClassLoader;", false));
76+
l.add(new VarInsnNode(Opcodes.ASTORE, 0));
77+
l.add(new JumpInsnNode(Opcodes.GOTO, label0));
78+
79+
l.add(label1);
80+
l.add(new LineNumberNode(-106, label1));
81+
if (node.version >= Opcodes.V1_6) {
82+
l.add(new FrameNode(Opcodes.F_SAME, 0, null, 0, null));
83+
}
84+
l.add(new InsnNode(Opcodes.ICONST_0));
85+
l.add(new InsnNode(Opcodes.IRETURN));
86+
87+
var label5 = new LabelNode();
88+
l.add(label5);
89+
needRemap.localVariables.add(new LocalVariableNode("cl", "Ljava/lang/ClassLoader;", null, label0, label5, 0));
90+
}
91+
needRemap.visitMaxs(2, 1);
92+
node.methods.add(needRemap);
93+
}
3394
}

0 commit comments

Comments
 (0)