24
24
import com .google .common .collect .Sets ;
25
25
import com .google .common .io .ByteStreams ;
26
26
import net .minecraft .launchwrapper .IClassTransformer ;
27
+ import net .minecraft .launchwrapper .Launch ;
27
28
import net .minecraftforge .fml .common .Loader ;
28
29
import org .objectweb .asm .ClassReader ;
29
30
import org .objectweb .asm .ClassVisitor ;
30
31
import org .objectweb .asm .ClassWriter ;
31
32
import org .objectweb .asm .Opcodes ;
32
33
import org .objectweb .asm .commons .ClassRemapper ;
33
34
import org .objectweb .asm .commons .Remapper ;
34
- import org .objectweb .asm .tree .*;
35
+ import org .objectweb .asm .tree .AbstractInsnNode ;
36
+ import org .objectweb .asm .tree .ClassNode ;
37
+ import org .objectweb .asm .tree .FieldNode ;
38
+ import org .objectweb .asm .tree .MethodInsnNode ;
39
+ import org .objectweb .asm .tree .MethodNode ;
35
40
36
41
import java .io .IOException ;
37
42
import java .io .InputStream ;
@@ -48,7 +53,7 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
48
53
49
54
if ("net.minecraftforge.common.ForgeHooks" .equals (transformedName )) {
50
55
ClassReader cr = new ClassReader (basicClass );
51
- ClassWriter cw = new ClassWriter (ClassWriter .COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
56
+ ClassWriter cw = new SafeClassWriter (ClassWriter .COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
52
57
ClassVisitor cv = new PickBlockPatch (cw );
53
58
cr .accept (cv , ClassReader .EXPAND_FRAMES );
54
59
return cw .toByteArray ();
@@ -188,4 +193,39 @@ public String map(final String name) {
188
193
189
194
}
190
195
196
+ private static class SafeClassWriter extends ClassWriter {
197
+
198
+ public SafeClassWriter (int flags ) {
199
+ super (flags );
200
+ }
201
+
202
+ @ Override
203
+ protected String getCommonSuperClass (final String type1 , final String type2 ) {
204
+ Class <?> c , d ;
205
+ // clueless
206
+ ClassLoader classLoader = Launch .classLoader ;
207
+ try {
208
+ c = Class .forName (type1 .replace ('/' , '.' ), false , classLoader );
209
+ d = Class .forName (type2 .replace ('/' , '.' ), false , classLoader );
210
+ } catch (Exception e ) {
211
+ throw new RuntimeException (e .toString ());
212
+ }
213
+ if (c .isAssignableFrom (d )) {
214
+ return type1 ;
215
+ }
216
+ if (d .isAssignableFrom (c )) {
217
+ return type2 ;
218
+ }
219
+ if (c .isInterface () || d .isInterface ()) {
220
+ return "java/lang/Object" ;
221
+ } else {
222
+ do {
223
+ c = c .getSuperclass ();
224
+ } while (!c .isAssignableFrom (d ));
225
+ return c .getName ().replace ('.' , '/' );
226
+ }
227
+ }
228
+
229
+ }
230
+
191
231
}
0 commit comments