mirror of
https://github.com/GTNewHorizons/CodeChickenCore.git
synced 2026-11-15 09:34:53 +00:00
Initial 1.7 commit
This commit is contained in:
1 parent
34154fc011
commit
ca675b5f31
72 files changed
+2967
-3335
No files matched your search
+143
-123
@@ -1,8 +1,12 @@
|
||||
package codechicken.lib.asm;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
import net.minecraft.launchwrapper.Launch;
|
||||
|
||||
import org.objectweb.asm.MethodVisitor;
|
||||
import org.objectweb.asm.commons.Remapper;
|
||||
@@ -19,219 +23,235 @@ import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
|
||||
public class ObfMapping
|
||||
{
|
||||
/**
|
||||
* CCC will deal with this.
|
||||
*/
|
||||
public static Remapper runtimeMapper = FMLDeobfuscatingRemapper.INSTANCE;
|
||||
public static Remapper mcpMapper = null;
|
||||
|
||||
public static final boolean obfuscated;
|
||||
|
||||
static
|
||||
public static class ObfRemapper extends Remapper
|
||||
{
|
||||
boolean obf = true;
|
||||
try
|
||||
{
|
||||
obf = ((LaunchClassLoader)ObfMapping.class.getClassLoader()).getClassBytes("net.minecraft.world.World") == null;
|
||||
private HashMap<String, String> fields = new HashMap<String, String>();
|
||||
private HashMap<String, String> funcs = new HashMap<String, String>();
|
||||
|
||||
public ObfRemapper() {
|
||||
try {
|
||||
Field rawFieldMapsField = FMLDeobfuscatingRemapper.class.getDeclaredField("rawFieldMaps");
|
||||
Field rawMethodMapsField = FMLDeobfuscatingRemapper.class.getDeclaredField("rawMethodMaps");
|
||||
rawFieldMapsField.setAccessible(true);
|
||||
rawMethodMapsField.setAccessible(true);
|
||||
Map<String, Map<String, String>> rawFieldMaps = (Map<String, Map<String, String>>) rawFieldMapsField.get(FMLDeobfuscatingRemapper.INSTANCE);
|
||||
Map<String, Map<String, String>> rawMethodMaps = (Map<String, Map<String, String>>) rawMethodMapsField.get(FMLDeobfuscatingRemapper.INSTANCE);
|
||||
|
||||
if(rawFieldMaps == null)
|
||||
throw new IllegalStateException("codechicken.lib.asm.ObfMapping loaded too early. Make sure all references are in or after the asm transformer load stage");
|
||||
|
||||
for(Map<String, String> map : rawFieldMaps.values())
|
||||
for(Entry<String, String> entry : map.entrySet())
|
||||
if(entry.getValue().startsWith("field"))
|
||||
fields.put(entry.getValue(), entry.getKey().substring(0, entry.getKey().indexOf(':')));
|
||||
for(Map<String, String> map : rawMethodMaps.values())
|
||||
for(Entry<String, String> entry : map.entrySet())
|
||||
if(entry.getValue().startsWith("func"))
|
||||
funcs.put(entry.getValue(), entry.getKey().substring(0, entry.getKey().indexOf('(')));
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
catch(IOException iox) {}
|
||||
|
||||
@Override
|
||||
public String mapMethodName(String owner, String name, String desc) {
|
||||
String s = funcs.get(name);
|
||||
return s == null ? name : s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String mapFieldName(String owner, String name, String desc) {
|
||||
String s = fields.get(name);
|
||||
return s == null ? name : s;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String map(String typeName) {
|
||||
return FMLDeobfuscatingRemapper.INSTANCE.unmap(typeName);
|
||||
}
|
||||
}
|
||||
|
||||
public static ObfRemapper obfMapper = new ObfRemapper();
|
||||
public static Remapper mcpMapper = null;
|
||||
|
||||
public static final boolean obfuscated;
|
||||
|
||||
static {
|
||||
boolean obf = true;
|
||||
try {
|
||||
obf = Launch.classLoader.getClassBytes("net.minecraft.world.World") == null;
|
||||
} catch (IOException ignored) {}
|
||||
obfuscated = obf;
|
||||
}
|
||||
|
||||
|
||||
public String s_owner;
|
||||
public String s_name;
|
||||
public String s_desc;
|
||||
|
||||
public boolean runtime;
|
||||
|
||||
public ObfMapping(String owner)
|
||||
{
|
||||
|
||||
public ObfMapping(String owner) {
|
||||
this(owner, "", "");
|
||||
}
|
||||
|
||||
public ObfMapping(String owner, String name, String desc)
|
||||
{
|
||||
|
||||
public ObfMapping(String owner, String name, String desc) {
|
||||
this.s_owner = owner;
|
||||
this.s_name = name;
|
||||
this.s_desc = desc;
|
||||
|
||||
if(s_owner.contains("."))
|
||||
if (s_owner.contains("."))
|
||||
throw new IllegalArgumentException(s_owner);
|
||||
|
||||
if(mcpMapper != null)
|
||||
map(mcpMapper);
|
||||
}
|
||||
|
||||
public ObfMapping(ObfMapping descmap, String subclass)
|
||||
{
|
||||
|
||||
public ObfMapping(ObfMapping descmap, String subclass) {
|
||||
this(subclass, descmap.s_name, descmap.s_desc);
|
||||
}
|
||||
|
||||
public static ObfMapping fromDesc(String s)
|
||||
{
|
||||
public static ObfMapping fromDesc(String s) {
|
||||
int lastDot = s.lastIndexOf('.');
|
||||
if(lastDot < 0)
|
||||
if (lastDot < 0)
|
||||
return new ObfMapping(s, "", "");
|
||||
int sep = s.indexOf('(');//methods
|
||||
int sep_end = sep;
|
||||
if(sep < 0) {
|
||||
if (sep < 0) {
|
||||
sep = s.indexOf(' ');//some stuffs
|
||||
sep_end = sep+1;
|
||||
sep_end = sep + 1;
|
||||
}
|
||||
if(sep < 0) {
|
||||
if (sep < 0) {
|
||||
sep = s.indexOf(':');//fields
|
||||
sep_end = sep+1;
|
||||
sep_end = sep + 1;
|
||||
}
|
||||
if(sep < 0)
|
||||
if (sep < 0)
|
||||
return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot + 1), "");
|
||||
|
||||
return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot+1, sep), s.substring(sep_end));
|
||||
return new ObfMapping(s.substring(0, lastDot), s.substring(lastDot + 1, sep), s.substring(sep_end));
|
||||
}
|
||||
|
||||
public ObfMapping subclass(String subclass)
|
||||
{
|
||||
|
||||
public ObfMapping subclass(String subclass) {
|
||||
return new ObfMapping(this, subclass);
|
||||
}
|
||||
|
||||
public boolean matches(MethodNode node)
|
||||
{
|
||||
public boolean matches(MethodNode node) {
|
||||
return s_name.equals(node.name) && s_desc.equals(node.desc);
|
||||
}
|
||||
|
||||
public boolean matches(MethodInsnNode node)
|
||||
{
|
||||
|
||||
public boolean matches(MethodInsnNode node) {
|
||||
return s_owner.equals(node.owner) && s_name.equals(node.name) && s_desc.equals(node.desc);
|
||||
}
|
||||
|
||||
public AbstractInsnNode toInsn(int opcode)
|
||||
{
|
||||
if(isClass())
|
||||
public AbstractInsnNode toInsn(int opcode) {
|
||||
if (isClass())
|
||||
return new TypeInsnNode(opcode, s_owner);
|
||||
else if(isMethod())
|
||||
else if (isMethod())
|
||||
return new MethodInsnNode(opcode, s_owner, s_name, s_desc);
|
||||
else
|
||||
return new FieldInsnNode(opcode, s_owner, s_name, s_desc);
|
||||
}
|
||||
|
||||
public void visitTypeInsn(MethodVisitor mv, int opcode)
|
||||
{
|
||||
|
||||
public void visitTypeInsn(MethodVisitor mv, int opcode) {
|
||||
mv.visitTypeInsn(opcode, s_owner);
|
||||
}
|
||||
|
||||
public void visitMethodInsn(MethodVisitor mv, int opcode)
|
||||
{
|
||||
|
||||
public void visitMethodInsn(MethodVisitor mv, int opcode) {
|
||||
mv.visitMethodInsn(opcode, s_owner, s_name, s_desc);
|
||||
}
|
||||
|
||||
public void visitFieldInsn(MethodVisitor mv, int opcode)
|
||||
{
|
||||
public void visitFieldInsn(MethodVisitor mv, int opcode) {
|
||||
mv.visitFieldInsn(opcode, s_owner, s_name, s_desc);
|
||||
}
|
||||
|
||||
public boolean isClass(String name)
|
||||
{
|
||||
public boolean isClass(String name) {
|
||||
return name.replace('.', '/').equals(s_owner);
|
||||
}
|
||||
|
||||
public boolean matches(String name, String desc)
|
||||
{
|
||||
public boolean matches(String name, String desc) {
|
||||
return s_name.equals(name) && s_desc.equals(desc);
|
||||
}
|
||||
|
||||
public boolean matches(FieldNode node)
|
||||
{
|
||||
public boolean matches(FieldNode node) {
|
||||
return s_name.equals(node.name) && s_desc.equals(node.desc);
|
||||
}
|
||||
|
||||
public boolean matches(FieldInsnNode node)
|
||||
{
|
||||
|
||||
public boolean matches(FieldInsnNode node) {
|
||||
return s_owner.equals(node.owner) && s_name.equals(node.name) && s_desc.equals(node.desc);
|
||||
}
|
||||
|
||||
public String javaClass()
|
||||
{
|
||||
public String javaClass() {
|
||||
return s_owner.replace('/', '.');
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj)
|
||||
{
|
||||
if(!(obj instanceof ObfMapping))
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ObfMapping))
|
||||
return false;
|
||||
|
||||
ObfMapping desc = (ObfMapping)obj;
|
||||
|
||||
ObfMapping desc = (ObfMapping) obj;
|
||||
return s_owner.equals(desc.s_owner) && s_name.equals(desc.s_name) && s_desc.equals(desc.s_desc);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(s_desc, s_name, s_owner);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
if(s_name.length() == 0)
|
||||
return "["+s_owner+"]";
|
||||
if(s_desc.length() == 0)
|
||||
return "["+s_owner+"."+s_name+"]";
|
||||
return "["+(isMethod() ? methodDesc() : fieldDesc())+"]";
|
||||
public String toString() {
|
||||
if (s_name.length() == 0)
|
||||
return "[" + s_owner + "]";
|
||||
if (s_desc.length() == 0)
|
||||
return "[" + s_owner + "." + s_name + "]";
|
||||
return "[" + (isMethod() ? methodDesc() : fieldDesc()) + "]";
|
||||
}
|
||||
|
||||
public String methodDesc()
|
||||
{
|
||||
return s_owner+"."+s_name+s_desc;
|
||||
public String methodDesc() {
|
||||
return s_owner + "." + s_name + s_desc;
|
||||
}
|
||||
|
||||
public String fieldDesc()
|
||||
{
|
||||
return s_owner+"."+s_name+":"+s_desc;
|
||||
public String fieldDesc() {
|
||||
return s_owner + "." + s_name + ":" + s_desc;
|
||||
}
|
||||
|
||||
public boolean isClass()
|
||||
{
|
||||
|
||||
public boolean isClass() {
|
||||
return s_name.length() == 0;
|
||||
}
|
||||
|
||||
public boolean isMethod()
|
||||
{
|
||||
|
||||
public boolean isMethod() {
|
||||
return s_desc.contains("(");
|
||||
}
|
||||
|
||||
public boolean isField()
|
||||
{
|
||||
|
||||
public boolean isField() {
|
||||
return !isClass() && !isMethod();
|
||||
}
|
||||
|
||||
public ObfMapping map(Remapper mapper)
|
||||
{
|
||||
if(isMethod())
|
||||
|
||||
public ObfMapping map(Remapper mapper) {
|
||||
if(mapper == null)
|
||||
return this;
|
||||
|
||||
if (isMethod())
|
||||
s_name = mapper.mapMethodName(s_owner, s_name, s_desc);
|
||||
else if(isField())
|
||||
else if (isField())
|
||||
s_name = mapper.mapFieldName(s_owner, s_name, s_desc);
|
||||
|
||||
|
||||
s_owner = mapper.mapType(s_owner);
|
||||
|
||||
if(isMethod())
|
||||
|
||||
if (isMethod())
|
||||
s_desc = mapper.mapMethodDesc(s_desc);
|
||||
else if(s_desc.length() > 0)
|
||||
else if (s_desc.length() > 0)
|
||||
s_desc = mapper.mapDesc(s_desc);
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ObfMapping toRuntime()
|
||||
{
|
||||
if(!runtime)
|
||||
map(runtimeMapper);
|
||||
|
||||
runtime = true;
|
||||
|
||||
public ObfMapping toRuntime() {
|
||||
map(mcpMapper);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ObfMapping copy()
|
||||
{
|
||||
|
||||
public ObfMapping toClassloading() {
|
||||
map(obfuscated ? obfMapper : mcpMapper);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ObfMapping copy() {
|
||||
return new ObfMapping(s_owner, s_name, s_desc);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user