From 1e501daced12c4d33c87fc1fae7b3a1f1cfedc1d Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 28 May 2022 13:38:33 +0800 Subject: [PATCH] Fix remapper cannot read inheritance in generated class --- .../util/remapper/ClassLoaderRemapper.java | 5 +++ .../mod/util/remapper/GlobalClassRepo.java | 6 ++++ .../common/mod/util/remapper/RuntimeRepo.java | 31 +++++++++++++++++++ .../generated/ArclightReflectionHandler.java | 2 +- 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/RuntimeRepo.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java index 3a365f70..151c951e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java @@ -350,6 +350,11 @@ public class ClassLoaderRemapper extends LenientJarRemapper { @Override public byte[] remapClassFile(byte[] in, ClassRepo repo) { + return remapClassFile(in, repo, false); + } + + public byte[] remapClassFile(byte[] in, ClassRepo repo, boolean runtime) { + if (runtime) GlobalClassRepo.runtimeRepo().put(in); return remapClassFile(new ClassReader(in), repo); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java index fec3f8e6..20591516 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java @@ -24,8 +24,10 @@ public class GlobalClassRepo implements ClassRepo, PluginPatcher.ClassRepo { private final LoadingCache cache = CacheBuilder.newBuilder().maximumSize(256) .expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel)); private final Set repos = Collections.newSetFromMap(new ConcurrentHashMap<>()); + private final RuntimeRepo runtimeRepo = new RuntimeRepo(); private GlobalClassRepo() { + repos.add(this.runtimeRepo); } @Override @@ -83,4 +85,8 @@ public class GlobalClassRepo implements ClassRepo, PluginPatcher.ClassRepo { public static PluginInheritanceProvider remappingProvider() { return REMAPPING; } + + public static RuntimeRepo runtimeRepo() { + return INSTANCE.runtimeRepo; + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/RuntimeRepo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/RuntimeRepo.java new file mode 100644 index 00000000..489add10 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/RuntimeRepo.java @@ -0,0 +1,31 @@ +package io.izzel.arclight.common.mod.util.remapper; + +import io.izzel.arclight.api.PluginPatcher; +import net.md_5.specialsource.repo.ClassRepo; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.tree.ClassNode; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class RuntimeRepo implements ClassRepo, PluginPatcher.ClassRepo { + + private final Map map = new ConcurrentHashMap<>(); + + @Override + public ClassNode findClass(String internalName) { + return map.get(internalName); + } + + @Override + public ClassNode findClass(String internalName, int parsingOptions) { + return map.get(internalName); + } + + public void put(byte[] bytes) { + ClassNode node = new ClassNode(); + ClassReader reader = new ClassReader(bytes); + reader.accept(node, ClassReader.SKIP_CODE); + this.map.put(reader.getClassName(), node); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java index 963c0ebc..11614797 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/generated/ArclightReflectionHandler.java @@ -653,7 +653,7 @@ public class ArclightReflectionHandler extends ClassLoader { } } if (rcl != null) { - return rcl.getRemapper().remapClassFile(bytes, GlobalClassRepo.INSTANCE); + return rcl.getRemapper().remapClassFile(bytes, GlobalClassRepo.INSTANCE, true); } else { ArclightRedirectAdapter.scanMethod(bytes); return bytes;