Faster boot speed by skipping code in asm analysis.
This commit is contained in:
parent
a99bc30cea
commit
ad0ff92408
|
@ -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,22 +275,23 @@ 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));
|
|
||||||
Preconditions.checkNotNull(node, "node");
|
|
||||||
ClassWriter writer = new ClassWriter(0);
|
|
||||||
String name = Type.getInternalName(ArclightReflectionHandler.class) + "_" + atomicInteger.getAndIncrement();
|
|
||||||
ClassVisitor visitor = new ClassRemapper(writer, new NameRemapper(name));
|
|
||||||
node.accept(visitor);
|
|
||||||
byte[] bytes = writer.toByteArray();
|
|
||||||
Class<?> cl = Unsafe.defineClass(name.replace('/', '.'), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain());
|
|
||||||
Unsafe.ensureClassInitialized(cl);
|
|
||||||
try {
|
try {
|
||||||
|
ClassNode node = MixinService.getService().getBytecodeProvider().getClassNode(Type.getInternalName(ArclightReflectionHandler.class));
|
||||||
|
Preconditions.checkNotNull(node, "node");
|
||||||
|
ClassWriter writer = new ClassWriter(0);
|
||||||
|
String name = Type.getInternalName(ArclightReflectionHandler.class) + "_" + atomicInteger.getAndIncrement();
|
||||||
|
ClassVisitor visitor = new ClassRemapper(writer, new NameRemapper(name));
|
||||||
|
node.accept(visitor);
|
||||||
|
byte[] bytes = writer.toByteArray();
|
||||||
|
Class<?> cl = Unsafe.defineClass(name.replace('/', '.'), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain());
|
||||||
|
Unsafe.ensureClassInitialized(cl);
|
||||||
|
|
||||||
Field remapper = cl.getField("remapper");
|
Field remapper = cl.getField("remapper");
|
||||||
remapper.set(null, this);
|
remapper.set(null, this);
|
||||||
|
return name;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
return name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NameRemapper extends Remapper {
|
private static class NameRemapper extends Remapper {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user