mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-23 00:29:51 +00:00
Bukkit Growing
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user