1
1
package io .izzel .arclight .common .mod .util .remapper ;
2
2
3
+ import org .objectweb .asm .Opcodes ;
4
+ import org .objectweb .asm .Type ;
5
+ import org .objectweb .asm .tree .*;
6
+
3
7
public interface RemappingClassLoader {
4
8
5
9
ClassLoaderRemapper getRemapper ();
@@ -18,16 +22,73 @@ static boolean needRemap(ClassLoader cl) {
18
22
// Removing redirect for PlatformClassLoader since only classes
19
23
// in the standard library are loaded by PlatformClassLoader.
20
24
// 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 ()) {
25
27
return true ;
26
- } else if (now == ClassLoader .getPlatformClassLoader () || now == null ) {
27
- return false ;
28
28
}
29
- now = now .getParent ();
30
- } while (now != null );
29
+ }
31
30
return false ;
32
31
}
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
+ }
33
94
}
0 commit comments