diff options
author | Sadaf Ebrahimi <sadafebrahimi@google.com> | 2023-07-25 18:25:09 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-07-25 18:25:09 +0000 |
commit | c6c5f5e28f13bad4844cea875ffcbfafe3cb4bb3 (patch) | |
tree | 8bbadcaf682a7ecd2cc18b453fa72d1b4975e94a | |
parent | 230a64101ffeaa2770a03aa3cbab843574026b8b (diff) | |
parent | fbcadfecb0db0b3667077ccc26e23d14fd72e2db (diff) | |
download | google-smali-c6c5f5e28f13bad4844cea875ffcbfafe3cb4bb3.tar.gz |
Upgrade google-smali to 3.0.3 am: d166abb294 am: 184671072b am: b2fd0c6881 am: fbcadfecb0
Original change: https://android-review.googlesource.com/c/platform/external/google-smali/+/2673480
Change-Id: If51f5513cd98f987d137b128a9ccea47c4f24cc9
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
12 files changed, 360 insertions, 41 deletions
@@ -1,6 +1,6 @@ # This project was upgraded with external_updater. # Usage: tools/external_updater/updater.sh update google-smali -# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md +# For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md name: "google-smali" description: "smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android\'s Java VM implementation." @@ -9,11 +9,11 @@ third_party { type: GIT value: "https://github.com/google/smali" } - version: "3.0.2" + version: "3.0.3" license_type: NOTICE last_upgrade_date { year: 2023 - month: 4 - day: 11 + month: 7 + day: 24 } } @@ -2,11 +2,13 @@ smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full functionality of the dex format (annotations, debug info, line info, etc.) -**NOTE**: This is a fork of https://github.com/JesusFreke/smali for patches needed by Google as the original repository is currently not maintained. After forking the namespace was changed from `org.jf` to `com.anroid.tools.smali`. The artifacts are released on [Google Maven](https://maven.google.com) under the following coordinates: -* [com.anroid.tools.smali:smali:<version>](https://maven.google.com/web/index.html?q=smali#com.android.tools.smali:smali) -* [com.anroid.tools.smali:smali-dexlib2:<version>](https://maven.google.com/web/index.html?q=smali-dexlib2#com.android.tools.smali:smali-dexlib2) -* [com.anroid.tools.smali:smali-baksmali:<version>](https://maven.google.com/web/index.html?q=smali-baksmali#com.android.tools.smali:smali) -* [com.anroid.tools.smali:smali-util:<version>](https://maven.google.com/web/index.html?q=smali-util#com.android.tools.smali:smali-util) +**NOTE**: This is a fork of https://github.com/JesusFreke/smali for patches needed by Google as the original repository is currently not maintained. After forking the namespace was changed from `org.jf` to `com.android.tools.smali`. The artifacts are released on [Google Maven](https://maven.google.com) under the following coordinates: + +* [`com.android.tools.smali:smali:<version>`](https://maven.google.com/web/index.html?q=smali#com.android.tools.smali:smali) +* [`com.android.tools.smali:smali-dexlib2:<version>`](https://maven.google.com/web/index.html?q=smali-dexlib2#com.android.tools.smali:smali-dexlib2) +* [`com.android.tools.smali:smali-baksmali:<version>`](https://maven.google.com/web/index.html?q=smali-baksmali#com.android.tools.smali:smali) +* [`com.android.tools.smali:smali-util:<version>`](https://maven.google.com/web/index.html?q=smali-util#com.android.tools.smali:smali-util) + After the fork the first version released was 3.0.0, which was version 2.5.2 from the original repo with a few patches and the namespace change. #### Support @@ -49,3 +51,21 @@ location) ``` ./gradlew release publishToMavenLocal ``` + +### Prepare and build a release version +To prepare a release update `build.gradle` with the next release version and commit that. +Then create a tag for that commit with the version. +``` +git tag <version> <commit> +git push origin <version> +``` +Release versions can then be built by the Google R8 team using: +``` +tools/trigger.py --smali=<version> --release +``` +in the R8 repository. + +The status of the build on the bot is at https://ci.chromium.org/p/r8/builders/ci/smali. + +### Releasing versions on Google Maven +TBD. diff --git a/build.gradle b/build.gradle index f0e766ad..c7581637 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ apply plugin: 'idea' -version = '3.0.2' +version = '3.0.3' def jcommanderVersion = '' if (!('release' in gradle.startParameter.taskNames)) { 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; |