Fix ClassLoaderAdapter. Release 1.0.5
This commit is contained in:
parent
f8678f4dfe
commit
e6ac5f332d
|
@ -33,13 +33,13 @@ public class ClassLoaderAdapter implements PluginTransformer {
|
||||||
private static final Marker MARKER = MarkerManager.getMarker("CLADAPTER");
|
private static final Marker MARKER = MarkerManager.getMarker("CLADAPTER");
|
||||||
private static final String CLASSLOADER = "java/lang/ClassLoader";
|
private static final String CLASSLOADER = "java/lang/ClassLoader";
|
||||||
|
|
||||||
private final Map<Type, Map.Entry<Type, Integer>> defineClassTypes = ImmutableMap.<Type, Map.Entry<Type, Integer>>builder()
|
private final Map<Type, Map.Entry<Type, int[]>> defineClassTypes = ImmutableMap.<Type, Map.Entry<Type, int[]>>builder()
|
||||||
.put(Type.getMethodType("(Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(SecureClassLoader.class), 1))
|
.put(Type.getMethodType("(Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(SecureClassLoader.class), new int[]{1, 3}))
|
||||||
.put(Type.getMethodType("(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(SecureClassLoader.class), 1))
|
.put(Type.getMethodType("(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(SecureClassLoader.class), new int[]{1, -1}))
|
||||||
.put(Type.getMethodType("([BII)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), 0))
|
.put(Type.getMethodType("([BII)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), new int[]{0, 2}))
|
||||||
.put(Type.getMethodType("(Ljava/lang/String;[BII)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), 1))
|
.put(Type.getMethodType("(Ljava/lang/String;[BII)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), new int[]{1, 3}))
|
||||||
.put(Type.getMethodType("(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), 1))
|
.put(Type.getMethodType("(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), new int[]{1, 3}))
|
||||||
.put(Type.getMethodType("(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/ProtectionDomain;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), 1))
|
.put(Type.getMethodType("(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/ProtectionDomain;)Ljava/lang/Class;"), Maps.immutableEntry(Type.getType(ClassLoader.class), new int[]{1, -1}))
|
||||||
.build();
|
.build();
|
||||||
private final Map<String, String> classLoaderTypes = ImmutableMap.<String, String>builder()
|
private final Map<String, String> classLoaderTypes = ImmutableMap.<String, String>builder()
|
||||||
.put(Type.getInternalName(URLClassLoader.class), Type.getInternalName(RemappingURLClassLoader.class))
|
.put(Type.getInternalName(URLClassLoader.class), Type.getInternalName(RemappingURLClassLoader.class))
|
||||||
|
@ -80,10 +80,11 @@ public class ClassLoaderAdapter implements PluginTransformer {
|
||||||
}
|
}
|
||||||
if (methodInsnNode.name.equals("defineClass")) {
|
if (methodInsnNode.name.equals("defineClass")) {
|
||||||
Type descType = Type.getMethodType(methodInsnNode.desc);
|
Type descType = Type.getMethodType(methodInsnNode.desc);
|
||||||
Map.Entry<Type, Integer> entry = defineClassTypes.get(descType);
|
Map.Entry<Type, int[]> entry = defineClassTypes.get(descType);
|
||||||
if (entry != null && GlobalClassRepo.inheritanceProvider().getAll(methodInsnNode.owner).contains(entry.getKey().getInternalName())) {
|
if (entry != null && GlobalClassRepo.inheritanceProvider().getAll(methodInsnNode.owner).contains(entry.getKey().getInternalName())) {
|
||||||
ArclightMod.LOGGER.debug(MARKER, "Found defineClass {} call in {} {}", descType.getInternalName(), node.name, methodNode.name + methodNode.desc);
|
ArclightMod.LOGGER.debug(MARKER, "Found defineClass {} call in {} {}", descType.getInternalName(), node.name, methodNode.name + methodNode.desc);
|
||||||
int index = entry.getValue();
|
int index = entry.getValue()[0];
|
||||||
|
int lengthIndex = entry.getValue()[1];
|
||||||
InsnList insnList = new InsnList();
|
InsnList insnList = new InsnList();
|
||||||
Type[] argumentTypes = descType.getArgumentTypes();
|
Type[] argumentTypes = descType.getArgumentTypes();
|
||||||
int[] argsMap = argsMap(argumentTypes);
|
int[] argsMap = argsMap(argumentTypes);
|
||||||
|
@ -92,6 +93,11 @@ public class ClassLoaderAdapter implements PluginTransformer {
|
||||||
insnList.add(new VarInsnNode(argumentTypes[index].getOpcode(Opcodes.ILOAD), methodNode.maxLocals + argsMap[index]));
|
insnList.add(new VarInsnNode(argumentTypes[index].getOpcode(Opcodes.ILOAD), methodNode.maxLocals + argsMap[index]));
|
||||||
insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ClassLoaderAdapter.class), "remapClassContent", "(Ljava/lang/ClassLoader;Ljava/lang/Object;)Ljava/lang/Object;", false));
|
insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ClassLoaderAdapter.class), "remapClassContent", "(Ljava/lang/ClassLoader;Ljava/lang/Object;)Ljava/lang/Object;", false));
|
||||||
insnList.add(new TypeInsnNode(Opcodes.CHECKCAST, argumentTypes[index].getInternalName()));
|
insnList.add(new TypeInsnNode(Opcodes.CHECKCAST, argumentTypes[index].getInternalName()));
|
||||||
|
if (lengthIndex != -1) {
|
||||||
|
insnList.add(new InsnNode(Opcodes.DUP));
|
||||||
|
insnList.add(new InsnNode(Opcodes.ARRAYLENGTH));
|
||||||
|
insnList.add(new VarInsnNode(argumentTypes[lengthIndex].getOpcode(Opcodes.ISTORE), methodNode.maxLocals + argsMap[lengthIndex]));
|
||||||
|
}
|
||||||
insnList.add(new VarInsnNode(argumentTypes[index].getOpcode(Opcodes.ISTORE), methodNode.maxLocals + argsMap[index]));
|
insnList.add(new VarInsnNode(argumentTypes[index].getOpcode(Opcodes.ISTORE), methodNode.maxLocals + argsMap[index]));
|
||||||
loadArgs(argumentTypes, argsMap, methodNode, insnList);
|
loadArgs(argumentTypes, argsMap, methodNode, insnList);
|
||||||
methodNode.instructions.insertBefore(methodInsnNode, insnList);
|
methodNode.instructions.insertBefore(methodInsnNode, insnList);
|
||||||
|
|
|
@ -3,7 +3,7 @@ import java.nio.file.attribute.BasicFileAttributes
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
group 'io.izzel.arclight'
|
group 'io.izzel.arclight'
|
||||||
version '1.0.4'
|
version '1.0.5'
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
agpVersion = '1.8'
|
agpVersion = '1.8'
|
||||||
|
|
Loading…
Reference in New Issue
Block a user