Bukkit Growing

This commit is contained in:
Zoë
2022-07-12 01:04:55 -07:00
parent 50377a1b89
commit 75b545b0be
8 changed files with 87 additions and 148 deletions

View File

@@ -1,7 +1,5 @@
package com.dfsek.terra.lifecycle.asm;
import com.dfsek.terra.mod.util.FertilizableUtil;
import net.gudenau.minecraft.asm.api.v1.Identifier;
import net.gudenau.minecraft.asm.api.v1.Transformer;
import org.objectweb.asm.Opcodes;
@@ -12,13 +10,13 @@ import org.objectweb.asm.tree.JumpInsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;
import java.io.IOException;
import com.dfsek.terra.lifecycle.util.ASMUtil;
import com.dfsek.terra.lifecycle.util.LoaderUtil;
import org.objectweb.asm.tree.VarInsnNode;
import com.dfsek.terra.mod.util.ASMUtil;
import com.dfsek.terra.mod.util.FertilizableUtil;
import static org.objectweb.asm.Opcodes.ACC_STATIC;

View File

@@ -1,56 +0,0 @@
package com.dfsek.terra.lifecycle.util;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
import java.io.IOException;
import java.util.WeakHashMap;
import static org.objectweb.asm.ClassReader.SKIP_CODE;
import static org.objectweb.asm.ClassReader.SKIP_DEBUG;
import static org.objectweb.asm.ClassReader.SKIP_FRAMES;
public class ASMUtil {
static final ThreadLocal<WeakHashMap<String, WeakHashMap<String, Boolean>>> INHERITANCE_CACHE = new ThreadLocal<>();
public static boolean inheritsFrom(ClassNode classNode, String interfaceName) throws IOException {
if (INHERITANCE_CACHE.get() == null) {
INHERITANCE_CACHE.set(new WeakHashMap<>());
}
return inheritsFromInternal(classNode, interfaceName);
}
protected static boolean inheritsFromInternal(ClassNode classNode, String interfaceName) throws IOException {
if (INHERITANCE_CACHE.get().containsKey(classNode.name)) {
if (INHERITANCE_CACHE.get().get(classNode.name).containsKey(interfaceName)) {
return INHERITANCE_CACHE.get().get(classNode.name).get(interfaceName);
}
}
for (String parent : classNode.interfaces) {
if (checkClass(parent, interfaceName)) {
return true;
}
}
if (checkClass(classNode.superName, interfaceName)) {
return true;
}
INHERITANCE_CACHE.get().getOrDefault(classNode.name, new WeakHashMap<>()).put(interfaceName, false);
return false;
}
protected static boolean checkClass(String name, String interfaceName) throws IOException {
if (name.startsWith("java/")) {
return false;
}
boolean isClass = name.equals(interfaceName);
INHERITANCE_CACHE.get().getOrDefault(name, new WeakHashMap<>()).put(interfaceName, isClass);
if (isClass) {
return true;
}
ClassNode node = new ClassNode();
new ClassReader(name).accept(node, SKIP_CODE | SKIP_DEBUG | SKIP_FRAMES);
return inheritsFromInternal(node, interfaceName);
}
}