From 160449b83a0a19244ae27d0c9acf539c0c730be5 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 7 Sep 2013 14:54:16 -0700 Subject: [PATCH] Implement instruction fixing in MutableMethodImplementation --- .../BuilderOffsetInstruction.java | 19 +- .../builder/MethodImplementationBuilder.java | 8 +- .../jf/dexlib2/builder/MethodLocation.java | 3 +- .../builder/MutableMethodImplementation.java | 218 +++++++++++++++++- .../instruction/BuilderInstruction10t.java | 1 + .../instruction/BuilderInstruction20t.java | 1 + .../instruction/BuilderInstruction21t.java | 1 + .../instruction/BuilderInstruction22t.java | 1 + .../instruction/BuilderInstruction30t.java | 1 + .../instruction/BuilderInstruction31t.java | 1 + smali/src/main/antlr3/smaliTreeWalker.g | 51 ++-- 11 files changed, 264 insertions(+), 41 deletions(-) rename dexlib2/src/main/java/org/jf/dexlib2/builder/{instruction => }/BuilderOffsetInstruction.java (53%) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderOffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java similarity index 53% rename from dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderOffsetInstruction.java rename to dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java index f3d07b9c..3f921d06 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/builder/instruction/BuilderOffsetInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java @@ -1,8 +1,6 @@ -package org.jf.dexlib2.builder.instruction; +package org.jf.dexlib2.builder; import org.jf.dexlib2.Opcode; -import org.jf.dexlib2.builder.BuilderInstruction; -import org.jf.dexlib2.builder.Label; import org.jf.dexlib2.iface.instruction.OffsetInstruction; import javax.annotation.Nonnull; @@ -18,6 +16,21 @@ public abstract class BuilderOffsetInstruction extends BuilderInstruction implem } @Override public int getCodeOffset() { + int codeOffset = internalGetCodeOffset(); + if ((this.getCodeUnits() == 1 && (codeOffset < Byte.MIN_VALUE || codeOffset > Byte.MAX_VALUE)) || + (this.getCodeUnits() == 2 && (codeOffset < Short.MIN_VALUE || codeOffset > Short.MAX_VALUE))) { + throw new IllegalStateException("Target is out of range"); + } + return codeOffset; + } + + + int internalGetCodeOffset() { return target.getCodeAddress() - this.getLocation().getCodeAddress(); } + + @Nonnull + public Label getTarget() { + return target; + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java index ee714516..c3dd9a02 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodImplementationBuilder.java @@ -18,13 +18,13 @@ public class MethodImplementationBuilder { private MethodLocation currentLocation; - public MethodImplementationBuilder() { - this.impl = new MutableMethodImplementation(); + public MethodImplementationBuilder(int registerCount) { + this.impl = new MutableMethodImplementation(registerCount); this.currentLocation = impl.instructionList.get(0); } - public MethodImplementation buildMethodImplementation() { - return impl.buildMethodImplementation(); + public MethodImplementation getMethodImplementation() { + return impl; } /** diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java index cf14caa0..de94345c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MethodLocation.java @@ -22,8 +22,7 @@ public class MethodLocation { private List