diff --git a/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java b/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java index a88e09f..cf4bb32 100644 --- a/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java +++ b/parabotv2/src/org/parabot/core/asm/adapters/AddGetterAdapter.java @@ -25,6 +25,7 @@ public class AddGetterAdapter implements Opcodes, Injectable { private String returnDesc; private boolean staticField; private boolean staticMethod; + private long multiplier; /** * @@ -40,11 +41,12 @@ 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 */ public AddGetterAdapter(final ClassNode into, final ClassNode fieldLocation, final FieldNode fieldNode, final String methodName, final String returnDesc, - final boolean staticMethod) { + final boolean staticMethod, final long multiplier) { this.into = into; this.fieldLocation = fieldLocation; this.fieldNode = fieldNode; @@ -52,6 +54,7 @@ public class AddGetterAdapter implements Opcodes, Injectable { this.returnDesc = returnDesc == null ? fieldNode.desc : returnDesc; this.staticField = Modifier.isStatic(fieldNode.access); this.staticMethod = staticMethod; + this.multiplier = multiplier; } /** @@ -117,7 +120,7 @@ public class AddGetterAdapter implements Opcodes, Injectable { @Override public void inject() { Core.verbose("Injecting: " + this.toString()); - + MethodNode method = new MethodNode(ACC_PUBLIC | (staticMethod ? ACC_STATIC : 0), methodName, "()" + returnDesc, null, null); @@ -138,8 +141,21 @@ public class AddGetterAdapter implements Opcodes, Injectable { } } - if (fieldNode.desc.equals("J") && returnDesc.equals("I")) + if(multiplier != 0) { + if(fieldNode.desc.equals("I")) { + method.visitInsn(I2L); + } + method.visitLdcInsn(new Long(multiplier)); + method.visitInsn(LMUL); + if(returnDesc.equals("I")) { + method.visitInsn(L2I); + } + } else if (fieldNode.desc.equals("J") && returnDesc.equals("I")) { method.visitInsn(L2I); + } 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 da7472f..9fff991 100644 --- a/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java +++ b/parabotv2/src/org/parabot/core/asm/wrappers/Getter.java @@ -21,6 +21,7 @@ public class Getter implements Injectable { private String methodName; private String returnDesc; private boolean staticMethod; + private long multiplier; /** * @@ -30,9 +31,10 @@ public class Getter implements Injectable { * @param methodName - method name of getter * @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 */ public Getter(final String into, final String fieldLocation, final String fieldNode, - final String methodName, final String returnDesc, final boolean staticMethod) { + final String methodName, final String returnDesc, final boolean staticMethod, final long multiplier) { Core.verbose(methodName + "[" + fieldLocation + "." + fieldNode + "]"); this.into = ASMUtils.getClass(into); this.fieldLocation = ASMUtils.getClass(fieldLocation); @@ -40,6 +42,7 @@ public class Getter implements Injectable { this.methodName = methodName; this.returnDesc = returnDesc == null ? this.fieldNode.desc : returnDesc; this.staticMethod = staticMethod; + this.multiplier = multiplier; } /** @@ -71,7 +74,7 @@ public class Getter implements Injectable { * @return AddGetterAdapter */ public AddGetterAdapter getAdapter() { - return new AddGetterAdapter(into, fieldLocation, fieldNode, methodName, returnDesc, staticMethod); + return new AddGetterAdapter(into, fieldLocation, fieldNode, methodName, returnDesc, staticMethod, multiplier); } } diff --git a/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java b/parabotv2/src/org/parabot/core/parsers/hooks/JSONHookParser.java index 6d39ca2..775432a 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); + g[i] = new Getter(into, clazz, this.get(o, "field"), this.get(o, "method"), desc, o.containsKey("static") ? (boolean) o.get("static") : false, 0); } return g; } diff --git a/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java b/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java index 3393e2a..cb8d234 100644 --- a/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java +++ b/parabotv2/src/org/parabot/core/parsers/hooks/XMLHookParser.java @@ -159,6 +159,7 @@ public class XMLHookParser extends HookParser { "accessor", addGetter)); final String into = isSet("into", addGetter) ? getValue("into", addGetter) : className; + final long multiplier = isSet("multiplier", addGetter) ? Long.parseLong(getValue("multiplier", addGetter)) : 0L; final String fieldName = getValue("field", addGetter); final String methodName = getValue("methodname", addGetter); boolean staticMethod = isSet("methstatic", addGetter) ? (getValue( @@ -184,7 +185,7 @@ public class XMLHookParser extends HookParser { returnDesc = str.toString(); } final Getter get = new Getter(into, className, fieldName, - methodName, returnDesc, staticMethod); + methodName, returnDesc, staticMethod, multiplier); getterList.add(get); } return getterList.toArray(new Getter[getterList.size()]);