Fix remapper cannot read inheritance in generated class

This commit is contained in:
IzzelAliz 2022-05-28 13:38:33 +08:00
parent 51a9d2a79c
commit 1e501daced
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
4 changed files with 43 additions and 1 deletions

View File

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

View File

@ -24,8 +24,10 @@ public class GlobalClassRepo implements ClassRepo, PluginPatcher.ClassRepo {
private final LoadingCache<String, ClassNode> cache = CacheBuilder.newBuilder().maximumSize(256)
.expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel));
private final Set<ClassRepo> 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;
}
}

View File

@ -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<String, ClassNode> 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);
}
}

View File

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