Fix ClassLoaderAdapter. Release 1.0.5

This commit is contained in:
IzzelAliz 2020-08-08 19:33:54 +08:00
parent f8678f4dfe
commit e6ac5f332d
2 changed files with 16 additions and 10 deletions

View File

@ -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);

View File

@ -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'