Faster boot speed by skipping code in asm analysis.

This commit is contained in:
IzzelAliz 2020-05-21 12:56:41 +08:00
parent a99bc30cea
commit ad0ff92408
2 changed files with 15 additions and 13 deletions

View File

@ -22,6 +22,7 @@ import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.commons.Remapper;
import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodInsnNode;
import org.spongepowered.asm.service.MixinService;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -259,7 +260,7 @@ public class PluginRemapper extends JarRemapper {
private byte[] remapClassFile(ClassReader reader, final ClassRepo repo) { private byte[] remapClassFile(ClassReader reader, final ClassRepo repo) {
ClassNode node = new ClassNode(); ClassNode node = new ClassNode();
RemappingClassAdapter mapper = new RemappingClassAdapter(node, this, repo); RemappingClassAdapter mapper = new RemappingClassAdapter(node, this, repo);
reader.accept(mapper, 0); reader.accept(mapper, ClassReader.SKIP_FRAMES);
ArclightRedirectAdapter.redirect(node, generatedHandler); ArclightRedirectAdapter.redirect(node, generatedHandler);
ArclightInterfaceInvokerGen.generate(node, this.classRepo, this, this.inheritanceProvider); ArclightInterfaceInvokerGen.generate(node, this.classRepo, this, this.inheritanceProvider);
@ -274,7 +275,8 @@ public class PluginRemapper extends JarRemapper {
private static AtomicInteger atomicInteger = new AtomicInteger(); private static AtomicInteger atomicInteger = new AtomicInteger();
private String generateReflectionHandler() { private String generateReflectionHandler() {
ClassNode node = classRepo.findClass(Type.getInternalName(ArclightReflectionHandler.class)); try {
ClassNode node = MixinService.getService().getBytecodeProvider().getClassNode(Type.getInternalName(ArclightReflectionHandler.class));
Preconditions.checkNotNull(node, "node"); Preconditions.checkNotNull(node, "node");
ClassWriter writer = new ClassWriter(0); ClassWriter writer = new ClassWriter(0);
String name = Type.getInternalName(ArclightReflectionHandler.class) + "_" + atomicInteger.getAndIncrement(); String name = Type.getInternalName(ArclightReflectionHandler.class) + "_" + atomicInteger.getAndIncrement();
@ -283,13 +285,13 @@ public class PluginRemapper extends JarRemapper {
byte[] bytes = writer.toByteArray(); byte[] bytes = writer.toByteArray();
Class<?> cl = Unsafe.defineClass(name.replace('/', '.'), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain()); Class<?> cl = Unsafe.defineClass(name.replace('/', '.'), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain());
Unsafe.ensureClassInitialized(cl); Unsafe.ensureClassInitialized(cl);
try {
Field remapper = cl.getField("remapper"); Field remapper = cl.getField("remapper");
remapper.set(null, this); remapper.set(null, this);
} catch (Exception e) {
e.printStackTrace();
}
return name; return name;
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
private static class NameRemapper extends Remapper { private static class NameRemapper extends Remapper {

View File

@ -61,7 +61,7 @@ public class SharedClassRepo implements ClassRepo {
try (InputStream inputStream = connection.getInputStream()) { try (InputStream inputStream = connection.getInputStream()) {
ClassReader reader = new ClassReader(inputStream); ClassReader reader = new ClassReader(inputStream);
ClassNode classNode = new ClassNode(); ClassNode classNode = new ClassNode();
reader.accept(classNode, 0); reader.accept(classNode, ClassReader.SKIP_CODE);
return classNode; return classNode;
} }
} catch (IOException ignored) { } catch (IOException ignored) {