diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java index 3e4925ea..e011cc16 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/MutableMethodImplementation.java @@ -657,6 +657,9 @@ public class MutableMethodImplementation implements MethodImplementation { case Format3rms: setInstruction(location, newBuilderInstruction3rms((Instruction3rms)instruction)); return; + case Format45cc: + setInstruction(location, newBuilderInstruction45cc((Instruction45cc) instruction)); + return; case Format51l: setInstruction(location, newBuilderInstruction51l((Instruction51l)instruction)); return; @@ -948,6 +951,21 @@ public class MutableMethodImplementation implements MethodImplementation { instruction.getVtableIndex()); } + @Nonnull + private BuilderInstruction45cc newBuilderInstruction45cc(@Nonnull Instruction45cc instruction) { + return new BuilderInstruction45cc( + instruction.getOpcode(), + instruction.getRegisterCount(), + instruction.getRegisterC(), + instruction.getRegisterD(), + instruction.getRegisterE(), + instruction.getRegisterF(), + instruction.getRegisterG(), + instruction.getReference(), + instruction.getReference2() + ); + } + @Nonnull private BuilderInstruction51l newBuilderInstruction51l(@Nonnull Instruction51l instruction) { return new BuilderInstruction51l( diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java index 92d94bec..6e09be91 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/InstructionRewriter.java @@ -65,6 +65,8 @@ public class InstructionRewriter implements Rewriter { return new RewrittenInstruction35c((Instruction35c)instruction); case Format3rc: return new RewrittenInstruction3rc((Instruction3rc)instruction); + case Format45cc: + return new RewrittenInstruction45cc((Instruction45cc) instruction); default: throw new IllegalArgumentException(); } @@ -202,4 +204,57 @@ public class InstructionRewriter implements Rewriter { return instruction.getRegisterCount(); } } + + protected class RewrittenInstruction45cc extends BaseRewrittenReferenceInstruction + implements Instruction45cc { + public RewrittenInstruction45cc(@Nonnull Instruction45cc instruction) { + super(instruction); + } + + @Nonnull public Reference getReference2() { + switch (instruction.getReferenceType2()) { + case ReferenceType.TYPE: + return RewriterUtils.rewriteTypeReference(rewriters.getTypeRewriter(), + (TypeReference)instruction.getReference2()); + case ReferenceType.FIELD: + return rewriters.getFieldReferenceRewriter().rewrite((FieldReference)instruction.getReference2()); + case ReferenceType.METHOD: + return rewriters.getMethodReferenceRewriter().rewrite((MethodReference)instruction.getReference2()); + case ReferenceType.STRING: + return instruction.getReference2(); + case ReferenceType.METHOD_PROTO: + return instruction.getReference2(); + default: + throw new IllegalArgumentException(); + } + } + + public int getReferenceType2() { + return instruction.getReferenceType2(); + } + + public int getRegisterC() { + return instruction.getRegisterC(); + } + + public int getRegisterE() { + return instruction.getRegisterE(); + } + + public int getRegisterG() { + return instruction.getRegisterG(); + } + + public int getRegisterCount() { + return instruction.getRegisterCount(); + } + + public int getRegisterD() { + return instruction.getRegisterD(); + } + + public int getRegisterF() { + return instruction.getRegisterF(); + } + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java index 08a60946..338b2b49 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java @@ -138,7 +138,7 @@ public class ClassPool extends BasePool implements ClassSe internReference(refInst.getReference(), refInst.getReferenceType()); } if (instruction instanceof DualReferenceInstruction) { - DualReferenceInstruction dualRefInst = (DualReferenceInstruction)instruction; + DualReferenceInstruction dualRefInst = (DualReferenceInstruction) instruction; internReference(dualRefInst.getReference2(), dualRefInst.getReferenceType2()); } }