diff options
Diffstat (limited to 'dexlib2')
9 files changed, 330 insertions, 31 deletions
diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java index 4f1b88fb..93d75817 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/dexbacked/DexBackedDexFile.java @@ -272,6 +272,12 @@ public class DexBackedDexFile implements DexFile { return getMethodSection(); case ReferenceType.FIELD: return getFieldSection(); + case ReferenceType.METHOD_PROTO: + return getMethodSection(); + case ReferenceType.METHOD_HANDLE: + return getMethodHandleSection(); + case ReferenceType.CALL_SITE: + return getCallSiteSection(); default: throw new IllegalArgumentException(String.format("Invalid reference type: %d", referenceType)); } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/CallSiteReferenceRewriter.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/CallSiteReferenceRewriter.java new file mode 100644 index 00000000..d19cebfa --- /dev/null +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/CallSiteReferenceRewriter.java @@ -0,0 +1,90 @@ +/* + * Copyright 2023, Google LLC + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * Neither the name of Google LLC nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.tools.smali.dexlib2.rewriter; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.android.tools.smali.dexlib2.base.reference.BaseCallSiteReference; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodHandleReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodProtoReference; +import com.android.tools.smali.dexlib2.iface.value.EncodedValue; + +import javax.annotation.Nonnull; +import java.util.List; + +public class CallSiteReferenceRewriter implements Rewriter<CallSiteReference> { + @Nonnull protected final Rewriters rewriters; + + public CallSiteReferenceRewriter(@Nonnull Rewriters rewriters) { + this.rewriters = rewriters; + } + + @Nonnull @Override public CallSiteReference rewrite(@Nonnull CallSiteReference callSiteReference) { + return new RewrittenCallSiteReference(callSiteReference); + } + + protected class RewrittenCallSiteReference extends BaseCallSiteReference { + @Nonnull protected CallSiteReference callSiteReference; + + public RewrittenCallSiteReference(@Nonnull CallSiteReference callSiteReference) { + this.callSiteReference = callSiteReference; + } + + @Override @Nonnull public String getName() { + return callSiteReference.getName(); + } + + @Override @Nonnull public MethodHandleReference getMethodHandle() { + return RewriterUtils.rewriteMethodHandleReference( + rewriters, callSiteReference.getMethodHandle()); + } + + @Override @Nonnull public String getMethodName() { + return callSiteReference.getMethodName(); + } + + @Override @Nonnull public MethodProtoReference getMethodProto() { + return RewriterUtils.rewriteMethodProtoReference( + rewriters.getTypeRewriter(), + callSiteReference.getMethodProto()); + } + + @Override @Nonnull public List<? extends EncodedValue> getExtraArguments() { + return Lists.transform(callSiteReference.getExtraArguments(), + new Function<EncodedValue, EncodedValue>() { + @Nonnull @Override public EncodedValue apply(EncodedValue encodedValue) { + return RewriterUtils.rewriteValue(rewriters, encodedValue); + } + }); + } + } +} diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/DexRewriter.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/DexRewriter.java index ed286b3e..dfdba7e3 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/DexRewriter.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/DexRewriter.java @@ -42,6 +42,7 @@ import com.android.tools.smali.dexlib2.iface.MethodParameter; import com.android.tools.smali.dexlib2.iface.TryBlock; import com.android.tools.smali.dexlib2.iface.debug.DebugItem; import com.android.tools.smali.dexlib2.iface.instruction.Instruction; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.value.EncodedValue; @@ -87,6 +88,7 @@ public class DexRewriter implements Rewriters { private final Rewriter<String> typeRewriter; private final Rewriter<FieldReference> fieldReferenceRewriter; private final Rewriter<MethodReference> methodReferenceRewriter; + private final Rewriter<CallSiteReference> callSiteReferenceRewriter; private final Rewriter<Annotation> annotationRewriter; private final Rewriter<AnnotationElement> annotationElementRewriter; private final Rewriter<EncodedValue> encodedValueRewriter; @@ -105,6 +107,7 @@ public class DexRewriter implements Rewriters { this.typeRewriter = module.getTypeRewriter(this); this.fieldReferenceRewriter = module.getFieldReferenceRewriter(this); this.methodReferenceRewriter = module.getMethodReferenceRewriter(this); + this.callSiteReferenceRewriter = module.getCallSiteReferenceRewriter(this); this.annotationRewriter = module.getAnnotationRewriter(this); this.annotationElementRewriter = module.getAnnotationElementRewriter(this); this.encodedValueRewriter = module.getEncodedValueRewriter(this); @@ -123,6 +126,7 @@ public class DexRewriter implements Rewriters { @Nonnull @Override public Rewriter<String> getTypeRewriter() { return typeRewriter; } @Nonnull @Override public Rewriter<FieldReference> getFieldReferenceRewriter() { return fieldReferenceRewriter; } @Nonnull @Override public Rewriter<MethodReference> getMethodReferenceRewriter() { return methodReferenceRewriter; } + @Nonnull @Override public Rewriter<CallSiteReference> getCallSiteReferenceRewriter() { return callSiteReferenceRewriter; } @Nonnull @Override public Rewriter<Annotation> getAnnotationRewriter() { return annotationRewriter; } @Nonnull @Override public Rewriter<AnnotationElement> getAnnotationElementRewriter() { return annotationElementRewriter; } @Nonnull @Override public Rewriter<EncodedValue> getEncodedValueRewriter() { return encodedValueRewriter; } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/InstructionRewriter.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/InstructionRewriter.java index b3468396..af4ba885 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/InstructionRewriter.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/InstructionRewriter.java @@ -32,6 +32,7 @@ package com.android.tools.smali.dexlib2.rewriter; import com.android.tools.smali.dexlib2.Opcode; import com.android.tools.smali.dexlib2.ReferenceType; +import com.android.tools.smali.dexlib2.iface.instruction.DualReferenceInstruction; import com.android.tools.smali.dexlib2.iface.instruction.Instruction; import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction; import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction20bc; @@ -41,10 +42,15 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31c; import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c; import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc; import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction45cc; +import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction4rcc; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodHandleReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodProtoReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.reference.Reference; import com.android.tools.smali.dexlib2.iface.reference.TypeReference; +import com.android.tools.smali.util.ExceptionWithContext; import javax.annotation.Nonnull; @@ -72,6 +78,8 @@ public class InstructionRewriter implements Rewriter<Instruction> { return new RewrittenInstruction3rc((Instruction3rc)instruction); case Format45cc: return new RewrittenInstruction45cc((Instruction45cc) instruction); + case Format4rcc: + return new RewrittenInstruction4rcc((Instruction4rcc) instruction); default: throw new IllegalArgumentException(); } @@ -79,6 +87,33 @@ public class InstructionRewriter implements Rewriter<Instruction> { return instruction; } + @Nonnull private Reference rewriteReference(int type, + @Nonnull Reference reference) { + switch (type) { + case ReferenceType.TYPE: + return RewriterUtils.rewriteTypeReference(rewriters.getTypeRewriter(), + (TypeReference)reference); + case ReferenceType.FIELD: + return rewriters.getFieldReferenceRewriter().rewrite((FieldReference)reference); + case ReferenceType.METHOD: + return rewriters.getMethodReferenceRewriter().rewrite((MethodReference)reference); + case ReferenceType.STRING: + return reference; + case ReferenceType.METHOD_PROTO: + return RewriterUtils.rewriteMethodProtoReference( + rewriters.getTypeRewriter(), + (MethodProtoReference)reference); + case ReferenceType.METHOD_HANDLE: + return RewriterUtils.rewriteMethodHandleReference( + rewriters, (MethodHandleReference)reference); + case ReferenceType.CALL_SITE: + return rewriters.getCallSiteReferenceRewriter().rewrite((CallSiteReference)reference); + default: + throw new ExceptionWithContext("Invalid reference type: %d", + type); + } + } + protected class BaseRewrittenReferenceInstruction<T extends ReferenceInstruction> implements ReferenceInstruction { @Nonnull protected T instruction; @@ -88,19 +123,8 @@ public class InstructionRewriter implements Rewriter<Instruction> { } @Override @Nonnull public Reference getReference() { - switch (instruction.getReferenceType()) { - case ReferenceType.TYPE: - return RewriterUtils.rewriteTypeReference(rewriters.getTypeRewriter(), - (TypeReference)instruction.getReference()); - case ReferenceType.FIELD: - return rewriters.getFieldReferenceRewriter().rewrite((FieldReference)instruction.getReference()); - case ReferenceType.METHOD: - return rewriters.getMethodReferenceRewriter().rewrite((MethodReference)instruction.getReference()); - case ReferenceType.STRING: - return instruction.getReference(); - default: - throw new IllegalArgumentException(); - } + return rewriteReference( + instruction.getReferenceType(), instruction.getReference()); } @Override public int getReferenceType() { @@ -210,33 +234,28 @@ public class InstructionRewriter implements Rewriter<Instruction> { } } - protected class RewrittenInstruction45cc extends BaseRewrittenReferenceInstruction<Instruction45cc> - implements Instruction45cc { - public RewrittenInstruction45cc(@Nonnull Instruction45cc instruction) { + protected class BaseRewrittenDualReferenceInstruction<T extends DualReferenceInstruction> + extends BaseRewrittenReferenceInstruction<T> + implements DualReferenceInstruction { + public BaseRewrittenDualReferenceInstruction(@Nonnull T 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(); - } + return rewriteReference( + instruction.getReferenceType2(), instruction.getReference2()); } public int getReferenceType2() { return instruction.getReferenceType2(); } + } + + protected class RewrittenInstruction45cc extends BaseRewrittenDualReferenceInstruction<Instruction45cc> + implements Instruction45cc { + public RewrittenInstruction45cc(@Nonnull Instruction45cc instruction) { + super(instruction); + } public int getRegisterC() { return instruction.getRegisterC(); @@ -262,4 +281,19 @@ public class InstructionRewriter implements Rewriter<Instruction> { return instruction.getRegisterF(); } } + + protected class RewrittenInstruction4rcc extends BaseRewrittenDualReferenceInstruction<Instruction4rcc> + implements Instruction4rcc { + public RewrittenInstruction4rcc(@Nonnull Instruction4rcc instruction) { + super(instruction); + } + + public int getStartRegister() { + return instruction.getStartRegister(); + } + + public int getRegisterCount() { + return instruction.getRegisterCount(); + } + } } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterModule.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterModule.java index 9762c893..0762b5f3 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterModule.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterModule.java @@ -42,6 +42,7 @@ import com.android.tools.smali.dexlib2.iface.MethodParameter; import com.android.tools.smali.dexlib2.iface.TryBlock; import com.android.tools.smali.dexlib2.iface.debug.DebugItem; import com.android.tools.smali.dexlib2.iface.instruction.Instruction; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.value.EncodedValue; @@ -101,6 +102,10 @@ public class RewriterModule { return new MethodReferenceRewriter(rewriters); } + @Nonnull public Rewriter<CallSiteReference> getCallSiteReferenceRewriter(@Nonnull Rewriters rewriters) { + return new CallSiteReferenceRewriter(rewriters); + } + @Nonnull public Rewriter<Annotation> getAnnotationRewriter(@Nonnull Rewriters rewriters) { return new AnnotationRewriter(rewriters); } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterUtils.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterUtils.java index a8297543..652eb46e 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterUtils.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/RewriterUtils.java @@ -30,8 +30,31 @@ package com.android.tools.smali.dexlib2.rewriter; +import com.android.tools.smali.util.ExceptionWithContext; +import com.android.tools.smali.dexlib2.MethodHandleType; +import com.android.tools.smali.dexlib2.ValueType; +import com.android.tools.smali.dexlib2.base.reference.BaseMethodHandleReference; +import com.android.tools.smali.dexlib2.base.reference.BaseMethodProtoReference; import com.android.tools.smali.dexlib2.base.reference.BaseTypeReference; +import com.android.tools.smali.dexlib2.base.value.BaseFieldEncodedValue; +import com.android.tools.smali.dexlib2.base.value.BaseMethodEncodedValue; +import com.android.tools.smali.dexlib2.base.value.BaseMethodHandleEncodedValue; +import com.android.tools.smali.dexlib2.base.value.BaseMethodTypeEncodedValue; +import com.android.tools.smali.dexlib2.base.value.BaseTypeEncodedValue; +import com.android.tools.smali.dexlib2.iface.reference.FieldReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodHandleReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodProtoReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodReference; +import com.android.tools.smali.dexlib2.iface.reference.Reference; import com.android.tools.smali.dexlib2.iface.reference.TypeReference; +import com.android.tools.smali.dexlib2.iface.value.EncodedValue; +import com.android.tools.smali.dexlib2.iface.value.FieldEncodedValue; +import com.android.tools.smali.dexlib2.iface.value.MethodEncodedValue; +import com.android.tools.smali.dexlib2.iface.value.MethodHandleEncodedValue; +import com.android.tools.smali.dexlib2.iface.value.MethodTypeEncodedValue; +import com.android.tools.smali.dexlib2.iface.value.TypeEncodedValue; +import com.google.common.base.Function; +import com.google.common.collect.Lists; import java.util.AbstractList; import java.util.AbstractSet; @@ -116,6 +139,119 @@ public class RewriterUtils { } }; } + + @Nonnull public static MethodHandleReference rewriteMethodHandleReference( + @Nonnull final Rewriters rewriters, + @Nonnull final MethodHandleReference methodHandleReference) { + switch (methodHandleReference.getMethodHandleType()) { + case MethodHandleType.STATIC_PUT: + case MethodHandleType.STATIC_GET: + case MethodHandleType.INSTANCE_PUT: + case MethodHandleType.INSTANCE_GET: + return new BaseMethodHandleReference() { + @Override public int getMethodHandleType() { + return methodHandleReference.getMethodHandleType(); + } + + @Nonnull @Override public Reference getMemberReference() { + return rewriters.getFieldReferenceRewriter().rewrite((FieldReference)methodHandleReference.getMemberReference()); + } + }; + case MethodHandleType.INVOKE_STATIC: + case MethodHandleType.INVOKE_INSTANCE: + case MethodHandleType.INVOKE_CONSTRUCTOR: + case MethodHandleType.INVOKE_DIRECT: + case MethodHandleType.INVOKE_INTERFACE: + return new BaseMethodHandleReference() { + @Override public int getMethodHandleType() { + return methodHandleReference.getMethodHandleType(); + } + + @Nonnull @Override public Reference getMemberReference() { + return rewriters.getMethodReferenceRewriter().rewrite((MethodReference)methodHandleReference.getMemberReference()); + } + }; + default: + throw new ExceptionWithContext("Invalid method handle type: %d", + methodHandleReference.getMethodHandleType()); + } + } + + @Nonnull public static MethodProtoReference rewriteMethodProtoReference( + @Nonnull final Rewriter<String> typeRewriter, + @Nonnull final MethodProtoReference methodProtoReference) { + return new BaseMethodProtoReference() { + @Nonnull @Override public List<? extends CharSequence> getParameterTypes() { + return rewriteList(typeRewriter, + Lists.transform(methodProtoReference.getParameterTypes(), + new Function<CharSequence, String>() { + @Nonnull @Override public String apply(CharSequence input) { + return input.toString(); + } + })); + } + + @Nonnull @Override public String getReturnType() { + return typeRewriter.rewrite(methodProtoReference.getReturnType()); + } + }; + } + + @Nonnull public static EncodedValue rewriteValue( + @Nonnull final Rewriters rewriters, + @Nonnull final EncodedValue encodedValue) { + switch (encodedValue.getValueType()) { + case ValueType.INT: + case ValueType.FLOAT: + case ValueType.LONG: + case ValueType.DOUBLE: + case ValueType.STRING: + return encodedValue; + + case ValueType.METHOD_TYPE: + return new BaseMethodTypeEncodedValue () { + @Override @Nonnull public MethodProtoReference getValue() { + return rewriteMethodProtoReference( + rewriters.getTypeRewriter(), + ((MethodTypeEncodedValue) encodedValue).getValue()); + } + }; + + case ValueType.METHOD_HANDLE: + return new BaseMethodHandleEncodedValue () { + @Override @Nonnull public MethodHandleReference getValue() { + return rewriteMethodHandleReference( + rewriters, + ((MethodHandleEncodedValue) encodedValue).getValue()); + } + }; + + case ValueType.TYPE: + return new BaseTypeEncodedValue () { + @Override @Nonnull public String getValue() { + return rewriters.getTypeRewriter().rewrite(((TypeEncodedValue) encodedValue).getValue()); + } + }; + + case ValueType.FIELD: + return new BaseFieldEncodedValue () { + @Override @Nonnull public FieldReference getValue() { + return rewriters.getFieldReferenceRewriter().rewrite(((FieldEncodedValue) encodedValue).getValue()); + } + }; + + case ValueType.METHOD: + return new BaseMethodEncodedValue () { + @Override @Nonnull public MethodReference getValue() { + return rewriters.getMethodReferenceRewriter().rewrite(((MethodEncodedValue) encodedValue).getValue()); + } + }; + + default: + throw new ExceptionWithContext("Unsupported encoded value type: %d", + encodedValue.getValueType()); + } + } } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/Rewriters.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/Rewriters.java index bb4cd34e..93d9cc4f 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/Rewriters.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/rewriter/Rewriters.java @@ -42,6 +42,7 @@ import com.android.tools.smali.dexlib2.iface.MethodParameter; import com.android.tools.smali.dexlib2.iface.TryBlock; import com.android.tools.smali.dexlib2.iface.debug.DebugItem; import com.android.tools.smali.dexlib2.iface.instruction.Instruction; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.value.EncodedValue; @@ -64,6 +65,7 @@ public interface Rewriters { @Nonnull Rewriter<String> getTypeRewriter(); @Nonnull Rewriter<FieldReference> getFieldReferenceRewriter(); @Nonnull Rewriter<MethodReference> getMethodReferenceRewriter(); + @Nonnull Rewriter<CallSiteReference> getCallSiteReferenceRewriter(); @Nonnull Rewriter<Annotation> getAnnotationRewriter(); @Nonnull Rewriter<AnnotationElement> getAnnotationElementRewriter(); diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/util/Preconditions.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/util/Preconditions.java index 66c7c40b..57faad6e 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/util/Preconditions.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/util/Preconditions.java @@ -35,7 +35,10 @@ import com.android.tools.smali.dexlib2.Opcode; import com.android.tools.smali.dexlib2.ReferenceType; import com.android.tools.smali.dexlib2.VerificationError; import com.android.tools.smali.dexlib2.iface.instruction.SwitchElement; +import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodHandleReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodProtoReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.reference.Reference; import com.android.tools.smali.dexlib2.iface.reference.StringReference; @@ -274,6 +277,21 @@ public class Preconditions { throw new IllegalArgumentException("Invalid reference type, expecting a method reference"); } break; + case ReferenceType.METHOD_PROTO: + if (!(reference instanceof MethodProtoReference)) { + throw new IllegalArgumentException("Invalid reference type, expecting a method proto reference"); + } + break; + case ReferenceType.METHOD_HANDLE: + if (!(reference instanceof MethodHandleReference)) { + throw new IllegalArgumentException("Invalid reference type, expecting a method handle reference"); + } + break; + case ReferenceType.CALL_SITE: + if (!(reference instanceof CallSiteReference)) { + throw new IllegalArgumentException("Invalid reference type, expecting a call site reference"); + } + break; default: throw new IllegalArgumentException(String.format("Not a valid reference type: %d", referenceType)); } diff --git a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/writer/pool/ClassPool.java b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/writer/pool/ClassPool.java index bf35aa99..a6a6fbb0 100644 --- a/dexlib2/src/main/java/com/android/tools/smali/dexlib2/writer/pool/ClassPool.java +++ b/dexlib2/src/main/java/com/android/tools/smali/dexlib2/writer/pool/ClassPool.java @@ -49,6 +49,7 @@ import com.android.tools.smali.dexlib2.iface.debug.SetSourceFile; import com.android.tools.smali.dexlib2.iface.debug.StartLocal; import com.android.tools.smali.dexlib2.iface.reference.CallSiteReference; import com.android.tools.smali.dexlib2.iface.reference.FieldReference; +import com.android.tools.smali.dexlib2.iface.reference.MethodHandleReference; import com.android.tools.smali.dexlib2.iface.reference.MethodProtoReference; import com.android.tools.smali.dexlib2.iface.reference.MethodReference; import com.android.tools.smali.dexlib2.iface.reference.Reference; @@ -196,6 +197,9 @@ public class ClassPool extends BasePool<String, PoolClassDef> implements ClassSe case ReferenceType.METHOD_PROTO: dexPool.protoSection.intern((MethodProtoReference)reference); break; + case ReferenceType.METHOD_HANDLE: + dexPool.methodHandleSection.intern((MethodHandleReference) reference); + break; case ReferenceType.CALL_SITE: dexPool.callSiteSection.intern((CallSiteReference) reference); break; |