Fix remapper cannot read inheritance in generated class
This commit is contained in:
parent
51a9d2a79c
commit
1e501daced
|
@ -350,6 +350,11 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] remapClassFile(byte[] in, ClassRepo repo) {
|
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);
|
return remapClassFile(new ClassReader(in), repo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,10 @@ public class GlobalClassRepo implements ClassRepo, PluginPatcher.ClassRepo {
|
||||||
private final LoadingCache<String, ClassNode> cache = CacheBuilder.newBuilder().maximumSize(256)
|
private final LoadingCache<String, ClassNode> cache = CacheBuilder.newBuilder().maximumSize(256)
|
||||||
.expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel));
|
.expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel));
|
||||||
private final Set<ClassRepo> repos = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
private final Set<ClassRepo> repos = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||||
|
private final RuntimeRepo runtimeRepo = new RuntimeRepo();
|
||||||
|
|
||||||
private GlobalClassRepo() {
|
private GlobalClassRepo() {
|
||||||
|
repos.add(this.runtimeRepo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -83,4 +85,8 @@ public class GlobalClassRepo implements ClassRepo, PluginPatcher.ClassRepo {
|
||||||
public static PluginInheritanceProvider remappingProvider() {
|
public static PluginInheritanceProvider remappingProvider() {
|
||||||
return REMAPPING;
|
return REMAPPING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RuntimeRepo runtimeRepo() {
|
||||||
|
return INSTANCE.runtimeRepo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -653,7 +653,7 @@ public class ArclightReflectionHandler extends ClassLoader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rcl != null) {
|
if (rcl != null) {
|
||||||
return rcl.getRemapper().remapClassFile(bytes, GlobalClassRepo.INSTANCE);
|
return rcl.getRemapper().remapClassFile(bytes, GlobalClassRepo.INSTANCE, true);
|
||||||
} else {
|
} else {
|
||||||
ArclightRedirectAdapter.scanMethod(bytes);
|
ArclightRedirectAdapter.scanMethod(bytes);
|
||||||
return bytes;
|
return bytes;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user