diff --git a/parabotv2/src/org/parabot/core/asm/ASMUtils.java b/parabotv2/src/org/parabot/core/asm/ASMUtils.java index 3a5a2c4..9b09e45 100644 --- a/parabotv2/src/org/parabot/core/asm/ASMUtils.java +++ b/parabotv2/src/org/parabot/core/asm/ASMUtils.java @@ -23,6 +23,18 @@ public class ASMUtils implements Opcodes { } return null; } + + public static FieldNode getField(ClassNode node, String fieldName, String desc) { + if(desc == null) { + return getField(node, fieldName); + } + for (final FieldNode fieldNode : node.fields) { + if (fieldNode.name.equals(fieldName) && fieldNode.desc.equals(desc)) { + return fieldNode; + } + } + return null; + } public static ClassNode getClass(String className) { Context context = Context.getInstance(); diff --git a/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java b/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java index bd593e2..01b7355 100644 --- a/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java +++ b/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java @@ -41,12 +41,14 @@ public class AddGetterAdapter implements Opcodes, Injectable { * - return type of method, can be null for default return * @param staticMethod * - pass true if you want the method to be static - * @param multiplier - if this field requires a multiplier + * @param multiplier + * - if this field requires a multipli */ public AddGetterAdapter(final ClassNode into, final ClassNode fieldLocation, final FieldNode fieldNode, final String methodName, final String returnDesc, final boolean staticMethod, final long multiplier) { + Core.verbose("Injecting getter method: " + methodName); this.into = into; this.fieldLocation = fieldLocation; this.fieldNode = fieldNode; @@ -141,24 +143,23 @@ public class AddGetterAdapter implements Opcodes, Injectable { } } - if(multiplier != 0) { - if(fieldNode.desc.equals("I") || fieldNode.desc.equals("S")) { + if (multiplier != 0) { + if (fieldNode.desc.equals("I") || fieldNode.desc.equals("S")) { method.visitInsn(I2L); } method.visitLdcInsn(new Long(multiplier)); method.visitInsn(LMUL); - if(returnDesc.equals("I") || returnDesc.equals("S")) { + if (returnDesc.equals("I") || returnDesc.equals("S")) { method.visitInsn(L2I); } - if(returnDesc.equals("S")) { + if (returnDesc.equals("S")) { method.visitInsn(I2S); } } else if (fieldNode.desc.equals("J") && returnDesc.equals("I")) { method.visitInsn(L2I); - } else if(fieldNode.desc.equals("I") && returnDesc.equals("J")) { + } else if (fieldNode.desc.equals("I") && returnDesc.equals("J")) { method.visitInsn(I2L); } - method.visitInsn(ASMUtils.getReturnOpcode(returnDesc)); method.visitMaxs(1, 1); diff --git a/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java b/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java index 9fff991..3228088 100644 --- a/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java +++ b/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java @@ -32,13 +32,15 @@ public class Getter implements Injectable { * @param returnDesc - return type of method, can be null for default return * @param staticMethod - pass true if you want the method to be static * @param multiplier - if there is one, otherwise 0L + * @param fieldDesc - desc of the field, null if there are no duplicate field names */ public Getter(final String into, final String fieldLocation, final String fieldNode, - final String methodName, final String returnDesc, final boolean staticMethod, final long multiplier) { + final String methodName, final String returnDesc, final boolean staticMethod, final long multiplier, + final String fieldDesc) { Core.verbose(methodName + "[" + fieldLocation + "." + fieldNode + "]"); this.into = ASMUtils.getClass(into); this.fieldLocation = ASMUtils.getClass(fieldLocation); - this.fieldNode = ASMUtils.getField(ASMUtils.getClass(fieldLocation), fieldNode); + this.fieldNode = ASMUtils.getField(ASMUtils.getClass(fieldLocation), fieldNode, fieldDesc); this.methodName = methodName; this.returnDesc = returnDesc == null ? this.fieldNode.desc : returnDesc; this.staticMethod = staticMethod; diff --git a/parabotv2/src/org/parabot/core/asm/wrappers/Setter.java b/parabotv2/src/org/parabot/core/asm/wrappers/Setter.java index 3f92aae..fb8901f 100644 --- a/parabotv2/src/org/parabot/core/asm/wrappers/Setter.java +++ b/parabotv2/src/org/parabot/core/asm/wrappers/Setter.java @@ -21,18 +21,18 @@ public class Setter implements Injectable { private String desc; private boolean methodStatic; - public Setter(final String fieldLocation, String into, final String fieldName, final String methodName, final String desc, final boolean methodStatic) { + public Setter(final String fieldLocation, String into, final String fieldName, final String methodName, final String desc, final boolean methodStatic, final String fieldDesc) { this.fieldLocation = ASMUtils.getClass(fieldLocation); into = (into == null) ? fieldLocation : into; this.into = ASMUtils.getClass(into); - this.field = ASMUtils.getField(this.fieldLocation, fieldName); + this.field = ASMUtils.getField(this.fieldLocation, fieldName, fieldDesc); this.name = methodName; this.desc = (desc == null) ? this.field.desc : desc; this.methodStatic = methodStatic; } public Setter(final String fieldLocation, final String fieldName, final String methodName) { - this(fieldLocation, null, fieldName, methodName, null, false); + this(fieldLocation, null, fieldName, methodName, null, false, null); } /** diff --git a/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java b/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java index 775432a..2ff494c 100644 --- a/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java +++ b/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java @@ -119,7 +119,7 @@ public class JSONHookParser extends HookParser { String clazz = o.containsKey("class") ? this.get(o, "class") : interfaces.get(this.get(o, "accessor")); String into = o.containsKey("into") ? this.get(o, "into") : clazz; - g[i] = new Getter(into, clazz, this.get(o, "field"), this.get(o, "method"), desc, o.containsKey("static") ? (boolean) o.get("static") : false, 0); + g[i] = new Getter(into, clazz, this.get(o, "field"), this.get(o, "method"), desc, o.containsKey("static") ? (boolean) o.get("static") : false, 0, null); } return g; } @@ -152,7 +152,7 @@ public class JSONHookParser extends HookParser { String clazz = o.containsKey("class") ? this.get(o, "class") : interfaces.get(this.get(o, "accessor")); String into = o.containsKey("into") ? this.get(o, "into") : clazz; - s[i] = new Setter(into, clazz, this.get(o, "field"), this.get(o, "method"), desc, o.containsKey("static") ? (boolean) o.get("static") : false); + s[i] = new Setter(into, clazz, this.get(o, "field"), this.get(o, "method"), desc, o.containsKey("static") ? (boolean) o.get("static") : false, null); } return s; } diff --git a/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java b/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java index cb8d234..54a67f4 100644 --- a/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java +++ b/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java @@ -161,6 +161,7 @@ public class XMLHookParser extends HookParser { addGetter) : className; final long multiplier = isSet("multiplier", addGetter) ? Long.parseLong(getValue("multiplier", addGetter)) : 0L; final String fieldName = getValue("field", addGetter); + final String fieldDesc = isSet("descfield", addGetter) ? getValue("descfield", addGetter) : null; final String methodName = getValue("methodname", addGetter); boolean staticMethod = isSet("methstatic", addGetter) ? (getValue( "methstatic", addGetter).equals("true")) : false; @@ -185,7 +186,7 @@ public class XMLHookParser extends HookParser { returnDesc = str.toString(); } final Getter get = new Getter(into, className, fieldName, - methodName, returnDesc, staticMethod, multiplier); + methodName, returnDesc, staticMethod, multiplier, fieldDesc); getterList.add(get); } return getterList.toArray(new Getter[getterList.size()]); @@ -233,6 +234,7 @@ public class XMLHookParser extends HookParser { final String into = isSet("into", addSetter) ? getValue("into", addSetter) : className; final String fieldName = getValue("field", addSetter); + final String fieldDesc = isSet("descfield", addSetter) ? getValue("descfield", addSetter) : null; final String methodName = getValue("methodname", addSetter); boolean staticMethod = isSet("methstatic", addSetter) ? (getValue( "methstatic", addSetter).equals("true")) : false; @@ -257,7 +259,7 @@ public class XMLHookParser extends HookParser { returnDesc = str.toString(); } final Setter get = new Setter(className, into, fieldName, - methodName, returnDesc, staticMethod); + methodName, returnDesc, staticMethod, fieldDesc); setterList.add(get); } return setterList.toArray(new Setter[setterList.size()]);