diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-05-17 14:17:15 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-05-17 14:17:15 +0000 |
commit | 77df77eb2635d8dcfb8c15516317582fc9a82e4f (patch) | |
tree | 7688c4a7448f89b247e803a867f5dfe3b8d71eed | |
parent | e37e1d9e08952bd584a664fb8e0ccac591aa24cc (diff) | |
parent | 49f383c1facb465b1daa7c4e5e73397291532bd8 (diff) | |
download | smali-oreo-m2-s3-release.tar.gz |
release-request-323db86e-b638-4d24-8eb1-d2e3bf4a9d1a-for-git_oc-mr1-release-4017779 snap-temp-L47900000064949209android-wear-8.1.0_r1android-vts-8.1_r9android-vts-8.1_r8android-vts-8.1_r7android-vts-8.1_r6android-vts-8.1_r5android-vts-8.1_r4android-vts-8.1_r3android-vts-8.1_r14android-vts-8.1_r13android-vts-8.1_r12android-vts-8.1_r11android-vts-8.1_r10android-security-8.1.0_r93android-security-8.1.0_r92android-security-8.1.0_r91android-security-8.1.0_r90android-security-8.1.0_r89android-security-8.1.0_r88android-security-8.1.0_r87android-security-8.1.0_r86android-security-8.1.0_r85android-security-8.1.0_r84android-security-8.1.0_r83android-security-8.1.0_r82android-cts-8.1_r9android-cts-8.1_r8android-cts-8.1_r7android-cts-8.1_r6android-cts-8.1_r5android-cts-8.1_r4android-cts-8.1_r3android-cts-8.1_r25android-cts-8.1_r24android-cts-8.1_r23android-cts-8.1_r22android-cts-8.1_r21android-cts-8.1_r20android-cts-8.1_r2android-cts-8.1_r19android-cts-8.1_r18android-cts-8.1_r17android-cts-8.1_r16android-cts-8.1_r15android-cts-8.1_r14android-cts-8.1_r13android-cts-8.1_r12android-cts-8.1_r11android-cts-8.1_r10android-cts-8.1_r1android-8.1.0_r9android-8.1.0_r81android-8.1.0_r80android-8.1.0_r8android-8.1.0_r79android-8.1.0_r78android-8.1.0_r77android-8.1.0_r76android-8.1.0_r75android-8.1.0_r74android-8.1.0_r73android-8.1.0_r72android-8.1.0_r71android-8.1.0_r70android-8.1.0_r7android-8.1.0_r69android-8.1.0_r68android-8.1.0_r67android-8.1.0_r66android-8.1.0_r65android-8.1.0_r64android-8.1.0_r63android-8.1.0_r62android-8.1.0_r61android-8.1.0_r60android-8.1.0_r6android-8.1.0_r53android-8.1.0_r52android-8.1.0_r51android-8.1.0_r50android-8.1.0_r5android-8.1.0_r48android-8.1.0_r47android-8.1.0_r46android-8.1.0_r45android-8.1.0_r43android-8.1.0_r42android-8.1.0_r41android-8.1.0_r40android-8.1.0_r4android-8.1.0_r39android-8.1.0_r38android-8.1.0_r37android-8.1.0_r36android-8.1.0_r35android-8.1.0_r33android-8.1.0_r32android-8.1.0_r31android-8.1.0_r30android-8.1.0_r3android-8.1.0_r29android-8.1.0_r28android-8.1.0_r27android-8.1.0_r26android-8.1.0_r25android-8.1.0_r23android-8.1.0_r22android-8.1.0_r21android-8.1.0_r20android-8.1.0_r2android-8.1.0_r19android-8.1.0_r18android-8.1.0_r17android-8.1.0_r16android-8.1.0_r15android-8.1.0_r14android-8.1.0_r13android-8.1.0_r12android-8.1.0_r11android-8.1.0_r10android-8.1.0_r1security-oc-mr1-releaseoreo-mr1-wear-releaseoreo-mr1-vts-releaseoreo-mr1-security-releaseoreo-mr1-s1-releaseoreo-mr1-releaseoreo-mr1-cuttlefish-testingoreo-mr1-cts-releaseoreo-m8-releaseoreo-m7-releaseoreo-m6-s4-releaseoreo-m6-s3-releaseoreo-m6-s2-releaseoreo-m5-releaseoreo-m4-s9-releaseoreo-m4-s8-releaseoreo-m4-s7-releaseoreo-m4-s6-releaseoreo-m4-s5-releaseoreo-m4-s4-releaseoreo-m4-s3-releaseoreo-m4-s2-releaseoreo-m4-s12-releaseoreo-m4-s11-releaseoreo-m4-s10-releaseoreo-m4-s1-releaseoreo-m3-releaseoreo-m2-s5-releaseoreo-m2-s4-releaseoreo-m2-s3-releaseoreo-m2-s2-releaseoreo-m2-s1-releaseoreo-m2-release
Change-Id: I49b9d891f9e560360d8d535084be9a2eda83cb32
170 files changed, 11240 insertions, 6118 deletions
@@ -2,7 +2,7 @@ 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.) -Downloads are at https://bitbucket.org/JesusFreke/smali/downloads. If you are interested in submitting a patch, feel free to send me a pull request here. +Downloads are at https://bitbucket.org/JesusFreke/smali/downloads/. If you are interested in submitting a patch, feel free to send me a pull request here. See [the wiki](https://github.com/JesusFreke/smali/wiki) for more info/news/release notes/etc. diff --git a/README.version b/README.version index 227d2d3c..22387f02 100644 --- a/README.version +++ b/README.version @@ -1,3 +1,3 @@ -URL: https://bitbucket.org/JesusFreke/smali/downloads/smali-2.0.5.jar -Version: 2.0.5 +URL: https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.0.jar +Version: 2.2.0 BugComponent: 99143 diff --git a/baksmali/Android.mk b/baksmali/Android.mk index feaff1d6..5e828ed8 100644 --- a/baksmali/Android.mk +++ b/baksmali/Android.mk @@ -36,7 +36,8 @@ LOCAL_SRC_FILES := \ LOCAL_JAR_MANIFEST := manifest.txt LOCAL_STATIC_JAVA_LIBRARIES := \ - dexlib2 + dexlib2 \ + jcommander-host #create a new baksmali.properties file using the correct version $(intermediates)/resources/baksmali.properties: $(LOCAL_PATH)/../build.gradle diff --git a/baksmali/build.gradle b/baksmali/build.gradle index f3a14b19..aae88a35 100644 --- a/baksmali/build.gradle +++ b/baksmali/build.gradle @@ -41,8 +41,8 @@ buildscript { dependencies { compile project(':util') compile project(':dexlib2') - compile depends.commons_cli compile depends.guava + compile depends.jcommander testCompile depends.junit testCompile project(':smali') @@ -59,7 +59,7 @@ task fatJar(type: Jar) { classifier = 'fat' manifest { - attributes('Main-Class': 'org.jf.baksmali.main') + attributes('Main-Class': 'org.jf.baksmali.Main') } doLast { @@ -92,7 +92,9 @@ task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) { dontobfuscate dontoptimize - keep 'public class org.jf.baksmali.main { public static void main(java.lang.String[]); }' + keep 'public class org.jf.baksmali.Main { public static void main(java.lang.String[]); }' + keep 'public class org.jf.util.jcommander.ColonParameterSplitter' + keep 'class com.beust.jcommander.** { *; }' keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }' dontwarn 'com.google.common.**' @@ -100,3 +102,17 @@ task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) { } tasks.getByPath(':release').dependsOn(proguard) + +task fastbuild(dependsOn: build) { +} + +task fb(dependsOn: fastbuild) { +} + +tasks.getByPath('javadoc').onlyIf({ + !gradle.taskGraph.hasTask(fastbuild) +}) + +tasks.getByPath('test').onlyIf({ + !gradle.taskGraph.hasTask(fastbuild) +})
\ No newline at end of file diff --git a/baksmali/manifest.txt b/baksmali/manifest.txt index ac026292..f769c2de 100644 --- a/baksmali/manifest.txt +++ b/baksmali/manifest.txt @@ -1 +1 @@ -Main-Class: org.jf.baksmali.main +Main-Class: org.jf.baksmali.Main diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java index 6c67d4ac..4b545ee6 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java @@ -28,7 +28,7 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.util.IndentingWriter; import javax.annotation.Nonnull; @@ -42,7 +42,7 @@ public class CatchMethodItem extends MethodItem { private final LabelMethodItem tryEndLabel; private final LabelMethodItem handlerLabel; - public CatchMethodItem(@Nonnull baksmaliOptions options, @Nonnull MethodDefinition.LabelCache labelCache, + public CatchMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition.LabelCache labelCache, int codeAddress, @Nullable String exceptionType, int startAddress, int endAddress, int handlerAddress) { super(codeAddress); diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java index 2529af8a..361826da 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java @@ -28,8 +28,7 @@ package org.jf.baksmali.Adaptors; -import com.google.common.collect.Lists; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.dexbacked.DexBackedClassDef; import org.jf.dexlib2.dexbacked.DexBackedDexFile.InvalidItemIndex; @@ -46,16 +45,16 @@ import java.io.IOException; import java.util.*; public class ClassDefinition { - @Nonnull public final baksmaliOptions options; + @Nonnull public final BaksmaliOptions options; @Nonnull public final ClassDef classDef; @Nonnull private final HashSet<String> fieldsSetInStaticConstructor; protected boolean validationErrors; - public ClassDefinition(@Nonnull baksmaliOptions options, @Nonnull ClassDef classDef) { + public ClassDefinition(@Nonnull BaksmaliOptions options, @Nonnull ClassDef classDef) { this.options = options; this.classDef = classDef; - fieldsSetInStaticConstructor = findFieldsSetInStaticConstructor(); + fieldsSetInStaticConstructor = findFieldsSetInStaticConstructor(classDef); } public boolean hadValidationErrors() { @@ -63,7 +62,7 @@ public class ClassDefinition { } @Nonnull - private HashSet<String> findFieldsSetInStaticConstructor() { + private static HashSet<String> findFieldsSetInStaticConstructor(@Nonnull ClassDef classDef) { HashSet<String> fieldsSetInStaticConstructor = new HashSet<String>(); for (Method method: classDef.getDirectMethods()) { @@ -166,7 +165,7 @@ public class ClassDefinition { writer.write("# annotations\n"); String containingClass = null; - if (options.useImplicitReferences) { + if (options.implicitReferences) { containingClass = classDef.getType(); } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java index aed315d7..26807048 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java @@ -28,14 +28,14 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import javax.annotation.Nonnull; public class EndTryLabelMethodItem extends LabelMethodItem { private int endTryAddress; - public EndTryLabelMethodItem(@Nonnull baksmaliOptions options, int codeAddress, int endTryAddress) { + public EndTryLabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, int endTryAddress) { super(options, codeAddress, "try_end_"); this.endTryAddress = endTryAddress; } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java index ae017914..90291b79 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java @@ -29,7 +29,7 @@ package org.jf.baksmali.Adaptors; import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.iface.Annotation; import org.jf.dexlib2.iface.Field; @@ -41,7 +41,7 @@ import java.io.IOException; import java.util.Collection; public class FieldDefinition { - public static void writeTo(baksmaliOptions options, IndentingWriter writer, Field field, + public static void writeTo(BaksmaliOptions options, IndentingWriter writer, Field field, boolean setInStaticConstructor) throws IOException { EncodedValue initialValue = field.getInitialValue(); int accessFlags = field.getAccessFlags(); @@ -68,7 +68,7 @@ public class FieldDefinition { writer.write(" = "); String containingClass = null; - if (options.useImplicitReferences) { + if (options.implicitReferences) { containingClass = field.getDefiningClass(); } @@ -82,7 +82,7 @@ public class FieldDefinition { writer.indent(4); String containingClass = null; - if (options.useImplicitReferences) { + if (options.implicitReferences) { containingClass = field.getDefiningClass(); } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java index fe85fe00..d58b2b68 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java @@ -32,7 +32,7 @@ import org.jf.baksmali.Adaptors.MethodDefinition; import org.jf.baksmali.Adaptors.MethodDefinition.InvalidSwitchPayload; import org.jf.baksmali.Adaptors.MethodItem; import org.jf.baksmali.Renderers.LongRenderer; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.Opcode; import org.jf.dexlib2.ReferenceType; import org.jf.dexlib2.VerificationError; @@ -67,7 +67,7 @@ public class InstructionMethodItem<T extends Instruction> extends MethodItem { } private boolean isAllowedOdex(@Nonnull Opcode opcode) { - baksmaliOptions options = methodDef.classDef.options; + BaksmaliOptions options = methodDef.classDef.options; if (options.allowOdex) { return true; } @@ -110,7 +110,7 @@ public class InstructionMethodItem<T extends Instruction> extends MethodItem { if (instruction instanceof ReferenceInstruction) { ReferenceInstruction referenceInstruction = (ReferenceInstruction)instruction; String classContext = null; - if (methodDef.classDef.options.useImplicitReferences) { + if (methodDef.classDef.options.implicitReferences) { classContext = methodDef.method.getDefiningClass(); } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java index 3ffb4bd4..be76edfe 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java @@ -30,7 +30,7 @@ package org.jf.baksmali.Adaptors.Format; import org.jf.baksmali.Adaptors.LabelMethodItem; import org.jf.baksmali.Adaptors.MethodDefinition; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.Opcode; import org.jf.dexlib2.iface.instruction.OffsetInstruction; import org.jf.util.IndentingWriter; @@ -41,7 +41,7 @@ import java.io.IOException; public class OffsetInstructionFormatMethodItem extends InstructionMethodItem<OffsetInstruction> { protected LabelMethodItem label; - public OffsetInstructionFormatMethodItem(@Nonnull baksmaliOptions options, @Nonnull MethodDefinition methodDef, + public OffsetInstructionFormatMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition methodDef, int codeAddress, OffsetInstruction instruction) { super(methodDef, codeAddress, instruction); diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java index b152bb69..268d643c 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java @@ -28,18 +28,18 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.util.IndentingWriter; import javax.annotation.Nonnull; import java.io.IOException; public class LabelMethodItem extends MethodItem { - private final baksmaliOptions options; + private final BaksmaliOptions options; private final String labelPrefix; private int labelSequence; - public LabelMethodItem(@Nonnull baksmaliOptions options, int codeAddress, @Nonnull String labelPrefix) { + public LabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, @Nonnull String labelPrefix) { super(codeAddress); this.options = options; this.labelPrefix = labelPrefix; @@ -76,7 +76,7 @@ public class LabelMethodItem extends MethodItem { public boolean writeTo(IndentingWriter writer) throws IOException { writer.write(':'); writer.write(labelPrefix); - if (options.useSequentialLabels) { + if (options.sequentialLabels) { writer.printUnsignedLongAsHex(labelSequence); } else { writer.printUnsignedLongAsHex(this.getLabelAddress()); diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java index ef2110a8..8161fe49 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java @@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.jf.baksmali.Adaptors.Debug.DebugMethodItem; import org.jf.baksmali.Adaptors.Format.InstructionMethodItemFactory; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.Format; import org.jf.dexlib2.Opcode; @@ -163,7 +163,7 @@ public class MethodDefinition { } public static void writeEmptyMethodTo(IndentingWriter writer, Method method, - baksmaliOptions options) throws IOException { + BaksmaliOptions options) throws IOException { writer.write(".method "); writeAccessFlags(writer, method.getAccessFlags()); writer.write(method.getName()); @@ -180,7 +180,7 @@ public class MethodDefinition { writeParameters(writer, method, methodParameters, options); String containingClass = null; - if (options.useImplicitReferences) { + if (options.implicitReferences) { containingClass = method.getDefiningClass(); } AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass); @@ -212,7 +212,7 @@ public class MethodDefinition { writer.write('\n'); writer.indent(4); - if (classDef.options.useLocalsDirective) { + if (classDef.options.localsDirective) { writer.write(".locals "); writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount); } else { @@ -228,7 +228,7 @@ public class MethodDefinition { } String containingClass = null; - if (classDef.options.useImplicitReferences) { + if (classDef.options.implicitReferences) { containingClass = method.getDefiningClass(); } AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass); @@ -313,18 +313,18 @@ public class MethodDefinition { private static void writeParameters(IndentingWriter writer, Method method, List<? extends MethodParameter> parameters, - baksmaliOptions options) throws IOException { + BaksmaliOptions options) throws IOException { boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags()); int registerNumber = isStatic?0:1; for (MethodParameter parameter: parameters) { String parameterType = parameter.getType(); String parameterName = parameter.getName(); Collection<? extends Annotation> annotations = parameter.getAnnotations(); - if ((options.outputDebugInfo && parameterName != null) || annotations.size() != 0) { + if ((options.debugInfo && parameterName != null) || annotations.size() != 0) { writer.write(".param p"); writer.printSignedIntAsDec(registerNumber); - if (parameterName != null && options.outputDebugInfo) { + if (parameterName != null && options.debugInfo) { writer.write(", "); ReferenceFormatter.writeStringReference(writer, parameterName); } @@ -335,7 +335,7 @@ public class MethodDefinition { writer.indent(4); String containingClass = null; - if (options.useImplicitReferences) { + if (options.implicitReferences) { containingClass = method.getDefiningClass(); } AnnotationFormatter.writeTo(writer, annotations, containingClass); @@ -374,11 +374,11 @@ public class MethodDefinition { } addTries(methodItems); - if (classDef.options.outputDebugInfo) { + if (classDef.options.debugInfo) { addDebugInfo(methodItems); } - if (classDef.options.useSequentialLabels) { + if (classDef.options.sequentialLabels) { setLabelSequentialNumbers(); } @@ -415,7 +415,7 @@ public class MethodDefinition { methodItems.add(new BlankMethodItem(currentCodeAddress)); } - if (classDef.options.addCodeOffsets) { + if (classDef.options.codeOffsets) { methodItems.add(new MethodItem(currentCodeAddress) { @Override @@ -432,7 +432,8 @@ public class MethodDefinition { }); } - if (!classDef.options.noAccessorComments && (instruction instanceof ReferenceInstruction)) { + if (classDef.options.accessorComments && classDef.options.syntheticAccessorResolver != null && + (instruction instanceof ReferenceInstruction)) { Opcode opcode = instruction.getOpcode(); if (opcode.referenceType == ReferenceType.METHOD) { @@ -493,7 +494,7 @@ public class MethodDefinition { methodItems.add(new BlankMethodItem(currentCodeAddress)); } - if (classDef.options.addCodeOffsets) { + if (classDef.options.codeOffsets) { methodItems.add(new MethodItem(currentCodeAddress) { @Override @@ -597,7 +598,7 @@ public class MethodDefinition { @Nullable private String getContainingClassForImplicitReference() { - if (classDef.options.useImplicitReferences) { + if (classDef.options.implicitReferences) { return classDef.classDef.getType(); } return null; diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java index 812a282a..62826b1e 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java @@ -28,7 +28,7 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.analysis.AnalyzedInstruction; import org.jf.dexlib2.analysis.RegisterType; import org.jf.util.IndentingWriter; @@ -60,12 +60,12 @@ public class PostInstructionRegisterInfoMethodItem extends MethodItem { int registerCount = analyzedInstruction.getRegisterCount(); BitSet registers = new BitSet(registerCount); - if ((registerInfo & baksmaliOptions.ALL) != 0) { + if ((registerInfo & BaksmaliOptions.ALL) != 0) { registers.set(0, registerCount); } else { - if ((registerInfo & baksmaliOptions.ALLPOST) != 0) { + if ((registerInfo & BaksmaliOptions.ALLPOST) != 0) { registers.set(0, registerCount); - } else if ((registerInfo & baksmaliOptions.DEST) != 0) { + } else if ((registerInfo & BaksmaliOptions.DEST) != 0) { addDestRegs(registers, registerCount); } } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java index f5329388..f934eddb 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java @@ -28,7 +28,7 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.dexlib2.analysis.AnalyzedInstruction; import org.jf.dexlib2.analysis.MethodAnalyzer; import org.jf.dexlib2.analysis.RegisterType; @@ -68,29 +68,29 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem { BitSet registers = new BitSet(registerCount); BitSet mergeRegisters = null; - if ((registerInfo & baksmaliOptions.ALL) != 0) { + if ((registerInfo & BaksmaliOptions.ALL) != 0) { registers.set(0, registerCount); } else { - if ((registerInfo & baksmaliOptions.ALLPRE) != 0) { + if ((registerInfo & BaksmaliOptions.ALLPRE) != 0) { registers.set(0, registerCount); } else { - if ((registerInfo & baksmaliOptions.ARGS) != 0) { + if ((registerInfo & BaksmaliOptions.ARGS) != 0) { addArgsRegs(registers); } - if ((registerInfo & baksmaliOptions.MERGE) != 0) { + if ((registerInfo & BaksmaliOptions.MERGE) != 0) { if (analyzedInstruction.isBeginningInstruction()) { addParamRegs(registers, registerCount); } mergeRegisters = new BitSet(registerCount); addMergeRegs(mergeRegisters, registerCount); - } else if ((registerInfo & baksmaliOptions.FULLMERGE) != 0 && + } else if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0 && (analyzedInstruction.isBeginningInstruction())) { addParamRegs(registers, registerCount); } } } - if ((registerInfo & baksmaliOptions.FULLMERGE) != 0) { + if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0) { if (mergeRegisters == null) { mergeRegisters = new BitSet(registerCount); addMergeRegs(mergeRegisters, registerCount); diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java index bffcb385..3d72f468 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java @@ -28,7 +28,7 @@ package org.jf.baksmali.Adaptors; -import org.jf.baksmali.baksmaliOptions; +import org.jf.baksmali.BaksmaliOptions; import org.jf.util.IndentingWriter; import javax.annotation.Nonnull; @@ -38,11 +38,11 @@ import java.io.IOException; * This class contains the logic used for formatting registers */ public class RegisterFormatter { - @Nonnull public final baksmaliOptions options; + @Nonnull public final BaksmaliOptions options; public final int registerCount; public final int parameterRegisterCount; - public RegisterFormatter(@Nonnull baksmaliOptions options, int registerCount, int parameterRegisterCount) { + public RegisterFormatter(@Nonnull BaksmaliOptions options, int registerCount, int parameterRegisterCount) { this.options = options; this.registerCount = registerCount; this.parameterRegisterCount = parameterRegisterCount; @@ -58,7 +58,7 @@ public class RegisterFormatter { * @param lastRegister the last register in the range */ public void writeRegisterRange(IndentingWriter writer, int startRegister, int lastRegister) throws IOException { - if (!options.noParameterRegisters) { + if (options.parameterRegisters) { assert startRegister <= lastRegister; if (startRegister >= registerCount - parameterRegisterCount) { @@ -86,7 +86,7 @@ public class RegisterFormatter { * @param register the register number */ public void writeTo(IndentingWriter writer, int register) throws IOException { - if (!options.noParameterRegisters) { + if (options.parameterRegisters) { if (register >= registerCount - parameterRegisterCount) { writer.write('p'); writer.printSignedIntAsDec((register - (registerCount - parameterRegisterCount))); diff --git a/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java new file mode 100644 index 00000000..20bc45be --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java @@ -0,0 +1,143 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.Parameter; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import org.jf.dexlib2.analysis.ClassPath; +import org.jf.dexlib2.analysis.ClassPathResolver; +import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; +import org.jf.dexlib2.iface.DexFile; +import org.jf.util.jcommander.ColonParameterSplitter; +import org.jf.util.jcommander.ExtendedParameter; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.util.List; + +import static org.jf.dexlib2.analysis.ClassPath.NOT_ART; + +public class AnalysisArguments { + @Parameter(names = {"-b", "--bootclasspath", "--bcp"}, + description = "A colon separated list of the files to include in the bootclasspath when analyzing the " + + "dex file. If not specified, baksmali will attempt to choose an " + + "appropriate default. When analyzing oat files, this can simply be the path to the device's " + + "boot.oat file. A single empty string can be used to specify that an empty bootclasspath should " + + "be used. (e.g. --bootclasspath \"\") See baksmali help classpath for more information.", + splitter = ColonParameterSplitter.class) + @ExtendedParameter(argumentNames = "classpath") + public List<String> bootClassPath = null; + + @Parameter(names = {"-c", "--classpath", "--cp"}, + description = "A colon separated list of additional files to include in the classpath when analyzing the " + + "dex file. These will be added to the classpath after any bootclasspath entries.", + splitter = ColonParameterSplitter.class) + @ExtendedParameter(argumentNames = "classpath") + public List<String> classPath = Lists.newArrayList(); + + @Parameter(names = {"-d", "--classpath-dir", "--cpd", "--dir"}, + description = "A directory to search for classpath files. This option can be used multiple times to " + + "specify multiple directories to search. They will be searched in the order they are provided.") + @ExtendedParameter(argumentNames = "dir") + public List<String> classPathDirectories = null; + + public static class CheckPackagePrivateArgument { + @Parameter(names = {"--check-package-private-access", "--package-private", "--checkpp", "--pp"}, + description = "Use the package-private access check when calculating vtable indexes. This is enabled " + + "by default for oat files. For odex files, this is only needed for odexes from 4.2.0. It " + + "was reverted in 4.2.1.") + public boolean checkPackagePrivateAccess = false; + } + + @Nonnull + public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir, @Nonnull DexFile dexFile, + boolean checkPackagePrivateAccess) throws IOException { + return loadClassPathForDexFile(dexFileDir, dexFile, checkPackagePrivateAccess, NOT_ART); + } + + @Nonnull + public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir, @Nonnull DexFile dexFile, + boolean checkPackagePrivateAccess, int oatVersion) + throws IOException { + ClassPathResolver resolver; + + // By default, oatVersion should be NOT_ART, and we'll automatically set it if dexFile is an oat file. In some + // cases the caller may choose to override the oat version, in which case we should use the given oat version + // regardless of the actual version of the oat file + if (oatVersion == NOT_ART) { + if (dexFile instanceof OatDexFile) { + checkPackagePrivateAccess = true; + oatVersion = ((OatDexFile)dexFile).getContainer().getOatVersion(); + } + } else { + // this should always be true for ART + checkPackagePrivateAccess = true; + } + + if (classPathDirectories == null || classPathDirectories.size() == 0) { + classPathDirectories = Lists.newArrayList(dexFileDir.getPath()); + } + + List<String> filteredClassPathDirectories = Lists.newArrayList(); + if (classPathDirectories != null) { + for (String dir: classPathDirectories) { + File file = new File(dir); + if (!file.exists()) { + System.err.println(String.format("Warning: directory %s does not exist. Ignoring.", dir)); + } else if (!file.isDirectory()) { + System.err.println(String.format("Warning: %s is not a directory. Ignoring.", dir)); + } else { + filteredClassPathDirectories.add(dir); + } + } + } + + if (bootClassPath == null) { + // TODO: we should be able to get the api from the Opcodes object associated with the dexFile.. + // except that the oat version -> api mapping doesn't fully work yet + resolver = new ClassPathResolver(filteredClassPathDirectories, classPath, dexFile); + } else if (bootClassPath.size() == 1 && bootClassPath.get(0).length() == 0) { + // --bootclasspath "" is a special case, denoting that no bootclasspath should be used + resolver = new ClassPathResolver( + ImmutableList.<String>of(), ImmutableList.<String>of(), classPath, dexFile); + } else { + resolver = new ClassPathResolver(filteredClassPathDirectories, bootClassPath, classPath, dexFile); + } + + if (oatVersion == 0 && dexFile instanceof OatDexFile) { + oatVersion = ((OatDexFile)dexFile).getContainer().getOatVersion(); + } + return new ClassPath(resolver.getResolvedClassProviders(), checkPackagePrivateAccess, oatVersion); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java index 50607340..1c0231b5 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java +++ b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java @@ -28,105 +28,28 @@ package org.jf.baksmali; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import org.jf.baksmali.Adaptors.ClassDefinition; -import org.jf.dexlib2.analysis.ClassPath; -import org.jf.dexlib2.analysis.CustomInlineMethodResolver; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.DexFile; -import org.jf.dexlib2.util.SyntheticAccessorResolver; import org.jf.util.ClassFileNameHandler; import org.jf.util.IndentingWriter; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; +import javax.annotation.Nullable; import java.io.*; +import java.util.HashSet; import java.util.List; -import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.*; -public class baksmali { - - public static boolean disassembleDexFile(DexFile dexFile, final baksmaliOptions options) { - if (options.registerInfo != 0 || options.deodex || options.normalizeVirtualMethods) { - try { - Iterable<String> extraClassPathEntries; - if (options.extraClassPathEntries != null) { - extraClassPathEntries = options.extraClassPathEntries; - } else { - extraClassPathEntries = ImmutableList.of(); - } - - options.classPath = ClassPath.fromClassPath(options.bootClassPathDirs, - Iterables.concat(options.bootClassPathEntries, extraClassPathEntries), dexFile, - options.apiLevel, options.checkPackagePrivateAccess, options.experimental); - - if (options.customInlineDefinitions != null) { - options.inlineResolver = new CustomInlineMethodResolver(options.classPath, - options.customInlineDefinitions); - } - } catch (Exception ex) { - System.err.println("\n\nError occurred while loading boot class path files. Aborting."); - ex.printStackTrace(System.err); - return false; - } - } - - if (options.resourceIdFileEntries != null) { - class PublicHandler extends DefaultHandler { - String prefix = null; - public PublicHandler(String prefix) { - super(); - this.prefix = prefix; - } - - public void startElement(String uri, String localName, - String qName, Attributes attr) throws SAXException { - if (qName.equals("public")) { - String type = attr.getValue("type"); - String name = attr.getValue("name").replace('.', '_'); - Integer public_key = Integer.decode(attr.getValue("id")); - String public_val = new StringBuffer() - .append(prefix) - .append(".") - .append(type) - .append(".") - .append(name) - .toString(); - options.resourceIds.put(public_key, public_val); - } - } - }; - - for (Entry<String,String> entry: options.resourceIdFileEntries.entrySet()) { - try { - SAXParser saxp = SAXParserFactory.newInstance().newSAXParser(); - String prefix = entry.getValue(); - saxp.parse(entry.getKey(), new PublicHandler(prefix)); - } catch (ParserConfigurationException e) { - continue; - } catch (SAXException e) { - continue; - } catch (IOException e) { - continue; - } - } - } +public class Baksmali { + public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options) { + return disassembleDexFile(dexFile, outputDir, jobs, options, null); + } - File outputDirectoryFile = new File(options.outputDirectory); - if (!outputDirectoryFile.exists()) { - if (!outputDirectoryFile.mkdirs()) { - System.err.println("Can't create the output directory " + options.outputDirectory); - return false; - } - } + public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options, + @Nullable List<String> classes) { //sort the classes, so that if we're on a case-insensitive file system and need to handle classes with file //name collisions, then we'll use the same name for each class, if the dex file goes through multiple @@ -134,16 +57,20 @@ public class baksmali { //may still change of course List<? extends ClassDef> classDefs = Ordering.natural().sortedCopy(dexFile.getClasses()); - if (!options.noAccessorComments) { - options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(), classDefs); - } - - final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDirectoryFile, ".smali"); + final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDir, ".smali"); - ExecutorService executor = Executors.newFixedThreadPool(options.jobs); + ExecutorService executor = Executors.newFixedThreadPool(jobs); List<Future<Boolean>> tasks = Lists.newArrayList(); + Set<String> classSet = null; + if (classes != null) { + classSet = new HashSet<String>(classes); + } + for (final ClassDef classDef: classDefs) { + if (classSet != null && !classSet.contains(classDef.getType())) { + continue; + } tasks.add(executor.submit(new Callable<Boolean>() { @Override public Boolean call() throws Exception { return disassembleClass(classDef, fileNameHandler, options); @@ -174,7 +101,7 @@ public class baksmali { } private static boolean disassembleClass(ClassDef classDef, ClassFileNameHandler fileNameHandler, - baksmaliOptions options) { + BaksmaliOptions options) { /** * The path for the disassembly file is based on the package name * The class descriptor will look something like: diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java index 32685ddf..7ad51243 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java +++ b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java @@ -31,19 +31,35 @@ package org.jf.baksmali; -import com.google.common.collect.Lists; import org.jf.dexlib2.analysis.ClassPath; import org.jf.dexlib2.analysis.InlineMethodResolver; import org.jf.dexlib2.util.SyntheticAccessorResolver; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; -import javax.annotation.Nullable; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; import java.io.File; -import java.util.Arrays; +import java.io.IOException; import java.util.HashMap; -import java.util.List; import java.util.Map; -public class baksmaliOptions { +public class BaksmaliOptions { + public int apiLevel = 15; + + public boolean parameterRegisters = true; + public boolean localsDirective = false; + public boolean sequentialLabels = false; + public boolean debugInfo = true; + public boolean codeOffsets = false; + public boolean accessorComments = true; + public boolean allowOdex = false; + public boolean deodex = false; + public boolean implicitReferences = false; + public boolean normalizeVirtualMethods = false; + // register info values public static final int ALL = 1; public static final int ALLPRE = 2; @@ -53,56 +69,40 @@ public class baksmaliOptions { public static final int MERGE = 32; public static final int FULLMERGE = 64; - public int apiLevel = 15; - public String outputDirectory = "out"; - @Nullable public String dexEntry = null; - public List<String> bootClassPathDirs = Lists.newArrayList(); - - public List<String> bootClassPathEntries = Lists.newArrayList(); - public List<String> extraClassPathEntries = Lists.newArrayList(); + public int registerInfo = 0; - public Map<String,String> resourceIdFileEntries = new HashMap<String,String>(); public Map<Integer,String> resourceIds = new HashMap<Integer,String>(); - - public boolean noParameterRegisters = false; - public boolean useLocalsDirective = false; - public boolean useSequentialLabels = false; - public boolean outputDebugInfo = true; - public boolean addCodeOffsets = false; - public boolean noAccessorComments = false; - public boolean allowOdex = false; - public boolean deodex = false; - public boolean experimental = false; - public boolean ignoreErrors = false; - public boolean checkPackagePrivateAccess = false; - public boolean useImplicitReferences = false; - public boolean normalizeVirtualMethods = false; - public File customInlineDefinitions = null; public InlineMethodResolver inlineResolver = null; - public int registerInfo = 0; public ClassPath classPath = null; - public int jobs = Runtime.getRuntime().availableProcessors(); - public boolean disassemble = true; - public boolean dump = false; - public String dumpFileName = null; - public SyntheticAccessorResolver syntheticAccessorResolver = null; - public void setBootClassPath(String bootClassPath) { - bootClassPathEntries = Lists.newArrayList(bootClassPath.split(":")); - } - - public void addExtraClassPath(String extraClassPath) { - if (extraClassPath.startsWith(":")) { - extraClassPath = extraClassPath.substring(1); - } - extraClassPathEntries.addAll(Arrays.asList(extraClassPath.split(":"))); - } - - public void setResourceIdFiles(String resourceIdFiles) { - for (String resourceIdFile: resourceIdFiles.split(":")) { - String[] entry = resourceIdFile.split("="); - resourceIdFileEntries.put(entry[1], entry[0]); + /** + * Load the resource ids from a set of public.xml files. + * + * @param resourceFiles A map of resource prefixes -> public.xml files + */ + public void loadResourceIds(Map<String, File> resourceFiles) throws SAXException, IOException { + for (Map.Entry<String, File> entry: resourceFiles.entrySet()) { + try { + SAXParser saxp = SAXParserFactory.newInstance().newSAXParser(); + final String prefix = entry.getKey(); + saxp.parse(entry.getValue(), new DefaultHandler() { + @Override + public void startElement(String uri, String localName, String qName, + Attributes attr) throws SAXException { + if (qName.equals("public")) { + String resourceType = attr.getValue("type"); + String resourceName = attr.getValue("name").replace('.', '_'); + Integer resourceId = Integer.decode(attr.getValue("id")); + String qualifiedResourceName = + String.format("%s.%s.%s", prefix, resourceType, resourceName); + resourceIds.put(resourceId, qualifiedResourceName); + } + } + }); + } catch (ParserConfigurationException ex) { + throw new RuntimeException(ex); + } } } } diff --git a/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java new file mode 100644 index 00000000..3ded479f --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java @@ -0,0 +1,109 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument; +import org.jf.dexlib2.analysis.CustomInlineMethodResolver; +import org.jf.dexlib2.analysis.InlineMethodResolver; +import org.jf.dexlib2.dexbacked.DexBackedOdexFile; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.util.List; + +@Parameters(commandDescription = "Deodexes an odex/oat file") +@ExtendedParameters( + commandName = "deodex", + commandAliases = { "de", "x" }) +public class DeodexCommand extends DisassembleCommand { + + @ParametersDelegate + protected CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument(); + + @Parameter(names = {"--inline-table", "--inline", "--it"}, + description = "Specify a file containing a custom inline method table to use. See the " + + "\"deodexerant\" tool in the smali github repository to dump the inline method table from a " + + "device that uses dalvik.") + @ExtendedParameter(argumentNames = "file") + private String inlineTable; + + public DeodexCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override protected BaksmaliOptions getOptions() { + BaksmaliOptions options = super.getOptions(); + + options.deodex = true; + + if (dexFile instanceof DexBackedOdexFile) { + if (inlineTable == null) { + options.inlineResolver = InlineMethodResolver.createInlineMethodResolver( + ((DexBackedOdexFile)dexFile).getOdexVersion()); + } else { + File inlineTableFile = new File(inlineTable); + if (!inlineTableFile.exists()) { + System.err.println(String.format("Could not find file: %s", inlineTable)); + System.exit(-1); + } + try { + options.inlineResolver = new CustomInlineMethodResolver(options.classPath, inlineTableFile); + } catch (IOException ex) { + System.err.println(String.format("Error while reading file: %s", inlineTableFile)); + ex.printStackTrace(System.err); + System.exit(-1); + } + } + } + + return options; + } + + @Override protected boolean shouldCheckPackagePrivateAccess() { + return checkPackagePrivateArgument.checkPackagePrivateAccess; + } + + @Override protected boolean needsClassPath() { + return true; + } + + @Override protected boolean showDeodexWarning() { + return false; + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java new file mode 100644 index 00000000..c7660cbe --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java @@ -0,0 +1,150 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedParameter; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.util.List; + +/** + * This class implements common functionality for commands that need to load a dex file based on + * command line input + */ +public abstract class DexInputCommand extends Command { + + @Parameter(names = {"-a", "--api"}, + description = "The numeric api level of the file being disassembled.") + @ExtendedParameter(argumentNames = "api") + public int apiLevel = 15; + + @Parameter(description = "A dex/apk/oat/odex file. For apk or oat files that contain multiple dex " + + "files, you can specify the specific entry to use as if the apk/oat file was a directory. " + + "e.g. \"app.apk/classes2.dex\". For more information, see \"baksmali help input\".") + @ExtendedParameter(argumentNames = "file") + protected List<String> inputList = Lists.newArrayList(); + + protected File inputFile; + protected String inputEntry; + protected DexBackedDexFile dexFile; + + public DexInputCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + /** + * Parses a dex file input from the user and loads the given dex file. + * + * In some cases, the input file can contain multiple dex files. If this is the case, you can refer to a specific + * dex file with a slash, followed by the entry name, optionally in quotes. + * + * If the entry name is enclosed in quotes, then it will strip the first and last quote and look for an entry with + * exactly that name. Otherwise, it will perform a partial filename match against the entry to find any candidates. + * If there is a single matching candidate, it will be used. Otherwise, an error will be generated. + * + * For example, to refer to the "/system/framework/framework.jar:classes2.dex" entry within the + * "framework/arm/framework.oat" oat file, you could use any of: + * + * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex" + * framework/arm/framework.oat/system/framework/framework.jar:classes2.dex + * framework/arm/framework.oat/framework/framework.jar:classes2.dex + * framework/arm/framework.oat/framework.jar:classes2.dex + * framework/arm/framework.oat/classes2.dex + * + * The last option is the easiest, but only works if the oat file doesn't contain another entry with the + * "classes2.dex" name. e.g. "/system/framework/blah.jar:classes2.dex" + * + * It's technically possible (although unlikely) for an oat file to contain 2 entries like: + * /system/framework/framework.jar:classes2.dex + * system/framework/framework.jar:classes2.dex + * + * In this case, the "framework/arm/framework.oat/system/framework/framework.jar:classes2.dex" syntax will generate + * an error because both entries match the partial entry name. Instead, you could use the following for the + * first and second entry respectively: + * + * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex" + * framework/arm/framework.oat/"system/framework/framework.jar:classes2.dex" + * + * @param input The name of a dex, apk, odex or oat file/entry. + */ + protected void loadDexFile(@Nonnull String input) { + File file = new File(input); + + while (file != null && !file.exists()) { + file = file.getParentFile(); + } + + if (file == null || !file.exists() || file.isDirectory()) { + System.err.println("Can't find file: " + input); + System.exit(1); + } + + inputFile = file; + + String dexEntry = null; + if (file.getPath().length() < input.length()) { + dexEntry = input.substring(file.getPath().length() + 1); + } + + if (!Strings.isNullOrEmpty(dexEntry)) { + boolean exactMatch = false; + if (dexEntry.length() > 2 && dexEntry.charAt(0) == '"' && dexEntry.charAt(dexEntry.length() - 1) == '"') { + dexEntry = dexEntry.substring(1, dexEntry.length() - 1); + exactMatch = true; + } + + inputEntry = dexEntry; + + try { + dexFile = DexFileFactory.loadDexEntry(file, dexEntry, exactMatch, Opcodes.forApi(apiLevel)); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } else { + try { + dexFile = DexFileFactory.loadDexFile(file, Opcodes.forApi(apiLevel)); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java new file mode 100644 index 00000000..2e3eb79e --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java @@ -0,0 +1,287 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import com.beust.jcommander.validators.PositiveInteger; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.jf.dexlib2.util.SyntheticAccessorResolver; +import org.jf.util.StringWrapper; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; +import org.xml.sax.SAXException; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@Parameters(commandDescription = "Disassembles a dex file.") +@ExtendedParameters( + commandName = "disassemble", + commandAliases = { "dis", "d" }) +public class DisassembleCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information for this command.") + private boolean help; + + @ParametersDelegate + protected AnalysisArguments analysisArguments = new AnalysisArguments(); + + @Parameter(names = {"--debug-info", "--di"}, arity = 1, + description = "Whether to include debug information in the output (.local, .param, .line, etc.). True " + + "by default, use --debug-info=false to disable.") + @ExtendedParameter(argumentNames = "boolean") + private boolean debugInfo = true; + + @Parameter(names = {"--code-offsets", "--offsets", "--off"}, + description = "Add a comment before each instruction with it's code offset within the method.") + private boolean codeOffsets = false; + + @Parameter(names = {"--resolve-resources", "--rr"}, arity = 2, + description = "This will attempt to find any resource id references within the bytecode and add a " + + "comment with the name of the resource being referenced. The parameter accepts 2 values:" + + "an arbitrary resource prefix and the path to a public.xml file. For example: " + + "--resolve-resources android.R framework/res/values/public.xml. This option can be specified " + + "multiple times to provide resources from multiple packages.") + @ExtendedParameter(argumentNames = {"resource prefix", "public.xml file"}) + private List<String> resourceIdFiles = Lists.newArrayList(); + + @Parameter(names = {"-j", "--jobs"}, + description = "The number of threads to use. Defaults to the number of cores available.", + validateWith = PositiveInteger.class) + @ExtendedParameter(argumentNames = "n") + private int jobs = Runtime.getRuntime().availableProcessors(); + + @Parameter(names = {"-l", "--use-locals"}, + description = "When disassembling, output the .locals directive with the number of non-parameter " + + "registers instead of the .registers directive with the total number of registers.") + private boolean localsDirective = false; + + @Parameter(names = {"--accessor-comments", "--ac"}, arity = 1, + description = "Generate helper comments for synthetic accessors. True by default, use " + + "--accessor-comments=false to disable.") + @ExtendedParameter(argumentNames = "boolean") + private boolean accessorComments = true; + + @Parameter(names = {"--normalize-virtual-methods", "--norm", "--nvm"}, + description = "Normalize virtual method references to use the base class where the method is " + + "originally declared.") + private boolean normalizeVirtualMethods = false; + + @Parameter(names = {"-o", "--output"}, + description = "The directory to write the disassembled files to.") + @ExtendedParameter(argumentNames = "dir") + private String outputDir = "out"; + + @Parameter(names = {"--parameter-registers", "--preg", "--pr"}, arity = 1, + description = "Use the pNN syntax for registers that refer to a method parameter on method entry. True " + + "by default, use --parameter-registers=false to disable.") + @ExtendedParameter(argumentNames = "boolean") + private boolean parameterRegisters = true; + + @Parameter(names = {"-r", "--register-info"}, + description = "Add comments before/after each instruction with information about register types. " + + "The value is a comma-separated list of any of ALL, ALLPRE, ALLPOST, ARGS, DEST, MERGE and " + + "FULLMERGE. See \"baksmali help register-info\" for more information.") + @ExtendedParameter(argumentNames = "register info specifier") + private List<String> registerInfoTypes = Lists.newArrayList(); + + @Parameter(names = {"--sequential-labels", "--seq", "--sl"}, + description = "Create label names using a sequential numbering scheme per label type, rather than " + + "using the bytecode address.") + private boolean sequentialLabels = false; + + @Parameter(names = {"--implicit-references", "--implicit", "--ir"}, + description = "Use implicit method and field references (without the class name) for methods and " + + "fields from the current class.") + private boolean implicitReferences = false; + + @Parameter(names = "--classes", + description = "A comma separated list of classes. Only disassemble these classes") + @ExtendedParameter(argumentNames = "classes") + private List<String> classes = null; + + public DisassembleCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + if (showDeodexWarning() && dexFile.hasOdexOpcodes()) { + StringWrapper.printWrappedString(System.err, + "Warning: You are disassembling an odex/oat file without deodexing it. You won't be able to " + + "re-assemble the results unless you deodex it. See \"baksmali help deodex\""); + } + + File outputDirectoryFile = new File(outputDir); + if (!outputDirectoryFile.exists()) { + if (!outputDirectoryFile.mkdirs()) { + System.err.println("Can't create the output directory " + outputDir); + System.exit(-1); + } + } + + if (analysisArguments.classPathDirectories == null || analysisArguments.classPathDirectories.isEmpty()) { + analysisArguments.classPathDirectories = Lists.newArrayList(inputFile.getAbsoluteFile().getParent()); + } + + if (!Baksmali.disassembleDexFile(dexFile, outputDirectoryFile, jobs, getOptions(), classes)) { + System.exit(-1); + } + } + + protected boolean needsClassPath() { + return !registerInfoTypes.isEmpty() || normalizeVirtualMethods; + } + + protected boolean shouldCheckPackagePrivateAccess() { + return false; + } + + protected boolean showDeodexWarning() { + return true; + } + + protected BaksmaliOptions getOptions() { + if (dexFile == null) { + throw new IllegalStateException("You must call loadDexFile first"); + } + + final BaksmaliOptions options = new BaksmaliOptions(); + + if (needsClassPath()) { + try { + options.classPath = analysisArguments.loadClassPathForDexFile( + inputFile.getAbsoluteFile().getParentFile(), dexFile, shouldCheckPackagePrivateAccess()); + } catch (Exception ex) { + System.err.println("\n\nError occurred while loading class path files. Aborting."); + ex.printStackTrace(System.err); + System.exit(-1); + } + } + + if (!resourceIdFiles.isEmpty()) { + Map<String, File> resourceFiles = Maps.newHashMap(); + + assert (resourceIdFiles.size() % 2) == 0; + for (int i=0; i<resourceIdFiles.size(); i+=2) { + String resourcePrefix = resourceIdFiles.get(i); + String publicXml = resourceIdFiles.get(i+1); + + File publicXmlFile = new File(publicXml); + + if (!publicXmlFile.exists()) { + System.err.println(String.format("Can't find file: %s", publicXmlFile)); + System.exit(-1); + } + + resourceFiles.put(resourcePrefix, publicXmlFile); + } + + try { + options.loadResourceIds(resourceFiles); + } catch (IOException ex) { + System.err.println("Error while loading resource files:"); + ex.printStackTrace(System.err); + System.exit(-1); + } catch (SAXException ex) { + System.err.println("Error while loading resource files:"); + ex.printStackTrace(System.err); + System.exit(-1); + } + } + + options.parameterRegisters = parameterRegisters; + options.localsDirective = localsDirective; + options.sequentialLabels = sequentialLabels; + options.debugInfo = debugInfo; + options.codeOffsets = codeOffsets; + options.accessorComments = accessorComments; + options.implicitReferences = implicitReferences; + options.normalizeVirtualMethods = normalizeVirtualMethods; + + options.registerInfo = 0; + + for (String registerInfoType: registerInfoTypes) { + if (registerInfoType.equalsIgnoreCase("ALL")) { + options.registerInfo |= BaksmaliOptions.ALL; + } else if (registerInfoType.equalsIgnoreCase("ALLPRE")) { + options.registerInfo |= BaksmaliOptions.ALLPRE; + } else if (registerInfoType.equalsIgnoreCase("ALLPOST")) { + options.registerInfo |= BaksmaliOptions.ALLPOST; + } else if (registerInfoType.equalsIgnoreCase("ARGS")) { + options.registerInfo |= BaksmaliOptions.ARGS; + } else if (registerInfoType.equalsIgnoreCase("DEST")) { + options.registerInfo |= BaksmaliOptions.DEST; + } else if (registerInfoType.equalsIgnoreCase("MERGE")) { + options.registerInfo |= BaksmaliOptions.MERGE; + } else if (registerInfoType.equalsIgnoreCase("FULLMERGE")) { + options.registerInfo |= BaksmaliOptions.FULLMERGE; + } else { + System.err.println(String.format("Invalid register info type: %s", registerInfoType)); + usage(); + System.exit(-1); + } + + if ((options.registerInfo & BaksmaliOptions.FULLMERGE) != 0) { + options.registerInfo &= ~BaksmaliOptions.MERGE; + } + } + + if (accessorComments) { + options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(), + dexFile.getClasses()); + } + + return options; + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java new file mode 100644 index 00000000..433be125 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java @@ -0,0 +1,106 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.raw.RawDexFile; +import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; +import org.jf.util.ConsoleUtil; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.*; +import java.util.List; + +@Parameters(commandDescription = "Prints an annotated hex dump for the given dex file") +@ExtendedParameters( + commandName = "dump", + commandAliases = "du") +public class DumpCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information for this command.") + private boolean help; + + public DumpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + try { + dump(dexFile, System.out); + } catch (IOException ex) { + System.err.println("There was an error while dumping the dex file"); + ex.printStackTrace(System.err); + } + } + + /** + * Writes an annotated hex dump of the given dex file to output. + * + * @param dexFile The dex file to dump + * @param output An OutputStream to write the annotated hex dump to. The caller is responsible for closing this + * when needed. + * + * @throws IOException + */ + public static void dump(@Nonnull DexBackedDexFile dexFile, @Nonnull OutputStream output) + throws IOException { + Writer writer = new BufferedWriter(new OutputStreamWriter(output)); + + int consoleWidth = ConsoleUtil.getConsoleWidth(); + if (consoleWidth <= 0) { + consoleWidth = 120; + } + + RawDexFile rawDexFile = new RawDexFile(dexFile.getOpcodes(), dexFile); + DexAnnotator annotator = new DexAnnotator(rawDexFile, consoleWidth); + annotator.writeAnnotations(writer); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java new file mode 100644 index 00000000..149ac63d --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java @@ -0,0 +1,204 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.google.common.collect.Lists; +import org.jf.util.ConsoleUtil; +import org.jf.util.StringWrapper; +import org.jf.util.jcommander.*; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Shows usage information") +@ExtendedParameters( + commandName = "help", + commandAliases = "h") +public class HelpCommand extends Command { + + public HelpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Parameter(description = "If specified, show the detailed usage information for the given commands") + @ExtendedParameter(argumentNames = "commands") + private List<String> commands = Lists.newArrayList(); + + public void run() { + JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1); + + if (commands == null || commands.isEmpty()) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } else { + boolean printedHelp = false; + for (String cmd : commands) { + if (cmd.equals("register-info")) { + printedHelp = true; + String registerInfoHelp = "The --register-info parameter will cause baksmali to generate " + + "comments before and after every instruction containing register type " + + "information about some subset of registers. This parameter accepts a comma-separated list" + + "of values specifying which registers and how much information to include.\n" + + " ALL: all pre- and post-instruction registers\n" + + " ALLPRE: all pre-instruction registers\n" + + " ALLPOST: all post-instruction registers\n" + + " ARGS: any pre-instruction registers used as arguments to the instruction\n" + + " DEST: the post-instruction register used as the output of the instruction\n" + + " MERGE: any pre-instruction register that has been merged from multiple " + + "incoming code paths\n" + + " FULLMERGE: an extended version of MERGE that also includes a list of all " + + "the register types from incoming code paths that were merged"; + + Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp, + ConsoleUtil.getConsoleWidth()); + for (String line : lines) { + System.out.println(line); + } + } else if (cmd.equals("input")) { + printedHelp = true; + String registerInfoHelp = "Apks and oat files can contain multiple dex files. In order to " + + "specify a particular dex file, the basic syntax is to treat the apk/oat file as a " + + "directory. For example, to load the \"classes2.dex\" entry from \"app.apk\", you can " + + "use \"app.apk/classes2.dex\".\n" + + "\n" + + "For ease of use, you can also specify a partial path to the dex file to load. For " + + "example, to load a entry named \"/system/framework/framework.jar:classes2.dex\" from " + + "\"framework.oat\", you can use any of the following:\n" + + "\"framework.oat/classes2.dex\"\n" + + "\"framework.oat/framework.jar:classes2.dex\"\n" + + "\"framework.oat/framework/framework.jar:classes2.dex\"\n" + + "\"framework.oat/system/framework/framework.jar:classes2.dex\"\n" + + "\n" + + "In some rare cases, an oat file could have entries that can't be differentiated with " + + "the above syntax. For example \"/blah/blah.dex\" and \"blah/blah.dex\". In this case, " + + "the \"blah.oat/blah/blah.dex\" would match both entries and generate an error. To get " + + "around this, you can add double quotes around the entry name to specify an exact entry " + + "name. E.g. blah.oat/\"/blah/blah.dex\" or blah.oat/\"blah/blah.dex\" respectively."; + + Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp, + ConsoleUtil.getConsoleWidth()); + for (String line : lines) { + System.out.println(line); + } + } else if (cmd.equals("classpath")) { + printedHelp = true; + String registerInfoHelp = "When deodexing odex/oat files or when using the --register-info " + + "option, baksmali needs to load all classes from the framework files on the device " + + "in order to fully understand the class hierarchy. There are several options that " + + "control how baksmali finds and loads the classpath entries.\n" + + "\n"+ + "L+ devices (ART):\n" + + "When deodexing or disassembling a file from an L+ device using ART, you generally " + + "just need to specify the path to the boot.oat file via the --bootclasspath/-b " + + "parameter. On pre-N devices, the boot.oat file is self-contained and no other files are " + + "needed. In N, boot.oat was split into multiple files. In this case, the other " + + "files should be in the same directory as the boot.oat file, but you still only need to " + + "specify the boot.oat file in the --bootclasspath/-b option. The other files will be " + + "automatically loaded from the same directory.\n" + + "\n" + + "Pre-L devices (dalvik):\n" + + "When deodexing odex files from a pre-L device using dalvik, you " + + "generally just need to specify the path to a directory containing the framework files " + + "from the device via the --classpath-dir/-d option. odex files contain a list of " + + "framework files they depend on and baksmali will search for these dependencies in the " + + "directory that you specify.\n" + + "\n" + + "Dex files don't contain a list of dependencies like odex files, so when disassembling a " + + "dex file using the --register-info option, and using the framework files from a " + + "pre-L device, baksmali will attempt to use a reasonable default list of classpath files " + + "based on the api level set via the -a option. If this default list is incorrect, you " + + "can override the classpath using the --bootclasspath/-b option. This option accepts a " + + "colon separated list of classpath entries. Each entry can be specified in a few " + + "different ways.\n" + + " - A simple filename like \"framework.jar\"\n" + + " - A device path like \"/system/framework/framework.jar\"\n" + + " - A local relative or absolute path like \"/tmp/framework/framework.jar\"\n" + + "When using the first or second formats, you should also specify the directory " + + "containing the framework files via the --classpath-dir/-d option. When using the third " + + "format, this option is not needed.\n" + + "It's worth noting that the second format matches the format used by Android for the " + + "BOOTCLASSPATH environment variable, so you can simply grab the value of that variable " + + "from the device and use it as-is.\n" + + "\n" + + "Examples:\n" + + " For an M device:\n" + + " adb pull /system/framework/arm/boot.oat /tmp/boot.oat\n" + + " baksmali deodex blah.oat -b /tmp/boot.oat\n" + + " For an N+ device:\n" + + " adb pull /system/framework/arm /tmp/framework\n" + + " baksmali deodex blah.oat -b /tmp/framework/boot.oat\n" + + " For a pre-L device:\n" + + " adb pull /system/framework /tmp/framework\n" + + " baksmali deodex blah.odex -d /tmp/framework\n" + + " Using the BOOTCLASSPATH on a pre-L device:\n" + + " adb pull /system/framework /tmp/framework\n" + + " export BOOTCLASSPATH=`adb shell \"echo \\\\$BOOTCLASPATH\"`\n" + + " baksmali disassemble --register-info ARGS,DEST blah.apk -b $BOOTCLASSPATH -d " + + "/tmp/framework"; + + Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp, + ConsoleUtil.getConsoleWidth()); + for (String line : lines) { + System.out.println(line); + } + } else { + JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd); + if (command == null) { + System.err.println("No such command: " + cmd); + } else { + printedHelp = true; + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(((Command)command.getObjects().get(0)).getCommandHierarchy())); + } + } + } + if (!printedHelp) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } + } + } + + @Parameters(hidden = true) + @ExtendedParameters(commandName = "hlep") + public static class HlepCommand extends HelpCommand { + public HlepCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java new file mode 100644 index 00000000..fb172bdd --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java @@ -0,0 +1,76 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists the classes in a dex file.") +@ExtendedParameters( + commandName = "classes", + commandAliases = { "class", "c" }) +public class ListClassesCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + public ListClassesCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + for (ClassDef classDef: dexFile.getClasses()) { + System.out.println(classDef.getType()); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java new file mode 100644 index 00000000..95476208 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java @@ -0,0 +1,85 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import org.jf.baksmali.ListHelpCommand.ListHlepCommand; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedCommands; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists various objects in a dex file.") +@ExtendedParameters( + commandName = "list", + commandAliases = "l") +public class ListCommand extends Command { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + public ListCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override protected void setupCommand(JCommander jc) { + List<JCommander> hierarchy = getCommandHierarchy(); + + ExtendedCommands.addExtendedCommand(jc, new ListStringsCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListMethodsCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListFieldsCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListTypesCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListClassesCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListDexCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListVtablesCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListFieldOffsetsCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListDependenciesCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListHelpCommand(hierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListHlepCommand(hierarchy)); + } + + @Override public void run() { + JCommander jc = getJCommander(); + if (help || jc.getParsedCommand() == null) { + usage(); + return; + } + + Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0); + command.run(); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java new file mode 100644 index 00000000..636a87c5 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java @@ -0,0 +1,118 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.google.common.collect.Lists; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.DexBackedOdexFile; +import org.jf.dexlib2.dexbacked.OatFile; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.*; +import java.util.List; + +@Parameters(commandDescription = "Lists the stored dependencies in an odex/oat file.") +@ExtendedParameters( + commandName = "dependencies", + commandAliases = { "deps", "dep" }) +public class ListDependenciesCommand extends Command { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + @Parameter(description = "An oat/odex file") + @ExtendedParameter(argumentNames = "file") + private List<String> inputList = Lists.newArrayList(); + + public ListDependenciesCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + InputStream inputStream = null; + try { + inputStream = new BufferedInputStream(new FileInputStream(input)); + } catch (FileNotFoundException ex) { + System.err.println("Could not find file: " + input); + System.exit(-1); + } + + try { + OatFile oatFile = OatFile.fromInputStream(inputStream); + for (String entry: oatFile.getBootClassPath()) { + System.out.println(entry); + } + return; + } catch (OatFile.NotAnOatFileException ex) { + // ignore + } catch (IOException ex) { + throw new RuntimeException(ex); + } + + try { + DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.getDefault(), inputStream); + for (String entry: odexFile.getDependencies()) { + System.out.println(entry); + } + return; + } catch (IOException ex) { + throw new RuntimeException(ex); + } catch (DexBackedOdexFile.NotAnOdexFile ex) { + // handled below + } catch (DexBackedDexFile.NotADexFile ex) { + // handled below + } + + System.err.println(input + " is not an odex or oat file."); + System.exit(-1); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java new file mode 100644 index 00000000..d5862eb1 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java @@ -0,0 +1,102 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.google.common.collect.Lists; +import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.iface.MultiDexContainer; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.IOException; +import java.util.List; + +@Parameters(commandDescription = "Lists the dex files in an apk/oat file.") +@ExtendedParameters( + commandName = "dex", + commandAliases = "d") +public class ListDexCommand extends Command { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + @Parameter(description = "An apk or oat file.") + @ExtendedParameter(argumentNames = "file") + private List<String> inputList = Lists.newArrayList(); + + public ListDexCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + File file = new File(input); + + if (!file.exists()) { + System.err.println(String.format("Could not find the file: %s", input)); + System.exit(-1); + } + + List<String> entries; + try { + MultiDexContainer<? extends DexBackedDexFile> container = + DexFileFactory.loadDexContainer(file, Opcodes.getDefault()); + entries = container.getDexEntryNames(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + + for (String entry: entries) { + System.out.println(entry); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java new file mode 100644 index 00000000..d6dd6e2b --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java @@ -0,0 +1,120 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import org.jf.dexlib2.analysis.ClassProto; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.reference.FieldReference; +import org.jf.util.SparseArray; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.List; + +@Parameters(commandDescription = "Lists the instance field offsets for classes in a dex file.") +@ExtendedParameters( + commandName = "fieldoffsets", + commandAliases = { "fieldoffset", "fo" }) +public class ListFieldOffsetsCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + @ParametersDelegate + private AnalysisArguments analysisArguments = new AnalysisArguments(); + + public ListFieldOffsetsCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + BaksmaliOptions options = getOptions(); + + try { + for (ClassDef classDef: dexFile.getClasses()) { + ClassProto classProto = (ClassProto) options.classPath.getClass(classDef); + SparseArray<FieldReference> fields = classProto.getInstanceFields(); + String className = "Class " + classDef.getType() + " : " + fields.size() + " instance fields\n"; + System.out.write(className.getBytes()); + for (int i=0;i<fields.size();i++) { + String field = fields.keyAt(i) + ":" + fields.valueAt(i).getType() + " " + fields.valueAt(i).getName() + "\n"; + System.out.write(field.getBytes()); + } + System.out.write("\n".getBytes()); + } + System.out.close(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + @Nonnull + private BaksmaliOptions getOptions() { + if (dexFile == null) { + throw new IllegalStateException("You must call loadDexFile first"); + } + + final BaksmaliOptions options = new BaksmaliOptions(); + + options.apiLevel = apiLevel; + + try { + options.classPath = analysisArguments.loadClassPathForDexFile( + inputFile.getAbsoluteFile().getParentFile(), dexFile, false); + } catch (Exception ex) { + System.err.println("Error occurred while loading class path files."); + ex.printStackTrace(System.err); + System.exit(-1); + } + + return options; + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java new file mode 100644 index 00000000..c4d090dd --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.ReferenceType; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists the fields in a dex file's field table.") +@ExtendedParameters( + commandName = "fields", + commandAliases = { "field", "f" }) +public class ListFieldsCommand extends ListReferencesCommand { + public ListFieldsCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors, ReferenceType.FIELD); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java new file mode 100644 index 00000000..2e642861 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java @@ -0,0 +1,92 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.google.common.collect.Iterables; +import org.jf.util.ConsoleUtil; +import org.jf.util.jcommander.*; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Shows usage information") +@ExtendedParameters( + commandName = "help", + commandAliases = "h") +public class ListHelpCommand extends Command { + + @Parameter(description = "If specified, show the detailed usage information for the given commands") + @ExtendedParameter(argumentNames = "commands") + private List<String> commands; + + public ListHelpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + public void run() { + if (commands == null || commands.isEmpty()) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } else { + boolean printedHelp = false; + JCommander parentJc = Iterables.getLast(commandAncestors); + for (String cmd : commands) { + JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd); + if (command == null) { + System.err.println("No such command: " + cmd); + } else { + printedHelp = true; + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(((Command)command.getObjects().get(0)).getCommandHierarchy())); + } + } + if (!printedHelp) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } + } + } + + @Parameters(hidden = true) + @ExtendedParameters(commandName = "hlep") + public static class ListHlepCommand extends ListHelpCommand { + public ListHlepCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java new file mode 100644 index 00000000..603e7647 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.ReferenceType; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists the methods in a dex file's method table.") +@ExtendedParameters( + commandName = "methods", + commandAliases = { "method", "m" }) +public class ListMethodsCommand extends ListReferencesCommand { + public ListMethodsCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors, ReferenceType.METHOD); + } +}
\ No newline at end of file diff --git a/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java new file mode 100644 index 00000000..da9c3e31 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java @@ -0,0 +1,74 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import org.jf.dexlib2.iface.reference.Reference; +import org.jf.dexlib2.util.ReferenceUtil; + +import javax.annotation.Nonnull; +import java.util.List; + +public abstract class ListReferencesCommand extends DexInputCommand { + + private final int referenceType; + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + public ListReferencesCommand(@Nonnull List<JCommander> commandAncestors, int referenceType) { + super(commandAncestors); + this.referenceType = referenceType; + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + for (Reference reference: dexFile.getReferences(referenceType)) { + System.out.println(ReferenceUtil.getReferenceString(reference)); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java new file mode 100644 index 00000000..8694f911 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.ReferenceType; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists the strings in a dex file's string table.") +@ExtendedParameters( + commandName = "strings", + commandAliases = { "string", "str", "s" }) +public class ListStringsCommand extends ListReferencesCommand { + public ListStringsCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors, ReferenceType.STRING); + } +}
\ No newline at end of file diff --git a/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java new file mode 100644 index 00000000..fbff2f29 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java @@ -0,0 +1,50 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameters; +import org.jf.dexlib2.ReferenceType; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Lists the type ids in a dex file's type table.") +@ExtendedParameters( + commandName = "types", + commandAliases = { "type", "t" }) +public class ListTypesCommand extends ListReferencesCommand { + public ListTypesCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors, ReferenceType.TYPE); + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java new file mode 100644 index 00000000..74435b3d --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java @@ -0,0 +1,157 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.ParametersDelegate; +import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument; +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.analysis.ClassProto; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.Method; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.List; + +@Parameters(commandDescription = "Lists the virtual method tables for classes in a dex file.") +@ExtendedParameters( + commandName = "vtables", + commandAliases = { "vtable", "v" }) +public class ListVtablesCommand extends DexInputCommand { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + @ParametersDelegate + private AnalysisArguments analysisArguments = new AnalysisArguments(); + + @ParametersDelegate + private CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument(); + + @Parameter(names = "--classes", + description = "A comma separated list of classes. Only print the vtable for these classes") + @ExtendedParameter(argumentNames = "classes") + private List<String> classes = null; + + @Parameter(names = "--override-oat-version", + description = "Uses a classpath for the given oat version, regardless of the actual oat version. This " + + "can be used, e.g. to list vtables from a dex file, as if they were in an oat file of the given " + + "version.") + private int oatVersion = 0; + + public ListVtablesCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || inputList == null || inputList.isEmpty()) { + usage(); + return; + } + + if (inputList.size() > 1) { + System.err.println("Too many files specified"); + usage(); + return; + } + + String input = inputList.get(0); + loadDexFile(input); + + BaksmaliOptions options = getOptions(); + if (options == null) { + return; + } + + try { + if (classes != null && !classes.isEmpty()) { + for (String cls: classes) { + listClassVtable((ClassProto)options.classPath.getClass(cls)); + } + return; + } + + for (ClassDef classDef : dexFile.getClasses()) { + if (!AccessFlags.INTERFACE.isSet(classDef.getAccessFlags())) { + listClassVtable((ClassProto)options.classPath.getClass(classDef)); + } + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + private void listClassVtable(ClassProto classProto) throws IOException { + List<Method> methods = classProto.getVtable(); + String className = "Class " + classProto.getType() + " extends " + classProto.getSuperclass() + + " : " + methods.size() + " methods\n"; + System.out.write(className.getBytes()); + for (int i = 0; i < methods.size(); i++) { + Method method = methods.get(i); + + String methodString = i + ":" + method.getDefiningClass() + "->" + method.getName() + "("; + for (CharSequence parameter : method.getParameterTypes()) { + methodString += parameter; + } + methodString += ")" + method.getReturnType() + "\n"; + System.out.write(methodString.getBytes()); + } + System.out.write("\n".getBytes()); + } + + protected BaksmaliOptions getOptions() { + if (dexFile == null) { + throw new IllegalStateException("You must call loadDexFile first"); + } + + final BaksmaliOptions options = new BaksmaliOptions(); + + options.apiLevel = apiLevel; + + try { + options.classPath = analysisArguments.loadClassPathForDexFile(inputFile.getAbsoluteFile().getParentFile(), + dexFile, checkPackagePrivateArgument.checkPackagePrivateAccess, oatVersion); + } catch (Exception ex) { + System.err.println("Error occurred while loading class path files."); + ex.printStackTrace(System.err); + return null; + } + + return options; + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/Main.java b/baksmali/src/main/java/org/jf/baksmali/Main.java new file mode 100644 index 00000000..66d9b4f8 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/Main.java @@ -0,0 +1,126 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.baksmali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.google.common.collect.Lists; +import org.jf.baksmali.HelpCommand.HlepCommand; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedCommands; +import org.jf.util.jcommander.ExtendedParameters; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Properties; + +@ExtendedParameters( + includeParametersInUsage = true, + commandName = "baksmali", + postfixDescription = "See baksmali help <command> for more information about a specific command") +public class Main extends Command { + public static final String VERSION = loadVersion(); + + @Parameter(names = {"--help", "-h", "-?"}, help = true, + description = "Show usage information") + private boolean help; + + @Parameter(names = {"--version", "-v"}, help = true, + description = "Print the version of baksmali and then exit") + public boolean version; + + private JCommander jc; + + public Main() { + super(Lists.<JCommander>newArrayList()); + } + + @Override public void run() { + } + + @Override protected JCommander getJCommander() { + return jc; + } + + public static void main(String[] args) { + Main main = new Main(); + + JCommander jc = new JCommander(main); + main.jc = jc; + jc.setProgramName("baksmali"); + List<JCommander> commandHierarchy = main.getCommandHierarchy(); + + ExtendedCommands.addExtendedCommand(jc, new DisassembleCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new DeodexCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new DumpCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new ListCommand(commandHierarchy)); + + jc.parse(args); + + if (main.version) { + version(); + } + + if (jc.getParsedCommand() == null || main.help) { + main.usage(); + return; + } + + Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0); + command.run(); + } + + protected static void version() { + System.out.println("baksmali " + VERSION + " (http://smali.org)"); + System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)"); + System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)"); + System.exit(0); + } + + private static String loadVersion() { + InputStream propertiesStream = Baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties"); + String version = "[unknown version]"; + if (propertiesStream != null) { + Properties properties = new Properties(); + try { + properties.load(propertiesStream); + version = properties.getProperty("application.version"); + } catch (IOException ex) { + // ignore + } + } + return version; + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/dump.java b/baksmali/src/main/java/org/jf/baksmali/dump.java deleted file mode 100644 index 79405e59..00000000 --- a/baksmali/src/main/java/org/jf/baksmali/dump.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2010 Ben Gruver (JesusFreke) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 org.jf.baksmali; - -import org.jf.dexlib2.Opcodes; -import org.jf.dexlib2.dexbacked.DexBackedDexFile; -import org.jf.dexlib2.dexbacked.raw.RawDexFile; -import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator; -import org.jf.util.ConsoleUtil; - -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; - -public class dump { - public static void dump(DexBackedDexFile dexFile, String dumpFileName, int apiLevel) throws IOException { - if (dumpFileName != null) { - Writer writer = null; - - try { - writer = new BufferedWriter(new FileWriter(dumpFileName)); - - int consoleWidth = ConsoleUtil.getConsoleWidth(); - if (consoleWidth <= 0) { - consoleWidth = 120; - } - - RawDexFile rawDexFile = new RawDexFile(Opcodes.forApi(apiLevel), dexFile); - DexAnnotator annotator = new DexAnnotator(rawDexFile, consoleWidth); - annotator.writeAnnotations(writer); - } catch (IOException ex) { - System.err.println("There was an error while dumping the dex file to " + dumpFileName); - ex.printStackTrace(System.err); - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException ex) { - System.err.println("There was an error while closing the dump file " + dumpFileName); - ex.printStackTrace(System.err); - } - } - } - } - } -} diff --git a/baksmali/src/main/java/org/jf/baksmali/main.java b/baksmali/src/main/java/org/jf/baksmali/main.java deleted file mode 100644 index 86f43d82..00000000 --- a/baksmali/src/main/java/org/jf/baksmali/main.java +++ /dev/null @@ -1,626 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2010 Ben Gruver (JesusFreke) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 org.jf.baksmali; - -import com.google.common.collect.Lists; -import org.apache.commons.cli.*; -import org.jf.dexlib2.DexFileFactory; -import org.jf.dexlib2.DexFileFactory.MultipleDexFilesException; -import org.jf.dexlib2.analysis.InlineMethodResolver; -import org.jf.dexlib2.dexbacked.DexBackedDexFile; -import org.jf.dexlib2.dexbacked.DexBackedOdexFile; -import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; -import org.jf.dexlib2.iface.DexFile; -import org.jf.util.ConsoleUtil; -import org.jf.util.SmaliHelpFormatter; - -import javax.annotation.Nonnull; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.Locale; -import java.util.Properties; - -public class main { - - public static final String VERSION; - - private static final Options basicOptions; - private static final Options debugOptions; - private static final Options options; - - static { - options = new Options(); - basicOptions = new Options(); - debugOptions = new Options(); - buildOptions(); - - InputStream templateStream = baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties"); - if (templateStream != null) { - Properties properties = new Properties(); - String version = "(unknown)"; - try { - properties.load(templateStream); - version = properties.getProperty("application.version"); - } catch (IOException ex) { - // ignore - } - VERSION = version; - } else { - VERSION = "[unknown version]"; - } - } - - /** - * This class is uninstantiable. - */ - private main() { - } - - /** - * A more programmatic-friendly entry point for baksmali - * - * @param options a baksmaliOptions object with the options to run baksmali with - * @param inputDexFile The DexFile to disassemble - * @return true if disassembly completed with no errors, or false if errors were encountered - */ - public static boolean run(@Nonnull baksmaliOptions options, @Nonnull DexFile inputDexFile) throws IOException { - if (options.bootClassPathEntries.isEmpty() && - (options.deodex || options.registerInfo != 0 || options.normalizeVirtualMethods)) { - if (inputDexFile instanceof DexBackedOdexFile) { - options.bootClassPathEntries = ((DexBackedOdexFile)inputDexFile).getDependencies(); - } else { - options.bootClassPathEntries = getDefaultBootClassPathForApi(options.apiLevel, - options.experimental); - } - } - - if (options.customInlineDefinitions == null && inputDexFile instanceof DexBackedOdexFile) { - options.inlineResolver = - InlineMethodResolver.createInlineMethodResolver( - ((DexBackedOdexFile)inputDexFile).getOdexVersion()); - } - - boolean errorOccurred = false; - if (options.disassemble) { - errorOccurred = !baksmali.disassembleDexFile(inputDexFile, options); - } - - if (options.dump) { - if (!(inputDexFile instanceof DexBackedDexFile)) { - throw new IllegalArgumentException("Annotated hex-dumps require a DexBackedDexFile"); - } - dump.dump((DexBackedDexFile)inputDexFile, options.dumpFileName, options.apiLevel); - } - - return !errorOccurred; - } - - /** - * Run! - */ - public static void main(String[] args) throws IOException { - Locale locale = new Locale("en", "US"); - Locale.setDefault(locale); - - CommandLineParser parser = new PosixParser(); - CommandLine commandLine; - - try { - commandLine = parser.parse(options, args); - } catch (ParseException ex) { - usage(); - return; - } - - baksmaliOptions options = new baksmaliOptions(); - - String[] remainingArgs = commandLine.getArgs(); - Option[] clOptions = commandLine.getOptions(); - - for (int i=0; i<clOptions.length; i++) { - Option option = clOptions[i]; - String opt = option.getOpt(); - - switch (opt.charAt(0)) { - case 'v': - version(); - return; - case '?': - while (++i < clOptions.length) { - if (clOptions[i].getOpt().charAt(0) == '?') { - usage(true); - return; - } - } - usage(false); - return; - case 'o': - options.outputDirectory = commandLine.getOptionValue("o"); - break; - case 'p': - options.noParameterRegisters = true; - break; - case 'l': - options.useLocalsDirective = true; - break; - case 's': - options.useSequentialLabels = true; - break; - case 'b': - options.outputDebugInfo = false; - break; - case 'd': - options.bootClassPathDirs.add(option.getValue()); - break; - case 'f': - options.addCodeOffsets = true; - break; - case 'r': - String[] values = commandLine.getOptionValues('r'); - int registerInfo = 0; - - if (values == null || values.length == 0) { - registerInfo = baksmaliOptions.ARGS | baksmaliOptions.DEST; - } else { - for (String value: values) { - if (value.equalsIgnoreCase("ALL")) { - registerInfo |= baksmaliOptions.ALL; - } else if (value.equalsIgnoreCase("ALLPRE")) { - registerInfo |= baksmaliOptions.ALLPRE; - } else if (value.equalsIgnoreCase("ALLPOST")) { - registerInfo |= baksmaliOptions.ALLPOST; - } else if (value.equalsIgnoreCase("ARGS")) { - registerInfo |= baksmaliOptions.ARGS; - } else if (value.equalsIgnoreCase("DEST")) { - registerInfo |= baksmaliOptions.DEST; - } else if (value.equalsIgnoreCase("MERGE")) { - registerInfo |= baksmaliOptions.MERGE; - } else if (value.equalsIgnoreCase("FULLMERGE")) { - registerInfo |= baksmaliOptions.FULLMERGE; - } else { - usage(); - return; - } - } - - if ((registerInfo & baksmaliOptions.FULLMERGE) != 0) { - registerInfo &= ~baksmaliOptions.MERGE; - } - } - options.registerInfo = registerInfo; - break; - case 'c': - String bcp = commandLine.getOptionValue("c"); - if (bcp != null && bcp.charAt(0) == ':') { - options.addExtraClassPath(bcp); - } else { - options.setBootClassPath(bcp); - } - break; - case 'x': - options.deodex = true; - break; - case 'X': - options.experimental = true; - break; - case 'm': - options.noAccessorComments = true; - break; - case 'a': - options.apiLevel = Integer.parseInt(commandLine.getOptionValue("a")); - break; - case 'j': - options.jobs = Integer.parseInt(commandLine.getOptionValue("j")); - break; - case 'i': - String rif = commandLine.getOptionValue("i"); - options.setResourceIdFiles(rif); - break; - case 't': - options.useImplicitReferences = true; - break; - case 'e': - options.dexEntry = commandLine.getOptionValue("e"); - break; - case 'k': - options.checkPackagePrivateAccess = true; - break; - case 'n': - options.normalizeVirtualMethods = true; - break; - case 'N': - options.disassemble = false; - break; - case 'D': - options.dump = true; - options.dumpFileName = commandLine.getOptionValue("D"); - break; - case 'I': - options.ignoreErrors = true; - break; - case 'T': - options.customInlineDefinitions = new File(commandLine.getOptionValue("T")); - break; - default: - assert false; - } - } - - if (remainingArgs.length != 1) { - usage(); - return; - } - - String inputDexPath = remainingArgs[0]; - File dexFileFile = new File(inputDexPath); - if (!dexFileFile.exists()) { - System.err.println("Can't find the file " + inputDexPath); - System.exit(1); - } - - //Read in and parse the dex file - DexBackedDexFile dexFile = null; - try { - dexFile = DexFileFactory.loadDexFile(dexFileFile, options.dexEntry, options.apiLevel, options.experimental); - } catch (MultipleDexFilesException ex) { - System.err.println(String.format("%s contains multiple dex files. You must specify which one to " + - "disassemble with the -e option", dexFileFile.getName())); - System.err.println("Valid entries include:"); - - for (OatDexFile oatDexFile: ex.oatFile.getDexFiles()) { - System.err.println(oatDexFile.filename); - } - System.exit(1); - } - - if (dexFile.hasOdexOpcodes()) { - if (!options.deodex) { - System.err.println("Warning: You are disassembling an odex file without deodexing it. You"); - System.err.println("won't be able to re-assemble the results unless you deodex it with the -x"); - System.err.println("option"); - options.allowOdex = true; - } - } else { - options.deodex = false; - } - - if (options.dump) { - if (options.dumpFileName == null) { - options.dumpFileName = inputDexPath + ".dump"; - } - } - - try { - if (!run(options, dexFile)) { - System.exit(1); - } - } catch (IllegalArgumentException ex) { - System.err.println(ex.getMessage()); - System.exit(1); - } - } - - /** - * Prints the usage message. - */ - private static void usage(boolean printDebugOptions) { - SmaliHelpFormatter formatter = new SmaliHelpFormatter(); - int consoleWidth = ConsoleUtil.getConsoleWidth(); - if (consoleWidth <= 0) { - consoleWidth = 80; - } - - formatter.setWidth(consoleWidth); - - formatter.printHelp("java -jar baksmali.jar [options] <dex-file>", - "disassembles and/or dumps a dex file", basicOptions, printDebugOptions?debugOptions:null); - } - - private static void usage() { - usage(false); - } - - /** - * Prints the version message. - */ - protected static void version() { - System.out.println("baksmali " + VERSION + " (http://smali.googlecode.com)"); - System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)"); - System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)"); - System.exit(0); - } - - @SuppressWarnings("AccessStaticViaInstance") - private static void buildOptions() { - Option versionOption = OptionBuilder.withLongOpt("version") - .withDescription("prints the version then exits") - .create("v"); - - Option helpOption = OptionBuilder.withLongOpt("help") - .withDescription("prints the help message then exits. Specify twice for debug options") - .create("?"); - - Option outputDirOption = OptionBuilder.withLongOpt("output") - .withDescription("the directory where the disassembled files will be placed. The default is out") - .hasArg() - .withArgName("DIR") - .create("o"); - - Option noParameterRegistersOption = OptionBuilder.withLongOpt("no-parameter-registers") - .withDescription("use the v<n> syntax instead of the p<n> syntax for registers mapped to method " + - "parameters") - .create("p"); - - Option deodexerantOption = OptionBuilder.withLongOpt("deodex") - .withDescription("deodex the given odex file. This option is ignored if the input file is not an " + - "odex file") - .create("x"); - - Option experimentalOption = OptionBuilder.withLongOpt("experimental") - .withDescription("enable experimental opcodes to be disassembled, even if they aren't necessarily supported in the Android runtime yet") - .create("X"); - - Option useLocalsOption = OptionBuilder.withLongOpt("use-locals") - .withDescription("output the .locals directive with the number of non-parameter registers, rather" + - " than the .register directive with the total number of register") - .create("l"); - - Option sequentialLabelsOption = OptionBuilder.withLongOpt("sequential-labels") - .withDescription("create label names using a sequential numbering scheme per label type, rather than " + - "using the bytecode address") - .create("s"); - - Option noDebugInfoOption = OptionBuilder.withLongOpt("no-debug-info") - .withDescription("don't write out debug info (.local, .param, .line, etc.)") - .create("b"); - - Option registerInfoOption = OptionBuilder.withLongOpt("register-info") - .hasOptionalArgs() - .withArgName("REGISTER_INFO_TYPES") - .withValueSeparator(',') - .withDescription("print the specificed type(s) of register information for each instruction. " + - "\"ARGS,DEST\" is the default if no types are specified.\nValid values are:\nALL: all " + - "pre- and post-instruction registers.\nALLPRE: all pre-instruction registers\nALLPOST: all " + - "post-instruction registers\nARGS: any pre-instruction registers used as arguments to the " + - "instruction\nDEST: the post-instruction destination register, if any\nMERGE: Any " + - "pre-instruction register has been merged from more than 1 different post-instruction " + - "register from its predecessors\nFULLMERGE: For each register that would be printed by " + - "MERGE, also show the incoming register types that were merged") - .create("r"); - - Option classPathOption = OptionBuilder.withLongOpt("bootclasspath") - .withDescription("A colon-separated list of bootclasspath jar/oat files to use for analysis. Add an " + - "initial colon to specify that the jars/oats should be appended to the default bootclasspath " + - "instead of replacing it") - .hasOptionalArg() - .withArgName("BOOTCLASSPATH") - .create("c"); - - Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir") - .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " + - "directory") - .hasArg() - .withArgName("DIR") - .create("d"); - - Option codeOffsetOption = OptionBuilder.withLongOpt("code-offsets") - .withDescription("add comments to the disassembly containing the code offset for each address") - .create("f"); - - Option noAccessorCommentsOption = OptionBuilder.withLongOpt("no-accessor-comments") - .withDescription("don't output helper comments for synthetic accessors") - .create("m"); - - Option apiLevelOption = OptionBuilder.withLongOpt("api-level") - .withDescription("The numeric api-level of the file being disassembled. If not " + - "specified, it defaults to 15 (ICS).") - .hasArg() - .withArgName("API_LEVEL") - .create("a"); - - Option jobsOption = OptionBuilder.withLongOpt("jobs") - .withDescription("The number of threads to use. Defaults to the number of cores available, up to a " + - "maximum of 6") - .hasArg() - .withArgName("NUM_THREADS") - .create("j"); - - Option resourceIdFilesOption = OptionBuilder.withLongOpt("resource-id-files") - .withDescription("the resource ID files to use, for analysis. A colon-separated list of prefix=file " + - "pairs. For example R=res/values/public.xml:" + - "android.R=$ANDROID_HOME/platforms/android-19/data/res/values/public.xml") - .hasArg() - .withArgName("FILES") - .create("i"); - - Option noImplicitReferencesOption = OptionBuilder.withLongOpt("implicit-references") - .withDescription("Use implicit (type-less) method and field references") - .create("t"); - - Option checkPackagePrivateAccessOption = OptionBuilder.withLongOpt("check-package-private-access") - .withDescription("When deodexing, use the package-private access check when calculating vtable " + - "indexes. It should only be needed for 4.2.0 odexes. The functionality was reverted for " + - "4.2.1.") - .create("k"); - - Option normalizeVirtualMethods = OptionBuilder.withLongOpt("normalize-virtual-methods") - .withDescription("Normalize virtual method references to the reference the base method.") - .create("n"); - - Option dumpOption = OptionBuilder.withLongOpt("dump-to") - .withDescription("dumps the given dex file into a single annotated dump file named FILE" + - " (<dexfile>.dump by default), along with the normal disassembly") - .hasOptionalArg() - .withArgName("FILE") - .create("D"); - - Option ignoreErrorsOption = OptionBuilder.withLongOpt("ignore-errors") - .withDescription("ignores any non-fatal errors that occur while disassembling/deodexing," + - " ignoring the class if needed, and continuing with the next class. The default" + - " behavior is to stop disassembling and exit once an error is encountered") - .create("I"); - - Option noDisassemblyOption = OptionBuilder.withLongOpt("no-disassembly") - .withDescription("suppresses the output of the disassembly") - .create("N"); - - Option inlineTableOption = OptionBuilder.withLongOpt("inline-table") - .withDescription("specify a file containing a custom inline method table to use for deodexing") - .hasArg() - .withArgName("FILE") - .create("T"); - - Option dexEntryOption = OptionBuilder.withLongOpt("dex-file") - .withDescription("looks for dex file named DEX_FILE, defaults to classes.dex") - .withArgName("DEX_FILE") - .hasArg() - .create("e"); - - basicOptions.addOption(versionOption); - basicOptions.addOption(helpOption); - basicOptions.addOption(outputDirOption); - basicOptions.addOption(noParameterRegistersOption); - basicOptions.addOption(deodexerantOption); - basicOptions.addOption(experimentalOption); - basicOptions.addOption(useLocalsOption); - basicOptions.addOption(sequentialLabelsOption); - basicOptions.addOption(noDebugInfoOption); - basicOptions.addOption(registerInfoOption); - basicOptions.addOption(classPathOption); - basicOptions.addOption(classPathDirOption); - basicOptions.addOption(codeOffsetOption); - basicOptions.addOption(noAccessorCommentsOption); - basicOptions.addOption(apiLevelOption); - basicOptions.addOption(jobsOption); - basicOptions.addOption(resourceIdFilesOption); - basicOptions.addOption(noImplicitReferencesOption); - basicOptions.addOption(dexEntryOption); - basicOptions.addOption(checkPackagePrivateAccessOption); - basicOptions.addOption(normalizeVirtualMethods); - - debugOptions.addOption(dumpOption); - debugOptions.addOption(ignoreErrorsOption); - debugOptions.addOption(noDisassemblyOption); - debugOptions.addOption(inlineTableOption); - - for (Object option: basicOptions.getOptions()) { - options.addOption((Option)option); - } - for (Object option: debugOptions.getOptions()) { - options.addOption((Option)option); - } - } - - @Nonnull - private static List<String> getDefaultBootClassPathForApi(int apiLevel, boolean experimental) { - if (apiLevel < 9) { - return Lists.newArrayList( - "/system/framework/core.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/android.policy.jar", - "/system/framework/services.jar"); - } else if (apiLevel < 12) { - return Lists.newArrayList( - "/system/framework/core.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/android.policy.jar", - "/system/framework/services.jar", - "/system/framework/core-junit.jar"); - } else if (apiLevel < 14) { - return Lists.newArrayList( - "/system/framework/core.jar", - "/system/framework/apache-xml.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/android.policy.jar", - "/system/framework/services.jar", - "/system/framework/core-junit.jar"); - } else if (apiLevel < 16) { - return Lists.newArrayList( - "/system/framework/core.jar", - "/system/framework/core-junit.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/android.policy.jar", - "/system/framework/services.jar", - "/system/framework/apache-xml.jar", - "/system/framework/filterfw.jar"); - } else if (apiLevel < 21) { - // this is correct as of api 17/4.2.2 - return Lists.newArrayList( - "/system/framework/core.jar", - "/system/framework/core-junit.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/telephony-common.jar", - "/system/framework/mms-common.jar", - "/system/framework/android.policy.jar", - "/system/framework/services.jar", - "/system/framework/apache-xml.jar"); - } else if (apiLevel < 26) { - return Lists.newArrayList( - "/system/framework/core-libart.jar", - "/system/framework/conscrypt.jar", - "/system/framework/okhttp.jar", - "/system/framework/core-junit.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/telephony-common.jar", - "/system/framework/voip-common.jar", - "/system/framework/ims-common.jar", - "/system/framework/mms-common.jar", - "/system/framework/android.policy.jar", - "/system/framework/apache-xml.jar"); - } else { // api >= 26 - // TODO: verify, add new ones? - return Lists.newArrayList( - "/system/framework/core-libart.jar", - "/system/framework/conscrypt.jar", - "/system/framework/okhttp.jar", - "/system/framework/bouncycastle.jar", - "/system/framework/ext.jar", - "/system/framework/framework.jar", - "/system/framework/telephony-common.jar", - "/system/framework/voip-common.jar", - "/system/framework/ims-common.jar", - "/system/framework/mms-common.jar", - "/system/framework/android.policy.jar", - "/system/framework/apache-xml.jar"); - } - } -} diff --git a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java index 2bb04dda..a68038dc 100644 --- a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java @@ -36,7 +36,9 @@ import com.google.common.io.Resources; import junit.framework.Assert; import org.jf.baksmali.Adaptors.ClassDefinition; import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.analysis.ClassPath; +import org.jf.dexlib2.analysis.ClassProvider; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.DexFile; import org.jf.util.IndentingWriter; @@ -49,6 +51,7 @@ import java.io.IOException; import java.io.StringWriter; import java.net.URISyntaxException; import java.net.URL; +import java.util.ArrayList; public class AnalysisTest { @@ -68,6 +71,11 @@ public class AnalysisTest { } @Test + public void InstanceOfTest() throws IOException, URISyntaxException { + runTest("InstanceOfTest", true, true); + } + + @Test public void MultipleStartInstructionsTest() throws IOException, URISyntaxException { runTest("MultipleStartInstructionsTest", true); } @@ -83,16 +91,24 @@ public class AnalysisTest { } public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException { + runTest(test, registerInfo, false); + } + + public void runTest(String test, boolean registerInfo, boolean isArt) throws IOException, URISyntaxException { String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar); - DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), 15, false); + DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), Opcodes.getDefault()); - baksmaliOptions options = new baksmaliOptions(); + BaksmaliOptions options = new BaksmaliOptions(); if (registerInfo) { - options.registerInfo = baksmaliOptions.ALL | baksmaliOptions.FULLMERGE; - options.classPath = new ClassPath(); + options.registerInfo = BaksmaliOptions.ALL | BaksmaliOptions.FULLMERGE; + if (isArt) { + options.classPath = new ClassPath(new ArrayList<ClassProvider>(), true, 56); + } else { + options.classPath = new ClassPath(); + } } - options.useImplicitReferences = false; + options.implicitReferences = false; for (ClassDef classDef: dexFile.getClasses()) { StringWriter stringWriter = new StringWriter(); diff --git a/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java index 1c570b6c..4dd2ad93 100644 --- a/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java +++ b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java @@ -48,10 +48,9 @@ import java.io.StringWriter; public class BaksmaliTestUtils { public static void assertSmaliCompiledEquals(String source, String expected, - baksmaliOptions options, boolean stripComments) throws IOException, + BaksmaliOptions options, boolean stripComments) throws IOException, RecognitionException { - ClassDef classDef = SmaliTestUtils.compileSmali(source, options.apiLevel, - options.experimental); + ClassDef classDef = SmaliTestUtils.compileSmali(source, options.apiLevel); // Remove unnecessary whitespace and optionally strip all comments from smali file String normalizedActual = getNormalizedSmali(classDef, options, stripComments); @@ -62,13 +61,13 @@ public class BaksmaliTestUtils { } public static void assertSmaliCompiledEquals(String source, String expected, - baksmaliOptions options) throws IOException, RecognitionException { + BaksmaliOptions options) throws IOException, RecognitionException { assertSmaliCompiledEquals(source, expected, options, false); } public static void assertSmaliCompiledEquals(String source, String expected) throws IOException, RecognitionException { - baksmaliOptions options = new baksmaliOptions(); + BaksmaliOptions options = new BaksmaliOptions(); assertSmaliCompiledEquals(source, expected, options); } @@ -81,7 +80,7 @@ public class BaksmaliTestUtils { } @Nonnull - public static String getNormalizedSmali(@Nonnull ClassDef classDef, @Nonnull baksmaliOptions options, + public static String getNormalizedSmali(@Nonnull ClassDef classDef, @Nonnull BaksmaliOptions options, boolean stripComments) throws IOException { StringWriter stringWriter = new StringWriter(); diff --git a/baksmali/src/test/java/org/jf/baksmali/DexTest.java b/baksmali/src/test/java/org/jf/baksmali/DexTest.java index 5a4db658..f9f55622 100644 --- a/baksmali/src/test/java/org/jf/baksmali/DexTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/DexTest.java @@ -65,7 +65,7 @@ public abstract class DexTest { } @Nonnull - protected DexBackedDexFile getInputDexFile(@Nonnull String testName, @Nonnull baksmaliOptions options) { + protected DexBackedDexFile getInputDexFile(@Nonnull String testName, @Nonnull BaksmaliOptions options) { try { // Load file from resources as a stream byte[] inputBytes = BaksmaliTestUtils.readResourceBytesFully(getInputFilename(testName)); diff --git a/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java index 1a34e8c3..769372eb 100644 --- a/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java @@ -57,10 +57,10 @@ public class DisassemblyTest extends DexTest { } protected void runTest(@Nonnull String testName) { - runTest(testName, new baksmaliOptions()); + runTest(testName, new BaksmaliOptions()); } - protected void runTest(@Nonnull String testName, @Nonnull baksmaliOptions options) { + protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) { try { DexBackedDexFile inputDex = getInputDexFile(testName, options); Assert.assertEquals(1, inputDex.getClassCount()); diff --git a/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java index 78fabc0b..ad2aad5b 100644 --- a/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java @@ -42,7 +42,7 @@ import org.junit.Test; public class FieldGapOrderTest extends DexTest { @Test public void testOldOrder() { - DexFile dexFile = getInputDexFile("FieldGapOrder", new baksmaliOptions()); + DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions()); Assert.assertEquals(3, dexFile.getClasses().size()); ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 66); @@ -56,7 +56,7 @@ public class FieldGapOrderTest extends DexTest { @Test public void testNewOrder() { - DexFile dexFile = getInputDexFile("FieldGapOrder", new baksmaliOptions()); + DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions()); Assert.assertEquals(3, dexFile.getClasses().size()); ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 67); diff --git a/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java index 1f2ae5bf..962a6be7 100644 --- a/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java @@ -62,8 +62,8 @@ public class ImplicitReferenceTest { "return-void\n" + ".end method\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = true; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = true; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -93,8 +93,8 @@ public class ImplicitReferenceTest { " return-void\n" + ".end method\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = false; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = false; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -118,8 +118,8 @@ public class ImplicitReferenceTest { ".field public static field3:Ljava/lang/reflect/Method; = I()V\n" + ".field public static field4:Ljava/lang/Class; = I\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = true; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = true; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -143,8 +143,8 @@ public class ImplicitReferenceTest { ".field public static field3:Ljava/lang/reflect/Method; = LHelloWorld;->I()V\n" + ".field public static field4:Ljava/lang/Class; = I\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = false; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = false; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -174,8 +174,8 @@ public class ImplicitReferenceTest { " return-void\n" + ".end method\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = true; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = true; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -205,8 +205,8 @@ public class ImplicitReferenceTest { " return-void\n" + ".end method\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = false; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = false; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -228,8 +228,8 @@ public class ImplicitReferenceTest { ".field public static field2:Ljava/lang/reflect/Field; = V:I\n" + ".field public static field3:Ljava/lang/reflect/Field; = I:I\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = true; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = true; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } @@ -251,8 +251,8 @@ public class ImplicitReferenceTest { ".field public static field2:Ljava/lang/reflect/Field; = LHelloWorld;->V:I\n" + ".field public static field3:Ljava/lang/reflect/Field; = LHelloWorld;->I:I\n"; - baksmaliOptions options = new baksmaliOptions(); - options.useImplicitReferences = false; + BaksmaliOptions options = new BaksmaliOptions(); + options.implicitReferences = false; BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options); } diff --git a/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java index d85d7913..f1ade1e9 100644 --- a/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java @@ -36,6 +36,6 @@ import org.junit.Test; public class InterfaceOrderTest extends IdenticalRoundtripTest { @Test public void testInterfaceOrder() { - runTest("InterfaceOrder", new baksmaliOptions()); + runTest("InterfaceOrder", new BaksmaliOptions()); } } diff --git a/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java index c9ff2d4d..81e98a30 100644 --- a/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java +++ b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java @@ -69,10 +69,10 @@ public abstract class RoundtripTest { } protected void runTest(@Nonnull String testName) { - runTest(testName, new baksmaliOptions()); + runTest(testName, new BaksmaliOptions()); } - protected void runTest(@Nonnull String testName, @Nonnull baksmaliOptions options) { + protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) { try { // Load file from resources as a stream String inputFilename = getInputFilename(testName); diff --git a/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali new file mode 100644 index 00000000..8e3337af --- /dev/null +++ b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali @@ -0,0 +1,118 @@ +.class public LInstanceOfTest; +.super Ljava/lang/Object; + + +# virtual methods +.method public testInstanceOfEqz(Ljava/lang/Object;)I + .registers 3 + + #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + instance-of v0, p1, Ljava/lang/String; + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + if-eqz v0, :cond_9 + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + invoke-virtual {p1}, Ljava/lang/String;->length()I + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + move-result v0 + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + return v0 + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + + :cond_9 + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + const v0, -0x1 + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + return v0 + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); +.end method + +.method public testInstanceOfNez(Ljava/lang/Object;)I + .registers 3 + + #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + instance-of v0, p1, Ljava/lang/String; + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + if-nez v0, :cond_8 + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + const v0, -0x1 + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + return v0 + #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + + :cond_8 + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + invoke-virtual {p1}, Ljava/lang/String;->length()I + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + + #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + move-result v0 + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); + return v0 + #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;); +.end method + +.method public testRegisterAlias(Ljava/lang/Object;)I + .registers 4 + + #v0=(Uninit);v1=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;); + move-object p0, p1 + #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + instance-of v0, p0, Ljava/lang/String; + #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + if-eqz v0, :cond_f + #v0=(Boolean);v1=(Uninit);p0=(Unknown);p1=(Unknown); + + :cond_5 + #v0=(Integer):merge{0x3:(Boolean),0xc:(Integer)} + #v1=(Conflicted):merge{0x3:(Uninit),0xc:(Null)} + #p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + invoke-virtual {p1}, Ljava/lang/String;->length()I + #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + move-result v0 + #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + const v1, 0x0 + #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + if-le v0, v1, :cond_5 + #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + + #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + return v0 + #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;); + + :cond_f + #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + const v0, -0x1 + #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + + #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); + return v0 + #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;); +.end method diff --git a/baksmali/src/test/resources/InstanceOfTest/classes.dex b/baksmali/src/test/resources/InstanceOfTest/classes.dex Binary files differnew file mode 100644 index 00000000..571bdb8a --- /dev/null +++ b/baksmali/src/test/resources/InstanceOfTest/classes.dex diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali index f9c43637..1970d3b4 100644 --- a/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali +++ b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali @@ -26,11 +26,37 @@ #v0=(Conflicted):merge{0x5:(UninitRef,Ljava/lang/String;),0x7:(UninitRef,Ljava/lang/String;)} #v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); invoke-direct {v0}, Ljava/lang/String;-><init>()V - #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); - #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); return-void - #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;); +.end method + +.method public constructor <init>(I)V + .registers 2 + + #p0=(UninitThis,LUninitRefIdentityTest;);p1=(Integer); + move-object p1, p0 + #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;); + + #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;); + invoke-direct {p1}, Ljava/lang/Object;-><init>()V + #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;); + + :cond_4 + #p0=(Reference,LUninitRefIdentityTest;); + #p1=(Reference,LUninitRefIdentityTest;):merge{0x1:(Reference,LUninitRefIdentityTest;),0x7:(Null)} + const p1, 0x0 + #p0=(Reference,LUninitRefIdentityTest;);p1=(Null); + + #p0=(Reference,LUninitRefIdentityTest;);p1=(Null); + if-nez p1, :cond_4 + #p0=(Reference,LUninitRefIdentityTest;);p1=(Null); + + #p0=(Reference,LUninitRefIdentityTest;);p1=(Null); + return-void + #p0=(Reference,LUninitRefIdentityTest;);p1=(Null); .end method .method public constructor <init>(Ljava/lang/String;)V @@ -48,3 +74,37 @@ return-void #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;); .end method + + +# virtual methods +.method public overlappingInits()V + .registers 3 + + #v0=(Uninit);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + new-instance v0, Ljava/lang/String; + #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + + #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;); + new-instance v1, Ljava/lang/String; + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;); + + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;); + new-instance p0, Ljava/lang/String; + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;); + + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;); + invoke-direct {p0}, Ljava/lang/String;-><init>()V + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + + #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + invoke-direct {v1}, Ljava/lang/String;-><init>()V + #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + + #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + invoke-direct {v0}, Ljava/lang/String;-><init>()V + #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + + #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); + return-void + #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;); +.end method diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex Binary files differindex ea146cf6..0f0caab3 100644 --- a/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex +++ b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex diff --git a/build.gradle b/build.gradle index 56aaa3f6..9e8205d4 100644 --- a/build.gradle +++ b/build.gradle @@ -31,9 +31,14 @@ apply plugin: 'idea' -version = '2.1.3' +version = '2.2.0' +def jcommanderVersion = '' if (!('release' in gradle.startParameter.taskNames)) { + // we compile against 1.48 normally, to match what's in AOSP, but switch to a newer version + // for release, because it has some fixes required when running on Android + jcommanderVersion = 'com.beust:jcommander:1.48' + def versionSuffix try { def git = org.eclipse.jgit.api.Git.open(file('.')) @@ -51,6 +56,8 @@ if (!('release' in gradle.startParameter.taskNames)) { version += "-${versionSuffix}" } else { + jcommanderVersion = 'com.beust:jcommander:1.64' + if (System.env.JDK6_HOME == null && !JavaVersion.current().isJava6()) { throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 6. " + "Either run gradle with java 6, or define the JDK6_HOME environment variable.") @@ -101,15 +108,16 @@ subprojects { guava: 'com.google.guava:guava:18.0', findbugs: 'com.google.code.findbugs:jsr305:1.3.9', junit: 'junit:junit:4.6', + mockito: 'org.mockito:mockito-core:1.10.19', antlr_runtime: 'org.antlr:antlr-runtime:3.5.2', antlr: 'org.antlr:antlr:3.5.2', stringtemplate: 'org.antlr:stringtemplate:3.2.1', - commons_cli: 'commons-cli:commons-cli:1.2', jflex_plugin: 'org.xbib.gradle.plugin:gradle-plugin-jflex:1.1.0', proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1', dx: 'com.google.android.tools:dx:1.7', - gson: 'com.google.code.gson:gson:2.3.1' - ] + gson: 'com.google.code.gson:gson:2.3.1', + jcommander: jcommanderVersion + ] } repositories { @@ -196,5 +204,6 @@ buildscript { } task wrapper(type: Wrapper) { - gradleVersion = '2.14' + gradleVersion = '3.1' + distributionType = Wrapper.DistributionType.ALL }
\ No newline at end of file diff --git a/dexlib2/Android.mk b/dexlib2/Android.mk index 437ee377..e55aa475 100644 --- a/dexlib2/Android.mk +++ b/dexlib2/Android.mk @@ -33,6 +33,7 @@ LOCAL_SRC_FILES := \ LOCAL_STATIC_JAVA_LIBRARIES := \ commons-cli-1.2 \ guavalib \ + jcommander-host \ jsr305lib diff --git a/dexlib2/OatVersions.txt b/dexlib2/OatVersions.txt index 8aa9ea96..329c4f04 100644 --- a/dexlib2/OatVersions.txt +++ b/dexlib2/OatVersions.txt @@ -8,6 +8,7 @@ d7cbf8a6629942e7bd315ffae7e1c77b082f3e11 - 60 - return-void-barrier -> return-void-no-barrier 1412dfa4adcd511902e510fa0c948b168ab5840c - 61 (re-commit of f3251d12) 9d6bf69ad3012a9d843268fdd5325b6719b6d5f2 - 62 +- classpath list was added 0de1133ba600f299b3d67938f650720d9f859eb2 - 63 07785bb98dc8bbe192970e0f4c2cafd338a8dc68 - 64 fa2c054b28d4b540c1b3651401a7a091282a015f - 65 @@ -21,4 +22,69 @@ fab6788358dfb64e5c370611ddbbbffab0ed0553 - 67 6e2d5747d00697a25251d25dd33b953e54709507 - 68 (revert of 54b62480) 0747466fca310eedea5fc49e37d54f240a0b3c0f - 69 (re-commit of 54b62480) 501fd635a557645ab05f893c56e1f358e21bab82 - 70 -99170c636dfae4908b102347cfe9f92bad1881cc - 71
\ No newline at end of file +99170c636dfae4908b102347cfe9f92bad1881cc - 71 +3cfa4d05afa76e19ca99ec964b535a15c73683f0 - 72 +- default methods +d9786b0e5be23ea0258405165098b4216579209c - 73 +- fast class lookup table +a4f1220c1518074db18ca1044e9201492975750b - 74 +625a64aad13905d8a2454bf3cc0e874487b110d5 - 75 +- bootclasspath list was added +- class offsets moved out to a separate table +919f5536182890d2e03f59b961acf8f7c836ff61 - 74 (revert of 625a64aa) +9bdf108885a27ba05fae8501725649574d7c491b - 75 (re-commit of 625a64aa) +a62d2f04a6ecf804f8a78e722a6ca8ccb2dfa931 - 76 +845e5064580bd37ad5014f7aa0d078be7265464d - 75 (revert of a62d2f04) +29d38e77c553c6cf71fc4dafe2d22b4e3f814872 - 76 (re-commit of 845e5064) +d1537b569b6cd18297c5e02d13cdd588c4366c51 - 77 +61b28a17d9b6e8e998103646e98e4a9772e11927 - 78 +9d07e3d128ccfa0ef7670feadd424a825e447d1d - 79 +952e1e3710158982941fc70326e9fddc3021235d - 80 +013e3f33495dcc31dba19c9de128d23ed441d7d3 - 81 +87f3fcbd0db352157fc59148e94647ef21b73bce - 82 +02b75806a80f8b75c3d6ba2ff97c995117630f36 - 83 +4359e61927866c254bc2d701e3ea4c48de10b79c - 84 +d549c28cfbddba945cb88857bcca3dce1414fb29 - 85 +952dbb19cd094b8bfb01dbb33e0878db429e499a - 86 +239d6eaff0cbb5c4c0139f7053a012758799f186 - 87 - introduction of vdex files +77d9dd75d5d4a22ad1235f9a08d2cfbf2f0ae6fa - 89 +af1e2990cd1406a0fb7cba1d2e208208e950e413 - 90 +9fd8c60cdff7b28a89bb97fd90ae9d0f37cf8f8b - 91 +6beced4c017826f7c449f12fac7fa42403657f2b - 92 +58c3f6a0d15a4340c0a11ab7fbc8c4b990c64b77 - 93 +5923b5238091d9cd65f988fc059deb4fbb2e7f08 - 94 +2b615ba29c4dfcf54aaf44955f2eac60f5080b2e - 95 +f7aaacd97881c6924b8212c7f8fe4a4c8721ef53 - 94 (revert of 2b615ba) +0d3998b5ff619364acf47bec0b541e7a49bd6fe7 - 95 (re-commit of 2b615ba) +ac141397dc29189ad2b2df41f8d4312246beec60 - 96 +1998cd02603197f2acdc0734397a6d48b2f59b80 - 97 +e71b35446985835363a4508646cf7b1121bd95a3 - 98 +39cee66a8ddf0254626c9591662cf87e4a1cedc4 - 99 +cc99df230feb46ba717252f002d0cc2da6828421 - 100 +fee255039e30c1c3dfc70c426c3d176221c3cdf9 - 99 (revert of cc99df23) +e761bccf9f0d884cc4d4ec104568cef968296492 - 100 (re-commit of cc99df23) +8d91ac31ccb92557e434d89ffade3372466e1af5 - 101 +fd3161acfbe82c54ef49958f0ccc62511f224f91 - 102 +a2f526f889be06f96ea59624c9dfb1223b3839f3 - 103 +b048cb74b742b03eb6dd5f1d6dd49e559f730b36 - 104 +12f1b99775bbf7dd82d0a897587ab6ed0e75ee22 - 105 +ec7862283dd49f5a58d0ac45960ce27c2f7671b8 - 106 +45aa598cd1773f5eb1705dec13bea059238e054d - 107 +d16363a93053de0f32252c7897d839a46aff14ae - 108 +1a20b6801f2432a42b906f0de01e7e9586526aec - 109 +575d3e60c68b5cf481b615dde4a16283507b19ed - 110 +85c0f2ac03417f5125bc2ff1dab8109859c67d5c - 111 +5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5 - 111 +b7ea3799c15b0090bb690e18ac1b5b0fddbdeee8 - 112 + - version bump for missing bump in commits + - 3228908337fdfe851223f8ae374538de25cb5ad1 + - 5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5 +d776ff08e07494327716f0d2ea1a774b2ebfbca9 - 113 +bfb80d25eaeb7a604d5dd25a370e3869e96a33ab - 114 +1aea3510b8dd0c512cec61c91c5ef1f1e5d53d64 - 115 +6374c58f2ea403b3a05fb27376110fe4d0fc8e3f - 114 (revert of 1aea3510) +0b66d6174bf1f6023f9d36dda8538490b79c2e9f - 113 (revert of bfb80d25) +8d6768d47b66a688d35399d524ad5a5450e9d9d4 - 114 (i don't even) +f44d36c8423f81cbb5e9f55d8813e26ffa1a7f3b - 115 (115 again. heck if I know what's going on) +cbcedbf9382bc773713cd3552ed96f417bf1daeb - 116 +051071718085ce807a2e7c55278a8d723e238e86 - 116 diff --git a/dexlib2/VdexVersions.txt b/dexlib2/VdexVersions.txt new file mode 100644 index 00000000..9cb1a731 --- /dev/null +++ b/dexlib2/VdexVersions.txt @@ -0,0 +1,8 @@ +7b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2 - 0 - introduction of vdex files +5d5a36bddbc008cd52a3207aa2b31177c47f9a49 - 0 - verifier deps +4acefd33064d37b41ca55c3c9355345a20e5f9c2 - 0 - quickening info +f54e5df37cb42d9a83fc54b375da5ef335d604a9 - 1 - dex file count + dex location checksum +7498105ec7497bae2ba9f1a697da9efa0c979654 - 2 - verify profile +3eba863e41d531340392d9ec64e17963ac898d81 - 3 +97fa9928c07d3e0ee631235e9619fb0f8949ed7a - 4 +6e54f78c7c1e01c1a91a458c6e51cca1c7d13ad4 - 5 diff --git a/dexlib2/build.gradle b/dexlib2/build.gradle index 8fbe5ffe..422d2c31 100644 --- a/dexlib2/build.gradle +++ b/dexlib2/build.gradle @@ -51,6 +51,7 @@ dependencies { compile depends.guava testCompile depends.junit + testCompile depends.mockito accessorTestGenerator project('accessorTestGenerator') diff --git a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java index 60488ba2..1caaf9f8 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java @@ -31,14 +31,22 @@ package org.jf.dexlib2; -import com.google.common.base.MoreObjects; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.io.ByteStreams; +import com.google.common.io.Files; import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile; import org.jf.dexlib2.dexbacked.DexBackedOdexFile; import org.jf.dexlib2.dexbacked.OatFile; import org.jf.dexlib2.dexbacked.OatFile.NotAnOatFileException; import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; +import org.jf.dexlib2.dexbacked.OatFile.VdexProvider; +import org.jf.dexlib2.dexbacked.ZipDexContainer; +import org.jf.dexlib2.dexbacked.ZipDexContainer.NotAZipFileException; import org.jf.dexlib2.iface.DexFile; +import org.jf.dexlib2.iface.MultiDexContainer; import org.jf.dexlib2.writer.pool.DexPool; import org.jf.util.ExceptionWithContext; @@ -46,80 +54,44 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.*; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; public final class DexFileFactory { - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull String path, int api) throws IOException { - return loadDexFile(path, api, false); - } - - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull String path, int api, boolean experimental) - throws IOException { - return loadDexFile(new File(path), "classes.dex", Opcodes.forApi(api, experimental)); - } @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, int api) throws IOException { - return loadDexFile(dexFile, api, false); + public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nonnull Opcodes opcodes) throws IOException { + return loadDexFile(new File(path), opcodes); } + /** + * Loads a dex/apk/odex/oat file. + * + * For oat files with multiple dex files, the first will be opened. For zip/apk files, the "classes.dex" entry + * will be opened. + * + * @param file The file to open + * @param opcodes The set of opcodes to use + * @return A DexBackedDexFile for the given file + * + * @throws UnsupportedOatVersionException If file refers to an unsupported oat file + * @throws DexFileNotFoundException If file does not exist, if file is a zip file but does not have a "classes.dex" + * entry, or if file is an oat file that has no dex entries. + * @throws UnsupportedFileTypeException If file is not a valid dex/zip/odex/oat file, or if the "classes.dex" entry + * in a zip file is not a valid dex file + */ @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, int api, boolean experimental) - throws IOException { - return loadDexFile(dexFile, null, Opcodes.forApi(api, experimental)); - } - - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, @Nullable String dexEntry, int api, - boolean experimental) throws IOException { - return loadDexFile(dexFile, dexEntry, Opcodes.forApi(api, experimental)); - } + public static DexBackedDexFile loadDexFile(@Nonnull File file, @Nonnull Opcodes opcodes) throws IOException { + if (!file.exists()) { + throw new DexFileNotFoundException("%s does not exist", file.getName()); + } - @Nonnull - public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, @Nullable String dexEntry, - @Nonnull Opcodes opcodes) throws IOException { - ZipFile zipFile = null; - boolean isZipFile = false; try { - zipFile = new ZipFile(dexFile); - // if we get here, it's safe to assume we have a zip file - isZipFile = true; - - String zipEntryName = MoreObjects.firstNonNull(dexEntry, "classes.dex"); - ZipEntry zipEntry = zipFile.getEntry(zipEntryName); - if (zipEntry == null) { - throw new DexFileNotFound("zip file %s does not contain a %s file", dexFile.getName(), zipEntryName); - } - long fileLength = zipEntry.getSize(); - if (fileLength < 40) { - throw new ExceptionWithContext("The %s file in %s is too small to be a valid dex file", - zipEntryName, dexFile.getName()); - } else if (fileLength > Integer.MAX_VALUE) { - throw new ExceptionWithContext("The %s file in %s is too large to read in", - zipEntryName, dexFile.getName()); - } - byte[] dexBytes = new byte[(int)fileLength]; - ByteStreams.readFully(zipFile.getInputStream(zipEntry), dexBytes); - return new DexBackedDexFile(opcodes, dexBytes); - } catch (IOException ex) { - // don't continue on if we know it's a zip file - if (isZipFile) { - throw ex; - } - } finally { - if (zipFile != null) { - try { - zipFile.close(); - } catch (IOException ex) { - // just eat it - } - } + ZipDexContainer container = new ZipDexContainer(file, opcodes); + return new DexEntryFinder(file.getPath(), container).findEntry("classes.dex", true); + } catch (NotAZipFileException ex) { + // eat it and continue } - InputStream inputStream = new BufferedInputStream(new FileInputStream(dexFile)); + InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); try { try { return DexBackedDexFile.fromInputStream(opcodes, inputStream); @@ -127,17 +99,18 @@ public final class DexFileFactory { // just eat it } - // Note: DexBackedDexFile.fromInputStream will reset inputStream back to the same position, if it fails - try { return DexBackedOdexFile.fromInputStream(opcodes, inputStream); } catch (DexBackedOdexFile.NotAnOdexFile ex) { // just eat it } + // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream + // back to the same position, if they fails + OatFile oatFile = null; try { - oatFile = OatFile.fromInputStream(inputStream); + oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file)); } catch (NotAnOatFileException ex) { // just eat it } @@ -150,77 +123,373 @@ public final class DexFileFactory { List<OatDexFile> oatDexFiles = oatFile.getDexFiles(); if (oatDexFiles.size() == 0) { - throw new DexFileNotFound("Oat file %s contains no dex files", dexFile.getName()); + throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName()); } - if (dexEntry == null) { - if (oatDexFiles.size() > 1) { - throw new MultipleDexFilesException(oatFile); - } - return oatDexFiles.get(0); - } else { - // first check for an exact match - for (OatDexFile oatDexFile : oatFile.getDexFiles()) { - if (oatDexFile.filename.equals(dexEntry)) { - return oatDexFile; - } - } + return oatDexFiles.get(0); + } + } finally { + inputStream.close(); + } - if (!dexEntry.contains("/")) { - for (OatDexFile oatDexFile : oatFile.getDexFiles()) { - File oatEntryFile = new File(oatDexFile.filename); - if (oatEntryFile.getName().equals(dexEntry)) { - return oatDexFile; - } - } - } + throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath()); + } + + /** + * Loads a dex entry from a container format (zip/oat) + * + * This has two modes of operation, depending on the exactMatch parameter. When exactMatch is true, it will only + * load an entry whose name exactly matches that provided by the dexEntry parameter. + * + * When exactMatch is false, then it will search for any entry that dexEntry is a path suffix of. "path suffix" + * meaning all the path components in dexEntry must fully match the corresponding path components in the entry name, + * but some path components at the beginning of entry name can be missing. + * + * For example, if an oat file contains a "/system/framework/framework.jar:classes2.dex" entry, then the following + * will match (not an exhaustive list): + * + * "/system/framework/framework.jar:classes2.dex" + * "system/framework/framework.jar:classes2.dex" + * "framework/framework.jar:classes2.dex" + * "framework.jar:classes2.dex" + * "classes2.dex" + * + * Note that partial path components specifically don't match. So something like "work/framework.jar:classes2.dex" + * would not match. + * + * If dexEntry contains an initial slash, it will be ignored for purposes of this suffix match -- but not when + * performing an exact match. + * + * If multiple entries match the given dexEntry, a MultipleMatchingDexEntriesException will be thrown + * + * @param file The container file. This must be either a zip (apk) file or an oat file. + * @param dexEntry The name of the entry to load. This can either be the exact entry name, if exactMatch is true, + * or it can be a path suffix. + * @param exactMatch If true, dexE + * @param opcodes The set of opcodes to use + * @return A DexBackedDexFile for the given entry + * + * @throws UnsupportedOatVersionException If file refers to an unsupported oat file + * @throws DexFileNotFoundException If the file does not exist, or if no matching entry could be found + * @throws UnsupportedFileTypeException If file is not a valid zip/oat file, or if the matching entry is not a + * valid dex file + * @throws MultipleMatchingDexEntriesException If multiple entries match the given dexEntry + */ + public static DexBackedDexFile loadDexEntry(@Nonnull File file, @Nonnull String dexEntry, + boolean exactMatch, @Nonnull Opcodes opcodes) throws IOException { + if (!file.exists()) { + throw new DexFileNotFoundException("Container file %s does not exist", file.getName()); + } + + try { + ZipDexContainer container = new ZipDexContainer(file, opcodes); + return new DexEntryFinder(file.getPath(), container).findEntry(dexEntry, exactMatch); + } catch (NotAZipFileException ex) { + // eat it and continue + } + + InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); + try { + OatFile oatFile = null; + try { + oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file)); + } catch (NotAnOatFileException ex) { + // just eat it + } - throw new DexFileNotFound("oat file %s does not contain a dex file named %s", - dexFile.getName(), dexEntry); + if (oatFile != null) { + if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) { + throw new UnsupportedOatVersionException(oatFile); + } + + List<OatDexFile> oatDexFiles = oatFile.getDexFiles(); + + if (oatDexFiles.size() == 0) { + throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName()); } + + return new DexEntryFinder(file.getPath(), oatFile).findEntry(dexEntry, exactMatch); } } finally { inputStream.close(); } - throw new ExceptionWithContext("%s is not an apk, dex, odex or oat file.", dexFile.getPath()); + throw new UnsupportedFileTypeException("%s is not an apk or oat file.", file.getPath()); } + /** + * Loads a file containing 1 or more dex files + * + * If the given file is a dex or odex file, it will return a MultiDexContainer containing that single entry. + * Otherwise, for an oat or zip file, it will return an OatFile or ZipDexContainer respectively. + * + * @param file The file to open + * @param opcodes The set of opcodes to use + * @return A MultiDexContainer + * @throws DexFileNotFoundException If the given file does not exist + * @throws UnsupportedFileTypeException If the given file is not a valid dex/zip/odex/oat file + */ + public static MultiDexContainer<? extends DexBackedDexFile> loadDexContainer( + @Nonnull File file, @Nonnull final Opcodes opcodes) throws IOException { + if (!file.exists()) { + throw new DexFileNotFoundException("%s does not exist", file.getName()); + } + + ZipDexContainer zipDexContainer = new ZipDexContainer(file, opcodes); + if (zipDexContainer.isZipFile()) { + return zipDexContainer; + } + + InputStream inputStream = new BufferedInputStream(new FileInputStream(file)); + try { + try { + DexBackedDexFile dexFile = DexBackedDexFile.fromInputStream(opcodes, inputStream); + return new SingletonMultiDexContainer(file.getPath(), dexFile); + } catch (DexBackedDexFile.NotADexFile ex) { + // just eat it + } + + try { + DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(opcodes, inputStream); + return new SingletonMultiDexContainer(file.getPath(), odexFile); + } catch (DexBackedOdexFile.NotAnOdexFile ex) { + // just eat it + } + + // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream + // back to the same position, if they fails + + OatFile oatFile = null; + try { + oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file)); + } catch (NotAnOatFileException ex) { + // just eat it + } + + if (oatFile != null) { + // TODO: we should support loading earlier oat files, just not deodexing them + if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) { + throw new UnsupportedOatVersionException(oatFile); + } + return oatFile; + } + } finally { + inputStream.close(); + } + + throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath()); + } + + /** + * Writes a DexFile out to disk + * + * @param path The path to write the dex file to + * @param dexFile a DexFile to write + */ public static void writeDexFile(@Nonnull String path, @Nonnull DexFile dexFile) throws IOException { DexPool.writeTo(path, dexFile); } private DexFileFactory() {} - public static class DexFileNotFound extends ExceptionWithContext { - public DexFileNotFound(@Nullable Throwable cause) { - super(cause); + public static class DexFileNotFoundException extends ExceptionWithContext { + public DexFileNotFoundException(@Nullable String message, Object... formatArgs) { + super(message, formatArgs); } + } + + public static class UnsupportedOatVersionException extends ExceptionWithContext { + @Nonnull public final OatFile oatFile; - public DexFileNotFound(@Nullable Throwable cause, @Nullable String message, Object... formatArgs) { - super(cause, message, formatArgs); + public UnsupportedOatVersionException(@Nonnull OatFile oatFile) { + super("Unsupported oat version: %d", oatFile.getOatVersion()); + this.oatFile = oatFile; } + } - public DexFileNotFound(@Nullable String message, Object... formatArgs) { - super(message, formatArgs); + public static class MultipleMatchingDexEntriesException extends ExceptionWithContext { + public MultipleMatchingDexEntriesException(@Nonnull String message, Object... formatArgs) { + super(String.format(message, formatArgs)); } } - public static class MultipleDexFilesException extends ExceptionWithContext { - @Nonnull public final OatFile oatFile; + public static class UnsupportedFileTypeException extends ExceptionWithContext { + public UnsupportedFileTypeException(@Nonnull String message, Object... formatArgs) { + super(String.format(message, formatArgs)); + } + } - public MultipleDexFilesException(@Nonnull OatFile oatFile) { - super("Oat file has multiple dex files."); - this.oatFile = oatFile; + /** + * Matches two entries fully, ignoring any initial slash, if any + */ + private static boolean fullEntryMatch(@Nonnull String entry, @Nonnull String targetEntry) { + if (entry.equals(targetEntry)) { + return true; } + + if (entry.charAt(0) == '/') { + entry = entry.substring(1); + } + + if (targetEntry.charAt(0) == '/') { + targetEntry = targetEntry.substring(1); + } + + return entry.equals(targetEntry); } - public static class UnsupportedOatVersionException extends ExceptionWithContext { - @Nonnull public final OatFile oatFile; + /** + * Performs a partial match against entry and targetEntry. + * + * This is considered a partial match if targetEntry is a suffix of entry, and if the suffix starts + * on a path "part" (ignoring the initial separator, if any). Both '/' and ':' are considered separators for this. + * + * So entry="/blah/blah/something.dex" and targetEntry="lah/something.dex" shouldn't match, but + * both targetEntry="blah/something.dex" and "/blah/something.dex" should match. + */ + private static boolean partialEntryMatch(String entry, String targetEntry) { + if (entry.equals(targetEntry)) { + return true; + } - public UnsupportedOatVersionException(@Nonnull OatFile oatFile) { - super("Unsupported oat version: %d", oatFile.getOatVersion()); - this.oatFile = oatFile; + if (!entry.endsWith(targetEntry)) { + return false; + } + + // Make sure the first matching part is a full entry. We don't want to match "/blah/blah/something.dex" with + // "lah/something.dex", but both "/blah/something.dex" and "blah/something.dex" should match + char precedingChar = entry.charAt(entry.length() - targetEntry.length() - 1); + char firstTargetChar = targetEntry.charAt(0); + // This is a device path, so we should always use the linux separator '/', rather than the current platform's + // separator + return firstTargetChar == ':' || firstTargetChar == '/' || precedingChar == ':' || precedingChar == '/'; + } + + protected static class DexEntryFinder { + private final String filename; + private final MultiDexContainer<? extends DexBackedDexFile> dexContainer; + + public DexEntryFinder(@Nonnull String filename, + @Nonnull MultiDexContainer<? extends DexBackedDexFile> dexContainer) { + this.filename = filename; + this.dexContainer = dexContainer; + } + + @Nonnull + public DexBackedDexFile findEntry(@Nonnull String targetEntry, boolean exactMatch) throws IOException { + if (exactMatch) { + try { + DexBackedDexFile dexFile = dexContainer.getEntry(targetEntry); + if (dexFile == null) { + throw new DexFileNotFoundException("Could not find entry %s in %s.", targetEntry, filename); + } + return dexFile; + } catch (NotADexFile ex) { + throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file", targetEntry, filename); + } + } + + // find all full and partial matches + List<String> fullMatches = Lists.newArrayList(); + List<DexBackedDexFile> fullEntries = Lists.newArrayList(); + List<String> partialMatches = Lists.newArrayList(); + List<DexBackedDexFile> partialEntries = Lists.newArrayList(); + for (String entry: dexContainer.getDexEntryNames()) { + if (fullEntryMatch(entry, targetEntry)) { + // We want to grab all full matches, regardless of whether they're actually a dex file. + fullMatches.add(entry); + fullEntries.add(dexContainer.getEntry(entry)); + } else if (partialEntryMatch(entry, targetEntry)) { + partialMatches.add(entry); + partialEntries.add(dexContainer.getEntry(entry)); + } + } + + // full matches always take priority + if (fullEntries.size() == 1) { + try { + DexBackedDexFile dexFile = fullEntries.get(0); + assert dexFile != null; + return dexFile; + } catch (NotADexFile ex) { + throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file", + fullMatches.get(0), filename); + } + } + if (fullEntries.size() > 1) { + // This should be quite rare. This would only happen if an oat file has two entries that differ + // only by an initial path separator. e.g. "/blah/blah.dex" and "blah/blah.dex" + throw new MultipleMatchingDexEntriesException(String.format( + "Multiple entries in %s match %s: %s", filename, targetEntry, + Joiner.on(", ").join(fullMatches))); + } + + if (partialEntries.size() == 0) { + throw new DexFileNotFoundException("Could not find a dex entry in %s matching %s", + filename, targetEntry); + } + if (partialEntries.size() > 1) { + throw new MultipleMatchingDexEntriesException(String.format( + "Multiple dex entries in %s match %s: %s", filename, targetEntry, + Joiner.on(", ").join(partialMatches))); + } + return partialEntries.get(0); + } + } + + private static class SingletonMultiDexContainer implements MultiDexContainer<DexBackedDexFile> { + private final String entryName; + private final DexBackedDexFile dexFile; + + public SingletonMultiDexContainer(@Nonnull String entryName, @Nonnull DexBackedDexFile dexFile) { + this.entryName = entryName; + this.dexFile = dexFile; + } + + @Nonnull @Override public List<String> getDexEntryNames() throws IOException { + return ImmutableList.of(entryName); + } + + @Nullable @Override public DexBackedDexFile getEntry(@Nonnull String entryName) throws IOException { + if (entryName.equals(this.entryName)) { + return dexFile; + } + return null; + } + + @Nonnull @Override public Opcodes getOpcodes() { + return dexFile.getOpcodes(); + } + } + + public static class FilenameVdexProvider implements VdexProvider { + private final File vdexFile; + + @Nullable + private byte[] buf = null; + private boolean loadedVdex = false; + + public FilenameVdexProvider(File oatFile) { + File oatParent = oatFile.getAbsoluteFile().getParentFile(); + String baseName = Files.getNameWithoutExtension(oatFile.getAbsolutePath()); + vdexFile = new File(oatParent, baseName + ".vdex"); + } + + @Nullable @Override public byte[] getVdex() { + if (!loadedVdex) { + if (vdexFile.exists()) { + try { + buf = ByteStreams.toByteArray(new FileInputStream(vdexFile)); + } catch (FileNotFoundException e) { + buf = null; + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + loadedVdex = true; + } + + return buf; } } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java index 843550f8..60dffa2f 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java @@ -330,8 +330,6 @@ public enum Opcode public static final int JUMBO_OPCODE = 0x200; //if the instruction can initialize an uninitialized object reference public static final int CAN_INITIALIZE_REFERENCE = 0x400; - //if the instruction is experimental (not potentially supported by Android runtime yet) - public static final int EXPERIMENTAL = 0x800; private static final int ALL_APIS = 0xFFFF0000; @@ -471,10 +469,6 @@ public enum Opcode return (flags & CAN_INITIALIZE_REFERENCE) != 0; } - public final boolean isExperimental() { - return (flags & EXPERIMENTAL) != 0; - } - private static class VersionConstraint { @Nonnull public final Range<Integer> apiRange; @Nonnull public final Range<Integer> artVersionRange; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java index a137dee2..5f8106d2 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java @@ -56,41 +56,32 @@ public class Opcodes { @Nonnull public static Opcodes forApi(int api) { - return new Opcodes(api, NO_VERSION, false); - } - - @Nonnull - public static Opcodes forApi(int api, boolean experimental) { - return new Opcodes(api, NO_VERSION, experimental); + return new Opcodes(api, NO_VERSION); } @Nonnull public static Opcodes forArtVersion(int artVersion) { - return forArtVersion(artVersion, false); + return new Opcodes(NO_VERSION, artVersion); } + /** + * @return a default Opcodes instance for when the exact Opcodes to use doesn't matter or isn't known + */ @Nonnull - public static Opcodes forArtVersion(int artVersion, boolean experimental) { - return new Opcodes(NO_VERSION, artVersion, experimental); + public static Opcodes getDefault() { + // The last pre-art api + return forApi(20); } - @Deprecated - public Opcodes(int api) { - this(api, false); - } + private Opcodes(int api, int artVersion) { - @Deprecated - public Opcodes(int api, boolean experimental) { - this(api, VersionMap.mapApiToArtVersion(api), experimental); - } - private Opcodes(int api, int artVersion, boolean experimental) { if (api >= 21) { - this.api = api; + this.api = api; this.artVersion = mapApiToArtVersion(api); } else if (artVersion >= 0 && artVersion < 39) { this.api = mapArtVersionToApi(artVersion); - this.artVersion = artVersion; + this.artVersion = artVersion; } else { this.api = api; this.artVersion = artVersion; @@ -116,7 +107,7 @@ public class Opcodes { } Short opcodeValue = versionToValueMap.get(version); - if (opcodeValue != null && (!opcode.isExperimental() || experimental)) { + if (opcodeValue != null) { if (!opcode.format.isPayloadFormat) { opcodesByValue[opcodeValue] = opcode; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java index 55f1ddc7..1a9b9ad1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java @@ -32,12 +32,14 @@ package org.jf.dexlib2.analysis; import com.google.common.base.Objects; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.jf.dexlib2.Opcode; import org.jf.dexlib2.iface.instruction.*; import org.jf.dexlib2.iface.instruction.formats.Instruction22c; import org.jf.dexlib2.iface.reference.MethodReference; import org.jf.dexlib2.iface.reference.Reference; +import org.jf.dexlib2.iface.reference.TypeReference; import org.jf.util.ExceptionWithContext; import javax.annotation.Nonnull; @@ -54,7 +56,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { /** * The actual instruction */ - @Nullable + @Nonnull protected Instruction instruction; /** @@ -65,21 +67,25 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { /** * Instructions that can pass on execution to this one during normal execution */ + @Nonnull protected final TreeSet<AnalyzedInstruction> predecessors = new TreeSet<AnalyzedInstruction>(); /** * Instructions that can execution could pass on to next during normal execution */ + @Nonnull protected final LinkedList<AnalyzedInstruction> successors = new LinkedList<AnalyzedInstruction>(); /** * This contains the register types *before* the instruction has executed */ + @Nonnull protected final RegisterType[] preRegisterMap; /** * This contains the register types *after* the instruction has executed */ + @Nonnull protected final RegisterType[] postRegisterMap; /** @@ -94,8 +100,8 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { */ protected final Instruction originalInstruction; - public AnalyzedInstruction(MethodAnalyzer methodAnalyzer, Instruction instruction, int instructionIndex, - int registerCount) { + public AnalyzedInstruction(@Nonnull MethodAnalyzer methodAnalyzer, @Nonnull Instruction instruction, + int instructionIndex, int registerCount) { this.methodAnalyzer = methodAnalyzer; this.instruction = instruction; this.originalInstruction = instruction; @@ -150,18 +156,17 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { instruction = originalInstruction; } - public int getSuccessorCount() { - return successors.size(); - } - - public List<AnalyzedInstruction> getSuccesors() { + @Nonnull + public List<AnalyzedInstruction> getSuccessors() { return Collections.unmodifiableList(successors); } + @Nonnull public Instruction getInstruction() { return instruction; } + @Nonnull public Instruction getOriginalInstruction() { return originalInstruction; } @@ -184,11 +189,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { if (predecessors.size() == 0) { return false; } - - if (predecessors.first().instructionIndex == -1) { - return true; - } - return false; + return predecessors.first().instructionIndex == -1; } /* @@ -237,6 +238,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { * @param registerNumber the register number * @return The register type resulting from merging the post-instruction register types from all predecessors */ + @Nonnull protected RegisterType getMergedPreRegisterTypeFromPredecessors(int registerNumber) { RegisterType mergedRegisterType = null; for (AnalyzedInstruction predecessor: predecessors) { @@ -249,6 +251,10 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { } } } + if (mergedRegisterType == null) { + // This is a start-of-method or unreachable instruction. + throw new IllegalStateException(); + } return mergedRegisterType; } /** @@ -275,10 +281,10 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { * * This is used to set the register type for only one branch from a conditional jump. * - * @param predecessor Which predecessor is being overriden - * @param registerNumber The register number of the register being overriden + * @param predecessor Which predecessor is being overridden + * @param registerNumber The register number of the register being overridden * @param registerType The overridden register type - * @param verifiedInstructions + * @param verifiedInstructions A bit vector of instructions that have been verified * * @return true if the post-instruction register type for this instruction changed as a result of this override */ @@ -308,8 +314,8 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { return false; } - protected boolean isInvokeInit() { - if (instruction == null || !instruction.getOpcode().canInitializeReference()) { + public boolean isInvokeInit() { + if (!instruction.getOpcode().canInitializeReference()) { return false; } @@ -323,23 +329,26 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { return false; } - public boolean setsRegister() { - return instruction.getOpcode().setsRegister(); - } - - public boolean setsWideRegister() { - return instruction.getOpcode().setsWideRegister(); - } - + /** + * Determines if this instruction sets the given register, or alters its type + * + * @param registerNumber The register to check + * @return true if this instruction sets the given register or alters its type + */ public boolean setsRegister(int registerNumber) { - //When constructing a new object, the register type will be an uninitialized reference after the new-instance - //instruction, but becomes an initialized reference once the <init> method is called. So even though invoke - //instructions don't normally change any registers, calling an <init> method will change the type of its - //object register. If the uninitialized reference has been copied to other registers, they will be initialized - //as well, so we need to check for that too + // This method could be implemented by calling getSetRegisters and checking if registerNumber is in the result + // However, this is a frequently called method, and this is a more efficient implementation, because it doesn't + // allocate a new list, and it can potentially exit earlier + if (isInvokeInit()) { + // When constructing a new object, the register type will be an uninitialized reference after the + // new-instance instruction, but becomes an initialized reference once the <init> method is called. So even + // though invoke instructions don't normally change any registers, calling an <init> method will change the + // type of its object register. If the uninitialized reference has been copied to other registers, they will + // be initialized as well, so we need to check for that too int destinationRegister; if (instruction instanceof FiveRegisterInstruction) { + assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0; destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC(); } else { assert instruction instanceof RegisterRangeInstruction; @@ -348,34 +357,107 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { destinationRegister = rangeInstruction.getStartRegister(); } - if (registerNumber == destinationRegister) { - return true; + RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister); + if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) { + // We never let an uninitialized reference propagate past an invoke-init if the object register type is + // unknown This is because the uninitialized reference may be an alias to the reference being + // initialized, but we can't know that until the object register's type is known + RegisterType preInstructionRegisterType = getPreInstructionRegisterType(registerNumber); + if (preInstructionRegisterType.category == RegisterType.UNINIT_REF || + preInstructionRegisterType.category == RegisterType.UNINIT_THIS) { + return true; + } } - RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(registerNumber); - if (preInstructionDestRegisterType.category != RegisterType.UNINIT_REF && - preInstructionDestRegisterType.category != RegisterType.UNINIT_THIS) { + if (preInstructionDestRegisterType.category != RegisterType.UNINIT_REF && + preInstructionDestRegisterType.category != RegisterType.UNINIT_THIS) { return false; } - //check if the uninit ref has been copied to another register - if (getPreInstructionRegisterType(registerNumber).equals(preInstructionDestRegisterType)) { + + if (registerNumber == destinationRegister) { return true; } - return false; + + //check if the uninit ref has been copied to another register + return preInstructionDestRegisterType.equals(getPreInstructionRegisterType(registerNumber)); } - if (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ) { - AnalyzedInstruction previousInstruction = getPreviousInstruction(); - if (previousInstruction != null && - previousInstruction.instruction != null && - previousInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF && - registerNumber == ((Instruction22c)previousInstruction.instruction).getRegisterB() && - MethodAnalyzer.canNarrowAfterInstanceOf(previousInstruction, this, methodAnalyzer.getClassPath())) { - return true; + // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction. + // Normally, check-cast is where the register type actually changes. + // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate + // branch of the following if-eqz/if-nez + if (instructionIndex > 0 && + methodAnalyzer.getClassPath().isArt() && + getPredecessorCount() == 1 && + (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) { + + AnalyzedInstruction prevInstruction = predecessors.first(); + if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF && + MethodAnalyzer.canPropagateTypeAfterInstanceOf( + prevInstruction, this, methodAnalyzer.getClassPath())) { + Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction; + + if (registerNumber == instanceOfInstruction.getRegisterB()) { + return true; + } + + // Additionally, there may be a move instruction just before the instance-of, in order to put the value + // into a register that is addressable by the instance-of. In this case, we also need to propagate the + // new register type for the original register that the value was moved from. + // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the + // propagation if all predecessors are move-object instructions for the same source register + // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value? + if (instructionIndex > 1) { + int originalSourceRegister = -1; + + RegisterType newType = null; + + for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) { + Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode(); + if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 || + opcode == Opcode.MOVE_OBJECT_FROM16) { + TwoRegisterInstruction moveInstruction = + ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction); + RegisterType originalType = + prevPrevAnalyzedInstruction.getPostInstructionRegisterType( + moveInstruction.getRegisterB()); + if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) { + originalSourceRegister = -1; + break; + } + if (originalType.type == null) { + originalSourceRegister = -1; + break; + } + + if (newType == null) { + newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(), + (TypeReference)instanceOfInstruction.getReference()); + } + + if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) { + if (originalSourceRegister != -1) { + if (originalSourceRegister != moveInstruction.getRegisterB()) { + originalSourceRegister = -1; + break; + } + } else { + originalSourceRegister = moveInstruction.getRegisterB(); + } + } + } else { + originalSourceRegister = -1; + break; + } + } + if (originalSourceRegister != -1 && registerNumber == originalSourceRegister) { + return true; + } + } } } - if (!setsRegister()) { + if (!instruction.getOpcode().setsRegister()) { return false; } int destinationRegister = getDestinationRegister(); @@ -383,20 +465,151 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { if (registerNumber == destinationRegister) { return true; } - if (setsWideRegister() && registerNumber == (destinationRegister + 1)) { + if (instruction.getOpcode().setsWideRegister() && registerNumber == (destinationRegister + 1)) { return true; } return false; } - @Nullable - private AnalyzedInstruction getPreviousInstruction() { - for (AnalyzedInstruction predecessor: predecessors) { - if (predecessor.getInstructionIndex() == getInstructionIndex() - 1) { - return predecessor; + public List<Integer> getSetRegisters() { + List<Integer> setRegisters = Lists.newArrayList(); + + if (instruction.getOpcode().setsRegister()) { + setRegisters.add(getDestinationRegister()); + } + if (instruction.getOpcode().setsWideRegister()) { + setRegisters.add(getDestinationRegister() + 1); + } + + if (isInvokeInit()) { + //When constructing a new object, the register type will be an uninitialized reference after the new-instance + //instruction, but becomes an initialized reference once the <init> method is called. So even though invoke + //instructions don't normally change any registers, calling an <init> method will change the type of its + //object register. If the uninitialized reference has been copied to other registers, they will be initialized + //as well, so we need to check for that too + + int destinationRegister; + if (instruction instanceof FiveRegisterInstruction) { + destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC(); + assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0; + } else { + assert instruction instanceof RegisterRangeInstruction; + RegisterRangeInstruction rangeInstruction = (RegisterRangeInstruction)instruction; + assert rangeInstruction.getRegisterCount() > 0; + destinationRegister = rangeInstruction.getStartRegister(); + } + + RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister); + if (preInstructionDestRegisterType.category == RegisterType.UNINIT_REF || + preInstructionDestRegisterType.category == RegisterType.UNINIT_THIS) { + setRegisters.add(destinationRegister); + + RegisterType objectRegisterType = preRegisterMap[destinationRegister]; + for (int i = 0; i < preRegisterMap.length; i++) { + if (i == destinationRegister) { + continue; + } + + RegisterType preInstructionRegisterType = preRegisterMap[i]; + + if (preInstructionRegisterType.equals(objectRegisterType)) { + setRegisters.add(i); + } else if (preInstructionRegisterType.category == RegisterType.UNINIT_REF || + preInstructionRegisterType.category == RegisterType.UNINIT_THIS) { + RegisterType postInstructionRegisterType = postRegisterMap[i]; + if (postInstructionRegisterType.category == RegisterType.UNKNOWN) { + setRegisters.add(i); + } + } + } + } else if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) { + // We never let an uninitialized reference propagate past an invoke-init if the object register type is + // unknown This is because the uninitialized reference may be an alias to the reference being + // initialized, but we can't know that until the object register's type is known + + for (int i = 0; i < preRegisterMap.length; i++) { + RegisterType registerType = preRegisterMap[i]; + if (registerType.category == RegisterType.UNINIT_REF || + registerType.category == RegisterType.UNINIT_THIS) { + setRegisters.add(i); + } + } + } + } + + // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction. + // Normally, check-cast is where the register type actually changes. + // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate + // branch of the following if-eqz/if-nez + if (instructionIndex > 0 && + methodAnalyzer.getClassPath().isArt() && + getPredecessorCount() == 1 && + (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) { + + AnalyzedInstruction prevInstruction = predecessors.first(); + if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF && + MethodAnalyzer.canPropagateTypeAfterInstanceOf( + prevInstruction, this, methodAnalyzer.getClassPath())) { + Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction; + setRegisters.add(instanceOfInstruction.getRegisterB()); + + // Additionally, there may be a move instruction just before the instance-of, in order to put the value + // into a register that is addressable by the instance-of. In this case, we also need to propagate the + // new register type for the original register that the value was moved from. + // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the + // propagation if all predecessors are move-object instructions for the same source register + // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value? + if (instructionIndex > 1) { + int originalSourceRegister = -1; + + RegisterType newType = null; + + for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) { + Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode(); + if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 || + opcode == Opcode.MOVE_OBJECT_FROM16) { + TwoRegisterInstruction moveInstruction = + ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction); + RegisterType originalType = + prevPrevAnalyzedInstruction.getPostInstructionRegisterType( + moveInstruction.getRegisterB()); + if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) { + originalSourceRegister = -1; + break; + } + if (originalType.type == null) { + originalSourceRegister = -1; + break; + } + + if (newType == null) { + newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(), + (TypeReference)instanceOfInstruction.getReference()); + } + + if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) { + if (originalSourceRegister != -1) { + if (originalSourceRegister != moveInstruction.getRegisterB()) { + originalSourceRegister = -1; + break; + } + } else { + originalSourceRegister = moveInstruction.getRegisterB(); + } + } + } else { + originalSourceRegister = -1; + break; + } + } + if (originalSourceRegister != -1) { + setRegisters.add(originalSourceRegister); + } + } } } - return null; + + return setRegisters; } public int getDestinationRegister() { @@ -421,7 +634,7 @@ public class AnalyzedInstruction implements Comparable<AnalyzedInstruction> { return preRegisterMap[registerNumber]; } - public int compareTo(AnalyzedInstruction analyzedInstruction) { + public int compareTo(@Nonnull AnalyzedInstruction analyzedInstruction) { if (instructionIndex < analyzedInstruction.instructionIndex) { return -1; } else if (instructionIndex == analyzedInstruction.instructionIndex) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java index 9f9e396b..48bf6181 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java @@ -36,28 +36,18 @@ import com.google.common.base.Suppliers; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.jf.dexlib2.DexFileFactory; -import org.jf.dexlib2.DexFileFactory.DexFileNotFound; -import org.jf.dexlib2.DexFileFactory.MultipleDexFilesException; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.analysis.reflection.ReflectionClassDef; -import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; import org.jf.dexlib2.iface.ClassDef; -import org.jf.dexlib2.iface.DexFile; import org.jf.dexlib2.immutable.ImmutableDexFile; -import org.jf.util.ExceptionWithContext; import javax.annotation.Nonnull; -import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.Arrays; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class ClassPath { @Nonnull private final TypeProto unknownClass; @@ -70,8 +60,8 @@ public class ClassPath { /** * Creates a new ClassPath instance that can load classes from the given providers * - * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in - * order + * @param classProviders A varargs array of ClassProviders. When loading a class, these providers will be searched + * in order */ public ClassPath(ClassProvider... classProviders) throws IOException { this(Arrays.asList(classProviders), false, NOT_ART); @@ -82,6 +72,16 @@ public class ClassPath { * * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in * order + */ + public ClassPath(Iterable<ClassProvider> classProviders) throws IOException { + this(classProviders, false, NOT_ART); + } + + /** + * Creates a new ClassPath instance that can load classes from the given providers + * + * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in + * order * @param checkPackagePrivateAccess Whether checkPackagePrivateAccess is needed, enabled for ONLY early API 17 by * default * @param oatVersion The applicable oat version, or NOT_ART @@ -114,7 +114,7 @@ public class ClassPath { private static ClassProvider getBasicClasses() { // fallbacks for some special classes that we assume are present - return new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of( + return new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of( new ReflectionClassDef(Class.class), new ReflectionClassDef(Cloneable.class), new ReflectionClassDef(Object.class), @@ -164,119 +164,6 @@ public class ClassPath { return checkPackagePrivateAccess; } - @Nonnull - public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile, - int api, boolean experimental) { - return fromClassPath(classPathDirs, classPath, dexFile, api, api == 17, experimental); - } - - @Nonnull - public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile, - int api, boolean checkPackagePrivateAccess, boolean experimental) { - List<ClassProvider> providers = Lists.newArrayList(); - - int oatVersion = NOT_ART; - - for (String classPathEntry: classPath) { - List<? extends DexFile> classPathDexFiles = - loadClassPathEntry(classPathDirs, classPathEntry, api, experimental); - if (oatVersion == NOT_ART) { - for (DexFile classPathDexFile: classPathDexFiles) { - if (classPathDexFile instanceof OatDexFile) { - oatVersion = ((OatDexFile)classPathDexFile).getOatVersion(); - break; - } - } - } - for (DexFile classPathDexFile: classPathDexFiles) { - providers.add(new DexClassProvider(classPathDexFile)); - } - } - providers.add(new DexClassProvider(dexFile)); - return new ClassPath(providers, checkPackagePrivateAccess, oatVersion); - } - - @Nonnull - public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile, - int api, boolean checkPackagePrivateAccess, boolean experimental, - int oatVersion) { - List<ClassProvider> providers = Lists.newArrayList(); - - for (String classPathEntry: classPath) { - List<? extends DexFile> classPathDexFiles = - loadClassPathEntry(classPathDirs, classPathEntry, api, experimental); - for (DexFile classPathDexFile: classPathDexFiles) { - providers.add(new DexClassProvider(classPathDexFile)); - } - } - providers.add(new DexClassProvider(dexFile)); - return new ClassPath(providers, checkPackagePrivateAccess, oatVersion); - } - - private static final Pattern dalvikCacheOdexPattern = Pattern.compile("@([^@]+)@classes.dex$"); - - @Nonnull - private static List<? extends DexFile> loadClassPathEntry(@Nonnull Iterable<String> classPathDirs, - @Nonnull String bootClassPathEntry, int api, - boolean experimental) { - File rawEntry = new File(bootClassPathEntry); - // strip off the path - we only care about the filename - String entryName = rawEntry.getName(); - - // if it's a dalvik-cache entry, grab the name of the jar/apk - if (entryName.endsWith("@classes.dex")) { - Matcher m = dalvikCacheOdexPattern.matcher(entryName); - - if (!m.find()) { - throw new ExceptionWithContext(String.format("Cannot parse dependency value %s", bootClassPathEntry)); - } - - entryName = m.group(1); - } - - int extIndex = entryName.lastIndexOf("."); - - String baseEntryName; - if (extIndex == -1) { - baseEntryName = entryName; - } else { - baseEntryName = entryName.substring(0, extIndex); - } - - for (String classPathDir: classPathDirs) { - String[] extensions; - - if (entryName.endsWith(".oat")) { - extensions = new String[] { ".oat" }; - } else { - extensions = new String[] { "", ".odex", ".jar", ".apk", ".zip" }; - } - - for (String ext: extensions) { - File file = new File(classPathDir, baseEntryName + ext); - - if (file.exists() && file.isFile()) { - if (!file.canRead()) { - System.err.println(String.format( - "warning: cannot open %s for reading. Will continue looking.", file.getPath())); - } else { - try { - return ImmutableList.of(DexFileFactory.loadDexFile(file, api, experimental)); - } catch (DexFileNotFound ex) { - // ignore and continue - } catch (MultipleDexFilesException ex) { - return ex.oatFile.getDexFiles(); - } catch (Exception ex) { - throw ExceptionWithContext.withContext(ex, - "Error while reading boot class path entry \"%s\"", bootClassPathEntry); - } - } - } - } - } - throw new ExceptionWithContext("Cannot locate boot class path file %s", bootClassPathEntry); - } - private final Supplier<OdexedFieldInstructionMapper> fieldInstructionMapperSupplier = Suppliers.memoize( new Supplier<OdexedFieldInstructionMapper>() { @Override public OdexedFieldInstructionMapper get() { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java new file mode 100644 index 00000000..10daa566 --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java @@ -0,0 +1,465 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.analysis; + +import com.beust.jcommander.internal.Sets; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; +import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.DexBackedOdexFile; +import org.jf.dexlib2.dexbacked.OatFile; +import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; +import org.jf.dexlib2.iface.DexFile; +import org.jf.dexlib2.iface.MultiDexContainer; +import org.jf.dexlib2.iface.MultiDexContainer.MultiDexFile; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Set; + +public class ClassPathResolver { + private final Iterable<String> classPathDirs; + private final Opcodes opcodes; + + private final Set<File> loadedFiles = Sets.newHashSet(); + private final List<ClassProvider> classProviders = Lists.newArrayList(); + + /** + * Constructs a new ClassPathResolver using a specified list of bootclasspath entries + * + * @param bootClassPathDirs A list of directories to search for boot classpath entries. Can be empty if all boot + * classpath entries are specified as local paths + * @param bootClassPathEntries A list of boot classpath entries to load. These can either be local paths, or + * device paths (e.g. "/system/framework/framework.jar"). The entry will be interpreted + * first as a local path. If not found as a local path, it will be interpreted as a + * partial or absolute device path, and will be searched for in bootClassPathDirs + * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be + * local paths. Device paths are not supported. + * @param dexFile The dex file that the classpath will be used to analyze + * @throws IOException If any IOException occurs + * @throws ResolveException If any classpath entries cannot be loaded for some reason + * + * If null, a default bootclasspath is used, + * depending on the the file type of dexFile and the api level. If empty, no boot + * classpath entries will be loaded + */ + public ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nonnull List<String> bootClassPathEntries, + @Nonnull List<String> extraClassPathEntries, @Nonnull DexFile dexFile) + throws IOException { + this(bootClassPathDirs, bootClassPathEntries, extraClassPathEntries, dexFile, true); + } + + /** + * Constructs a new ClassPathResolver using a default list of bootclasspath entries + * + * @param bootClassPathDirs A list of directories to search for boot classpath entries + * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be + * local paths. Device paths are not supported. + * @param dexFile The dex file that the classpath will be used to analyze + * @throws IOException If any IOException occurs + * @throws ResolveException If any classpath entries cannot be loaded for some reason + * + * If null, a default bootclasspath is used, + * depending on the the file type of dexFile and the api level. If empty, no boot + * classpath entries will be loaded + */ + public ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nonnull List<String> extraClassPathEntries, + @Nonnull DexFile dexFile) + throws IOException { + this(bootClassPathDirs, null, extraClassPathEntries, dexFile, true); + } + + private ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nullable List<String> bootClassPathEntries, + @Nonnull List<String> extraClassPathEntries, @Nonnull DexFile dexFile, boolean unused) + throws IOException { + this.classPathDirs = bootClassPathDirs; + opcodes = dexFile.getOpcodes(); + + if (bootClassPathEntries == null) { + bootClassPathEntries = getDefaultBootClassPath(dexFile, opcodes.api); + } + + for (String entry : bootClassPathEntries) { + try { + loadLocalOrDeviceBootClassPathEntry(entry); + } catch (NoDexException ex) { + if (entry.endsWith(".jar")) { + String odexEntry = entry.substring(0, entry.length() - 4) + ".odex"; + try { + loadLocalOrDeviceBootClassPathEntry(odexEntry); + } catch (NoDexException ex2) { + throw new ResolveException("Neither %s nor %s contain a dex file", entry, odexEntry); + } catch (NotFoundException ex2) { + throw new ResolveException(ex); + } + } else { + throw new ResolveException(ex); + } + } catch (NotFoundException ex) { + if (entry.endsWith(".odex")) { + String jarEntry = entry.substring(0, entry.length() - 5) + ".jar"; + try { + loadLocalOrDeviceBootClassPathEntry(jarEntry); + } catch (NoDexException ex2) { + throw new ResolveException("Neither %s nor %s contain a dex file", entry, jarEntry); + } catch (NotFoundException ex2) { + throw new ResolveException(ex); + } + } else { + throw new ResolveException(ex); + } + } + } + + for (String entry: extraClassPathEntries) { + // extra classpath entries must be specified using a local path, so we don't need to do the search through + // bootClassPathDirs + try { + loadLocalClassPathEntry(entry); + } catch (NoDexException ex) { + throw new ResolveException(ex); + } + } + + if (dexFile instanceof MultiDexContainer.MultiDexFile) { + MultiDexContainer<? extends MultiDexFile> container = ((MultiDexFile)dexFile).getContainer(); + for (String entry: container.getDexEntryNames()) { + classProviders.add(new DexClassProvider(container.getEntry(entry))); + } + } else { + classProviders.add(new DexClassProvider(dexFile)); + } + } + + @Nonnull + public List<ClassProvider> getResolvedClassProviders() { + return classProviders; + } + + private boolean loadLocalClassPathEntry(@Nonnull String entry) throws NoDexException, IOException { + File entryFile = new File(entry); + if (entryFile.exists() && entryFile.isFile()) { + try { + loadEntry(entryFile, true); + return true; + } catch (UnsupportedFileTypeException ex) { + throw new ResolveException(ex, "Couldn't load classpath entry %s", entry); + } + } + return false; + } + + private void loadLocalOrDeviceBootClassPathEntry(@Nonnull String entry) + throws IOException, NoDexException, NotFoundException { + // first, see if the entry is a valid local path + if (loadLocalClassPathEntry(entry)) { + return; + } + + // It's not a local path, so let's try to resolve it as a device path, relative to one of the provided + // directories + List<String> pathComponents = splitDevicePath(entry); + Joiner pathJoiner = Joiner.on(File.pathSeparatorChar); + + for (String directory: classPathDirs) { + File directoryFile = new File(directory); + if (!directoryFile.exists()) { + continue; + } + + for (int i=0; i<pathComponents.size(); i++) { + String partialPath = pathJoiner.join(pathComponents.subList(i, pathComponents.size())); + File entryFile = new File(directoryFile, partialPath); + if (entryFile.exists() && entryFile.isFile()) { + loadEntry(entryFile, true); + return; + } + } + } + + throw new NotFoundException("Could not find classpath entry %s", entry); + } + + private void loadEntry(@Nonnull File entryFile, boolean loadOatDependencies) + throws IOException, NoDexException { + if (loadedFiles.contains(entryFile)) { + return; + } + + MultiDexContainer<? extends DexBackedDexFile> container; + try { + container = DexFileFactory.loadDexContainer(entryFile, opcodes); + } catch (UnsupportedFileTypeException ex) { + throw new ResolveException(ex); + } + + List<String> entryNames = container.getDexEntryNames(); + + if (entryNames.size() == 0) { + throw new NoDexException("%s contains no dex file", entryFile); + } + + loadedFiles.add(entryFile); + + for (String entryName: entryNames) { + classProviders.add(new DexClassProvider(container.getEntry(entryName))); + } + + if (loadOatDependencies && container instanceof OatFile) { + List<String> oatDependencies = ((OatFile)container).getBootClassPath(); + if (!oatDependencies.isEmpty()) { + try { + loadOatDependencies(entryFile.getParentFile(), oatDependencies); + } catch (NotFoundException ex) { + throw new ResolveException(ex, "Error while loading oat file %s", entryFile); + } catch (NoDexException ex) { + throw new ResolveException(ex, "Error while loading dependencies for oat file %s", entryFile); + } + } + } + } + + @Nonnull + private static List<String> splitDevicePath(@Nonnull String path) { + return Lists.newArrayList(Splitter.on('/').split(path)); + } + + private void loadOatDependencies(@Nonnull File directory, @Nonnull List<String> oatDependencies) + throws IOException, NoDexException, NotFoundException { + // We assume that all oat dependencies are located in the same directory as the oat file + for (String oatDependency: oatDependencies) { + String oatDependencyName = getFilenameForOatDependency(oatDependency); + File file = new File(directory, oatDependencyName); + if (!file.exists()) { + throw new NotFoundException("Cannot find dependency %s in %s", oatDependencyName, directory); + } + + loadEntry(file, false); + } + } + + @Nonnull + private String getFilenameForOatDependency(String oatDependency) { + int index = oatDependency.lastIndexOf('/'); + + String dependencyLeaf = oatDependency.substring(index+1); + if (dependencyLeaf.endsWith(".art")) { + return dependencyLeaf.substring(0, dependencyLeaf.length() - 4) + ".oat"; + } + return dependencyLeaf; + } + + private static class NotFoundException extends Exception { + public NotFoundException(String message, Object... formatArgs) { + super(String.format(message, formatArgs)); + } + } + + private static class NoDexException extends Exception { + public NoDexException(String message, Object... formatArgs) { + super(String.format(message, formatArgs)); + } + } + + /** + * An error that occurred while resolving the classpath + */ + public static class ResolveException extends RuntimeException { + public ResolveException (String message, Object... formatArgs) { + super(String.format(message, formatArgs)); + } + + public ResolveException (Throwable cause) { + super(cause); + } + + public ResolveException (Throwable cause, String message, Object... formatArgs) { + super(String.format(message, formatArgs), cause); + } + } + + /** + * Returns the default boot class path for the given dex file and api level. + */ + @Nonnull + private static List<String> getDefaultBootClassPath(@Nonnull DexFile dexFile, int apiLevel) { + if (dexFile instanceof OatFile.OatDexFile) { + List<String> bcp = ((OatDexFile)dexFile).getContainer().getBootClassPath(); + if (!bcp.isEmpty()) { + for (int i=0; i<bcp.size(); i++) { + String entry = bcp.get(i); + if (entry.endsWith(".art")) { + bcp.set(i, entry.substring(0, entry.length() - 4) + ".oat"); + } + } + return bcp; + } + return Lists.newArrayList("boot.oat"); + } + + if (dexFile instanceof DexBackedOdexFile) { + return ((DexBackedOdexFile)dexFile).getDependencies(); + } + + if (apiLevel <= 8) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar"); + } else if (apiLevel <= 11) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/core-junit.jar"); + } else if (apiLevel <= 13) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/apache-xml.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/core-junit.jar"); + } else if (apiLevel <= 15) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/apache-xml.jar", + "/system/framework/filterfw.jar"); + } else if (apiLevel <= 17) { + // this is correct as of api 17/4.2.2 + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/telephony-common.jar", + "/system/framework/mms-common.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/apache-xml.jar"); + } else if (apiLevel <= 18) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/telephony-common.jar", + "/system/framework/voip-common.jar", + "/system/framework/mms-common.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/apache-xml.jar"); + } else if (apiLevel <= 19) { + return Lists.newArrayList( + "/system/framework/core.jar", + "/system/framework/conscrypt.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/framework2.jar", + "/system/framework/telephony-common.jar", + "/system/framework/voip-common.jar", + "/system/framework/mms-common.jar", + "/system/framework/android.policy.jar", + "/system/framework/services.jar", + "/system/framework/apache-xml.jar", + "/system/framework/webviewchromium.jar"); + } else if (apiLevel <= 22) { + return Lists.newArrayList( + "/system/framework/core-libart.jar", + "/system/framework/conscrypt.jar", + "/system/framework/okhttp.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/telephony-common.jar", + "/system/framework/voip-common.jar", + "/system/framework/ims-common.jar", + "/system/framework/mms-common.jar", + "/system/framework/android.policy.jar", + "/system/framework/apache-xml.jar"); + } else if (apiLevel <= 23) { + return Lists.newArrayList( + "/system/framework/core-libart.jar", + "/system/framework/conscrypt.jar", + "/system/framework/okhttp.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/telephony-common.jar", + "/system/framework/voip-common.jar", + "/system/framework/ims-common.jar", + "/system/framework/apache-xml.jar", + "/system/framework/org.apache.http.legacy.boot.jar"); + } else /*if (apiLevel <= 24)*/ { + return Lists.newArrayList( + "/system/framework/core-oj.jar", + "/system/framework/core-libart.jar", + "/system/framework/conscrypt.jar", + "/system/framework/okhttp.jar", + "/system/framework/core-junit.jar", + "/system/framework/bouncycastle.jar", + "/system/framework/ext.jar", + "/system/framework/framework.jar", + "/system/framework/telephony-common.jar", + "/system/framework/voip-common.jar", + "/system/framework/ims-common.jar", + "/system/framework/apache-xml.jar", + "/system/framework/org.apache.http.legacy.boot.jar"); + } + } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java index cef683ce..44cc5e24 100644..100755 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java @@ -31,6 +31,7 @@ package org.jf.dexlib2.analysis; +import com.google.common.base.Joiner; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; @@ -38,12 +39,10 @@ import com.google.common.collect.*; import com.google.common.primitives.Ints; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.analysis.util.TypeProtoUtils; -import org.jf.dexlib2.iface.ClassDef; -import org.jf.dexlib2.iface.Field; -import org.jf.dexlib2.iface.Method; +import org.jf.dexlib2.base.reference.BaseMethodReference; +import org.jf.dexlib2.iface.*; import org.jf.dexlib2.iface.reference.FieldReference; import org.jf.dexlib2.iface.reference.MethodReference; -import org.jf.dexlib2.immutable.ImmutableMethod; import org.jf.dexlib2.util.MethodUtil; import org.jf.util.AlignmentUtils; import org.jf.util.ExceptionWithContext; @@ -52,6 +51,7 @@ import org.jf.util.SparseArray; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; +import java.util.Map.Entry; /** * A class "prototype". This contains things like the interfaces, the superclass, the vtable and the instance fields @@ -122,11 +122,18 @@ public class ClassProto implements TypeProto { */ @Nonnull protected LinkedHashMap<String, ClassDef> getInterfaces() { - return interfacesSupplier.get(); + if (!classPath.isArt() || classPath.oatVersion < 72) { + return preDefaultMethodInterfaceSupplier.get(); + } else { + return postDefaultMethodInterfaceSupplier.get(); + } } + /** + * This calculates the interfaces in the order required for vtable generation for dalvik and pre-default method ART + */ @Nonnull - private final Supplier<LinkedHashMap<String, ClassDef>> interfacesSupplier = + private final Supplier<LinkedHashMap<String, ClassDef>> preDefaultMethodInterfaceSupplier = Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() { @Override public LinkedHashMap<String, ClassDef> get() { Set<String> unresolvedInterfaces = new HashSet<String>(0); @@ -148,7 +155,8 @@ public class ClassProto implements TypeProto { ClassProto interfaceProto = (ClassProto) classPath.getClass(interfaceType); for (String superInterface: interfaceProto.getInterfaces().keySet()) { if (!interfaces.containsKey(superInterface)) { - interfaces.put(superInterface, interfaceProto.getInterfaces().get(superInterface)); + interfaces.put(superInterface, + interfaceProto.getInterfaces().get(superInterface)); } } if (!interfaceProto.interfacesFullyResolved) { @@ -158,6 +166,7 @@ public class ClassProto implements TypeProto { } } } catch (UnresolvedClassException ex) { + interfaces.put(type, null); unresolvedInterfaces.add(type); interfacesFullyResolved = false; } @@ -196,6 +205,71 @@ public class ClassProto implements TypeProto { } }); + /** + * This calculates the interfaces in the order required for vtable generation for post-default method ART + */ + @Nonnull + private final Supplier<LinkedHashMap<String, ClassDef>> postDefaultMethodInterfaceSupplier = + Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() { + @Override public LinkedHashMap<String, ClassDef> get() { + Set<String> unresolvedInterfaces = new HashSet<String>(0); + LinkedHashMap<String, ClassDef> interfaces = Maps.newLinkedHashMap(); + + String superclass = getSuperclass(); + if (superclass != null) { + ClassProto superclassProto = (ClassProto) classPath.getClass(superclass); + for (String superclassInterface: superclassProto.getInterfaces().keySet()) { + interfaces.put(superclassInterface, null); + } + if (!superclassProto.interfacesFullyResolved) { + unresolvedInterfaces.addAll(superclassProto.getUnresolvedInterfaces()); + interfacesFullyResolved = false; + } + } + + try { + for (String interfaceType: getClassDef().getInterfaces()) { + if (!interfaces.containsKey(interfaceType)) { + ClassProto interfaceProto = (ClassProto)classPath.getClass(interfaceType); + try { + for (Entry<String, ClassDef> entry: interfaceProto.getInterfaces().entrySet()) { + if (!interfaces.containsKey(entry.getKey())) { + interfaces.put(entry.getKey(), entry.getValue()); + } + } + } catch (UnresolvedClassException ex) { + interfaces.put(interfaceType, null); + unresolvedInterfaces.add(interfaceType); + interfacesFullyResolved = false; + } + if (!interfaceProto.interfacesFullyResolved) { + unresolvedInterfaces.addAll(interfaceProto.getUnresolvedInterfaces()); + interfacesFullyResolved = false; + } + try { + ClassDef interfaceDef = classPath.getClassDef(interfaceType); + interfaces.put(interfaceType, interfaceDef); + } catch (UnresolvedClassException ex) { + interfaces.put(interfaceType, null); + unresolvedInterfaces.add(interfaceType); + interfacesFullyResolved = false; + } + } + } + } catch (UnresolvedClassException ex) { + interfaces.put(type, null); + unresolvedInterfaces.add(type); + interfacesFullyResolved = false; + } + + if (unresolvedInterfaces.size() > 0) { + ClassProto.this.unresolvedInterfaces = unresolvedInterfaces; + } + + return interfaces; + } + }); + @Nonnull protected Set<String> getUnresolvedInterfaces() { if (unresolvedInterfaces == null) { @@ -219,7 +293,7 @@ public class ClassProto implements TypeProto { if (!interfacesFullyResolved) { throw new UnresolvedClassException("Interfaces for class %s not fully resolved: %s", getType(), - getUnresolvedInterfaces()); + Joiner.on(',').join(getUnresolvedInterfaces())); } return directInterfaces; @@ -378,7 +452,10 @@ public class ClassProto implements TypeProto { } public int findMethodIndexInVtable(@Nonnull MethodReference method) { - List<Method> vtable = getVtable(); + return findMethodIndexInVtable(getVtable(), method); + } + + private int findMethodIndexInVtable(@Nonnull List<Method> vtable, MethodReference method) { for (int i=0; i<vtable.size(); i++) { Method candidate = vtable.get(i); if (MethodUtil.methodSignaturesMatch(candidate, method)) { @@ -391,7 +468,20 @@ public class ClassProto implements TypeProto { return -1; } - @Nonnull SparseArray<FieldReference> getInstanceFields() { + private int findMethodIndexInVtableReverse(@Nonnull List<Method> vtable, MethodReference method) { + for (int i=vtable.size() - 1; i>=0; i--) { + Method candidate = vtable.get(i); + if (MethodUtil.methodSignaturesMatch(candidate, method)) { + if (!classPath.shouldCheckPackagePrivateAccess() || + AnalyzedMethodUtil.canAccess(this, candidate, true, false, false)) { + return i; + } + } + } + return -1; + } + + @Nonnull public SparseArray<FieldReference> getInstanceFields() { if (classPath.isArt()) { return artInstanceFieldsSupplier.get(); } else { @@ -439,10 +529,8 @@ public class ClassProto implements TypeProto { ClassProto superclass = null; if (superclassType != null) { superclass = (ClassProto) classPath.getClass(superclassType); - if (superclass != null) { startFieldOffset = superclass.getNextFieldOffset(); } - } int fieldIndexMod; if ((startFieldOffset % 8) == 0) { @@ -529,14 +617,12 @@ public class ClassProto implements TypeProto { //add padding to align the wide fields, if needed if (fieldTypes[i] == WIDE && !gotDouble) { - if (!gotDouble) { if (fieldOffset % 8 != 0) { assert fieldOffset % 8 == 4; fieldOffset += 4; } gotDouble = true; } - } instanceFields.append(fieldOffset, field); if (fieldTypes[i] == WIDE) { @@ -573,7 +659,7 @@ public class ClassProto implements TypeProto { public static FieldGap newFieldGap(int offset, int size, int oatVersion) { if (oatVersion >= 67) { return new FieldGap(offset, size) { - @Override public int compareTo(FieldGap o) { + @Override public int compareTo(@Nonnull FieldGap o) { int result = Ints.compare(o.size, size); if (result != 0) { return result; @@ -583,7 +669,7 @@ public class ClassProto implements TypeProto { }; } else { return new FieldGap(offset, size) { - @Override public int compareTo(FieldGap o) { + @Override public int compareTo(@Nonnull FieldGap o) { int result = Ints.compare(size, o.size); if (result != 0) { return result; @@ -777,12 +863,18 @@ public class ClassProto implements TypeProto { throw new ExceptionWithContext("Invalid type: %s", type); } - @Nonnull List<Method> getVtable() { - return vtableSupplier.get(); + @Nonnull public List<Method> getVtable() { + if (!classPath.isArt() || classPath.oatVersion < 72) { + return preDefaultMethodVtableSupplier.get(); + } else if (classPath.oatVersion < 87) { + return buggyPostDefaultMethodVtableSupplier.get(); + } else { + return postDefaultMethodVtableSupplier.get(); + } } //TODO: check the case when we have a package private method that overrides an interface method - @Nonnull private final Supplier<List<Method>> vtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() { + @Nonnull private final Supplier<List<Method>> preDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() { @Override public List<Method> get() { List<Method> vtable = Lists.newArrayList(); @@ -811,52 +903,315 @@ public class ClassProto implements TypeProto { //iterate over the virtual methods in the current class, and only add them when we don't already have the //method (i.e. if it was implemented by the superclass) if (!isInterface()) { - addToVtable(getClassDef().getVirtualMethods(), vtable, true); + addToVtable(getClassDef().getVirtualMethods(), vtable, true, true); - // assume that interface method is implemented in the current class, when adding it to vtable - // otherwise it looks like that method is invoked on an interface, which fails Dalvik's optimization checks - for (ClassDef interfaceDef: getDirectInterfaces()) { + // We use the current class for any vtable method references that we add, rather than the interface, so + // we don't end up trying to call invoke-virtual using an interface, which will fail verification + Iterable<ClassDef> interfaces = getDirectInterfaces(); + for (ClassDef interfaceDef: interfaces) { List<Method> interfaceMethods = Lists.newArrayList(); for (Method interfaceMethod: interfaceDef.getVirtualMethods()) { - ImmutableMethod method = new ImmutableMethod( - type, - interfaceMethod.getName(), - interfaceMethod.getParameters(), - interfaceMethod.getReturnType(), - interfaceMethod.getAccessFlags(), - interfaceMethod.getAnnotations(), - interfaceMethod.getImplementation()); - interfaceMethods.add(method); + interfaceMethods.add(new ReparentedMethod(interfaceMethod, type)); } - addToVtable(interfaceMethods, vtable, false); + addToVtable(interfaceMethods, vtable, false, true); } } return vtable; } + }); - private void addToVtable(@Nonnull Iterable<? extends Method> localMethods, - @Nonnull List<Method> vtable, boolean replaceExisting) { - List<? extends Method> methods = Lists.newArrayList(localMethods); - Collections.sort(methods); + /** + * This is the vtable supplier for a version of art that had buggy vtable calculation logic. In some cases it can + * produce multiple vtable entries for a given virtual method. This supplier duplicates this buggy logic in order to + * generate an identical vtable + */ + @Nonnull private final Supplier<List<Method>> buggyPostDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() { + @Override public List<Method> get() { + List<Method> vtable = Lists.newArrayList(); + + //copy the virtual methods from the superclass + String superclassType; + try { + superclassType = getSuperclass(); + } catch (UnresolvedClassException ex) { + vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable()); + vtableFullyResolved = false; + return vtable; + } + + if (superclassType != null) { + ClassProto superclass = (ClassProto) classPath.getClass(superclassType); + vtable.addAll(superclass.getVtable()); + + // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by + // this class should start, so we just propagate what we can from the parent and hope for the best. + if (!superclass.vtableFullyResolved) { + vtableFullyResolved = false; + return vtable; + } + } + + //iterate over the virtual methods in the current class, and only add them when we don't already have the + //method (i.e. if it was implemented by the superclass) + if (!isInterface()) { + addToVtable(getClassDef().getVirtualMethods(), vtable, true, true); + + List<String> interfaces = Lists.newArrayList(getInterfaces().keySet()); + + List<Method> defaultMethods = Lists.newArrayList(); + List<Method> defaultConflictMethods = Lists.newArrayList(); + List<Method> mirandaMethods = Lists.newArrayList(); - outer: for (Method virtualMethod: methods) { - for (int i=0; i<vtable.size(); i++) { - Method superMethod = vtable.get(i); - if (MethodUtil.methodSignaturesMatch(superMethod, virtualMethod)) { + final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap(); + + for (int i=interfaces.size()-1; i>=0; i--) { + String interfaceType = interfaces.get(i); + ClassDef interfaceDef = classPath.getClassDef(interfaceType); + + for (Method interfaceMethod : interfaceDef.getVirtualMethods()) { + + int vtableIndex = findMethodIndexInVtableReverse(vtable, interfaceMethod); + Method oldVtableMethod = null; + if (vtableIndex >= 0) { + oldVtableMethod = vtable.get(vtableIndex); + } + + for (int j=0; j<vtable.size(); j++) { + Method candidate = vtable.get(j); + if (MethodUtil.methodSignaturesMatch(candidate, interfaceMethod)) { if (!classPath.shouldCheckPackagePrivateAccess() || - AnalyzedMethodUtil.canAccess(ClassProto.this, superMethod, true, false, false)) { - if (replaceExisting) { - vtable.set(i, virtualMethod); + AnalyzedMethodUtil.canAccess(ClassProto.this, candidate, true, false, false)) { + if (interfaceMethodOverrides(interfaceMethod, candidate)) { + vtable.set(j, interfaceMethod); + } + } + } + } + + if (vtableIndex >= 0) { + if (!isOverridableByDefaultMethod(vtable.get(vtableIndex))) { + continue; + } + } + + int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod); + + if (defaultMethodIndex >= 0) { + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + ClassProto existingInterface = (ClassProto)classPath.getClass( + defaultMethods.get(defaultMethodIndex).getDefiningClass()); + if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) { + Method removedMethod = defaultMethods.remove(defaultMethodIndex); + defaultConflictMethods.add(removedMethod); + } } - continue outer; + continue; } + + int defaultConflictMethodIndex = findMethodIndexInVtable( + defaultConflictMethods, interfaceMethod); + if (defaultConflictMethodIndex >= 0) { + // There's already a matching method in the conflict list, we don't need to do + // anything else + continue; + } + + int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod); + + if (mirandaMethodIndex >= 0) { + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + + ClassProto existingInterface = (ClassProto)classPath.getClass( + mirandaMethods.get(mirandaMethodIndex).getDefiningClass()); + if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) { + Method oldMethod = mirandaMethods.remove(mirandaMethodIndex); + int methodOrderValue = methodOrder.get(oldMethod); + methodOrder.put(interfaceMethod, methodOrderValue); + defaultMethods.add(interfaceMethod); + } + } + continue; + } + + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + if (oldVtableMethod != null) { + if (!interfaceMethodOverrides(interfaceMethod, oldVtableMethod)) { + continue; + } + } + defaultMethods.add(interfaceMethod); + methodOrder.put(interfaceMethod, methodOrder.size()); + } else { + // TODO: do we need to check interfaceMethodOverrides here? + if (oldVtableMethod == null) { + mirandaMethods.add(interfaceMethod); + methodOrder.put(interfaceMethod, methodOrder.size()); + } + } + } + } + + Comparator<MethodReference> comparator = new Comparator<MethodReference>() { + @Override public int compare(MethodReference o1, MethodReference o2) { + return Ints.compare(methodOrder.get(o1), methodOrder.get(o2)); + } + }; + + // The methods should be in the same order within each list as they were iterated over. + // They can be misordered if, e.g. a method was originally added to the default list, but then moved + // to the conflict list. + Collections.sort(mirandaMethods, comparator); + Collections.sort(defaultMethods, comparator); + Collections.sort(defaultConflictMethods, comparator); + + vtable.addAll(mirandaMethods); + vtable.addAll(defaultMethods); + vtable.addAll(defaultConflictMethods); + } + return vtable; + } + }); + + @Nonnull private final Supplier<List<Method>> postDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() { + @Override public List<Method> get() { + List<Method> vtable = Lists.newArrayList(); + + //copy the virtual methods from the superclass + String superclassType; + try { + superclassType = getSuperclass(); + } catch (UnresolvedClassException ex) { + vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable()); + vtableFullyResolved = false; + return vtable; + } + + if (superclassType != null) { + ClassProto superclass = (ClassProto) classPath.getClass(superclassType); + vtable.addAll(superclass.getVtable()); + + // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by + // this class should start, so we just propagate what we can from the parent and hope for the best. + if (!superclass.vtableFullyResolved) { + vtableFullyResolved = false; + return vtable; + } + } + + //iterate over the virtual methods in the current class, and only add them when we don't already have the + //method (i.e. if it was implemented by the superclass) + if (!isInterface()) { + addToVtable(getClassDef().getVirtualMethods(), vtable, true, true); + + Iterable<ClassDef> interfaces = Lists.reverse(Lists.newArrayList(getDirectInterfaces())); + + List<Method> defaultMethods = Lists.newArrayList(); + List<Method> defaultConflictMethods = Lists.newArrayList(); + List<Method> mirandaMethods = Lists.newArrayList(); + + final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap(); + + for (ClassDef interfaceDef: interfaces) { + for (Method interfaceMethod : interfaceDef.getVirtualMethods()) { + + int vtableIndex = findMethodIndexInVtable(vtable, interfaceMethod); + + if (vtableIndex >= 0) { + if (interfaceMethodOverrides(interfaceMethod, vtable.get(vtableIndex))) { + vtable.set(vtableIndex, interfaceMethod); + } + } else { + int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod); + + if (defaultMethodIndex >= 0) { + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + ClassProto existingInterface = (ClassProto)classPath.getClass( + defaultMethods.get(defaultMethodIndex).getDefiningClass()); + if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) { + Method removedMethod = defaultMethods.remove(defaultMethodIndex); + defaultConflictMethods.add(removedMethod); + } + } + continue; + } + + int defaultConflictMethodIndex = findMethodIndexInVtable( + defaultConflictMethods, interfaceMethod); + if (defaultConflictMethodIndex >= 0) { + // There's already a matching method in the conflict list, we don't need to do + // anything else + continue; + } + + int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod); + + if (mirandaMethodIndex >= 0) { + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + + ClassProto existingInterface = (ClassProto)classPath.getClass( + mirandaMethods.get(mirandaMethodIndex).getDefiningClass()); + if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) { + Method oldMethod = mirandaMethods.remove(mirandaMethodIndex); + int methodOrderValue = methodOrder.get(oldMethod); + methodOrder.put(interfaceMethod, methodOrderValue); + defaultMethods.add(interfaceMethod); + } + } + continue; + } + + if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) { + defaultMethods.add(interfaceMethod); + methodOrder.put(interfaceMethod, methodOrder.size()); + } else { + mirandaMethods.add(interfaceMethod); + methodOrder.put(interfaceMethod, methodOrder.size()); + } + } + } + } + + Comparator<MethodReference> comparator = new Comparator<MethodReference>() { + @Override public int compare(MethodReference o1, MethodReference o2) { + return Ints.compare(methodOrder.get(o1), methodOrder.get(o2)); } + }; + + // The methods should be in the same order within each list as they were iterated over. + // They can be misordered if, e.g. a method was originally added to the default list, but then moved + // to the conflict list. + Collections.sort(defaultMethods, comparator); + Collections.sort(defaultConflictMethods, comparator); + Collections.sort(mirandaMethods, comparator); + addToVtable(defaultMethods, vtable, false, false); + addToVtable(defaultConflictMethods, vtable, false, false); + addToVtable(mirandaMethods, vtable, false, false); + } + return vtable; + } + }); + + private void addToVtable(@Nonnull Iterable<? extends Method> localMethods, @Nonnull List<Method> vtable, + boolean replaceExisting, boolean sort) { + if (sort) { + ArrayList<Method> methods = Lists.newArrayList(localMethods); + Collections.sort(methods); + localMethods = methods; + } + + for (Method virtualMethod: localMethods) { + int vtableIndex = findMethodIndexInVtable(vtable, virtualMethod); + + if (vtableIndex >= 0) { + if (replaceExisting) { + vtable.set(vtableIndex, virtualMethod); } + } else { // we didn't find an equivalent method, so add it as a new entry vtable.add(virtualMethod); } } - }); + } private static byte getFieldType(@Nonnull FieldReference field) { switch (field.getType().charAt(0)) { @@ -870,4 +1225,68 @@ public class ClassProto implements TypeProto { return 2; //OTHER } } + + private boolean isOverridableByDefaultMethod(@Nonnull Method method) { + ClassProto classProto = (ClassProto)classPath.getClass(method.getDefiningClass()); + return classProto.isInterface(); + } + + /** + * Checks if the interface method overrides the virtual or interface method2 + * @param method A Method from an interface + * @param method2 A Method from an interface or a class + * @return true if the interface method overrides the virtual or interface method2 + */ + private boolean interfaceMethodOverrides(@Nonnull Method method, @Nonnull Method method2) { + ClassProto classProto = (ClassProto)classPath.getClass(method2.getDefiningClass()); + + if (classProto.isInterface()) { + ClassProto targetClassProto = (ClassProto)classPath.getClass(method.getDefiningClass()); + return targetClassProto.implementsInterface(method2.getDefiningClass()); + } else { + return false; + } + } + + static class ReparentedMethod extends BaseMethodReference implements Method { + private final Method method; + private final String definingClass; + + public ReparentedMethod(Method method, String definingClass) { + this.method = method; + this.definingClass = definingClass; + } + + @Nonnull @Override public String getDefiningClass() { + return definingClass; + } + + @Nonnull @Override public String getName() { + return method.getName(); + } + + @Nonnull @Override public List<? extends CharSequence> getParameterTypes() { + return method.getParameterTypes(); + } + + @Nonnull @Override public String getReturnType() { + return method.getReturnType(); + } + + @Nonnull @Override public List<? extends MethodParameter> getParameters() { + return method.getParameters(); + } + + @Override public int getAccessFlags() { + return method.getAccessFlags(); + } + + @Nonnull @Override public Set<? extends Annotation> getAnnotations() { + return method.getAnnotations(); + } + + @Nullable @Override public MethodImplementation getImplementation() { + return method.getImplementation(); + } + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java deleted file mode 100644 index 2bb3e492..00000000 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2013, Google Inc. - * All rights reserved. - * - * 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 Inc. 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 org.jf.dexlib2.analysis; - -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; -import org.apache.commons.cli.*; -import org.jf.dexlib2.DexFileFactory; -import org.jf.dexlib2.dexbacked.DexBackedDexFile; -import org.jf.dexlib2.iface.ClassDef; -import org.jf.dexlib2.iface.Field; -import org.jf.dexlib2.iface.Method; -import org.jf.dexlib2.iface.reference.FieldReference; -import org.jf.util.ConsoleUtil; -import org.jf.util.SparseArray; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; - -public class DumpFields { - private static final Options options; - - static { - options = new Options(); - buildOptions(); - } - - public static void main(String[] args) { - CommandLineParser parser = new PosixParser(); - CommandLine commandLine; - - try { - commandLine = parser.parse(options, args); - } catch (ParseException ex) { - usage(); - return; - } - - String[] remainingArgs = commandLine.getArgs(); - - Option[] parsedOptions = commandLine.getOptions(); - ArrayList<String> bootClassPathDirs = Lists.newArrayList(); - String outFile = "fields.txt"; - int apiLevel = 15; - boolean experimental = false; - - for (int i=0; i<parsedOptions.length; i++) { - Option option = parsedOptions[i]; - String opt = option.getOpt(); - - switch (opt.charAt(0)) { - case 'd': - bootClassPathDirs.add(option.getValue()); - break; - case 'o': - outFile = option.getValue(); - break; - case 'a': - apiLevel = Integer.parseInt(commandLine.getOptionValue("a")); - break; - case 'X': - experimental = true; - break; - default: - assert false; - } - } - - if (remainingArgs.length != 1) { - usage(); - return; - } - - String inputDexFileName = remainingArgs[0]; - - File dexFileFile = new File(inputDexFileName); - if (!dexFileFile.exists()) { - System.err.println("Can't find the file " + inputDexFileName); - System.exit(1); - } - - try { - DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, apiLevel, experimental); - Iterable<String> bootClassPaths = Splitter.on(":").split("core.jar:ext.jar:framework.jar:android.policy.jar:services.jar"); - ClassPath classPath = ClassPath.fromClassPath(bootClassPathDirs, bootClassPaths, dexFile, apiLevel, experimental); - FileOutputStream outStream = new FileOutputStream(outFile); - - for (ClassDef classDef: dexFile.getClasses()) { - ClassProto classProto = (ClassProto) classPath.getClass(classDef); - SparseArray<FieldReference> fields = classProto.getInstanceFields(); - String className = "Class " + classDef.getType() + " : " + fields.size() + " instance fields\n"; - outStream.write(className.getBytes()); - for (int i=0;i<fields.size();i++) { - String field = fields.keyAt(i) + ":" + fields.valueAt(i).getType() + " " + fields.valueAt(i).getName() + "\n"; - outStream.write(field.getBytes()); - } - outStream.write("\n".getBytes()); - } - outStream.close(); - } catch (IOException ex) { - System.out.println("IOException thrown when trying to open a dex file or write out vtables: " + ex); - } - - } - - /** - * Prints the usage message. - */ - private static void usage() { - int consoleWidth = ConsoleUtil.getConsoleWidth(); - if (consoleWidth <= 0) { - consoleWidth = 80; - } - - System.out.println("java -cp baksmali.jar org.jf.dexlib2.analysis.DumpFields -d path/to/framework/jar/files <dex-file>"); - } - - private static void buildOptions() { - Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir") - .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " + - "directory") - .hasArg() - .withArgName("DIR") - .create("d"); - - Option outputFileOption = OptionBuilder.withLongOpt("out-file") - .withDescription("output file") - .hasArg() - .withArgName("FILE") - .create("o"); - - Option apiLevelOption = OptionBuilder.withLongOpt("api-level") - .withDescription("The numeric api-level of the file being disassembled. If not " + - "specified, it defaults to 15 (ICS).") - .hasArg() - .withArgName("API_LEVEL") - .create("a"); - - Option experimentalOption = OptionBuilder.withLongOpt("experimental") - .withDescription("Enable dumping experimental opcodes, that aren't necessarily " + - "supported by the android runtime yet.") - .create("X"); - - options.addOption(classPathDirOption); - options.addOption(outputFileOption); - options.addOption(apiLevelOption); - options.addOption(experimentalOption); - } -} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java deleted file mode 100644 index 193c0d39..00000000 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2013, Google Inc. - * All rights reserved. - * - * 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 Inc. 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 org.jf.dexlib2.analysis; - -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; -import org.apache.commons.cli.*; -import org.jf.dexlib2.DexFileFactory; -import org.jf.dexlib2.dexbacked.DexBackedDexFile; -import org.jf.dexlib2.iface.ClassDef; -import org.jf.dexlib2.iface.Method; -import org.jf.util.ConsoleUtil; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -public class DumpVtables { - private static final Options options; - - static { - options = new Options(); - buildOptions(); - } - - public static void main(String[] args) { - CommandLineParser parser = new PosixParser(); - CommandLine commandLine; - - try { - commandLine = parser.parse(options, args); - } catch (ParseException ex) { - usage(); - return; - } - - String[] remainingArgs = commandLine.getArgs(); - - Option[] parsedOptions = commandLine.getOptions(); - ArrayList<String> bootClassPathDirs = Lists.newArrayList(); - String outFile = "vtables.txt"; - int apiLevel = 15; - boolean experimental = false; - - for (int i=0; i<parsedOptions.length; i++) { - Option option = parsedOptions[i]; - String opt = option.getOpt(); - - switch (opt.charAt(0)) { - case 'd': - bootClassPathDirs.add(option.getValue()); - break; - case 'o': - outFile = option.getValue(); - break; - case 'a': - apiLevel = Integer.parseInt(commandLine.getOptionValue("a")); - break; - case 'X': - experimental = true; - break; - default: - assert false; - } - } - - if (remainingArgs.length != 1) { - usage(); - return; - } - - String inputDexFileName = remainingArgs[0]; - - File dexFileFile = new File(inputDexFileName); - if (!dexFileFile.exists()) { - System.err.println("Can't find the file " + inputDexFileName); - System.exit(1); - } - - try { - DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, apiLevel, experimental); - Iterable<String> bootClassPaths = Splitter.on(":").split("core.jar:ext.jar:framework.jar:android.policy.jar:services.jar"); - ClassPath classPath = ClassPath.fromClassPath(bootClassPathDirs, bootClassPaths, dexFile, apiLevel, experimental); - FileOutputStream outStream = new FileOutputStream(outFile); - - for (ClassDef classDef: dexFile.getClasses()) { - ClassProto classProto = (ClassProto) classPath.getClass(classDef); - List<Method> methods = classProto.getVtable(); - String className = "Class " + classDef.getType() + " extends " + classDef.getSuperclass() + " : " + methods.size() + " methods\n"; - outStream.write(className.getBytes()); - for (int i=0;i<methods.size();i++) { - Method method = methods.get(i); - - String methodString = i + ":" + method.getDefiningClass() + "->" + method.getName() + "("; - for (CharSequence parameter: method.getParameterTypes()) { - methodString += parameter; - } - methodString += ")" + method.getReturnType() + "\n"; - outStream.write(methodString.getBytes()); - } - outStream.write("\n".getBytes()); - } - outStream.close(); - } catch (IOException ex) { - System.out.println("IOException thrown when trying to open a dex file or write out vtables: " + ex); - } - - } - - /** - * Prints the usage message. - */ - private static void usage() { - int consoleWidth = ConsoleUtil.getConsoleWidth(); - if (consoleWidth <= 0) { - consoleWidth = 80; - } - - System.out.println("java -cp baksmali.jar org.jf.dexlib2.analysis.DumpVtables -d path/to/framework/jar/files <dex-file>"); - } - - private static void buildOptions() { - Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir") - .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " + - "directory") - .hasArg() - .withArgName("DIR") - .create("d"); - - Option outputFileOption = OptionBuilder.withLongOpt("out-file") - .withDescription("output file") - .hasArg() - .withArgName("FILE") - .create("o"); - - Option apiLevelOption = OptionBuilder.withLongOpt("api-level") - .withDescription("The numeric api-level of the file being disassembled. If not " + - "specified, it defaults to 15 (ICS).") - .hasArg() - .withArgName("API_LEVEL") - .create("a"); - - Option experimentalOption = OptionBuilder.withLongOpt("experimental") - .withDescription("Enable dumping experimental opcodes, that aren't necessarily " + - "supported by the android runtime yet.") - .create("X"); - - options.addOption(classPathDirOption); - options.addOption(outputFileOption); - options.addOption(apiLevelOption); - options.addOption(experimentalOption); - } -} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java index b7a15a01..7a51c96c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java @@ -36,6 +36,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.jf.dexlib2.AccessFlags; import org.jf.dexlib2.Opcode; +import org.jf.dexlib2.base.reference.BaseMethodReference; import org.jf.dexlib2.iface.*; import org.jf.dexlib2.iface.instruction.*; import org.jf.dexlib2.iface.instruction.formats.*; @@ -89,10 +90,10 @@ public class MethodAnalyzer { @Nullable private AnalysisException analysisException = null; - //This is a dummy instruction that occurs immediately before the first real instruction. We can initialize the - //register types for this instruction to the parameter types, in order to have them propagate to all of its - //successors, e.g. the first real instruction, the first instructions in any exception handlers covering the first - //instruction, etc. + // This is a dummy instruction that occurs immediately before the first real instruction. We can initialize the + // register types for this instruction to the parameter types, in order to have them propagate to all of its + // successors, e.g. the first real instruction, the first instructions in any exception handlers covering the first + // instruction, etc. private final AnalyzedInstruction startOfMethod; public MethodAnalyzer(@Nonnull ClassPath classPath, @Nonnull Method method, @@ -110,27 +111,16 @@ public class MethodAnalyzer { this.methodImpl = methodImpl; - //override AnalyzedInstruction and provide custom implementations of some of the methods, so that we don't - //have to handle the case this special case of instruction being null, in the main class - startOfMethod = new AnalyzedInstruction(this, null, -1, methodImpl.getRegisterCount()) { - public boolean setsRegister() { - return false; - } - - @Override - public boolean setsWideRegister() { - return false; - } - - @Override - public boolean setsRegister(int registerNumber) { - return false; + // Override AnalyzedInstruction and provide custom implementations of some of the methods, so that we don't + // have to handle the case this special case of instruction being null, in the main class + startOfMethod = new AnalyzedInstruction(this, new ImmutableInstruction10x(Opcode.NOP), -1, methodImpl.getRegisterCount()) { + @Override protected boolean addPredecessor(AnalyzedInstruction predecessor) { + throw new UnsupportedOperationException(); } - @Override - public int getDestinationRegister() { - assert false; - return -1; + @Override @Nonnull + public RegisterType getPredecessorRegisterType(@Nonnull AnalyzedInstruction predecessor, int registerNumber) { + throw new UnsupportedOperationException(); } }; @@ -141,6 +131,7 @@ public class MethodAnalyzer { analyze(); } + @Nonnull public ClassPath getClassPath() { return classPath; } @@ -362,6 +353,7 @@ public class MethodAnalyzer { private void overridePredecessorRegisterTypeAndPropagateChanges( @Nonnull AnalyzedInstruction analyzedInstruction, @Nonnull AnalyzedInstruction predecessor, int registerNumber, @Nonnull RegisterType registerType) { + BitSet changedInstructions = new BitSet(analyzedInstructions.size()); if (!analyzedInstruction.overridePredecessorRegisterType( @@ -383,6 +375,28 @@ public class MethodAnalyzer { } } + private void initializeRefAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction, + int registerNumber, @Nonnull RegisterType registerType) { + + BitSet changedInstructions = new BitSet(analyzedInstructions.size()); + + if (!analyzedInstruction.setPostRegisterType(registerNumber, registerType)) { + return; + } + + propagateRegisterToSuccessors(analyzedInstruction, registerNumber, changedInstructions, false); + + propagateChanges(changedInstructions, registerNumber, false); + + if (registerType.category == RegisterType.LONG_LO) { + checkWidePair(registerNumber, analyzedInstruction); + setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.LONG_HI_TYPE); + } else if (registerType.category == RegisterType.DOUBLE_LO) { + checkWidePair(registerNumber, analyzedInstruction); + setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.DOUBLE_HI_TYPE); + } + } + private void setPostRegisterTypeAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction, int registerNumber, @Nonnull RegisterType registerType) { @@ -1176,32 +1190,46 @@ public class MethodAnalyzer { setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, castRegisterType); } - static boolean canNarrowAfterInstanceOf(AnalyzedInstruction analyzedInstanceOfInstruction, - AnalyzedInstruction analyzedIfInstruction, ClassPath classPath) { + public static boolean isNotWideningConversion(RegisterType originalType, RegisterType newType) { + if (originalType.type == null || newType.type == null) { + return true; + } + if (originalType.type.isInterface()) { + return newType.type.implementsInterface(originalType.type.getType()); + } else { + TypeProto commonSuperclass = newType.type.getCommonSuperclass(originalType.type); + if (commonSuperclass.getType().equals(originalType.type.getType())) { + return true; + } + if (commonSuperclass.getType().equals(newType.type.getType())) { + return false; + } + } + return true; + } + + static boolean canPropagateTypeAfterInstanceOf(AnalyzedInstruction analyzedInstanceOfInstruction, + AnalyzedInstruction analyzedIfInstruction, ClassPath classPath) { + if (!classPath.isArt()) { + return false; + } + Instruction ifInstruction = analyzedIfInstruction.instruction; - assert analyzedIfInstruction.instruction != null; if (((Instruction21t)ifInstruction).getRegisterA() == analyzedInstanceOfInstruction.getDestinationRegister()) { Reference reference = ((Instruction22c)analyzedInstanceOfInstruction.getInstruction()).getReference(); RegisterType registerType = RegisterType.getRegisterType(classPath, (TypeReference)reference); - if (registerType.type != null && !registerType.type.isInterface()) { - int objectRegister = ((TwoRegisterInstruction)analyzedInstanceOfInstruction.getInstruction()) - .getRegisterB(); + try { + if (registerType.type != null && !registerType.type.isInterface()) { + int objectRegister = ((TwoRegisterInstruction)analyzedInstanceOfInstruction.getInstruction()) + .getRegisterB(); - RegisterType originalType = analyzedIfInstruction.getPreInstructionRegisterType(objectRegister); + RegisterType originalType = analyzedIfInstruction.getPreInstructionRegisterType(objectRegister); - if (originalType.type != null) { - // Only override if we're going from an interface to a class, or are going to a narrower class - if (originalType.type.isInterface()) { - return true; - } else { - TypeProto commonSuperclass = registerType.type.getCommonSuperclass(originalType.type); - // only if it's a narrowing conversion - if (commonSuperclass.getType().equals(originalType.type.getType())) { - return true; - } - } + return isNotWideningConversion(originalType, registerType); } + } catch (UnresolvedClassException ex) { + return false; } } return false; @@ -1210,21 +1238,16 @@ public class MethodAnalyzer { /** * Art uses a peephole optimization for an if-eqz or if-nez that occur immediately after an instance-of. It will * narrow the type if possible, and then NOP out any corresponding check-cast instruction later on - * - * TODO: Is this still safe to do even for dalvik odexes? I think it should be.. */ private void analyzeIfEqzNez(@Nonnull AnalyzedInstruction analyzedInstruction) { - int instructionIndex = analyzedInstruction.getInstructionIndex(); - if (instructionIndex > 0) { - AnalyzedInstruction prevAnalyzedInstruction = analyzedInstructions.valueAt(instructionIndex - 1); - if (prevAnalyzedInstruction.instruction != null && - prevAnalyzedInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF) { - if (canNarrowAfterInstanceOf(prevAnalyzedInstruction, analyzedInstruction, classPath)) { - // Propagate the original type to the failing branch, and the new type to the successful branch - int narrowingRegister = ((Instruction22c)prevAnalyzedInstruction.instruction).getRegisterB(); - RegisterType originalType = analyzedInstruction.getPreInstructionRegisterType(narrowingRegister); - RegisterType newType = RegisterType.getRegisterType(classPath, - (TypeReference)((Instruction22c)prevAnalyzedInstruction.instruction).getReference()); + if (classPath.isArt()) { + int instructionIndex = analyzedInstruction.getInstructionIndex(); + if (instructionIndex > 0) { + if (analyzedInstruction.getPredecessorCount() != 1) { + return; + } + AnalyzedInstruction prevAnalyzedInstruction = analyzedInstruction.getPredecessors().first(); + if (prevAnalyzedInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF) { AnalyzedInstruction fallthroughInstruction = analyzedInstructions.valueAt( analyzedInstruction.getInstructionIndex() + 1); @@ -1233,16 +1256,25 @@ public class MethodAnalyzer { ((Instruction21t)analyzedInstruction.instruction).getCodeOffset(); AnalyzedInstruction branchInstruction = analyzedInstructions.get(nextAddress); - if (analyzedInstruction.instruction.getOpcode() == Opcode.IF_EQZ) { - overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, analyzedInstruction, - narrowingRegister, newType); - overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction, - narrowingRegister, originalType); - } else { - overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, analyzedInstruction, - narrowingRegister, originalType); - overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction, - narrowingRegister, newType); + int narrowingRegister = ((Instruction22c)prevAnalyzedInstruction.instruction).getRegisterB(); + RegisterType originalType = analyzedInstruction.getPreInstructionRegisterType(narrowingRegister); + + Instruction22c instanceOfInstruction = (Instruction22c)prevAnalyzedInstruction.instruction; + RegisterType newType = RegisterType.getRegisterType(classPath, + (TypeReference)instanceOfInstruction.getReference()); + + for (int register : analyzedInstruction.getSetRegisters()) { + if (analyzedInstruction.instruction.getOpcode() == Opcode.IF_EQZ) { + overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, + analyzedInstruction, register, newType); + overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction, + register, originalType); + } else { + overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, + analyzedInstruction, register, originalType); + overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction, + register, newType); + } } } } @@ -1380,44 +1412,32 @@ public class MethodAnalyzer { } private void analyzeInvokeDirectCommon(@Nonnull AnalyzedInstruction analyzedInstruction, int objectRegister) { - //the only time that an invoke instruction changes a register type is when using invoke-direct on a - //constructor (<init>) method, which changes the uninitialized reference (and any register that the same - //uninit reference has been copied to) to an initialized reference - - ReferenceInstruction instruction = (ReferenceInstruction)analyzedInstruction.instruction; - - MethodReference methodReference = (MethodReference)instruction.getReference(); - - if (!methodReference.getName().equals("<init>")) { - return; - } - - RegisterType objectRegisterType = analyzedInstruction.getPreInstructionRegisterType(objectRegister); - - if (objectRegisterType.category != RegisterType.UNINIT_REF && - objectRegisterType.category != RegisterType.UNINIT_THIS) { - return; - } + // This handles the case of invoking a constructor on an uninitialized reference. This propagates the + // initialized type for the object register, and also any known aliased registers. + // + // In some cases, unrelated uninitialized references may not have been propagated past this instruction. This + // happens when propagating those types and the type of object register of this instruction isn't known yet. + // In this case, we can't determine if the uninitialized reference being propagated in an alias of the object + // register, so we don't stop propagation. + // + // We check for any of these unpropagated uninitialized references here and propagate them. + if (analyzedInstruction.isInvokeInit()) { + RegisterType uninitRef = analyzedInstruction.getPreInstructionRegisterType(objectRegister); + if (uninitRef.category != RegisterType.UNINIT_REF && uninitRef.category != RegisterType.UNINIT_THIS) { + assert analyzedInstruction.getSetRegisters().isEmpty(); + return; + } - setPostRegisterTypeAndPropagateChanges(analyzedInstruction, objectRegister, - RegisterType.getRegisterType(RegisterType.REFERENCE, objectRegisterType.type)); + RegisterType initRef = RegisterType.getRegisterType(RegisterType.REFERENCE, uninitRef.type); - for (int i=0; i<analyzedInstruction.postRegisterMap.length; i++) { - RegisterType postInstructionRegisterType = analyzedInstruction.postRegisterMap[i]; - if (postInstructionRegisterType.category == RegisterType.UNKNOWN) { - RegisterType preInstructionRegisterType = - analyzedInstruction.getPreInstructionRegisterType(i); + for (int register: analyzedInstruction.getSetRegisters()) { + RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(register); - if (preInstructionRegisterType.category == RegisterType.UNINIT_REF || - preInstructionRegisterType.category == RegisterType.UNINIT_THIS) { - RegisterType registerType; - if (preInstructionRegisterType.equals(objectRegisterType)) { - registerType = analyzedInstruction.postRegisterMap[objectRegister]; - } else { - registerType = preInstructionRegisterType; - } - - setPostRegisterTypeAndPropagateChanges(analyzedInstruction, i, registerType); + if (registerType == uninitRef) { + setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, initRef); + } else { + // This is unrelated uninitialized reference. propagate it as-is + setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, registerType); } } } @@ -1695,13 +1715,13 @@ public class MethodAnalyzer { // fieldClass is now the first accessible class found. Now. we need to make sure that the field is // actually valid for this class - resolvedField = classPath.getClass(fieldClass.getType()).getFieldByOffset(fieldOffset); - if (resolvedField == null) { + FieldReference newResolvedField = classPath.getClass(fieldClass.getType()).getFieldByOffset(fieldOffset); + if (newResolvedField == null) { throw new ExceptionWithContext("Couldn't find accessible class while resolving field %s", ReferenceUtil.getShortFieldDescriptor(resolvedField)); } - resolvedField = new ImmutableFieldReference(fieldClass.getType(), resolvedField.getName(), - resolvedField.getType()); + resolvedField = new ImmutableFieldReference(fieldClass.getType(), newResolvedField.getName(), + newResolvedField.getType()); } String fieldType = resolvedField.getType(); @@ -1733,41 +1753,9 @@ public class MethodAnalyzer { targetMethod = (MethodReference)instruction.getReference(); } - TypeProto typeProto = classPath.getClass(targetMethod.getDefiningClass()); - int methodIndex; - try { - methodIndex = typeProto.findMethodIndexInVtable(targetMethod); - } catch (UnresolvedClassException ex) { - return true; - } - - if (methodIndex < 0) { - return true; - } - - Method replacementMethod = typeProto.getMethodByVtableIndex(methodIndex); - assert replacementMethod != null; - while (true) { - String superType = typeProto.getSuperclass(); - if (superType == null) { - break; - } - typeProto = classPath.getClass(superType); - Method resolvedMethod = typeProto.getMethodByVtableIndex(methodIndex); - if (resolvedMethod == null) { - break; - } - - if (!resolvedMethod.equals(replacementMethod)) { - if (!AnalyzedMethodUtil.canAccess(typeProto, replacementMethod, true, true, true)) { - continue; - } - - replacementMethod = resolvedMethod; - } - } + MethodReference replacementMethod = normalizeMethodReference(targetMethod); - if (replacementMethod.equals(method)) { + if (replacementMethod == null || replacementMethod.equals(targetMethod)) { return true; } @@ -1839,7 +1827,9 @@ public class MethodAnalyzer { // no need to check class access for invoke-super. A class can obviously access its superclass. ClassDef thisClass = classPath.getClassDef(method.getDefiningClass()); - if (!isSuper && !TypeUtils.canAccessClass( + if (classPath.getClass(resolvedMethod.getDefiningClass()).isInterface()) { + resolvedMethod = new ReparentedMethodReference(resolvedMethod, objectRegisterTypeProto.getType()); + } else if (!isSuper && !TypeUtils.canAccessClass( thisClass.getType(), classPath.getClassDef(resolvedMethod.getDefiningClass()))) { // the class is not accessible. So we start looking at objectRegisterTypeProto (which may be different @@ -1860,13 +1850,20 @@ public class MethodAnalyzer { MethodReference newResolvedMethod = classPath.getClass(methodClass.getType()).getMethodByVtableIndex(methodIndex); if (newResolvedMethod == null) { - // TODO: fix NPE here throw new ExceptionWithContext("Couldn't find accessible class while resolving method %s", ReferenceUtil.getMethodDescriptor(resolvedMethod, true)); } resolvedMethod = newResolvedMethod; resolvedMethod = new ImmutableMethodReference(methodClass.getType(), resolvedMethod.getName(), resolvedMethod.getParameterTypes(), resolvedMethod.getReturnType()); + + } + + if (normalizeVirtualMethods) { + MethodReference replacementMethod = normalizeMethodReference(resolvedMethod); + if (replacementMethod != null) { + resolvedMethod = replacementMethod; + } } Instruction deodexedInstruction; @@ -1967,4 +1964,70 @@ public class MethodAnalyzer { "pair because it is the last register.", registerNumber)); } } + + @Nullable + private MethodReference normalizeMethodReference(@Nonnull MethodReference methodRef) { + TypeProto typeProto = classPath.getClass(methodRef.getDefiningClass()); + int methodIndex; + try { + methodIndex = typeProto.findMethodIndexInVtable(methodRef); + } catch (UnresolvedClassException ex) { + return null; + } + + if (methodIndex < 0) { + return null; + } + + ClassProto thisClass = (ClassProto)classPath.getClass(method.getDefiningClass()); + + Method replacementMethod = typeProto.getMethodByVtableIndex(methodIndex); + assert replacementMethod != null; + while (true) { + String superType = typeProto.getSuperclass(); + if (superType == null) { + break; + } + typeProto = classPath.getClass(superType); + Method resolvedMethod = typeProto.getMethodByVtableIndex(methodIndex); + if (resolvedMethod == null) { + break; + } + + if (!resolvedMethod.equals(replacementMethod)) { + if (!AnalyzedMethodUtil.canAccess(thisClass, resolvedMethod, false, false, true)) { + continue; + } + + replacementMethod = resolvedMethod; + } + } + return replacementMethod; + } + + private static class ReparentedMethodReference extends BaseMethodReference { + private final MethodReference baseReference; + private final String definingClass; + + public ReparentedMethodReference(MethodReference baseReference, String definingClass) { + this.baseReference = baseReference; + this.definingClass = definingClass; + } + + @Override @Nonnull public String getName() { + return baseReference.getName(); + } + + @Override @Nonnull public List<? extends CharSequence> getParameterTypes() { + return baseReference.getParameterTypes(); + } + + @Override @Nonnull public String getReturnType() { + return baseReference.getReturnType(); + } + + @Nonnull @Override public String getDefiningClass() { + return definingClass; + } + } }
\ No newline at end of file diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java index ba782fe6..75478ca6 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java @@ -235,7 +235,7 @@ public class RegisterType { case '[': return getRegisterType(REFERENCE, classPath.getClass(type)); default: - throw new ExceptionWithContext("Invalid type: " + type); + throw new AnalysisException("Invalid type: " + type); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java index 4a4615a6..029ddb9a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java @@ -31,12 +31,43 @@ package org.jf.dexlib2.analysis.reflection.util; +import com.google.common.collect.ImmutableBiMap; + public class ReflectionUtils { + + private static ImmutableBiMap<String, String> primitiveMap = ImmutableBiMap.<String, String>builder() + .put("boolean", "Z") + .put("int", "I") + .put("long", "J") + .put("double", "D") + .put("void", "V") + .put("float", "F") + .put("char", "C") + .put("short", "S") + .put("byte", "B") + .build(); + public static String javaToDexName(String javaName) { - javaName = javaName.replace('.', '/'); - if (javaName.length() > 1 && javaName.charAt(javaName.length()-1) != ';') { - javaName = 'L' + javaName + ';'; + if (javaName.charAt(0) == '[') { + return javaName.replace('.', '/'); + } + + if (primitiveMap.containsKey(javaName)) { + return primitiveMap.get(javaName); + } + + return 'L' + javaName.replace('.', '/') + ';'; + } + + public static String dexToJavaName(String dexName) { + if (dexName.charAt(0) == '[') { + return dexName.replace('/', '.'); } - return javaName; + + if (primitiveMap.inverse().containsKey(dexName)) { + return primitiveMap.inverse().get(dexName); + } + + return dexName.replace('/', '.').substring(1, dexName.length()-2); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java index f056f245..862e342b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java @@ -32,6 +32,7 @@ package org.jf.dexlib2.base.reference; import org.jf.dexlib2.iface.reference.FieldReference; +import org.jf.dexlib2.util.ReferenceUtil; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -64,4 +65,8 @@ public abstract class BaseFieldReference implements FieldReference { if (res != 0) return res; return getType().compareTo(o.getType()); } + + @Override public String toString() { + return ReferenceUtil.getFieldDescriptor(this); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java index c0d38b0b..2fc5ed13 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java @@ -33,6 +33,7 @@ package org.jf.dexlib2.base.reference; import com.google.common.collect.Ordering; import org.jf.dexlib2.iface.reference.MethodProtoReference; +import org.jf.dexlib2.util.ReferenceUtil; import org.jf.util.CharSequenceUtils; import org.jf.util.CollectionUtils; @@ -63,4 +64,8 @@ public abstract class BaseMethodProtoReference implements MethodProtoReference { if (res != 0) return res; return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes()); } + + @Override public String toString() { + return ReferenceUtil.getMethodProtoDescriptor(this); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java index 3ff6f7db..f297760e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java @@ -33,6 +33,7 @@ package org.jf.dexlib2.base.reference; import com.google.common.collect.Ordering; import org.jf.dexlib2.iface.reference.MethodReference; +import org.jf.dexlib2.util.ReferenceUtil; import org.jf.util.CharSequenceUtils; import org.jf.util.CollectionUtils; @@ -70,4 +71,8 @@ public abstract class BaseMethodReference implements MethodReference { if (res != 0) return res; return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes()); } + + @Override public String toString() { + return ReferenceUtil.getMethodDescriptor(this); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java index c6daa91e..2f13c1ae 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java @@ -58,5 +58,5 @@ public abstract class BaseStringReference implements StringReference { @Override public int length() { return getString().length(); } @Override public char charAt(int index) { return getString().charAt(index); } @Override public CharSequence subSequence(int start, int end) { return getString().subSequence(start, end); } - @Override public String toString() { return getString(); } + @Override @Nonnull public String toString() { return getString(); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java index d75d7b67..27e43d5e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java @@ -33,6 +33,7 @@ package org.jf.dexlib2.builder; import org.jf.dexlib2.Opcode; import org.jf.dexlib2.iface.instruction.OffsetInstruction; +import org.jf.util.ExceptionWithContext; import javax.annotation.Nonnull; @@ -48,9 +49,16 @@ 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"); + if (this.getCodeUnits() == 1) { + if (codeOffset < Byte.MIN_VALUE || codeOffset > Byte.MAX_VALUE) { + throw new ExceptionWithContext("Invalid instruction offset: %d. " + + "Offset must be in [-128, 127]", codeOffset); + } + } else if (this.getCodeUnits() == 2) { + if (codeOffset < Short.MIN_VALUE || codeOffset > Short.MAX_VALUE) { + throw new ExceptionWithContext("Invalid instruction offset: %d. " + + "Offset must be in [-32768, 32767]", codeOffset); + } } return codeOffset; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java index 32505eec..fe260c5f 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java @@ -33,16 +33,24 @@ package org.jf.dexlib2.dexbacked; import com.google.common.io.ByteStreams; import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.ReferenceType; import org.jf.dexlib2.dexbacked.raw.*; +import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference; +import org.jf.dexlib2.dexbacked.reference.DexBackedMethodReference; +import org.jf.dexlib2.dexbacked.reference.DexBackedStringReference; +import org.jf.dexlib2.dexbacked.reference.DexBackedTypeReference; import org.jf.dexlib2.dexbacked.util.FixedSizeSet; import org.jf.dexlib2.iface.DexFile; +import org.jf.dexlib2.iface.reference.Reference; +import org.jf.dexlib2.util.DexUtil; import org.jf.util.ExceptionWithContext; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.util.AbstractList; +import java.util.List; import java.util.Set; public class DexBackedDexFile extends BaseDexBuffer implements DexFile { @@ -61,13 +69,13 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { private final int classCount; private final int classStartOffset; - private DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { + protected DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { super(buf, offset); this.opcodes = opcodes; if (verifyMagic) { - verifyMagicAndByteOrder(buf, offset); + DexUtil.verifyDexHeader(buf, offset); } stringCount = readSmallUint(HeaderItem.STRING_COUNT_OFFSET); @@ -85,7 +93,7 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { } public DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull BaseDexBuffer buf) { - this(opcodes, buf.buf); + this(opcodes, buf.buf, buf.baseOffset); } public DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset) { @@ -96,22 +104,10 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { this(opcodes, buf, 0, true); } + @Nonnull public static DexBackedDexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is) throws IOException { - if (!is.markSupported()) { - throw new IllegalArgumentException("InputStream must support mark"); - } - is.mark(44); - byte[] partialHeader = new byte[44]; - try { - ByteStreams.readFully(is, partialHeader); - } catch (EOFException ex) { - throw new NotADexFile("File is too short"); - } finally { - is.reset(); - } - - verifyMagicAndByteOrder(partialHeader, 0); + DexUtil.verifyDexHeader(is); byte[] buf = ByteStreams.toByteArray(is); return new DexBackedDexFile(opcodes, buf, 0, false); @@ -148,25 +144,6 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { }; } - private static void verifyMagicAndByteOrder(@Nonnull byte[] buf, int offset) { - if (!HeaderItem.verifyMagic(buf, offset)) { - StringBuilder sb = new StringBuilder("Invalid magic value:"); - for (int i=0; i<8; i++) { - sb.append(String.format(" %02x", buf[i])); - } - throw new NotADexFile(sb.toString()); - } - - int endian = HeaderItem.getEndian(buf, offset); - if (endian == HeaderItem.BIG_ENDIAN_TAG) { - throw new ExceptionWithContext("Big endian dex files are not currently supported"); - } - - if (endian != HeaderItem.LITTLE_ENDIAN_TAG) { - throw new ExceptionWithContext("Invalid endian tag: 0x%x", endian); - } - } - public int getStringIdItemOffset(int stringIndex) { if (stringIndex < 0 || stringIndex >= stringCount) { throw new InvalidItemIndex(stringIndex, "String index out of bounds: %d", stringIndex); @@ -265,6 +242,81 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { return getType(typeIndex); } + public List<DexBackedStringReference> getStrings() { + return new AbstractList<DexBackedStringReference>() { + @Override public DexBackedStringReference get(int index) { + if (index < 0 || index >= getStringCount()) { + throw new IndexOutOfBoundsException(); + } + return new DexBackedStringReference(DexBackedDexFile.this, index); + } + + @Override public int size() { + return getStringCount(); + } + }; + } + + public List<DexBackedTypeReference> getTypes() { + return new AbstractList<DexBackedTypeReference>() { + @Override public DexBackedTypeReference get(int index) { + if (index < 0 || index >= getTypeCount()) { + throw new IndexOutOfBoundsException(); + } + return new DexBackedTypeReference(DexBackedDexFile.this, index); + } + + @Override public int size() { + return getTypeCount(); + } + }; + } + + public List<DexBackedMethodReference> getMethods() { + return new AbstractList<DexBackedMethodReference>() { + @Override public DexBackedMethodReference get(int index) { + if (index < 0 || index >= getMethodCount()) { + throw new IndexOutOfBoundsException(); + } + return new DexBackedMethodReference(DexBackedDexFile.this, index); + } + + @Override public int size() { + return getMethodCount(); + } + }; + } + + public List<DexBackedFieldReference> getFields() { + return new AbstractList<DexBackedFieldReference>() { + @Override public DexBackedFieldReference get(int index) { + if (index < 0 || index >= getFieldCount()) { + throw new IndexOutOfBoundsException(); + } + return new DexBackedFieldReference(DexBackedDexFile.this, index); + } + + @Override public int size() { + return getFieldCount(); + } + }; + } + + public List<? extends Reference> getReferences(int referenceType) { + switch (referenceType) { + case ReferenceType.STRING: + return getStrings(); + case ReferenceType.TYPE: + return getTypes(); + case ReferenceType.METHOD: + return getMethods(); + case ReferenceType.FIELD: + return getFields(); + default: + throw new IllegalArgumentException(String.format("Invalid reference type: %d", referenceType)); + } + } + @Override @Nonnull public DexReader readerAt(int offset) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java index 676d86cd..a82032a1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -84,7 +84,7 @@ public class DexBackedMethodImplementation implements MethodImplementation { // Does the instruction extend past the end of the method? int offset = reader.getOffset(); if (offset > endOffset || offset < 0) { - throw new ExceptionWithContext("The last instruction in the method is truncated"); + throw new ExceptionWithContext("The last instruction in method %s is truncated", method); } return instruction; } @@ -129,7 +129,11 @@ public class DexBackedMethodImplementation implements MethodImplementation { return DebugInfo.newOrEmpty(dexFile, 0, this); } if (debugOffset < 0) { - System.err.println("%s: Invalid debug offset"); + System.err.println(String.format("%s: Invalid debug offset", method)); + return DebugInfo.newOrEmpty(dexFile, 0, this); + } + if (debugOffset >= dexFile.buf.length) { + System.err.println(String.format("%s: Invalid debug offset", method)); return DebugInfo.newOrEmpty(dexFile, 0, this); } return DebugInfo.newOrEmpty(dexFile, debugOffset, this); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java index 12f19db0..379ecaac 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java @@ -35,9 +35,9 @@ import com.google.common.io.ByteStreams; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem; import org.jf.dexlib2.dexbacked.util.VariableSizeList; +import org.jf.dexlib2.util.DexUtil; import javax.annotation.Nonnull; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; @@ -49,7 +49,6 @@ public class DexBackedOdexFile extends DexBackedDexFile { private final byte[] odexBuf; - public DexBackedOdexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] odexBuf, byte[] dexBuf) { super(opcodes, dexBuf); @@ -64,7 +63,7 @@ public class DexBackedOdexFile extends DexBackedDexFile { return true; } - public List<String> getDependencies() { + @Nonnull public List<String> getDependencies() { final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf); final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset; @@ -85,22 +84,9 @@ public class DexBackedOdexFile extends DexBackedDexFile { }; } - public static DexBackedOdexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is) + @Nonnull public static DexBackedOdexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is) throws IOException { - if (!is.markSupported()) { - throw new IllegalArgumentException("InputStream must support mark"); - } - is.mark(8); - byte[] partialHeader = new byte[8]; - try { - ByteStreams.readFully(is, partialHeader); - } catch (EOFException ex) { - throw new NotADexFile("File is too short"); - } finally { - is.reset(); - } - - verifyMagic(partialHeader); + DexUtil.verifyOdexHeader(is); is.reset(); byte[] odexBuf = new byte[OdexHeaderItem.ITEM_SIZE]; @@ -115,18 +101,8 @@ public class DexBackedOdexFile extends DexBackedDexFile { return new DexBackedOdexFile(opcodes, odexBuf, dexBuf); } - private static void verifyMagic(byte[] buf) { - if (!OdexHeaderItem.verifyMagic(buf)) { - StringBuilder sb = new StringBuilder("Invalid magic value:"); - for (int i=0; i<8; i++) { - sb.append(String.format(" %02x", buf[i])); - } - throw new NotAnOdexFile(sb.toString()); - } - } - public int getOdexVersion() { - return OdexHeaderItem.getVersion(odexBuf); + return OdexHeaderItem.getVersion(odexBuf, 0); } public static class NotAnOdexFile extends RuntimeException { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java index dbeb67ce..aaf942ea 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java @@ -31,22 +31,29 @@ package org.jf.dexlib2.dexbacked; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterators; import com.google.common.io.ByteStreams; import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.OatFile.OatDexFile; import org.jf.dexlib2.dexbacked.OatFile.SymbolTable.Symbol; import org.jf.dexlib2.dexbacked.raw.HeaderItem; +import org.jf.dexlib2.iface.MultiDexContainer; import org.jf.util.AbstractForwardSequentialList; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.util.AbstractList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; -public class OatFile extends BaseDexBuffer { +public class OatFile extends BaseDexBuffer implements MultiDexContainer<OatDexFile> { private static final byte[] ELF_MAGIC = new byte[] { 0x7f, 'E', 'L', 'F' }; private static final byte[] OAT_MAGIC = new byte[] { 'o', 'a', 't', '\n' }; private static final int MIN_ELF_HEADER_SIZE = 52; @@ -54,7 +61,7 @@ public class OatFile extends BaseDexBuffer { // These are the "known working" versions that I have manually inspected the source for. // Later version may or may not work, depending on what changed. private static final int MIN_OAT_VERSION = 56; - private static final int MAX_OAT_VERSION = 71; + private static final int MAX_OAT_VERSION = 86; public static final int UNSUPPORTED = 0; public static final int SUPPORTED = 1; @@ -63,8 +70,13 @@ public class OatFile extends BaseDexBuffer { private final boolean is64bit; @Nonnull private final OatHeader oatHeader; @Nonnull private final Opcodes opcodes; + @Nullable private final VdexProvider vdexProvider; public OatFile(@Nonnull byte[] buf) { + this(buf, null); + } + + public OatFile(@Nonnull byte[] buf, @Nullable VdexProvider vdexProvider) { super(buf); if (buf.length < MIN_ELF_HEADER_SIZE) { @@ -100,6 +112,7 @@ public class OatFile extends BaseDexBuffer { } this.opcodes = Opcodes.forArtVersion(oatHeader.getVersion()); + this.vdexProvider = vdexProvider; } private static void verifyMagic(byte[] buf) { @@ -110,7 +123,11 @@ public class OatFile extends BaseDexBuffer { } } - public static OatFile fromInputStream(@Nonnull InputStream is) + public static OatFile fromInputStream(@Nonnull InputStream is) throws IOException { + return fromInputStream(is, null); + } + + public static OatFile fromInputStream(@Nonnull InputStream is, @Nullable VdexProvider vdexProvider) throws IOException { if (!is.markSupported()) { throw new IllegalArgumentException("InputStream must support mark"); @@ -130,7 +147,7 @@ public class OatFile extends BaseDexBuffer { is.reset(); byte[] buf = ByteStreams.toByteArray(is); - return new OatFile(buf); + return new OatFile(buf, vdexProvider); } public int getOatVersion() { @@ -149,6 +166,22 @@ public class OatFile extends BaseDexBuffer { } @Nonnull + public List<String> getBootClassPath() { + if (getOatVersion() < 75) { + return ImmutableList.of(); + } + String bcp = oatHeader.getKeyValue("bootclasspath"); + if (bcp == null) { + return ImmutableList.of(); + } + return Arrays.asList(bcp.split(":")); + } + + @Nonnull @Override public Opcodes getOpcodes() { + return opcodes; + } + + @Nonnull public List<OatDexFile> getDexFiles() { return new AbstractForwardSequentialList<OatDexFile>() { @Override public int size() { @@ -156,53 +189,57 @@ public class OatFile extends BaseDexBuffer { } @Nonnull @Override public Iterator<OatDexFile> iterator() { - return new Iterator<OatDexFile>() { - int index = 0; - int offset = oatHeader.getDexListStart(); - - @Override public boolean hasNext() { - return index < size(); + return Iterators.transform(new DexEntryIterator(), new Function<DexEntry, OatDexFile>() { + @Nullable @Override public OatDexFile apply(DexEntry dexEntry) { + return dexEntry.getDexFile(); } + }); + } + }; + } - @Override public OatDexFile next() { - int filenameLength = readSmallUint(offset); - offset += 4; - - // TODO: what is the correct character encoding? - String filename = new String(buf, offset, filenameLength, Charset.forName("US-ASCII")); - offset += filenameLength; - - offset += 4; // checksum - - int dexOffset = readSmallUint(offset) + oatHeader.offset; - offset += 4; - - int classCount = readSmallUint(dexOffset + HeaderItem.CLASS_COUNT_OFFSET); - offset += 4 * classCount; - - index++; - - return new OatDexFile(dexOffset, filename); - } + @Nonnull @Override public List<String> getDexEntryNames() throws IOException { + return new AbstractForwardSequentialList<String>() { + @Override public int size() { + return oatHeader.getDexFileCount(); + } - @Override public void remove() { - throw new UnsupportedOperationException(); + @Nonnull @Override public Iterator<String> iterator() { + return Iterators.transform(new DexEntryIterator(), new Function<DexEntry, String>() { + @Nullable @Override public String apply(DexEntry dexEntry) { + return dexEntry.entryName; } - }; + }); } }; } - public class OatDexFile extends DexBackedDexFile { + @Nullable @Override public OatDexFile getEntry(@Nonnull String entryName) throws IOException { + DexEntryIterator iterator = new DexEntryIterator(); + while (iterator.hasNext()) { + DexEntry entry = iterator.next(); + + if (entry.entryName.equals(entryName)) { + return entry.getDexFile(); + } + } + return null; + } + + public class OatDexFile extends DexBackedDexFile implements MultiDexContainer.MultiDexFile { @Nonnull public final String filename; - public OatDexFile(int offset, @Nonnull String filename) { - super(opcodes, OatFile.this.buf, offset); + public OatDexFile(byte[] buf, int offset, @Nonnull String filename) { + super(opcodes, buf, offset); this.filename = filename; } - public int getOatVersion() { - return OatFile.this.getOatVersion(); + @Nonnull @Override public String getEntryName() { + return filename; + } + + @Nonnull @Override public OatFile getContainer() { + return OatFile.this; } @Override public boolean hasOdexOpcodes() { @@ -211,57 +248,87 @@ public class OatFile extends BaseDexBuffer { } private class OatHeader { - private final int offset; + private final int headerOffset; public OatHeader(int offset) { - this.offset = offset; + this.headerOffset = offset; } public boolean isValid() { for (int i=0; i<OAT_MAGIC.length; i++) { - if (buf[offset + i] != OAT_MAGIC[i]) { + if (buf[headerOffset + i] != OAT_MAGIC[i]) { return false; } } for (int i=4; i<7; i++) { - if (buf[offset + i] < '0' || buf[offset + i] > '9') { + if (buf[headerOffset + i] < '0' || buf[headerOffset + i] > '9') { return false; } } - return buf[offset + 7] == 0; + return buf[headerOffset + 7] == 0; } public int getVersion() { - return Integer.valueOf(new String(buf, offset + 4, 3)); + return Integer.valueOf(new String(buf, headerOffset + 4, 3)); } public int getDexFileCount() { - return readSmallUint(offset + 20); + return readSmallUint(headerOffset + 20); } public int getKeyValueStoreSize() { - int version = getVersion(); - if (version < 56) { + if (getVersion() < MIN_OAT_VERSION) { throw new IllegalStateException("Unsupported oat version"); } int fieldOffset = 17 * 4; - return readSmallUint(offset + fieldOffset); + return readSmallUint(headerOffset + fieldOffset); } public int getHeaderSize() { - int version = getVersion(); - if (version >= 56) { - return 18*4 + getKeyValueStoreSize(); - } else { + if (getVersion() < MIN_OAT_VERSION) { throw new IllegalStateException("Unsupported oat version"); } + return 18*4 + getKeyValueStoreSize(); + } + + @Nullable + public String getKeyValue(@Nonnull String key) { + int size = getKeyValueStoreSize(); + int offset = headerOffset + 18 * 4; + int endOffset = offset + size; + + while (offset < endOffset) { + int keyStartOffset = offset; + while (offset < endOffset && buf[offset] != '\0') { + offset++; + } + if (offset >= endOffset) { + throw new InvalidOatFileException("Oat file contains truncated key value store"); + } + int keyEndOffset = offset; + + String k = new String(buf, keyStartOffset, keyEndOffset - keyStartOffset); + if (k.equals(key)) { + int valueStartOffset = ++offset; + while (offset < endOffset && buf[offset] != '\0') { + offset++; + } + if (offset >= endOffset) { + throw new InvalidOatFileException("Oat file contains truncated key value store"); + } + int valueEndOffset = offset; + return new String(buf, valueStartOffset, valueEndOffset - valueStartOffset); + } + offset++; + } + return null; } public int getDexListStart() { - return offset + getHeaderSize(); + return headerOffset + getHeaderSize(); } } @@ -481,7 +548,74 @@ public class OatFile extends BaseDexBuffer { return new String(buf, start, end-start, Charset.forName("US-ASCII")); } + } + + private class DexEntry { + public final String entryName; + public final byte[] buf; + public final int dexOffset; + + + public DexEntry(String entryName, byte[] buf, int dexOffset) { + this.entryName = entryName; + this.buf = buf; + this.dexOffset = dexOffset; + } + + public OatDexFile getDexFile() { + return new OatDexFile(buf, dexOffset, entryName); + } + } + + private class DexEntryIterator implements Iterator<DexEntry> { + int index = 0; + int offset = oatHeader.getDexListStart(); + + @Override public boolean hasNext() { + return index < oatHeader.getDexFileCount(); + } + + @Override public DexEntry next() { + int filenameLength = readSmallUint(offset); + offset += 4; + + // TODO: what is the correct character encoding? + String filename = new String(buf, offset, filenameLength, Charset.forName("US-ASCII")); + offset += filenameLength; + + offset += 4; // checksum + + int dexOffset = readSmallUint(offset); + offset += 4; + + byte[] buf; + if (getOatVersion() >= 87 && vdexProvider != null && vdexProvider.getVdex() != null) { + buf = vdexProvider.getVdex(); + } else { + buf = OatFile.this.buf; + dexOffset += oatHeader.headerOffset; + } + + if (getOatVersion() >= 75) { + offset += 4; // offset to class offsets table + } + if (getOatVersion() >= 73) { + offset += 4; // lookup table offset + } + if (getOatVersion() < 75) { + // prior to 75, the class offsets are included here directly + int classCount = readSmallUint(dexOffset + HeaderItem.CLASS_COUNT_OFFSET); + offset += 4 * classCount; + } + + index++; + + return new DexEntry(filename, buf, dexOffset); + } + @Override public void remove() { + throw new UnsupportedOperationException(); + } } public static class InvalidOatFileException extends RuntimeException { @@ -493,4 +627,9 @@ public class OatFile extends BaseDexBuffer { public static class NotAnOatFileException extends RuntimeException { public NotAnOatFileException() {} } + + public interface VdexProvider { + @Nullable + byte[] getVdex(); + } }
\ No newline at end of file diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java new file mode 100644 index 00000000..50052c20 --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java @@ -0,0 +1,201 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.dexbacked; + +import com.google.common.collect.Lists; +import com.google.common.io.ByteStreams; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile; +import org.jf.dexlib2.dexbacked.ZipDexContainer.ZipDexFile; +import org.jf.dexlib2.iface.MultiDexContainer; +import org.jf.dexlib2.util.DexUtil; +import org.jf.dexlib2.util.DexUtil.InvalidFile; +import org.jf.dexlib2.util.DexUtil.UnsupportedFile; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +/** + * Represents a zip file that contains dex files (i.e. an apk or jar file) + */ +public class ZipDexContainer implements MultiDexContainer<ZipDexFile> { + + private final File zipFilePath; + private final Opcodes opcodes; + + /** + * Constructs a new ZipDexContainer for the given zip file + * + * @param zipFilePath The path to the zip file + * @param opcodes The Opcodes instance to use when loading dex files from this container + */ + public ZipDexContainer(@Nonnull File zipFilePath, @Nonnull Opcodes opcodes) { + this.zipFilePath = zipFilePath; + this.opcodes = opcodes; + } + + @Nonnull @Override public Opcodes getOpcodes() { + return opcodes; + } + + /** + * Gets a list of the names of dex files in this zip file. + * + * @return A list of the names of dex files in this zip file + */ + @Nonnull @Override public List<String> getDexEntryNames() throws IOException { + List<String> entryNames = Lists.newArrayList(); + ZipFile zipFile = getZipFile(); + try { + Enumeration<? extends ZipEntry> entriesEnumeration = zipFile.entries(); + + while (entriesEnumeration.hasMoreElements()) { + ZipEntry entry = entriesEnumeration.nextElement(); + + if (!isDex(zipFile, entry)) { + continue; + } + + entryNames.add(entry.getName()); + } + + return entryNames; + } finally { + zipFile.close(); + } + } + + /** + * Loads a dex file from a specific named entry. + * + * @param entryName The name of the entry + * @return A ZipDexFile, or null if there is no entry with the given name + * @throws NotADexFile If the entry isn't a dex file + */ + @Nullable @Override public ZipDexFile getEntry(@Nonnull String entryName) throws IOException { + ZipFile zipFile = getZipFile(); + try { + ZipEntry entry = zipFile.getEntry(entryName); + if (entry == null) { + return null; + } + + return loadEntry(zipFile, entry); + } finally { + zipFile.close(); + } + } + + public boolean isZipFile() { + ZipFile zipFile = null; + try { + zipFile = getZipFile(); + return true; + } catch (IOException ex) { + return false; + } catch (NotAZipFileException ex) { + return false; + } finally { + if(zipFile != null) { + try { + zipFile.close(); + } catch (IOException ex) { + // just eat it + } + } + } + } + + public class ZipDexFile extends DexBackedDexFile implements MultiDexContainer.MultiDexFile { + + private final String entryName; + + protected ZipDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, @Nonnull String entryName) { + super(opcodes, buf, 0); + this.entryName = entryName; + } + + @Nonnull @Override public String getEntryName() { + return entryName; + } + + @Nonnull @Override public MultiDexContainer getContainer() { + return ZipDexContainer.this; + } + } + + protected boolean isDex(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException { + InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry)); + try { + DexUtil.verifyDexHeader(inputStream); + } catch (NotADexFile ex) { + return false; + } catch (InvalidFile ex) { + return false; + } catch (UnsupportedFile ex) { + return false; + } finally { + inputStream.close(); + } + return true; + } + + protected ZipFile getZipFile() throws IOException { + try { + return new ZipFile(zipFilePath); + } catch (IOException ex) { + throw new NotAZipFileException(); + } + } + + @Nonnull + protected ZipDexFile loadEntry(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException { + InputStream inputStream = zipFile.getInputStream(zipEntry); + try { + byte[] buf = ByteStreams.toByteArray(inputStream); + return new ZipDexFile(opcodes, buf, zipEntry.getName()); + } finally { + inputStream.close(); + } + } + + public static class NotAZipFileException extends RuntimeException { + } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java index 2f3af4c3..e8db9698 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java @@ -42,15 +42,8 @@ import javax.annotation.Nullable; public class HeaderItem { public static final int ITEM_SIZE = 0x70; - /** - * The magic numbers for dex files. - * - * They are: "dex\n035\0", "dex\n037\0", and "dex\n038\0". - */ - public static final byte[][] MAGIC_VALUES= new byte[][] { - new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00}, - new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x37, 0x00}, - new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x38, 0x00}}; + private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00 }; + private static final int[] SUPPORTED_DEX_VERSIONS = new int[] { 35, 37, 38 }; public static final int LITTLE_ENDIAN_TAG = 0x12345678; public static final int BIG_ENDIAN_TAG = 0x78563412; @@ -231,51 +224,100 @@ public class HeaderItem { return "Invalid"; } - /** - * Get the higest magic number supported by Android for this api level. + * Get the highest magic number supported by Android for this api level. * @return The dex file magic number */ public static byte[] getMagicForApi(int api) { if (api < 24) { // Prior to Android N we only support dex version 035. - return HeaderItem.MAGIC_VALUES[0]; + return getMagicForDexVersion(35); } else if (api < 26) { // On android N and later we support dex version 037. - return HeaderItem.MAGIC_VALUES[1]; + return getMagicForDexVersion(37); } else { // On android O and later we support dex version 038. - return HeaderItem.MAGIC_VALUES[2]; + return getMagicForDexVersion(38); } } - private static int getVersion(byte[] buf, int offset) { + public static byte[] getMagicForDexVersion(int dexVersion) { + byte[] magic = MAGIC_VALUE.clone(); + + if (dexVersion < 0 || dexVersion > 999) { + throw new IllegalArgumentException("dexVersion must be within [0, 999]"); + } + + for (int i=6; i>=4; i--) { + int digit = dexVersion % 10; + magic[i] = (byte)('0' + digit); + dexVersion /= 10; + } + + return magic; + } + + /** + * Verifies the magic value at the beginning of a dex file + * + * @param buf A byte array containing at least the first 8 bytes of a dex file + * @param offset The offset within the buffer to the beginning of the dex header + * @return True if the magic value is valid + */ + public static boolean verifyMagic(byte[] buf, int offset) { if (buf.length - offset < 8) { - return 0; + return false; } - boolean matches = true; - for (int i=0; i<MAGIC_VALUES.length; i++) { - byte[] expected = MAGIC_VALUES[i]; - matches = true; - for (int j=0; j<8; j++) { - if (buf[offset + j] != expected[j]) { - matches = false; - break; + for (int i=0; i<4; i++) { + if (buf[offset + i] != MAGIC_VALUE[i]) { + return false; } } - if (matches) { - return i==0?35:(i==1?37:38); + for (int i=4; i<7; i++) { + if (buf[offset + i] < '0' || + buf[offset + i] > '9') { + return false; } } - return 0; + if (buf[offset + 7] != MAGIC_VALUE[7]) { + return false; } - public static boolean verifyMagic(byte[] buf, int offset) { - // verifies the magic value - return getVersion(buf, offset) != 0; + return true; + } + + /** + * Gets the dex version from a dex header + * + * @param buf A byte array containing at least the first 7 bytes of a dex file + * @param offset The offset within the buffer to the beginning of the dex header + * @return The dex version if the header is valid or -1 if the header is invalid + */ + public static int getVersion(byte[] buf, int offset) { + if (!verifyMagic(buf, offset)) { + return -1; + } + + return getVersionUnchecked(buf, offset); + } + + private static int getVersionUnchecked(byte[] buf, int offset) { + int version = (buf[offset + 4] - '0') * 100; + version += (buf[offset + 5] - '0') * 10; + version += buf[offset + 6] - '0'; + + return version; } + public static boolean isSupportedDexVersion(int version) { + for (int i=0; i<SUPPORTED_DEX_VERSIONS.length; i++) { + if (SUPPORTED_DEX_VERSIONS[i] == version) { + return true; + } + } + return false; + } public static int getEndian(byte[] buf, int offset) { BaseDexBuffer bdb = new BaseDexBuffer(buf); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java index c6599bc4..7566834a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java @@ -36,10 +36,8 @@ import org.jf.dexlib2.dexbacked.BaseDexBuffer; public class OdexHeaderItem { public static final int ITEM_SIZE = 40; - public static final byte[][] MAGIC_VALUES= new byte[][] { - new byte[] {0x64, 0x65, 0x79, 0x0A, 0x30, 0x33, 0x35, 0x00}, // "dey\n035\0" - new byte[] {0x64, 0x65, 0x79, 0x0A, 0x30, 0x33, 0x36, 0x00} // "dey\n036\0" - }; + private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x79, 0x0A, 0x00, 0x00, 0x00, 0x00 }; + private static final int[] SUPPORTED_ODEX_VERSIONS = new int[] { 35, 36 }; public static final int MAGIC_OFFSET = 0; public static final int MAGIC_LENGTH = 8; @@ -51,31 +49,66 @@ public class OdexHeaderItem { public static final int AUX_LENGTH_OFFSET = 28; public static final int FLAGS_OFFSET = 32; - public static int getVersion(byte[] magic) { - if (magic.length < 8) { - return 0; + /** + * Verifies the magic value at the beginning of an odex file + * + * @param buf A byte array containing at least the first 8 bytes of an odex file + * @param offset The offset within the buffer to the beginning of the odex header + * @return True if the magic value is valid + */ + public static boolean verifyMagic(byte[] buf, int offset) { + if (buf.length - offset < 8) { + return false; } - boolean matches = true; - for (int i=0; i<MAGIC_VALUES.length; i++) { - byte[] expected = MAGIC_VALUES[i]; - matches = true; - for (int j=0; j<8; j++) { - if (magic[j] != expected[j]) { - matches = false; - break; - } + for (int i=0; i<4; i++) { + if (buf[offset + i] != MAGIC_VALUE[i]) { + return false; } - if (matches) { - return i==0?35:36; + } + for (int i=4; i<7; i++) { + if (buf[offset + i] < '0' || + buf[offset + i] > '9') { + return false; } } - return 0; + if (buf[offset + 7] != MAGIC_VALUE[7]) { + return false; + } + + return true; + } + + /** + * Gets the dex version from an odex header + * + * @param buf A byte array containing at least the first 7 bytes of an odex file + * @param offset The offset within the buffer to the beginning of the odex header + * @return The odex version if the header is valid or -1 if the header is invalid + */ + public static int getVersion(byte[] buf, int offset) { + if (!verifyMagic(buf, offset)) { + return -1; + } + + return getVersionUnchecked(buf, offset); + } + + private static int getVersionUnchecked(byte[] buf, int offset) { + int version = (buf[offset + 4] - '0') * 100; + version += (buf[offset + 5] - '0') * 10; + version += buf[offset + 6] - '0'; + + return version; } - public static boolean verifyMagic(byte[] buf) { - // verifies the magic value - return getVersion(buf) != 0; + public static boolean isSupportedOdexVersion(int version) { + for (int i=0; i<SUPPORTED_ODEX_VERSIONS.length; i++) { + if (SUPPORTED_ODEX_VERSIONS[i] == version) { + return true; + } + } + return false; } public static int getDexOffset(byte[] buf) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java new file mode 100644 index 00000000..6c4e769a --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java @@ -0,0 +1,77 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.iface; + +import org.jf.dexlib2.Opcodes; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.List; + +/** + * This class represents a dex container that can contain multiple, named dex files + */ +public interface MultiDexContainer<T extends DexFile> { + /** + * @return A list of the names of dex entries in this container + */ + @Nonnull List<String> getDexEntryNames() throws IOException; + + /** + * Gets the dex entry with the given name + * + * @param entryName The name of the entry + * @return A DexFile, or null if no entry with that name is found + */ + @Nullable T getEntry(@Nonnull String entryName) throws IOException; + + /** + * @return the Opcodes instance associated with this MultiDexContainer + */ + @Nonnull Opcodes getOpcodes(); + + /** + * This class represents a dex file that is contained in a MultiDexContainer + */ + interface MultiDexFile extends DexFile { + /** + * @return The name of this entry within its container + */ + @Nonnull String getEntryName(); + + /** + * @return The MultiDexContainer that contains this dex file + */ + @Nonnull MultiDexContainer<? extends MultiDexFile> getContainer(); + } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java index 2112bd07..76f39a14 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java @@ -45,18 +45,6 @@ public class ImmutableDexFile implements DexFile { @Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes; @Nonnull private final Opcodes opcodes; - @Deprecated - public ImmutableDexFile(@Nullable Collection<? extends ClassDef> classes) { - this.classes = ImmutableClassDef.immutableSetOf(classes); - this.opcodes = Opcodes.forApi(19); - } - - @Deprecated - public ImmutableDexFile(@Nullable ImmutableSet<? extends ImmutableClassDef> classes) { - this.classes = ImmutableUtils.nullToEmptySet(classes); - this.opcodes = Opcodes.forApi(19); - } - public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection<? extends ClassDef> classes) { this.classes = ImmutableClassDef.immutableSetOf(classes); this.opcodes = opcodes; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java new file mode 100644 index 00000000..389edfd7 --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java @@ -0,0 +1,189 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.util; + +import com.google.common.io.ByteStreams; +import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile; +import org.jf.dexlib2.dexbacked.DexBackedOdexFile.NotAnOdexFile; +import org.jf.dexlib2.dexbacked.raw.HeaderItem; +import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem; + +import javax.annotation.Nonnull; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +public class DexUtil { + + /** + * Reads in the dex header from the given input stream and verifies that it is valid and a supported version + * + * The inputStream must support mark(), and will be reset to initial position upon exiting the method + * + * @param inputStream An input stream that is positioned at a dex header + * @throws NotADexFile If the file is not a dex file + * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason + * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality + */ + public static void verifyDexHeader(@Nonnull InputStream inputStream) throws IOException { + if (!inputStream.markSupported()) { + throw new IllegalArgumentException("InputStream must support mark"); + } + inputStream.mark(44); + byte[] partialHeader = new byte[44]; + try { + ByteStreams.readFully(inputStream, partialHeader); + } catch (EOFException ex) { + throw new NotADexFile("File is too short"); + } finally { + inputStream.reset(); + } + + verifyDexHeader(partialHeader, 0); + } + + /** + * Verifies that the dex header is valid and a supported version + * + * @param buf A byte array containing at least the first 44 bytes of a dex file + * @param offset The offset within the array to the dex header + * @throws NotADexFile If the file is not a dex file + * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason + * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality + */ + public static void verifyDexHeader(@Nonnull byte[] buf, int offset) { + int dexVersion = HeaderItem.getVersion(buf, offset); + if (dexVersion == -1) { + StringBuilder sb = new StringBuilder("Not a valid dex magic value:"); + for (int i=0; i<8; i++) { + sb.append(String.format(" %02x", buf[i])); + } + throw new NotADexFile(sb.toString()); + } + + if (!HeaderItem.isSupportedDexVersion(dexVersion)) { + throw new UnsupportedFile(String.format("Dex version %03d is not supported", dexVersion)); + } + + int endian = HeaderItem.getEndian(buf, offset); + if (endian == HeaderItem.BIG_ENDIAN_TAG) { + throw new UnsupportedFile("Big endian dex files are not supported"); + } + + if (endian != HeaderItem.LITTLE_ENDIAN_TAG) { + throw new InvalidFile(String.format("Invalid endian tag: 0x%x", endian)); + } + } + + /** + * Reads in the odex header from the given input stream and verifies that it is valid and a supported version + * + * The inputStream must support mark(), and will be reset to initial position upon exiting the method + * + * @param inputStream An input stream that is positioned at an odex header + * @throws NotAnOdexFile If the file is not an odex file + * @throws UnsupportedFile If the odex header is valid, but is an unsupported version + */ + public static void verifyOdexHeader(@Nonnull InputStream inputStream) throws IOException { + if (!inputStream.markSupported()) { + throw new IllegalArgumentException("InputStream must support mark"); + } + inputStream.mark(8); + byte[] partialHeader = new byte[8]; + try { + ByteStreams.readFully(inputStream, partialHeader); + } catch (EOFException ex) { + throw new NotAnOdexFile("File is too short"); + } finally { + inputStream.reset(); + } + + verifyOdexHeader(partialHeader, 0); + } + + /** + * Verifies that the odex header is valid and a supported version + * + * @param buf A byte array containing at least the first 8 bytes of an odex file + * @param offset The offset within the array to the odex header + * @throws NotAnOdexFile If the file is not an odex file + * @throws UnsupportedFile If the odex header is valid, but uses unsupported functionality + */ + public static void verifyOdexHeader(@Nonnull byte[] buf, int offset) { + int odexVersion = OdexHeaderItem.getVersion(buf, offset); + if (odexVersion == -1) { + StringBuilder sb = new StringBuilder("Not a valid odex magic value:"); + for (int i=0; i<8; i++) { + sb.append(String.format(" %02x", buf[i])); + } + throw new NotAnOdexFile(sb.toString()); + } + + if (!OdexHeaderItem.isSupportedOdexVersion(odexVersion)) { + throw new UnsupportedFile(String.format("Odex version %03d is not supported", odexVersion)); + } + } + + public static class InvalidFile extends RuntimeException { + public InvalidFile() { + } + + public InvalidFile(String message) { + super(message); + } + + public InvalidFile(String message, Throwable cause) { + super(message, cause); + } + + public InvalidFile(Throwable cause) { + super(cause); + } + } + + public static class UnsupportedFile extends RuntimeException { + public UnsupportedFile() { + } + + public UnsupportedFile(String message) { + super(message); + } + + public UnsupportedFile(String message, Throwable cause) { + super(message, cause); + } + + public UnsupportedFile(Throwable cause) { + super(cause); + } + } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java index 6ca1ce93..00cce65d 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java @@ -53,11 +53,7 @@ import org.jf.dexlib2.iface.instruction.Instruction; import org.jf.dexlib2.iface.instruction.OneRegisterInstruction; import org.jf.dexlib2.iface.instruction.ReferenceInstruction; import org.jf.dexlib2.iface.instruction.formats.*; -import org.jf.dexlib2.iface.reference.FieldReference; -import org.jf.dexlib2.iface.reference.MethodProtoReference; -import org.jf.dexlib2.iface.reference.MethodReference; -import org.jf.dexlib2.iface.reference.StringReference; -import org.jf.dexlib2.iface.reference.TypeReference; +import org.jf.dexlib2.iface.reference.*; import org.jf.dexlib2.util.InstructionUtil; import org.jf.dexlib2.util.MethodUtil; import org.jf.dexlib2.util.ReferenceUtil; @@ -92,7 +88,18 @@ public abstract class DexWriter< TypeListKey, FieldKey, MethodKey, EncodedValue, - AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement> { + AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement, + StringSectionType extends StringSection<StringKey, StringRef>, + TypeSectionType extends TypeSection<StringKey, TypeKey, TypeRef>, + ProtoSectionType extends ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey>, + FieldSectionType extends FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey>, + MethodSectionType extends MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey>, + ClassSectionType extends ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey, + AnnotationSetKey, EncodedValue>, + TypeListSectionType extends TypeListSection<TypeKey, TypeListKey>, + AnnotationSectionType extends AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement, + EncodedValue>, + AnnotationSetSectionType extends AnnotationSetSection<AnnotationKey, AnnotationSetKey>> { public static final int NO_INDEX = -1; public static final int NO_OFFSET = 0; @@ -124,43 +131,34 @@ public abstract class DexWriter< protected int numCodeItemItems = 0; protected int numClassDataItems = 0; - protected final StringSection<StringKey, StringRef> stringSection; - protected final TypeSection<StringKey, TypeKey, TypeRef> typeSection; - protected final ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey> protoSection; - protected final FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey> fieldSection; - protected final MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey> methodSection; - protected final ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey, AnnotationSetKey, - EncodedValue> classSection; + public final StringSectionType stringSection; + public final TypeSectionType typeSection; + public final ProtoSectionType protoSection; + public final FieldSectionType fieldSection; + public final MethodSectionType methodSection; + public final ClassSectionType classSection; - protected final TypeListSection<TypeKey, TypeListKey> typeListSection; - protected final AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement, EncodedValue> annotationSection; - protected final AnnotationSetSection<AnnotationKey, AnnotationSetKey> annotationSetSection; - - protected DexWriter(Opcodes opcodes, - StringSection<StringKey, StringRef> stringSection, - TypeSection<StringKey, TypeKey, TypeRef> typeSection, - ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey> protoSection, - FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey> fieldSection, - MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey> methodSection, - ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey, AnnotationSetKey, - EncodedValue> classSection, - TypeListSection<TypeKey, TypeListKey> typeListSection, - AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement, - EncodedValue> annotationSection, - AnnotationSetSection<AnnotationKey, AnnotationSetKey> annotationSetSection) { + public final TypeListSectionType typeListSection; + public final AnnotationSectionType annotationSection; + public final AnnotationSetSectionType annotationSetSection; + + protected DexWriter(Opcodes opcodes) { this.opcodes = opcodes; - this.stringSection = stringSection; - this.typeSection = typeSection; - this.protoSection = protoSection; - this.fieldSection = fieldSection; - this.methodSection = methodSection; - this.classSection = classSection; - this.typeListSection = typeListSection; - this.annotationSection = annotationSection; - this.annotationSetSection = annotationSetSection; + SectionProvider sectionProvider = getSectionProvider(); + this.stringSection = sectionProvider.getStringSection(); + this.typeSection = sectionProvider.getTypeSection(); + this.protoSection = sectionProvider.getProtoSection(); + this.fieldSection = sectionProvider.getFieldSection(); + this.methodSection = sectionProvider.getMethodSection(); + this.classSection = sectionProvider.getClassSection(); + this.typeListSection = sectionProvider.getTypeListSection(); + this.annotationSection = sectionProvider.getAnnotationSection(); + this.annotationSetSection = sectionProvider.getAnnotationSetSection(); } + @Nonnull protected abstract SectionProvider getSectionProvider(); + protected abstract void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer, @Nonnull EncodedValue encodedValue) throws IOException; @@ -192,12 +190,12 @@ public abstract class DexWriter< private int getDataSectionOffset() { return HeaderItem.ITEM_SIZE + - stringSection.getItems().size() * StringIdItem.ITEM_SIZE + - typeSection.getItems().size() * TypeIdItem.ITEM_SIZE + - protoSection.getItems().size() * ProtoIdItem.ITEM_SIZE + - fieldSection.getItems().size() * FieldIdItem.ITEM_SIZE + - methodSection.getItems().size() * MethodIdItem.ITEM_SIZE + - classSection.getItems().size() * ClassDefItem.ITEM_SIZE; + stringSection.getItemCount() * StringIdItem.ITEM_SIZE + + typeSection.getItemCount() * TypeIdItem.ITEM_SIZE + + protoSection.getItemCount() * ProtoIdItem.ITEM_SIZE + + fieldSection.getItemCount() * FieldIdItem.ITEM_SIZE + + methodSection.getItemCount() * MethodIdItem.ITEM_SIZE + + classSection.getItemCount() * ClassDefItem.ITEM_SIZE; } @Nonnull @@ -227,6 +225,22 @@ public abstract class DexWriter< return classReferences; } + /** + * Checks whether any of the size-sensitive constant pools have overflowed. + * + * This checks whether the type, method, field pools are larger than 64k entries. + * + * Note that even if this returns true, it may still be possible to successfully write the dex file, if the + * overflowed items are not referenced anywhere that uses a 16-bit index + * + * @return true if any of the size-sensitive constant pools have overflowed + */ + public boolean hasOverflowed() { + return methodSection.getItemCount() > (1 << 16) || + typeSection.getItemCount() > (1 << 16) || + fieldSection.getItemCount() > (1 << 16); + } + public void writeTo(@Nonnull DexDataStore dest) throws IOException { this.writeTo(dest, MemoryDeferredOutputStream.getFactory()); } @@ -801,7 +815,14 @@ public abstract class DexWriter< int debugItemOffset = writeDebugItem(offsetWriter, debugWriter, classSection.getParameterNames(methodKey), debugItems); - int codeItemOffset = writeCodeItem(codeWriter, ehBuf, methodKey, tryBlocks, instructions, debugItemOffset); + int codeItemOffset; + try { + codeItemOffset = writeCodeItem( + codeWriter, ehBuf, methodKey, tryBlocks, instructions, debugItemOffset); + } catch (RuntimeException ex) { + throw new ExceptionWithContext(ex, "Exception occurred while writing code_item for method %s", + methodSection.getMethodReference(methodKey)); + } if (codeItemOffset != -1) { codeOffsets.add(new CodeItemOffset<MethodKey>(methodKey, codeItemOffset)); @@ -950,105 +971,111 @@ public abstract class DexWriter< methodSection, protoSection); writer.writeInt(codeUnitCount); + int codeOffset = 0; for (Instruction instruction: instructions) { - switch (instruction.getOpcode().format) { - case Format10t: - instructionWriter.write((Instruction10t)instruction); - break; - case Format10x: - instructionWriter.write((Instruction10x)instruction); - break; - case Format11n: - instructionWriter.write((Instruction11n)instruction); - break; - case Format11x: - instructionWriter.write((Instruction11x)instruction); - break; - case Format12x: - instructionWriter.write((Instruction12x)instruction); - break; - case Format20bc: - instructionWriter.write((Instruction20bc)instruction); - break; - case Format20t: - instructionWriter.write((Instruction20t)instruction); - break; - case Format21c: - instructionWriter.write((Instruction21c)instruction); - break; - case Format21ih: - instructionWriter.write((Instruction21ih)instruction); - break; - case Format21lh: - instructionWriter.write((Instruction21lh)instruction); - break; - case Format21s: - instructionWriter.write((Instruction21s)instruction); - break; - case Format21t: - instructionWriter.write((Instruction21t)instruction); - break; - case Format22b: - instructionWriter.write((Instruction22b)instruction); - break; - case Format22c: - instructionWriter.write((Instruction22c)instruction); - break; - case Format22s: - instructionWriter.write((Instruction22s)instruction); - break; - case Format22t: - instructionWriter.write((Instruction22t)instruction); - break; - case Format22x: - instructionWriter.write((Instruction22x)instruction); - break; - case Format23x: - instructionWriter.write((Instruction23x)instruction); - break; - case Format30t: - instructionWriter.write((Instruction30t)instruction); - break; - case Format31c: - instructionWriter.write((Instruction31c)instruction); - break; - case Format31i: - instructionWriter.write((Instruction31i)instruction); - break; - case Format31t: - instructionWriter.write((Instruction31t)instruction); - break; - case Format32x: - instructionWriter.write((Instruction32x)instruction); - break; - case Format35c: - instructionWriter.write((Instruction35c)instruction); - break; - case Format3rc: - instructionWriter.write((Instruction3rc)instruction); - break; - case Format45cc: - instructionWriter.write((Instruction45cc) instruction); - break; - case Format4rcc: - instructionWriter.write((Instruction4rcc) instruction); - break; - case Format51l: - instructionWriter.write((Instruction51l)instruction); - break; - case ArrayPayload: - instructionWriter.write((ArrayPayload)instruction); - break; - case PackedSwitchPayload: - instructionWriter.write((PackedSwitchPayload)instruction); - break; - case SparseSwitchPayload: - instructionWriter.write((SparseSwitchPayload)instruction); - break; - default: - throw new ExceptionWithContext("Unsupported instruction format: %s", - instruction.getOpcode().format); + try { + switch (instruction.getOpcode().format) { + case Format10t: + instructionWriter.write((Instruction10t)instruction); + break; + case Format10x: + instructionWriter.write((Instruction10x)instruction); + break; + case Format11n: + instructionWriter.write((Instruction11n)instruction); + break; + case Format11x: + instructionWriter.write((Instruction11x)instruction); + break; + case Format12x: + instructionWriter.write((Instruction12x)instruction); + break; + case Format20bc: + instructionWriter.write((Instruction20bc)instruction); + break; + case Format20t: + instructionWriter.write((Instruction20t)instruction); + break; + case Format21c: + instructionWriter.write((Instruction21c)instruction); + break; + case Format21ih: + instructionWriter.write((Instruction21ih)instruction); + break; + case Format21lh: + instructionWriter.write((Instruction21lh)instruction); + break; + case Format21s: + instructionWriter.write((Instruction21s)instruction); + break; + case Format21t: + instructionWriter.write((Instruction21t)instruction); + break; + case Format22b: + instructionWriter.write((Instruction22b)instruction); + break; + case Format22c: + instructionWriter.write((Instruction22c)instruction); + break; + case Format22s: + instructionWriter.write((Instruction22s)instruction); + break; + case Format22t: + instructionWriter.write((Instruction22t)instruction); + break; + case Format22x: + instructionWriter.write((Instruction22x)instruction); + break; + case Format23x: + instructionWriter.write((Instruction23x)instruction); + break; + case Format30t: + instructionWriter.write((Instruction30t)instruction); + break; + case Format31c: + instructionWriter.write((Instruction31c)instruction); + break; + case Format31i: + instructionWriter.write((Instruction31i)instruction); + break; + case Format31t: + instructionWriter.write((Instruction31t)instruction); + break; + case Format32x: + instructionWriter.write((Instruction32x)instruction); + break; + case Format35c: + instructionWriter.write((Instruction35c)instruction); + break; + case Format3rc: + instructionWriter.write((Instruction3rc)instruction); + break; + case Format45cc: + instructionWriter.write((Instruction45cc)instruction); + break; + case Format4rcc: + instructionWriter.write((Instruction4rcc)instruction); + break; + case Format51l: + instructionWriter.write((Instruction51l)instruction); + break; + case ArrayPayload: + instructionWriter.write((ArrayPayload)instruction); + break; + case PackedSwitchPayload: + instructionWriter.write((PackedSwitchPayload)instruction); + break; + case SparseSwitchPayload: + instructionWriter.write((SparseSwitchPayload)instruction); + break; + default: + throw new ExceptionWithContext("Unsupported instruction format: %s", + instruction.getOpcode().format); + } + } catch (RuntimeException ex) { + throw new ExceptionWithContext(ex, "Error while writing instruction at code offset 0x%x", codeOffset); } + codeOffset += instruction.getCodeUnits(); } if (tryBlocks.size() > 0) { @@ -1274,4 +1301,16 @@ public abstract class DexWriter< // (https://code.google.com/p/android/issues/detail?id=35304) return (opcodes.api < 17); } + + public abstract class SectionProvider { + @Nonnull public abstract StringSectionType getStringSection(); + @Nonnull public abstract TypeSectionType getTypeSection(); + @Nonnull public abstract ProtoSectionType getProtoSection(); + @Nonnull public abstract FieldSectionType getFieldSection(); + @Nonnull public abstract MethodSectionType getMethodSection(); + @Nonnull public abstract ClassSectionType getClassSection(); + @Nonnull public abstract TypeListSectionType getTypeListSection(); + @Nonnull public abstract AnnotationSectionType getAnnotationSection(); + @Nonnull public abstract AnnotationSetSectionType getAnnotationSetSection(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java index 53d14474..8abc776b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java @@ -38,4 +38,5 @@ import java.util.Map; public interface IndexSection<Key> { int getItemIndex(@Nonnull Key key); @Nonnull Collection<? extends Map.Entry<? extends Key, Integer>> getItems(); + int getItemCount(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java index 32e6d6bf..f31e84c8 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java @@ -39,6 +39,7 @@ import javax.annotation.Nonnull; public interface MethodSection<StringKey, TypeKey, ProtoRefKey extends MethodProtoReference, MethodRefKey extends MethodReference, MethodKey> extends IndexSection<MethodRefKey> { + @Nonnull MethodRefKey getMethodReference(@Nonnull MethodKey key); @Nonnull TypeKey getDefiningClass(@Nonnull MethodRefKey key); @Nonnull ProtoRefKey getPrototype(@Nonnull MethodRefKey key); @Nonnull ProtoRefKey getPrototype(@Nonnull MethodKey key); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java new file mode 100644 index 00000000..64ba1d7b --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java @@ -0,0 +1,42 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.writer.builder; + +import javax.annotation.Nonnull; + +public class BaseBuilderPool { + @Nonnull protected final DexBuilder dexBuilder; + + public BaseBuilderPool(@Nonnull DexBuilder dexBuilder) { + this.dexBuilder = dexBuilder; + } +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java index e16bff0c..37e536cd 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java @@ -41,14 +41,13 @@ import java.util.Collection; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -class BuilderAnnotationPool implements AnnotationSection<BuilderStringReference, BuilderTypeReference, - BuilderAnnotation, BuilderAnnotationElement, BuilderEncodedValue> { - @Nonnull private final BuilderContext context; +class BuilderAnnotationPool extends BaseBuilderPool implements AnnotationSection<BuilderStringReference, + BuilderTypeReference, BuilderAnnotation, BuilderAnnotationElement, BuilderEncodedValue> { @Nonnull private final ConcurrentMap<Annotation, BuilderAnnotation> internedItems = Maps.newConcurrentMap(); - BuilderAnnotationPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderAnnotationPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderAnnotation internAnnotation(@Nonnull Annotation annotation) { @@ -59,8 +58,8 @@ class BuilderAnnotationPool implements AnnotationSection<BuilderStringReference, BuilderAnnotation dexBuilderAnnotation = new BuilderAnnotation( annotation.getVisibility(), - context.typePool.internType(annotation.getType()), - context.internAnnotationElements(annotation.getElements())); + dexBuilder.typeSection.internType(annotation.getType()), + dexBuilder.internAnnotationElements(annotation.getElements())); ret = internedItems.putIfAbsent(dexBuilderAnnotation, dexBuilderAnnotation); return ret==null?dexBuilderAnnotation:ret; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java index 43ca7452..ef9a9d63 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java @@ -39,7 +39,7 @@ import java.util.AbstractSet; import java.util.Iterator; import java.util.Set; -class BuilderAnnotationSet extends AbstractSet<BuilderAnnotation> { +public class BuilderAnnotationSet extends AbstractSet<BuilderAnnotation> { public static final BuilderAnnotationSet EMPTY = new BuilderAnnotationSet(ImmutableSet.<BuilderAnnotation>of()); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java index 353190fb..45af5cf3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java @@ -46,13 +46,13 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentMap; -class BuilderAnnotationSetPool implements AnnotationSetSection<BuilderAnnotation, BuilderAnnotationSet> { - @Nonnull private final BuilderContext context; +class BuilderAnnotationSetPool extends BaseBuilderPool + implements AnnotationSetSection<BuilderAnnotation, BuilderAnnotationSet> { @Nonnull private final ConcurrentMap<Set<? extends Annotation>, BuilderAnnotationSet> internedItems = Maps.newConcurrentMap(); - BuilderAnnotationSetPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderAnnotationSetPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderAnnotationSet internAnnotationSet(@Nullable Set<? extends Annotation> annotations) { @@ -69,7 +69,7 @@ class BuilderAnnotationSetPool implements AnnotationSetSection<BuilderAnnotation ImmutableSet.copyOf(Iterators.transform(annotations.iterator(), new Function<Annotation, BuilderAnnotation>() { @Nullable @Override public BuilderAnnotation apply(Annotation input) { - return context.annotationPool.internAnnotation(input); + return dexBuilder.annotationSection.internAnnotation(input); } }))); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java index 10215925..9938a6e0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java @@ -31,7 +31,6 @@ package org.jf.dexlib2.writer.builder; -import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.collect.*; import org.jf.dexlib2.base.reference.BaseTypeReference; @@ -81,14 +80,10 @@ public class BuilderClassDef extends BaseTypeReference implements ClassDef { this.interfaces = interfaces; this.sourceFile = sourceFile; this.annotations = annotations; - this.staticFields = ImmutableSortedSet.copyOf( - (Iterable<? extends BuilderField>)Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC)); - this.instanceFields = ImmutableSortedSet.copyOf( - (Iterable<? extends BuilderField>)Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE)); - this.directMethods = ImmutableSortedSet.copyOf( - (Iterable<? extends BuilderMethod>)Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT)); - this.virtualMethods = ImmutableSortedSet.copyOf( - (Iterable<? extends BuilderMethod>)Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL)); + this.staticFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC)); + this.instanceFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE)); + this.directMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT)); + this.virtualMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL)); } @Nonnull @Override public String getType() { return type.getType(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java index 29980f32..232b4824 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java @@ -60,12 +60,14 @@ import java.util.*; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -public class BuilderClassPool implements ClassSection<BuilderStringReference, BuilderTypeReference, BuilderTypeList, - BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet, BuilderEncodedValue> { +public class BuilderClassPool extends BaseBuilderPool implements ClassSection<BuilderStringReference, + BuilderTypeReference, BuilderTypeList, BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet, + BuilderEncodedValue> { @Nonnull private final ConcurrentMap<String, BuilderClassDef> internedItems = Maps.newConcurrentMap(); - BuilderClassPool() { + public BuilderClassPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull BuilderClassDef internClass(@Nonnull BuilderClassDef classDef) { @@ -441,4 +443,8 @@ public class BuilderClassPool implements ClassSection<BuilderStringReference, Bu } }; } + + @Override public int getItemCount() { + return internedItems.size(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java deleted file mode 100644 index e6f8e225..00000000 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2013, Google Inc. - * All rights reserved. - * - * 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 Inc. 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 org.jf.dexlib2.writer.builder; - -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterators; -import org.jf.dexlib2.ValueType; -import org.jf.dexlib2.iface.AnnotationElement; -import org.jf.dexlib2.iface.value.*; -import org.jf.dexlib2.writer.builder.BuilderEncodedValues.*; -import org.jf.util.ExceptionWithContext; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Set; - -class BuilderContext { - // keep our own local references to the various pools, using the Builder specific pool type; - @Nonnull final BuilderStringPool stringPool; - @Nonnull final BuilderTypePool typePool; - @Nonnull final BuilderFieldPool fieldPool; - @Nonnull final BuilderMethodPool methodPool; - @Nonnull final BuilderProtoPool protoPool; - @Nonnull final BuilderClassPool classPool; - - @Nonnull final BuilderTypeListPool typeListPool; - @Nonnull final BuilderAnnotationPool annotationPool; - @Nonnull final BuilderAnnotationSetPool annotationSetPool; - - - BuilderContext() { - this.stringPool = new BuilderStringPool(); - this.typePool = new BuilderTypePool(this); - this.fieldPool = new BuilderFieldPool(this); - this.methodPool = new BuilderMethodPool(this); - this.protoPool = new BuilderProtoPool(this); - this.classPool = new BuilderClassPool(); - - this.typeListPool = new BuilderTypeListPool(this); - this.annotationPool = new BuilderAnnotationPool(this); - this.annotationSetPool = new BuilderAnnotationSetPool(this); - } - - @Nonnull Set<? extends BuilderAnnotationElement> internAnnotationElements( - @Nonnull Set<? extends AnnotationElement> elements) { - return ImmutableSet.copyOf( - Iterators.transform(elements.iterator(), - new Function<AnnotationElement, BuilderAnnotationElement>() { - @Nullable @Override - public BuilderAnnotationElement apply(AnnotationElement input) { - return internAnnotationElement(input); - } - })); - } - - @Nonnull private BuilderAnnotationElement internAnnotationElement(@Nonnull AnnotationElement annotationElement) { - return new BuilderAnnotationElement(stringPool.internString(annotationElement.getName()), - internEncodedValue(annotationElement.getValue())); - } - - @Nullable BuilderEncodedValue internNullableEncodedValue(@Nullable EncodedValue encodedValue) { - if (encodedValue == null) { - return null; - } - return internEncodedValue(encodedValue); - } - - @Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) { - switch (encodedValue.getValueType()) { - case ValueType.ANNOTATION: - return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue); - case ValueType.ARRAY: - return internArrayEncodedValue((ArrayEncodedValue)encodedValue); - case ValueType.BOOLEAN: - boolean value = ((BooleanEncodedValue)encodedValue).getValue(); - return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE; - case ValueType.BYTE: - return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue()); - case ValueType.CHAR: - return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue()); - case ValueType.DOUBLE: - return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue()); - case ValueType.ENUM: - return internEnumEncodedValue((EnumEncodedValue)encodedValue); - case ValueType.FIELD: - return internFieldEncodedValue((FieldEncodedValue)encodedValue); - case ValueType.FLOAT: - return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue()); - case ValueType.INT: - return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue()); - case ValueType.LONG: - return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue()); - case ValueType.METHOD: - return internMethodEncodedValue((MethodEncodedValue)encodedValue); - case ValueType.NULL: - return BuilderNullEncodedValue.INSTANCE; - case ValueType.SHORT: - return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue()); - case ValueType.STRING: - return internStringEncodedValue((StringEncodedValue)encodedValue); - case ValueType.TYPE: - return internTypeEncodedValue((TypeEncodedValue)encodedValue); - default: - throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType()); - } - } - - @Nonnull private BuilderAnnotationEncodedValue internAnnotationEncodedValue(@Nonnull AnnotationEncodedValue value) { - return new BuilderAnnotationEncodedValue( - typePool.internType(value.getType()), - internAnnotationElements(value.getElements())); - } - - @Nonnull private BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue value) { - return new BuilderArrayEncodedValue( - ImmutableList.copyOf( - Iterators.transform(value.getValue().iterator(), - new Function<EncodedValue, BuilderEncodedValue>() { - @Nullable @Override public BuilderEncodedValue apply(EncodedValue input) { - return internEncodedValue(input); - } - }))); - } - - @Nonnull private BuilderEnumEncodedValue internEnumEncodedValue(@Nonnull EnumEncodedValue value) { - return new BuilderEnumEncodedValue(fieldPool.internField(value.getValue())); - } - - @Nonnull private BuilderFieldEncodedValue internFieldEncodedValue(@Nonnull FieldEncodedValue value) { - return new BuilderFieldEncodedValue(fieldPool.internField(value.getValue())); - } - - @Nonnull private BuilderMethodEncodedValue internMethodEncodedValue(@Nonnull MethodEncodedValue value) { - return new BuilderMethodEncodedValue(methodPool.internMethod(value.getValue())); - } - - @Nonnull private BuilderStringEncodedValue internStringEncodedValue(@Nonnull StringEncodedValue string) { - return new BuilderStringEncodedValue(stringPool.internString(string.getValue())); - } - - @Nonnull private BuilderTypeEncodedValue internTypeEncodedValue(@Nonnull TypeEncodedValue type) { - return new BuilderTypeEncodedValue(typePool.internType(type.getValue())); - } -} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java index 7a90649f..3bc65cd8 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java @@ -41,14 +41,13 @@ import java.util.Collection; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -public class BuilderFieldPool +public class BuilderFieldPool extends BaseBuilderPool implements FieldSection<BuilderStringReference, BuilderTypeReference, BuilderFieldReference, BuilderField> { - @Nonnull private final BuilderContext context; @Nonnull private final ConcurrentMap<FieldReference, BuilderFieldReference> internedItems = Maps.newConcurrentMap(); - BuilderFieldPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderFieldPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull BuilderFieldReference internField(@Nonnull String definingClass, String name, String type) { @@ -63,9 +62,9 @@ public class BuilderFieldPool } BuilderFieldReference dexPoolFieldReference = new BuilderFieldReference( - context.typePool.internType(fieldReference.getDefiningClass()), - context.stringPool.internString(fieldReference.getName()), - context.typePool.internType(fieldReference.getType())); + dexBuilder.typeSection.internType(fieldReference.getDefiningClass()), + dexBuilder.stringSection.internString(fieldReference.getName()), + dexBuilder.typeSection.internType(fieldReference.getType())); ret = internedItems.putIfAbsent(dexPoolFieldReference, dexPoolFieldReference); return ret==null?dexPoolFieldReference:ret; } @@ -104,4 +103,8 @@ public class BuilderFieldPool } }; } + + @Override public int getItemCount() { + return internedItems.size(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java index 2c5dd816..7f937fdc 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java @@ -42,14 +42,13 @@ import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -class BuilderMethodPool implements MethodSection<BuilderStringReference, BuilderTypeReference, +class BuilderMethodPool extends BaseBuilderPool implements MethodSection<BuilderStringReference, BuilderTypeReference, BuilderMethodProtoReference, BuilderMethodReference, BuilderMethod>{ - @Nonnull private final BuilderContext context; @Nonnull private final ConcurrentMap<MethodReference, BuilderMethodReference> internedItems = Maps.newConcurrentMap(); - BuilderMethodPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderMethodPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderMethodReference internMethod(@Nonnull MethodReference methodReference) { @@ -59,9 +58,9 @@ class BuilderMethodPool implements MethodSection<BuilderStringReference, Builder } BuilderMethodReference dexPoolMethodReference = new BuilderMethodReference( - context.typePool.internType(methodReference.getDefiningClass()), - context.stringPool.internString(methodReference.getName()), - context.protoPool.internMethodProto(methodReference)); + dexBuilder.typeSection.internType(methodReference.getDefiningClass()), + dexBuilder.stringSection.internString(methodReference.getName()), + dexBuilder.protoSection.internMethodProto(methodReference)); ret = internedItems.putIfAbsent(dexPoolMethodReference, dexPoolMethodReference); return ret==null?dexPoolMethodReference:ret; } @@ -72,6 +71,10 @@ class BuilderMethodPool implements MethodSection<BuilderStringReference, Builder return internMethod(new MethodKey(definingClass, name, parameters, returnType)); } + @Nonnull @Override public BuilderMethodReference getMethodReference(@Nonnull BuilderMethod builderMethod) { + return builderMethod.methodReference; + } + @Nonnull @Override public BuilderTypeReference getDefiningClass(@Nonnull BuilderMethodReference key) { return key.definingClass; @@ -112,6 +115,10 @@ class BuilderMethodPool implements MethodSection<BuilderStringReference, Builder }; } + @Override public int getItemCount() { + return internedItems.size(); + } + private static class MethodKey extends BaseMethodReference implements MethodReference { @Nonnull private final String definingClass; @Nonnull private final String name; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java index de19fa30..969f2433 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java @@ -44,14 +44,13 @@ import java.util.Collection; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -class BuilderProtoPool +class BuilderProtoPool extends BaseBuilderPool implements ProtoSection<BuilderStringReference, BuilderTypeReference, BuilderMethodProtoReference, BuilderTypeList> { - @Nonnull private final BuilderContext context; @Nonnull private final ConcurrentMap<MethodProtoReference, BuilderMethodProtoReference> internedItems = Maps.newConcurrentMap(); - BuilderProtoPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderProtoPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderMethodProtoReference internMethodProto(@Nonnull MethodProtoReference methodProto) { @@ -61,10 +60,10 @@ class BuilderProtoPool } BuilderMethodProtoReference protoReference = new BuilderMethodProtoReference( - context.stringPool.internString(MethodUtil.getShorty( + dexBuilder.stringSection.internString(MethodUtil.getShorty( methodProto.getParameterTypes(), methodProto.getReturnType())), - context.typeListPool.internTypeList(methodProto.getParameterTypes()), - context.typePool.internType(methodProto.getReturnType())); + dexBuilder.typeListSection.internTypeList(methodProto.getParameterTypes()), + dexBuilder.typeSection.internType(methodProto.getReturnType())); ret = internedItems.putIfAbsent(protoReference, protoReference); return ret==null?protoReference:ret; } @@ -103,4 +102,8 @@ class BuilderProtoPool } }; } + + @Override public int getItemCount() { + return internedItems.size(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java index 6b60e9f8..95fe86fb 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java @@ -86,4 +86,8 @@ class BuilderStringPool implements StringSection<BuilderStringReference, Builder } }; } + + @Override public int getItemCount() { + return internedItems.size(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java index 7b189fdb..604e39ce 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java @@ -45,13 +45,12 @@ import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -class BuilderTypeListPool implements TypeListSection<BuilderTypeReference, BuilderTypeList> { - @Nonnull private final BuilderContext context; +class BuilderTypeListPool extends BaseBuilderPool implements TypeListSection<BuilderTypeReference, BuilderTypeList> { @Nonnull private final ConcurrentMap<List<? extends CharSequence>, BuilderTypeList> internedItems = Maps.newConcurrentMap(); - BuilderTypeListPool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderTypeListPool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) { @@ -67,7 +66,7 @@ class BuilderTypeListPool implements TypeListSection<BuilderTypeReference, Build BuilderTypeList typeList = new BuilderTypeList( ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() { @Nonnull @Override public BuilderTypeReference apply(CharSequence input) { - return context.typePool.internType(input.toString()); + return dexBuilder.typeSection.internType(input.toString()); } }))); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java index 29871fc9..b9476de0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java @@ -41,12 +41,12 @@ import java.util.Collection; import java.util.Map.Entry; import java.util.concurrent.ConcurrentMap; -class BuilderTypePool implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> { - @Nonnull private final BuilderContext context; +class BuilderTypePool extends BaseBuilderPool + implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> { @Nonnull private final ConcurrentMap<String, BuilderTypeReference> internedItems = Maps.newConcurrentMap(); - BuilderTypePool(@Nonnull BuilderContext context) { - this.context = context; + public BuilderTypePool(@Nonnull DexBuilder dexBuilder) { + super(dexBuilder); } @Nonnull public BuilderTypeReference internType(@Nonnull String type) { @@ -54,7 +54,7 @@ class BuilderTypePool implements TypeSection<BuilderStringReference, BuilderType if (ret != null) { return ret; } - BuilderStringReference stringRef = context.stringPool.internString(type); + BuilderStringReference stringRef = dexBuilder.stringSection.internString(type); BuilderTypeReference typeReference = new BuilderTypeReference(stringRef); ret = internedItems.putIfAbsent(type, typeReference); return ret==null?typeReference:ret; @@ -92,4 +92,8 @@ class BuilderTypePool implements TypeSection<BuilderStringReference, BuilderType } }; } + + @Override public int getItemCount() { + return internedItems.size(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java index b7507fa6..25938fe0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java @@ -33,11 +33,13 @@ package org.jf.dexlib2.writer.builder; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.ValueType; import org.jf.dexlib2.iface.Annotation; +import org.jf.dexlib2.iface.AnnotationElement; import org.jf.dexlib2.iface.MethodImplementation; import org.jf.dexlib2.iface.MethodParameter; import org.jf.dexlib2.iface.reference.*; @@ -56,32 +58,16 @@ import java.util.Set; public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringReference, BuilderTypeReference, BuilderTypeReference, BuilderMethodProtoReference, BuilderFieldReference, BuilderMethodReference, BuilderClassDef, BuilderAnnotation, BuilderAnnotationSet, BuilderTypeList, BuilderField, BuilderMethod, - BuilderEncodedValue, BuilderAnnotationElement> { + BuilderEncodedValue, BuilderAnnotationElement, BuilderStringPool, BuilderTypePool, BuilderProtoPool, + BuilderFieldPool, BuilderMethodPool, BuilderClassPool, BuilderTypeListPool, BuilderAnnotationPool, + BuilderAnnotationSetPool> { - @Nonnull private final BuilderContext context; - - @Nonnull public static DexBuilder makeDexBuilder() { - BuilderContext context = new BuilderContext(); - return new DexBuilder(Opcodes.forApi(20), context); - } - - @Deprecated - @Nonnull - public static DexBuilder makeDexBuilder(int api) { - BuilderContext context = new BuilderContext(); - return new DexBuilder(Opcodes.forApi(api), context); - } - - @Nonnull public static DexBuilder makeDexBuilder(@Nonnull Opcodes opcodes) { - BuilderContext context = new BuilderContext(); - return new DexBuilder(opcodes, context); + public DexBuilder(@Nonnull Opcodes opcodes) { + super(opcodes); } - private DexBuilder(@Nonnull Opcodes opcodes, @Nonnull BuilderContext context) { - super(opcodes, context.stringPool, context.typePool, context.protoPool, - context.fieldPool, context.methodPool, context.classPool, context.typeListPool, context.annotationPool, - context.annotationSetPool); - this.context = context; + @Nonnull @Override protected SectionProvider getSectionProvider() { + return new DexBuilderSectionProvider(); } @Nonnull public BuilderField internField(@Nonnull String definingClass, @@ -90,10 +76,10 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR int accessFlags, @Nullable EncodedValue initialValue, @Nonnull Set<? extends Annotation> annotations) { - return new BuilderField(context.fieldPool.internField(definingClass, name, type), + return new BuilderField(fieldSection.internField(definingClass, name, type), accessFlags, - context.internNullableEncodedValue(initialValue), - context.annotationSetPool.internAnnotationSet(annotations)); + internNullableEncodedValue(initialValue), + annotationSetSection.internAnnotationSet(annotations)); } @Nonnull public BuilderMethod internMethod(@Nonnull String definingClass, @@ -106,10 +92,10 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR if (parameters == null) { parameters = ImmutableList.of(); } - return new BuilderMethod(context.methodPool.internMethod(definingClass, name, parameters, returnType), + return new BuilderMethod(methodSection.internMethod(definingClass, name, parameters, returnType), internMethodParameters(parameters), accessFlags, - context.annotationSetPool.internAnnotationSet(annotations), + annotationSetSection.internAnnotationSet(annotations), methodImplementation); } @@ -136,18 +122,18 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR } } - return context.classPool.internClass(new BuilderClassDef(context.typePool.internType(type), + return classSection.internClass(new BuilderClassDef(typeSection.internType(type), accessFlags, - context.typePool.internNullableType(superclass), - context.typeListPool.internTypeList(interfaces), - context.stringPool.internNullableString(sourceFile), - context.annotationSetPool.internAnnotationSet(annotations), + typeSection.internNullableType(superclass), + typeListSection.internTypeList(interfaces), + stringSection.internNullableString(sourceFile), + annotationSetSection.internAnnotationSet(annotations), fields, methods)); } @Nonnull public BuilderStringReference internStringReference(@Nonnull String string) { - return context.stringPool.internString(string); + return stringSection.internString(string); } @Nullable public BuilderStringReference internNullableStringReference(@Nullable String string) { @@ -158,7 +144,7 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR } @Nonnull public BuilderTypeReference internTypeReference(@Nonnull String type) { - return context.typePool.internType(type); + return typeSection.internType(type); } @Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) { @@ -169,15 +155,15 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR } @Nonnull public BuilderFieldReference internFieldReference(@Nonnull FieldReference field) { - return context.fieldPool.internField(field); + return fieldSection.internField(field); } @Nonnull public BuilderMethodReference internMethodReference(@Nonnull MethodReference method) { - return context.methodPool.internMethod(method); + return methodSection.internMethod(method); } @Nonnull public BuilderMethodProtoReference internMethodProtoReference(@Nonnull MethodProtoReference methodProto) { - return context.protoPool.internMethodProto(methodProto); + return protoSection.internMethodProto(methodProto); } @Nonnull public BuilderReference internReference(@Nonnull Reference reference) { @@ -214,9 +200,9 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR @Nonnull private BuilderMethodParameter internMethodParameter(@Nonnull MethodParameter methodParameter) { return new BuilderMethodParameter( - context.typePool.internType(methodParameter.getType()), - context.stringPool.internNullableString(methodParameter.getName()), - context.annotationSetPool.internAnnotationSet(methodParameter.getAnnotations())); + typeSection.internType(methodParameter.getType()), + stringSection.internNullableString(methodParameter.getName()), + annotationSetSection.internAnnotationSet(methodParameter.getAnnotations())); } @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer, @@ -276,4 +262,143 @@ public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringR throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType()); } } + + @Nonnull Set<? extends BuilderAnnotationElement> internAnnotationElements( + @Nonnull Set<? extends AnnotationElement> elements) { + return ImmutableSet.copyOf( + Iterators.transform(elements.iterator(), + new Function<AnnotationElement, BuilderAnnotationElement>() { + @Nullable @Override + public BuilderAnnotationElement apply(AnnotationElement input) { + return internAnnotationElement(input); + } + })); + } + + @Nonnull private BuilderAnnotationElement internAnnotationElement(@Nonnull AnnotationElement annotationElement) { + return new BuilderAnnotationElement(stringSection.internString(annotationElement.getName()), + internEncodedValue(annotationElement.getValue())); + } + + @Nullable BuilderEncodedValue internNullableEncodedValue(@Nullable EncodedValue encodedValue) { + if (encodedValue == null) { + return null; + } + return internEncodedValue(encodedValue); + } + + @Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) { + switch (encodedValue.getValueType()) { + case ValueType.ANNOTATION: + return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue); + case ValueType.ARRAY: + return internArrayEncodedValue((ArrayEncodedValue)encodedValue); + case ValueType.BOOLEAN: + boolean value = ((BooleanEncodedValue)encodedValue).getValue(); + return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE; + case ValueType.BYTE: + return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue()); + case ValueType.CHAR: + return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue()); + case ValueType.DOUBLE: + return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue()); + case ValueType.ENUM: + return internEnumEncodedValue((EnumEncodedValue)encodedValue); + case ValueType.FIELD: + return internFieldEncodedValue((FieldEncodedValue)encodedValue); + case ValueType.FLOAT: + return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue()); + case ValueType.INT: + return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue()); + case ValueType.LONG: + return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue()); + case ValueType.METHOD: + return internMethodEncodedValue((MethodEncodedValue)encodedValue); + case ValueType.NULL: + return BuilderNullEncodedValue.INSTANCE; + case ValueType.SHORT: + return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue()); + case ValueType.STRING: + return internStringEncodedValue((StringEncodedValue)encodedValue); + case ValueType.TYPE: + return internTypeEncodedValue((TypeEncodedValue)encodedValue); + default: + throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType()); + } + } + + @Nonnull private BuilderAnnotationEncodedValue internAnnotationEncodedValue(@Nonnull AnnotationEncodedValue value) { + return new BuilderAnnotationEncodedValue( + typeSection.internType(value.getType()), + internAnnotationElements(value.getElements())); + } + + @Nonnull private BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue value) { + return new BuilderArrayEncodedValue( + ImmutableList.copyOf( + Iterators.transform(value.getValue().iterator(), + new Function<EncodedValue, BuilderEncodedValue>() { + @Nullable @Override public BuilderEncodedValue apply(EncodedValue input) { + return internEncodedValue(input); + } + }))); + } + + @Nonnull private BuilderEnumEncodedValue internEnumEncodedValue(@Nonnull EnumEncodedValue value) { + return new BuilderEnumEncodedValue(fieldSection.internField(value.getValue())); + } + + @Nonnull private BuilderFieldEncodedValue internFieldEncodedValue(@Nonnull FieldEncodedValue value) { + return new BuilderFieldEncodedValue(fieldSection.internField(value.getValue())); + } + + @Nonnull private BuilderMethodEncodedValue internMethodEncodedValue(@Nonnull MethodEncodedValue value) { + return new BuilderMethodEncodedValue(methodSection.internMethod(value.getValue())); + } + + @Nonnull private BuilderStringEncodedValue internStringEncodedValue(@Nonnull StringEncodedValue string) { + return new BuilderStringEncodedValue(stringSection.internString(string.getValue())); + } + + @Nonnull private BuilderTypeEncodedValue internTypeEncodedValue(@Nonnull TypeEncodedValue type) { + return new BuilderTypeEncodedValue(typeSection.internType(type.getValue())); + } + + protected class DexBuilderSectionProvider extends SectionProvider { + @Nonnull @Override public BuilderStringPool getStringSection() { + return new BuilderStringPool(); + } + + @Nonnull @Override public BuilderTypePool getTypeSection() { + return new BuilderTypePool(DexBuilder.this); + } + + @Nonnull @Override public BuilderProtoPool getProtoSection() { + return new BuilderProtoPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderFieldPool getFieldSection() { + return new BuilderFieldPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderMethodPool getMethodSection() { + return new BuilderMethodPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderClassPool getClassSection() { + return new BuilderClassPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderTypeListPool getTypeListSection() { + return new BuilderTypeListPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderAnnotationPool getAnnotationSection() { + return new BuilderAnnotationPool(DexBuilder.this); + } + + @Nonnull @Override public BuilderAnnotationSetPool getAnnotationSetSection() { + return new BuilderAnnotationSetPool(DexBuilder.this); + } + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java index c4cfa390..b2db8890 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java @@ -41,26 +41,18 @@ import java.util.Collection; public class AnnotationPool extends BaseOffsetPool<Annotation> implements AnnotationSection<CharSequence, CharSequence, Annotation, AnnotationElement, EncodedValue> { - @Nonnull StringPool stringPool; - @Nonnull TypePool typePool; - @Nonnull FieldPool fieldPool; - @Nonnull MethodPool methodPool; - public AnnotationPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool, - @Nonnull FieldPool fieldPool, @Nonnull MethodPool methodPool) { - this.stringPool = stringPool; - this.typePool = typePool; - this.fieldPool = fieldPool; - this.methodPool = methodPool; + public AnnotationPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull Annotation annotation) { Integer prev = internedItems.put(annotation, 0); if (prev == null) { - typePool.intern(annotation.getType()); + dexPool.typeSection.intern(annotation.getType()); for (AnnotationElement element: annotation.getElements()) { - stringPool.intern(element.getName()); - DexPool.internEncodedValue(element.getValue(), stringPool, typePool, fieldPool, methodPool); + dexPool.stringSection.intern(element.getName()); + dexPool.internEncodedValue(element.getValue()); } } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java index 6512dcb4..2170b95b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java @@ -40,10 +40,9 @@ import java.util.Set; public class AnnotationSetPool extends BaseNullableOffsetPool<Set<? extends Annotation>> implements AnnotationSetSection<Annotation, Set<? extends Annotation>> { - @Nonnull private final AnnotationPool annotationPool; - public AnnotationSetPool(@Nonnull AnnotationPool annotationPool) { - this.annotationPool = annotationPool; + public AnnotationSetPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull Set<? extends Annotation> annotationSet) { @@ -51,7 +50,7 @@ public class AnnotationSetPool extends BaseNullableOffsetPool<Set<? extends Anno Integer prev = internedItems.put(annotationSet, 0); if (prev == null) { for (Annotation annotation: annotationSet) { - annotationPool.intern(annotation); + dexPool.annotationSection.intern(annotation); } } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java index 01109ad4..c07dcf1a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java @@ -31,7 +31,6 @@ package org.jf.dexlib2.writer.pool; -import com.google.common.collect.Maps; import org.jf.dexlib2.writer.IndexSection; import org.jf.util.ExceptionWithContext; @@ -39,8 +38,11 @@ import javax.annotation.Nonnull; import java.util.Collection; import java.util.Map; -public abstract class BaseIndexPool<Key> implements IndexSection<Key> { - @Nonnull protected final Map<Key, Integer> internedItems = Maps.newHashMap(); +public abstract class BaseIndexPool<Key> extends BasePool<Key, Integer> implements IndexSection<Key> { + + public BaseIndexPool(@Nonnull DexPool dexPool) { + super(dexPool); + } @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() { return internedItems.entrySet(); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java index ed9dbb6a..b04060a3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java @@ -34,10 +34,16 @@ package org.jf.dexlib2.writer.pool; import org.jf.dexlib2.writer.DexWriter; import org.jf.dexlib2.writer.NullableOffsetSection; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public abstract class BaseNullableOffsetPool<Key> extends BaseOffsetPool<Key> implements NullableOffsetSection<Key> { + + public BaseNullableOffsetPool(@Nonnull DexPool dexPool) { + super(dexPool); + } + @Override public int getNullableItemOffset(@Nullable Key key) { if (key == null) { return DexWriter.NO_OFFSET; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java index e66a50ad..789c9547 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java @@ -31,7 +31,6 @@ package org.jf.dexlib2.writer.pool; -import com.google.common.collect.Maps; import org.jf.dexlib2.writer.OffsetSection; import org.jf.util.ExceptionWithContext; @@ -39,8 +38,11 @@ import javax.annotation.Nonnull; import java.util.Collection; import java.util.Map; -public abstract class BaseOffsetPool<Key> implements OffsetSection<Key> { - @Nonnull protected final Map<Key, Integer> internedItems = Maps.newHashMap(); +public abstract class BaseOffsetPool<Key> extends BasePool<Key, Integer> implements OffsetSection<Key> { + + public BaseOffsetPool(@Nonnull DexPool dexPool) { + super(dexPool); + } @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() { return internedItems.entrySet(); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java new file mode 100644 index 00000000..4fa18102 --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java @@ -0,0 +1,75 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.writer.pool; + +import com.google.common.collect.Maps; + +import javax.annotation.Nonnull; +import java.util.Iterator; +import java.util.Map; + +public class BasePool<Key, Value> implements Markable { + @Nonnull protected final DexPool dexPool; + @Nonnull protected final Map<Key, Value> internedItems = Maps.newLinkedHashMap(); + private int markedItemCount = -1; + + public BasePool(@Nonnull DexPool dexPool) { + this.dexPool = dexPool; + } + + public void mark() { + markedItemCount = internedItems.size(); + } + + public void reset() { + if (markedItemCount < 0) { + throw new IllegalStateException("mark() must be called before calling reset()"); + } + + if (markedItemCount == internedItems.size()) { + return; + } + + Iterator<Key> keys = internedItems.keySet().iterator(); + for (int i=0; i<markedItemCount; i++) { + keys.next(); + } + while (keys.hasNext()) { + keys.next(); + keys.remove(); + } + } + + public int getItemCount() { + return internedItems.size(); + } +} 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 0389973a..7c1d6811 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 @@ -58,30 +58,12 @@ import java.io.IOException; import java.util.*; import java.util.Map.Entry; -public class ClassPool implements ClassSection<CharSequence, CharSequence, +public class ClassPool extends BasePool<String, PoolClassDef> implements ClassSection<CharSequence, CharSequence, TypeListPool.Key<? extends Collection<? extends CharSequence>>, PoolClassDef, Field, PoolMethod, Set<? extends Annotation>, EncodedValue> { - @Nonnull private HashMap<String, PoolClassDef> internedItems = Maps.newHashMap(); - - @Nonnull private final StringPool stringPool; - @Nonnull private final TypePool typePool; - @Nonnull private final FieldPool fieldPool; - @Nonnull private final MethodPool methodPool; - @Nonnull private final AnnotationSetPool annotationSetPool; - @Nonnull private final TypeListPool typeListPool; - - public ClassPool(@Nonnull StringPool stringPool, - @Nonnull TypePool typePool, - @Nonnull FieldPool fieldPool, - @Nonnull MethodPool methodPool, - @Nonnull AnnotationSetPool annotationSetPool, - @Nonnull TypeListPool typeListPool) { - this.stringPool = stringPool; - this.typePool = typePool; - this.fieldPool = fieldPool; - this.methodPool = methodPool; - this.annotationSetPool = annotationSetPool; - this.typeListPool = typeListPool; + + public ClassPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull ClassDef classDef) { @@ -92,10 +74,10 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, throw new ExceptionWithContext("Class %s has already been interned", poolClassDef.getType()); } - typePool.intern(poolClassDef.getType()); - typePool.internNullable(poolClassDef.getSuperclass()); - typeListPool.intern(poolClassDef.getInterfaces()); - stringPool.internNullable(poolClassDef.getSourceFile()); + dexPool.typeSection.intern(poolClassDef.getType()); + dexPool.typeSection.internNullable(poolClassDef.getSuperclass()); + dexPool.typeListSection.intern(poolClassDef.getInterfaces()); + dexPool.stringSection.internNullable(poolClassDef.getSourceFile()); HashSet<String> fields = new HashSet<String>(); for (Field field: poolClassDef.getFields()) { @@ -104,14 +86,14 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, throw new ExceptionWithContext("Multiple definitions for field %s->%s", poolClassDef.getType(), fieldDescriptor); } - fieldPool.intern(field); + dexPool.fieldSection.intern(field); EncodedValue initialValue = field.getInitialValue(); if (initialValue != null) { - DexPool.internEncodedValue(initialValue, stringPool, typePool, fieldPool, methodPool); + dexPool.internEncodedValue(initialValue); } - annotationSetPool.intern(field.getAnnotations()); + dexPool.annotationSetSection.intern(field.getAnnotations()); } HashSet<String> methods = new HashSet<String>(); @@ -121,17 +103,17 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, throw new ExceptionWithContext("Multiple definitions for method %s->%s", poolClassDef.getType(), methodDescriptor); } - methodPool.intern(method); + dexPool.methodSection.intern(method); internCode(method); internDebug(method); - annotationSetPool.intern(method.getAnnotations()); + dexPool.annotationSetSection.intern(method.getAnnotations()); for (MethodParameter parameter: method.getParameters()) { - annotationSetPool.intern(parameter.getAnnotations()); + dexPool.annotationSetSection.intern(parameter.getAnnotations()); } } - annotationSetPool.intern(poolClassDef.getAnnotations()); + dexPool.annotationSetSection.intern(poolClassDef.getAnnotations()); } private void internCode(@Nonnull Method method) { @@ -146,16 +128,16 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, Reference reference = ((ReferenceInstruction)instruction).getReference(); switch (instruction.getOpcode().referenceType) { case ReferenceType.STRING: - stringPool.intern((StringReference)reference); + dexPool.stringSection.intern((StringReference)reference); break; case ReferenceType.TYPE: - typePool.intern((TypeReference)reference); + dexPool.typeSection.intern((TypeReference)reference); break; case ReferenceType.FIELD: - fieldPool.intern((FieldReference) reference); + dexPool.fieldSection.intern((FieldReference) reference); break; case ReferenceType.METHOD: - methodPool.intern((MethodReference)reference); + dexPool.methodSection.intern((MethodReference)reference); break; default: throw new ExceptionWithContext("Unrecognized reference type: %d", @@ -172,7 +154,7 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, for (TryBlock<? extends ExceptionHandler> tryBlock: methodImpl.getTryBlocks()) { for (ExceptionHandler handler: tryBlock.getExceptionHandlers()) { - typePool.internNullable(handler.getExceptionType()); + dexPool.typeSection.internNullable(handler.getExceptionType()); } } } @@ -182,7 +164,7 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, for (MethodParameter param: method.getParameters()) { String paramName = param.getName(); if (paramName != null) { - stringPool.intern(paramName); + dexPool.stringSection.intern(paramName); } } @@ -192,12 +174,12 @@ public class ClassPool implements ClassSection<CharSequence, CharSequence, switch (debugItem.getDebugItemType()) { case DebugItemType.START_LOCAL: StartLocal startLocal = (StartLocal)debugItem; - stringPool.internNullable(startLocal.getName()); - typePool.internNullable(startLocal.getType()); - stringPool.internNullable(startLocal.getSignature()); + dexPool.stringSection.internNullable(startLocal.getName()); + dexPool.typeSection.internNullable(startLocal.getType()); + dexPool.stringSection.internNullable(startLocal.getSignature()); break; case DebugItemType.SET_SOURCE_FILE: - stringPool.internNullable(((SetSourceFile) debugItem).getSourceFile()); + dexPool.stringSection.internNullable(((SetSourceFile) debugItem).getSourceFile()); break; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java index d12457a2..6d662ec3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java @@ -39,7 +39,7 @@ import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.Field; import org.jf.dexlib2.iface.reference.*; import org.jf.dexlib2.iface.value.*; -import org.jf.dexlib2.writer.DexWriter; +import org.jf.dexlib2.writer.*; import org.jf.dexlib2.writer.io.DexDataStore; import org.jf.dexlib2.writer.io.FileDataStore; import org.jf.util.ExceptionWithContext; @@ -54,59 +54,69 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen MethodProtoReference, FieldReference, MethodReference, PoolClassDef, Annotation, Set<? extends Annotation>, TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod, - EncodedValue, AnnotationElement> { + EncodedValue, AnnotationElement, StringPool, TypePool, ProtoPool, FieldPool, MethodPool, ClassPool, + TypeListPool, AnnotationPool, AnnotationSetPool> { - @Nonnull - public static DexPool makeDexPool() { - return makeDexPool(Opcodes.forApi(20)); - } - - @Deprecated - @Nonnull - public static DexPool makeDexPool(int api) { - return makeDexPool(Opcodes.forApi(api)); - } + private final Markable[] sections = new Markable[] { + stringSection, typeSection, protoSection, fieldSection, methodSection, classSection, typeListSection, + annotationSection, annotationSetSection + }; - @Nonnull - public static DexPool makeDexPool(@Nonnull Opcodes opcodes) { - StringPool stringPool = new StringPool(); - TypePool typePool = new TypePool(stringPool); - FieldPool fieldPool = new FieldPool(stringPool, typePool); - TypeListPool typeListPool = new TypeListPool(typePool); - ProtoPool protoPool = new ProtoPool(stringPool, typePool, typeListPool); - MethodPool methodPool = new MethodPool(stringPool, typePool, protoPool); - AnnotationPool annotationPool = new AnnotationPool(stringPool, typePool, fieldPool, methodPool); - AnnotationSetPool annotationSetPool = new AnnotationSetPool(annotationPool); - ClassPool classPool = new ClassPool(stringPool, typePool, fieldPool, methodPool, annotationSetPool, - typeListPool); - - return new DexPool(opcodes, stringPool, typePool, protoPool, fieldPool, methodPool, classPool, typeListPool, - annotationPool, annotationSetPool); + public DexPool(Opcodes opcodes) { + super(opcodes); } - private DexPool(Opcodes opcodes, StringPool stringPool, TypePool typePool, ProtoPool protoPool, FieldPool fieldPool, - MethodPool methodPool, ClassPool classPool, TypeListPool typeListPool, - AnnotationPool annotationPool, AnnotationSetPool annotationSetPool) { - super(opcodes, stringPool, typePool, protoPool, fieldPool, methodPool, - classPool, typeListPool, annotationPool, annotationSetPool); + @Nonnull @Override protected SectionProvider getSectionProvider() { + return new DexPoolSectionProvider(); } - public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException { - DexPool dexPool = makeDexPool(); + public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) + throws IOException { + DexPool dexPool = new DexPool(input.getOpcodes()); for (ClassDef classDef: input.getClasses()) { - ((ClassPool)dexPool.classSection).intern(classDef); + dexPool.internClass(classDef); } dexPool.writeTo(dataStore); } public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException { - DexPool dexPool = makeDexPool(); + DexPool dexPool = new DexPool(input.getOpcodes()); for (ClassDef classDef: input.getClasses()) { - ((ClassPool)dexPool.classSection).intern(classDef); + dexPool.internClass(classDef); } dexPool.writeTo(new FileDataStore(new File(path))); } + /** + * Interns a class into this DexPool + * @param classDef The class to intern + */ + public void internClass(ClassDef classDef) { + classSection.intern(classDef); + } + + /** + * Creates a marked state that can be returned to by calling reset() + * + * This is useful to rollback the last added class if it causes a method/field/type overflow + */ + public void mark() { + for (Markable section: sections) { + section.mark(); + } + } + + /** + * Resets to the last marked state + * + * This is useful to rollback the last added class if it causes a method/field/type overflow + */ + public void reset() { + for (Markable section: sections) { + section.reset(); + } + } + @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer, @Nonnull EncodedValue encodedValue) throws IOException { switch (encodedValue.getValueType()) { @@ -165,40 +175,74 @@ public class DexPool extends DexWriter<CharSequence, StringReference, CharSequen } } - public static void internEncodedValue(@Nonnull EncodedValue encodedValue, - @Nonnull StringPool stringPool, - @Nonnull TypePool typePool, - @Nonnull FieldPool fieldPool, - @Nonnull MethodPool methodPool) { + void internEncodedValue(@Nonnull EncodedValue encodedValue) { switch (encodedValue.getValueType()) { case ValueType.ANNOTATION: AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue; - typePool.intern(annotationEncodedValue.getType()); + typeSection.intern(annotationEncodedValue.getType()); for (AnnotationElement element: annotationEncodedValue.getElements()) { - stringPool.intern(element.getName()); - internEncodedValue(element.getValue(), stringPool, typePool, fieldPool, methodPool); + stringSection.intern(element.getName()); + internEncodedValue(element.getValue()); } break; case ValueType.ARRAY: for (EncodedValue element: ((ArrayEncodedValue)encodedValue).getValue()) { - internEncodedValue(element, stringPool, typePool, fieldPool, methodPool); + internEncodedValue(element); } break; case ValueType.STRING: - stringPool.intern(((StringEncodedValue)encodedValue).getValue()); + stringSection.intern(((StringEncodedValue)encodedValue).getValue()); break; case ValueType.TYPE: - typePool.intern(((TypeEncodedValue)encodedValue).getValue()); + typeSection.intern(((TypeEncodedValue)encodedValue).getValue()); break; case ValueType.ENUM: - fieldPool.intern(((EnumEncodedValue)encodedValue).getValue()); + fieldSection.intern(((EnumEncodedValue)encodedValue).getValue()); break; case ValueType.FIELD: - fieldPool.intern(((FieldEncodedValue)encodedValue).getValue()); + fieldSection.intern(((FieldEncodedValue)encodedValue).getValue()); break; case ValueType.METHOD: - methodPool.intern(((MethodEncodedValue)encodedValue).getValue()); + methodSection.intern(((MethodEncodedValue)encodedValue).getValue()); break; } } + + protected class DexPoolSectionProvider extends SectionProvider { + @Nonnull @Override public StringPool getStringSection() { + return new StringPool(DexPool.this); + } + + @Nonnull @Override public TypePool getTypeSection() { + return new TypePool(DexPool.this); + } + + @Nonnull @Override public ProtoPool getProtoSection() { + return new ProtoPool(DexPool.this); + } + + @Nonnull @Override public FieldPool getFieldSection() { + return new FieldPool(DexPool.this); + } + + @Nonnull @Override public MethodPool getMethodSection() { + return new MethodPool(DexPool.this); + } + + @Nonnull @Override public ClassPool getClassSection() { + return new ClassPool(DexPool.this); + } + + @Nonnull @Override public TypeListPool getTypeListSection() { + return new TypeListPool(DexPool.this); + } + + @Nonnull @Override public AnnotationPool getAnnotationSection() { + return new AnnotationPool(DexPool.this); + } + + @Nonnull @Override public AnnotationSetPool getAnnotationSetSection() { + return new AnnotationSetPool(DexPool.this); + } + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java index 3403d12e..135d79bd 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java @@ -39,20 +39,17 @@ import javax.annotation.Nonnull; public class FieldPool extends BaseIndexPool<FieldReference> implements FieldSection<CharSequence, CharSequence, FieldReference, Field> { - @Nonnull private final StringPool stringPool; - @Nonnull private final TypePool typePool; - public FieldPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool) { - this.stringPool = stringPool; - this.typePool = typePool; + public FieldPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull FieldReference field) { Integer prev = internedItems.put(field, 0); if (prev == null) { - typePool.intern(field.getDefiningClass()); - stringPool.intern(field.getName()); - typePool.intern(field.getType()); + dexPool.typeSection.intern(field.getDefiningClass()); + dexPool.stringSection.intern(field.getName()); + dexPool.typeSection.intern(field.getType()); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java new file mode 100644 index 00000000..8b14574c --- /dev/null +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java @@ -0,0 +1,37 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.writer.pool; + +public interface Markable { + void mark(); + void reset(); +} diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java index 8103d319..2801abd0 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java @@ -39,26 +39,24 @@ import javax.annotation.Nonnull; public class MethodPool extends BaseIndexPool<MethodReference> implements MethodSection<CharSequence, CharSequence, MethodProtoReference, MethodReference, PoolMethod> { - @Nonnull private final StringPool stringPool; - @Nonnull private final TypePool typePool; - @Nonnull private final ProtoPool protoPool; - public MethodPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool, - @Nonnull ProtoPool protoPool) { - this.stringPool = stringPool; - this.typePool = typePool; - this.protoPool = protoPool; + public MethodPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull MethodReference method) { Integer prev = internedItems.put(method, 0); if (prev == null) { - typePool.intern(method.getDefiningClass()); - protoPool.intern(new PoolMethodProto(method)); - stringPool.intern(method.getName()); + dexPool.typeSection.intern(method.getDefiningClass()); + dexPool.protoSection.intern(new PoolMethodProto(method)); + dexPool.stringSection.intern(method.getName()); } } + @Nonnull @Override public MethodReference getMethodReference(@Nonnull PoolMethod poolMethod) { + return poolMethod; + } + @Nonnull @Override public CharSequence getDefiningClass(@Nonnull MethodReference methodReference) { return methodReference.getDefiningClass(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java index 523e5f4d..1209bd93 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java @@ -43,23 +43,17 @@ import java.util.List; public class ProtoPool extends BaseIndexPool<MethodProtoReference> implements ProtoSection<CharSequence, CharSequence, MethodProtoReference, TypeListPool.Key<? extends Collection<? extends CharSequence>>> { - @Nonnull private final StringPool stringPool; - @Nonnull private final TypePool typePool; - @Nonnull private final TypeListPool typeListPool; - public ProtoPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool, - @Nonnull TypeListPool typeListPool) { - this.stringPool = stringPool; - this.typePool = typePool; - this.typeListPool = typeListPool; + public ProtoPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull MethodProtoReference reference) { Integer prev = internedItems.put(reference, 0); if (prev == null) { - stringPool.intern(getShorty(reference)); - typePool.intern(reference.getReturnType()); - typeListPool.intern(reference.getParameterTypes()); + dexPool.stringSection.intern(getShorty(reference)); + dexPool.typeSection.intern(reference.getReturnType()); + dexPool.typeListSection.intern(reference.getParameterTypes()); } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java index 5886b4f6..61f1502e 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java @@ -39,6 +39,11 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public class StringPool extends StringTypeBasePool implements StringSection<CharSequence, StringReference> { + + public StringPool(@Nonnull DexPool dexPool) { + super(dexPool); + } + public void intern(@Nonnull CharSequence string) { internedItems.put(string.toString(), 0); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java index 768e562d..54c6cea6 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java @@ -31,7 +31,6 @@ package org.jf.dexlib2.writer.pool; -import com.google.common.collect.Maps; import org.jf.dexlib2.writer.DexWriter; import org.jf.dexlib2.writer.NullableIndexSection; import org.jf.util.ExceptionWithContext; @@ -41,8 +40,12 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Map; -public abstract class StringTypeBasePool implements NullableIndexSection<CharSequence> { - @Nonnull protected final Map<String, Integer> internedItems = Maps.newHashMap(); +public abstract class StringTypeBasePool extends BasePool<String, Integer> + implements NullableIndexSection<CharSequence>, Markable { + + public StringTypeBasePool(@Nonnull DexPool dexPool) { + super(dexPool); + } @Nonnull @Override public Collection<Map.Entry<String, Integer>> getItems() { return internedItems.entrySet(); diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java index 7e0fbe03..038f4d1a 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java @@ -43,10 +43,10 @@ import java.util.Iterator; public class TypeListPool extends BaseNullableOffsetPool<Key<? extends Collection<? extends CharSequence>>> implements TypeListSection<CharSequence, Key<? extends Collection<? extends CharSequence>>> { - @Nonnull private final TypePool typePool; - public TypeListPool(@Nonnull TypePool typePool) { - this.typePool = typePool; + + public TypeListPool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull Collection<? extends CharSequence> types) { @@ -55,7 +55,7 @@ public class TypeListPool extends BaseNullableOffsetPool<Key<? extends Collectio Integer prev = internedItems.put(key, 0); if (prev == null) { for (CharSequence type: types) { - typePool.intern(type); + dexPool.typeSection.intern(type); } } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java index 13bcd8ad..7e432089 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java @@ -39,17 +39,17 @@ import javax.annotation.Nullable; public class TypePool extends StringTypeBasePool implements TypeSection<CharSequence, CharSequence, TypeReference> { - @Nonnull private final StringPool stringPool; - public TypePool(@Nonnull StringPool stringPool) { - this.stringPool = stringPool; + + public TypePool(@Nonnull DexPool dexPool) { + super(dexPool); } public void intern(@Nonnull CharSequence type) { String typeString = type.toString(); Integer prev = internedItems.put(typeString, 0); if (prev == null) { - stringPool.intern(typeString); + dexPool.stringSection.intern(typeString); } } diff --git a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java index 4c8f85bf..ff832c27 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java @@ -79,7 +79,7 @@ public class AccessorTest { public void testAccessors() throws IOException { URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex"); Assert.assertNotNull(url); - DexFile f = DexFileFactory.loadDexFile(url.getFile(), 15, false); + DexFile f = DexFileFactory.loadDexFile(url.getFile(), Opcodes.getDefault()); SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses()); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java new file mode 100644 index 00000000..610d3c76 --- /dev/null +++ b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java @@ -0,0 +1,231 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2; + +import com.beust.jcommander.internal.Maps; +import com.google.common.collect.Lists; +import org.jf.dexlib2.DexFileFactory.DexEntryFinder; +import org.jf.dexlib2.DexFileFactory.DexFileNotFoundException; +import org.jf.dexlib2.DexFileFactory.MultipleMatchingDexEntriesException; +import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile; +import org.jf.dexlib2.iface.MultiDexContainer; +import org.junit.Assert; +import org.junit.Test; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import static org.mockito.Mockito.mock; + +public class DexEntryFinderTest { + + @Test + public void testNormalStuff() throws Exception { + Map<String, DexBackedDexFile> entries = Maps.newHashMap(); + DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class); + entries.put("/system/framework/framework.jar", dexFile1); + DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class); + entries.put("/system/framework/framework.jar:classes2.dex", dexFile2); + DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries)); + + Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true)); + + assertEntryNotFound(testFinder, "system/framework/framework.jar", true); + assertEntryNotFound(testFinder, "/framework/framework.jar", true); + assertEntryNotFound(testFinder, "framework/framework.jar", true); + assertEntryNotFound(testFinder, "/framework.jar", true); + assertEntryNotFound(testFinder, "framework.jar", true); + + Assert.assertEquals(dexFile1, testFinder.findEntry("system/framework/framework.jar", false)); + Assert.assertEquals(dexFile1, testFinder.findEntry("/framework/framework.jar", false)); + Assert.assertEquals(dexFile1, testFinder.findEntry("framework/framework.jar", false)); + Assert.assertEquals(dexFile1, testFinder.findEntry("/framework.jar", false)); + Assert.assertEquals(dexFile1, testFinder.findEntry("framework.jar", false)); + + assertEntryNotFound(testFinder, "ystem/framework/framework.jar", false); + assertEntryNotFound(testFinder, "ssystem/framework/framework.jar", false); + assertEntryNotFound(testFinder, "ramework/framework.jar", false); + assertEntryNotFound(testFinder, "ramework.jar", false); + assertEntryNotFound(testFinder, "framework", false); + + Assert.assertEquals(dexFile2, testFinder.findEntry("/system/framework/framework.jar:classes2.dex", true)); + + assertEntryNotFound(testFinder, "system/framework/framework.jar:classes2.dex", true); + assertEntryNotFound(testFinder, "framework.jar:classes2.dex", true); + assertEntryNotFound(testFinder, "classes2.dex", true); + + Assert.assertEquals(dexFile2, testFinder.findEntry("system/framework/framework.jar:classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar:classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar:classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("/framework.jar:classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("framework.jar:classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry(":classes2.dex", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("classes2.dex", false)); + + assertEntryNotFound(testFinder, "ystem/framework/framework.jar:classes2.dex", false); + assertEntryNotFound(testFinder, "ramework.jar:classes2.dex", false); + assertEntryNotFound(testFinder, "lasses2.dex", false); + assertEntryNotFound(testFinder, "classes2", false); + } + + @Test + public void testSimilarEntries() throws Exception { + Map<String, DexBackedDexFile> entries = Maps.newHashMap(); + DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class); + entries.put("/system/framework/framework.jar", dexFile1); + DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class); + entries.put("system/framework/framework.jar", dexFile2); + DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries)); + + Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true)); + Assert.assertEquals(dexFile2, testFinder.findEntry("system/framework/framework.jar", true)); + + assertMultipleMatchingEntries(testFinder, "/system/framework/framework.jar"); + assertMultipleMatchingEntries(testFinder, "system/framework/framework.jar"); + + assertMultipleMatchingEntries(testFinder, "/framework/framework.jar"); + assertMultipleMatchingEntries(testFinder, "framework/framework.jar"); + assertMultipleMatchingEntries(testFinder, "/framework.jar"); + assertMultipleMatchingEntries(testFinder, "framework.jar"); + } + + @Test + public void testMatchingSuffix() throws Exception { + Map<String, DexBackedDexFile> entries = Maps.newHashMap(); + DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class); + entries.put("/system/framework/framework.jar", dexFile1); + DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class); + entries.put("/framework/framework.jar", dexFile2); + DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries)); + + Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true)); + Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", true)); + + Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", false)); + Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar", false)); + + assertMultipleMatchingEntries(testFinder, "/framework.jar"); + assertMultipleMatchingEntries(testFinder, "framework.jar"); + } + + @Test + public void testNonDexEntries() throws Exception { + Map<String, DexBackedDexFile> entries = Maps.newHashMap(); + DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class); + entries.put("classes.dex", dexFile1); + entries.put("/blah/classes.dex", null); + DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries)); + + Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", true)); + Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", false)); + + assertUnsupportedFileType(testFinder, "/blah/classes.dex", true); + assertDexFileNotFound(testFinder, "/blah/classes.dex", false); + } + + private void assertEntryNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException { + try { + finder.findEntry(entry, exactMatch); + Assert.fail(); + } catch (DexFileNotFoundException ex) { + // expected exception + } + } + + private void assertMultipleMatchingEntries(DexEntryFinder finder, String entry) throws IOException { + try { + finder.findEntry(entry, false); + Assert.fail(); + } catch (MultipleMatchingDexEntriesException ex) { + // expected exception + } + } + + private void assertUnsupportedFileType(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException { + try { + finder.findEntry(entry, exactMatch); + Assert.fail(); + } catch (UnsupportedFileTypeException ex) { + // expected exception + } + } + + private void assertDexFileNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException { + try { + finder.findEntry(entry, exactMatch); + Assert.fail(); + } catch (DexFileNotFoundException ex) { + // expected exception + } + } + + public static class TestMultiDexContainer implements MultiDexContainer<DexBackedDexFile> { + @Nonnull private final Map<String, DexBackedDexFile> entries; + + public TestMultiDexContainer(@Nonnull Map<String, DexBackedDexFile> entries) { + this.entries = entries; + } + + @Nonnull @Override public List<String> getDexEntryNames() throws IOException { + List<String> entryNames = Lists.newArrayList(); + + for (Entry<String, DexBackedDexFile> entry: entries.entrySet()) { + if (entry.getValue() != null) { + entryNames.add(entry.getKey()); + } + } + + return entryNames; + } + + @Nullable @Override public DexBackedDexFile getEntry(@Nonnull String entryName) throws IOException { + if (entries.containsKey(entryName)) { + DexBackedDexFile entry = entries.get(entryName); + if (entry == null) { + throw new NotADexFile(); + } + return entry; + } + return null; + } + + @Nonnull @Override public Opcodes getOpcodes() { + return Opcodes.getDefault(); + } + } +} diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java index 3f1ee56d..d69dd81a 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java @@ -32,8 +32,10 @@ package org.jf.dexlib2.analysis; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import junit.framework.Assert; import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.immutable.ImmutableDexFile; import org.junit.Test; @@ -51,49 +53,53 @@ public class CommonSuperclassTest { // fivetwothree // fivethree - private final ClassPath classPath; + private final ClassPath oldClassPath; + private final ClassPath newClassPath; + public CommonSuperclassTest() throws IOException { - classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), - ImmutableSet.of( - TestUtils.makeClassDef("Ljava/lang/Object;", null), - TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"), - TestUtils.makeClassDef("Ltest/two;", "Ljava/lang/Object;"), - TestUtils.makeClassDef("Ltest/onetwo;", "Ltest/one;"), - TestUtils.makeClassDef("Ltest/onetwothree;", "Ltest/onetwo;"), - TestUtils.makeClassDef("Ltest/onethree;", "Ltest/one;"), - TestUtils.makeClassDef("Ltest/fivetwo;", "Ltest/five;"), - TestUtils.makeClassDef("Ltest/fivetwothree;", "Ltest/fivetwo;"), - TestUtils.makeClassDef("Ltest/fivethree;", "Ltest/five;"), - TestUtils.makeInterfaceDef("Ljava/lang/Cloneable;"), - TestUtils.makeInterfaceDef("Ljava/io/Serializable;"), - - // basic class and interface - TestUtils.makeClassDef("Liface/classiface1;", "Ljava/lang/Object;", "Liface/iface1;"), - TestUtils.makeInterfaceDef("Liface/iface1;"), - - // a more complex interface tree - TestUtils.makeInterfaceDef("Liface/base1;"), - // implements undefined interface - TestUtils.makeInterfaceDef("Liface/sub1;", "Liface/base1;", "Liface/base2;"), - // this implements sub1, so that its interfaces can't be fully resolved either - TestUtils.makeInterfaceDef("Liface/sub2;", "Liface/base1;", "Liface/sub1;"), - TestUtils.makeInterfaceDef("Liface/sub3;", "Liface/base1;"), - TestUtils.makeInterfaceDef("Liface/sub4;", "Liface/base1;", "Liface/sub3;"), - TestUtils.makeClassDef("Liface/classsub1;", "Ljava/lang/Object;", "Liface/sub1;"), - TestUtils.makeClassDef("Liface/classsub2;", "Ljava/lang/Object;", "Liface/sub2;"), - TestUtils.makeClassDef("Liface/classsub3;", "Ljava/lang/Object;", "Liface/sub3;", - "Liface/base;"), - TestUtils.makeClassDef("Liface/classsub4;", "Ljava/lang/Object;", "Liface/sub3;", - "Liface/sub4;"), - TestUtils.makeClassDef("Liface/classsubsub4;", "Liface/classsub4;"), - TestUtils.makeClassDef("Liface/classsub1234;", "Ljava/lang/Object;", "Liface/sub1;", - "Liface/sub2;", "Liface/sub3;", "Liface/sub4;") - )))); + ImmutableSet<ClassDef> classes = ImmutableSet.of( + TestUtils.makeClassDef("Ljava/lang/Object;", null), + TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"), + TestUtils.makeClassDef("Ltest/two;", "Ljava/lang/Object;"), + TestUtils.makeClassDef("Ltest/onetwo;", "Ltest/one;"), + TestUtils.makeClassDef("Ltest/onetwothree;", "Ltest/onetwo;"), + TestUtils.makeClassDef("Ltest/onethree;", "Ltest/one;"), + TestUtils.makeClassDef("Ltest/fivetwo;", "Ltest/five;"), + TestUtils.makeClassDef("Ltest/fivetwothree;", "Ltest/fivetwo;"), + TestUtils.makeClassDef("Ltest/fivethree;", "Ltest/five;"), + TestUtils.makeInterfaceDef("Ljava/lang/Cloneable;"), + TestUtils.makeInterfaceDef("Ljava/io/Serializable;"), + + // basic class and interface + TestUtils.makeClassDef("Liface/classiface1;", "Ljava/lang/Object;", "Liface/iface1;"), + TestUtils.makeInterfaceDef("Liface/iface1;"), + + // a more complex interface tree + TestUtils.makeInterfaceDef("Liface/base1;"), + // implements undefined interface + TestUtils.makeInterfaceDef("Liface/sub1;", "Liface/base1;", "Liface/base2;"), + // this implements sub1, so that its interfaces can't be fully resolved either + TestUtils.makeInterfaceDef("Liface/sub2;", "Liface/base1;", "Liface/sub1;"), + TestUtils.makeInterfaceDef("Liface/sub3;", "Liface/base1;"), + TestUtils.makeInterfaceDef("Liface/sub4;", "Liface/base1;", "Liface/sub3;"), + TestUtils.makeClassDef("Liface/classsub1;", "Ljava/lang/Object;", "Liface/sub1;"), + TestUtils.makeClassDef("Liface/classsub2;", "Ljava/lang/Object;", "Liface/sub2;"), + TestUtils.makeClassDef("Liface/classsub3;", "Ljava/lang/Object;", "Liface/sub3;", + "Liface/base;"), + TestUtils.makeClassDef("Liface/classsub4;", "Ljava/lang/Object;", "Liface/sub3;", + "Liface/sub4;"), + TestUtils.makeClassDef("Liface/classsubsub4;", "Liface/classsub4;"), + TestUtils.makeClassDef("Liface/classsub1234;", "Ljava/lang/Object;", "Liface/sub1;", + "Liface/sub2;", "Liface/sub3;", "Liface/sub4;")); + + oldClassPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes))); + newClassPath = new ClassPath(Lists.newArrayList(new DexClassProvider( + new ImmutableDexFile(Opcodes.forArtVersion(72), classes))), true, 72); } - public void superclassTest(String commonSuperclass, - String type1, String type2) { + public void superclassTest(ClassPath classPath, String commonSuperclass, + String type1, String type2) { TypeProto commonSuperclassProto = classPath.getClass(commonSuperclass); TypeProto type1Proto = classPath.getClass(type1); TypeProto type2Proto = classPath.getClass(type2); @@ -102,6 +108,11 @@ public class CommonSuperclassTest { Assert.assertSame(commonSuperclassProto, type2Proto.getCommonSuperclass(type1Proto)); } + public void superclassTest(String commonSuperclass, String type1, String type2) { + superclassTest(oldClassPath, commonSuperclass, type1, type2); + superclassTest(newClassPath, commonSuperclass, type1, type2); + } + @Test public void testGetCommonSuperclass() throws IOException { String object = "Ljava/lang/Object;"; @@ -131,7 +142,11 @@ public class CommonSuperclassTest { // same value, but different object Assert.assertEquals( onetwo, - classPath.getClass(onetwo).getCommonSuperclass(new ClassProto(classPath, onetwo)).getType()); + oldClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(oldClassPath, onetwo)).getType()); + + Assert.assertEquals( + onetwo, + newClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(newClassPath, onetwo)).getType()); // other object is superclass superclassTest(object, object, one); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java index 90a63590..70e6a042 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java @@ -51,11 +51,12 @@ import org.jf.dexlib2.immutable.instruction.ImmutableInstruction35mi; import org.junit.Assert; import org.junit.Test; +import java.io.IOException; import java.util.List; public class CustomMethodInlineTableTest { @Test - public void testCustomMethodInlineTable_Virtual() { + public void testCustomMethodInlineTable_Virtual() throws IOException { List<ImmutableInstruction> instructions = Lists.newArrayList( new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0), new ImmutableInstruction10x(Opcode.RETURN_VOID)); @@ -67,10 +68,12 @@ public class CustomMethodInlineTableTest { ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, null, null, ImmutableList.of(method)); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef)); + + ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(), + ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); + ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART); - ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile, - 15, false); InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V"); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false); @@ -82,7 +85,7 @@ public class CustomMethodInlineTableTest { } @Test - public void testCustomMethodInlineTable_Static() { + public void testCustomMethodInlineTable_Static() throws IOException { List<ImmutableInstruction> instructions = Lists.newArrayList( new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0), new ImmutableInstruction10x(Opcode.RETURN_VOID)); @@ -94,10 +97,12 @@ public class CustomMethodInlineTableTest { ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, null, ImmutableList.of(method), null); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef)); + + ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(), + ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); + ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART); - ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile, - 15, false); InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V"); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false); @@ -109,7 +114,7 @@ public class CustomMethodInlineTableTest { } @Test - public void testCustomMethodInlineTable_Direct() { + public void testCustomMethodInlineTable_Direct() throws IOException { List<ImmutableInstruction> instructions = Lists.newArrayList( new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0), new ImmutableInstruction10x(Opcode.RETURN_VOID)); @@ -121,10 +126,12 @@ public class CustomMethodInlineTableTest { ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, null, null, null, ImmutableList.of(method), null); - DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef)); + + ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(), + ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile); + ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART); - ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile, - 15, false); InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V"); MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java new file mode 100644 index 00000000..215ba179 --- /dev/null +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java @@ -0,0 +1,260 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.analysis; + +import com.google.common.collect.Lists; +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.Opcode; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.builder.MethodImplementationBuilder; +import org.jf.dexlib2.builder.instruction.BuilderInstruction10x; +import org.jf.dexlib2.builder.instruction.BuilderInstruction12x; +import org.jf.dexlib2.builder.instruction.BuilderInstruction21t; +import org.jf.dexlib2.builder.instruction.BuilderInstruction22c; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.DexFile; +import org.jf.dexlib2.iface.Method; +import org.jf.dexlib2.iface.MethodImplementation; +import org.jf.dexlib2.immutable.ImmutableClassDef; +import org.jf.dexlib2.immutable.ImmutableDexFile; +import org.jf.dexlib2.immutable.ImmutableMethod; +import org.jf.dexlib2.immutable.ImmutableMethodParameter; +import org.jf.dexlib2.immutable.reference.ImmutableTypeReference; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +import static org.jf.dexlib2.Opcodes.forArtVersion; + +public class MethodAnalyzerTest { + + @Test + public void testInstanceOfNarrowingEqz_art() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("not_instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Lmain;", analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType()); + + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + } + + @Test + public void testInstanceOfNarrowingEqz_dalvik() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("not_instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType()); + + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + } + + @Test + public void testInstanceOfNarrowingNez_art() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType()); + + Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + } + + @Test + public void testInstanceOfNarrowingNez_dalvik() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(2); + + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType()); + + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + } + + @Test + public void testInstanceOfNarrowingAfterMove_art() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(3); + + builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2)); + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("not_instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType()); + + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType()); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType()); + } + + @Test + public void testInstanceOfNarrowingAfterMove_dalvik() throws IOException { + MethodImplementationBuilder builder = new MethodImplementationBuilder(3); + + builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2)); + builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1, + new ImmutableTypeReference("Lmain;"))); + builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of"))); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + builder.addLabel("not_instance_of"); + builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); + + MethodImplementation methodImplementation = builder.getMethodImplementation(); + + Method method = new ImmutableMethod("Lmain;", "narrowing", + Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, methodImplementation); + ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, + null, null, null, Collections.singletonList(method)); + DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef)); + + ClassPath classPath = new ClassPath(new DexClassProvider(dexFile)); + MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false); + + List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions(); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType()); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType()); + + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType()); + Assert.assertEquals("Ljava/lang/Object;", + analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType()); + } +} diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java index 84cd284b..78bc8a51 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java @@ -57,7 +57,7 @@ public class SuperclassChainTest { ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of( objectClassDef, oneClassDef, twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes))); + ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes))); TypeProto objectClassProto = classPath.getClass("Ljava/lang/Object;"); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); @@ -88,7 +88,7 @@ public class SuperclassChainTest { ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;"); ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;"); ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes))); + ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes))); TypeProto unknownClassProto = classPath.getUnknownClass(); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java new file mode 100644 index 00000000..6074de14 --- /dev/null +++ b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java @@ -0,0 +1,106 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.dexlib2.pool; + +import com.google.common.collect.Lists; +import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.AnnotationVisibility; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.raw.MapItem; +import org.jf.dexlib2.dexbacked.raw.RawDexFile; +import org.jf.dexlib2.iface.ClassDef; +import org.jf.dexlib2.iface.Field; +import org.jf.dexlib2.iface.Method; +import org.jf.dexlib2.iface.MethodParameter; +import org.jf.dexlib2.immutable.*; +import org.jf.dexlib2.writer.io.MemoryDataStore; +import org.jf.dexlib2.writer.pool.DexPool; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +public class RollbackTest { + @Test + public void testRollback() throws IOException { + ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, + Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation;", null)), + Lists.<Field>newArrayList( + new ImmutableField("Lcls1;", "field1", "I", AccessFlags.PUBLIC.getValue(), null, null) + ), + Lists.<Method>newArrayList( + new ImmutableMethod("Lcls1", "method1", + Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("L", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, null)) + ); + + ClassDef class2 = new ImmutableClassDef("Lcls2;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null, + Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation2;", null)), + Lists.<Field>newArrayList( + new ImmutableField("Lcls2;", "field2", "D", AccessFlags.PUBLIC.getValue(), null, null) + ), + Lists.<Method>newArrayList( + new ImmutableMethod("Lcls2;", "method2", + Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("D", null, null)), "V", + AccessFlags.PUBLIC.getValue(), null, null)) + ); + + RawDexFile dexFile1; + { + MemoryDataStore dataStore = new MemoryDataStore(); + DexPool dexPool = new DexPool(Opcodes.getDefault()); + dexPool.internClass(class1); + dexPool.mark(); + dexPool.internClass(class2); + dexPool.reset(); + dexPool.writeTo(dataStore); + dexFile1 = new RawDexFile(Opcodes.getDefault(), dataStore.getData()); + } + + RawDexFile dexFile2; + { + MemoryDataStore dataStore = new MemoryDataStore(); + DexPool dexPool = new DexPool(Opcodes.getDefault()); + dexPool.internClass(class1); + dexPool.writeTo(dataStore); + dexFile2 = new RawDexFile(Opcodes.getDefault(), dataStore.getData()); + } + + List<MapItem> mapItems1 = dexFile1.getMapItems(); + List<MapItem> mapItems2 = dexFile2.getMapItems(); + for (int i=0; i<mapItems1.size(); i++) { + Assert.assertEquals(mapItems1.get(i).getType(), mapItems2.get(i).getType()); + Assert.assertEquals(mapItems1.get(i).getItemCount(), mapItems2.get(i).getItemCount()); + } + } +} diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java index 1a0a2892..bf55e37f 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java @@ -72,12 +72,12 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData()); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(dbClassDef); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); @@ -112,12 +112,12 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData()); ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(dbClassDef); Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null); diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java index c246e0ec..340b1fa1 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java @@ -62,7 +62,7 @@ import java.util.List; public class JumboStringConversionTest { @Test public void testJumboStringConversion() throws IOException { - DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); + DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault()); MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1); for (int i=0; i<66000; i++) { @@ -92,7 +92,7 @@ public class JumboStringConversionTest { MemoryDataStore dexStore = new MemoryDataStore(); dexBuilder.writeTo(dexStore); - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData()); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(classDef); @@ -122,7 +122,7 @@ public class JumboStringConversionTest { @Test public void testJumboStringConversion_NonMethodBuilder() throws IOException { - DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15)); + DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault()); final List<Instruction> instructions = Lists.newArrayList(); for (int i=0; i<66000; i++) { @@ -189,7 +189,7 @@ public class JumboStringConversionTest { MemoryDataStore dexStore = new MemoryDataStore(); dexBuilder.writeTo(dexStore); - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData()); ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); Assert.assertNotNull(classDef); diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar Binary files differindex 5ccda13e..6ffa2378 100644 --- a/gradle/wrapper/gradle-wrapper.jar +++ b/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23bc0f51..8ee9c631 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jul 08 16:46:58 PDT 2016 +#Wed Sep 28 23:22:26 AEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -157,4 +161,9 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then + cd "$(dirname "$0")" +fi + exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index 72d362da..e95643d6 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -49,7 +49,6 @@ goto fail @rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
@@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
diff --git a/smali/Android.mk b/smali/Android.mk index 016707d9..1a8d71c7 100644 --- a/smali/Android.mk +++ b/smali/Android.mk @@ -42,7 +42,8 @@ LOCAL_JAR_MANIFEST := manifest.txt LOCAL_STATIC_JAVA_LIBRARIES := \ antlr-runtime \ - dexlib2 + dexlib2 \ + jcommander-host #create a new smali.properties file using the correct version $(intermediates)/resources/smali.properties: $(LOCAL_PATH)/../build.gradle diff --git a/smali/build.gradle b/smali/build.gradle index 318b5a97..6472f216 100644 --- a/smali/build.gradle +++ b/smali/build.gradle @@ -76,8 +76,8 @@ dependencies { compile project(':util') compile project(':dexlib2') compile depends.antlr_runtime + compile depends.jcommander compile depends.stringtemplate - compile depends.commons_cli testCompile depends.junit @@ -95,7 +95,7 @@ task fatJar(type: Jar, dependsOn: jar) { classifier = 'fat' manifest { - attributes('Main-Class': 'org.jf.smali.main') + attributes('Main-Class': 'org.jf.smali.Main') } doLast { @@ -141,7 +141,8 @@ task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) { dontobfuscate dontoptimize - keep 'public class org.jf.smali.main { public static void main(java.lang.String[]); }' + keep 'public class org.jf.smali.Main { public static void main(java.lang.String[]); }' + keep 'class com.beust.jcommander.** { *; }' keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }' dontwarn 'com.google.common.**' diff --git a/smali/manifest.txt b/smali/manifest.txt index b673fc87..0a58e577 100644 --- a/smali/manifest.txt +++ b/smali/manifest.txt @@ -1 +1 @@ -Main-Class: org.jf.smali.main +Main-Class: org.jf.smali.Main diff --git a/smali/src/main/antlr/smaliParser.g b/smali/src/main/antlr/smaliParser.g index 29cd141b..2d5eccaa 100644 --- a/smali/src/main/antlr/smaliParser.g +++ b/smali/src/main/antlr/smaliParser.g @@ -263,8 +263,8 @@ import org.jf.dexlib2.Opcodes; this.allowOdex = allowOdex; } - public void setApiLevel(int apiLevel, boolean experimental) { - this.opcodes = new Opcodes(apiLevel, experimental); + public void setApiLevel(int apiLevel) { + this.opcodes = Opcodes.forApi(apiLevel); this.apiLevel = apiLevel; } diff --git a/smali/src/main/antlr/smaliTreeWalker.g b/smali/src/main/antlr/smaliTreeWalker.g index d074579b..171756ec 100644 --- a/smali/src/main/antlr/smaliTreeWalker.g +++ b/smali/src/main/antlr/smaliTreeWalker.g @@ -85,8 +85,8 @@ import java.util.*; this.dexBuilder = dexBuilder; } - public void setApiLevel(int apiLevel, boolean experimental) { - this.opcodes = new Opcodes(apiLevel, experimental); + public void setApiLevel(int apiLevel) { + this.opcodes = Opcodes.forApi(apiLevel); this.apiLevel = apiLevel; } diff --git a/smali/src/main/java/org/jf/smali/AssembleCommand.java b/smali/src/main/java/org/jf/smali/AssembleCommand.java new file mode 100644 index 00000000..efde1825 --- /dev/null +++ b/smali/src/main/java/org/jf/smali/AssembleCommand.java @@ -0,0 +1,113 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.smali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.validators.PositiveInteger; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.List; + +@Parameters(commandDescription = "Assembles smali files into a dex file.") +@ExtendedParameters( + commandName = "assemble", + commandAliases = { "ass", "as", "a" }) +public class AssembleCommand extends Command { + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information for this command.") + private boolean help; + + @Parameter(names = {"-j", "--jobs"}, + description = "The number of threads to use. Defaults to the number of cores available.", + validateWith = PositiveInteger.class) + @ExtendedParameter(argumentNames = "n") + private int jobs = Runtime.getRuntime().availableProcessors(); + + @Parameter(names = {"-a", "--api"}, + description = "The numeric api level to use while assembling.") + @ExtendedParameter(argumentNames = "api") + private int apiLevel = 15; + + @Parameter(names = {"-o", "--output"}, + description = "The name/path of the dex file to write.") + @ExtendedParameter(argumentNames = "file") + private String output = "out.dex"; + + @Parameter(names = "--verbose", + description = "Generate verbose error messages.") + private boolean verbose = false; + + @Parameter(names = {"--allow-odex-opcodes", "--allow-odex", "--ao"}, + description = "Allows the odex opcodes that dalvik doesn't reject to be assembled.") + private boolean allowOdexOpcodes; + + @Parameter(description = "Assembles the given files. If a directory is specified, it will be " + + "recursively searched for any files with a .smali prefix") + @ExtendedParameter(argumentNames = "[<file>|<dir>]+") + private List<String> input; + + public AssembleCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + @Override public void run() { + if (help || input == null || input.isEmpty()) { + usage(); + return; + } + + try { + Smali.assemble(getOptions(), input); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + protected SmaliOptions getOptions() { + SmaliOptions options = new SmaliOptions(); + + options.jobs = jobs; + options.apiLevel = apiLevel; + options.outputDexFile = output; + options.allowOdexOpcodes = allowOdexOpcodes; + options.verboseErrors = verbose; + + return options; + } +} diff --git a/smali/src/main/java/org/jf/smali/HelpCommand.java b/smali/src/main/java/org/jf/smali/HelpCommand.java new file mode 100644 index 00000000..429a7dfd --- /dev/null +++ b/smali/src/main/java/org/jf/smali/HelpCommand.java @@ -0,0 +1,92 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.smali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import org.jf.util.ConsoleUtil; +import org.jf.util.jcommander.*; + +import javax.annotation.Nonnull; +import java.util.List; + +@Parameters(commandDescription = "Shows usage information") +@ExtendedParameters( + commandName = "help", + commandAliases = "h") +public class HelpCommand extends Command { + + @Parameter(description = "If specified, show the detailed usage information for the given commands") + @ExtendedParameter(argumentNames = "commands") + private List<String> commands; + + public HelpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + + public void run() { + JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1); + + if (commands == null || commands.isEmpty()) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } else { + boolean printedHelp = false; + for (String cmd : commands) { + JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd); + if (command == null) { + System.err.println("No such command: " + cmd); + } else { + printedHelp = true; + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(((Command)command.getObjects().get(0)).getCommandHierarchy())); + } + } + if (!printedHelp) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); + } + } + } + + @Parameters(hidden = true) + @ExtendedParameters(commandName = "hlep") + public static class HlepCommand extends HelpCommand { + public HlepCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + } +} diff --git a/smali/src/main/java/org/jf/smali/Main.java b/smali/src/main/java/org/jf/smali/Main.java new file mode 100644 index 00000000..6b56fddb --- /dev/null +++ b/smali/src/main/java/org/jf/smali/Main.java @@ -0,0 +1,123 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.smali; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.google.common.collect.Lists; +import org.jf.smali.HelpCommand.HlepCommand; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedCommands; +import org.jf.util.jcommander.ExtendedParameters; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Properties; + +@ExtendedParameters( + includeParametersInUsage = true, + commandName = "smali", + postfixDescription = "See smali help <command> for more information about a specific command") +public class Main extends Command { + public static final String VERSION = loadVersion(); + + @Parameter(names = {"-h", "-?", "--help"}, help = true, + description = "Show usage information") + private boolean help; + + @Parameter(names = {"-v", "--version"}, help = true, + description = "Print the version of baksmali and then exit") + public boolean version; + + private JCommander jc; + + @Override public void run() { + } + + @Override protected JCommander getJCommander() { + return jc; + } + + public Main() { + super(Lists.<JCommander>newArrayList()); + } + + public static void main(String[] args) { + Main main = new Main(); + + JCommander jc = new JCommander(main); + main.jc = jc; + jc.setProgramName("smali"); + List<JCommander> commandHierarchy = main.getCommandHierarchy(); + + ExtendedCommands.addExtendedCommand(jc, new AssembleCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy)); + + jc.parse(args); + + if (main.version) { + version(); + } + + if (jc.getParsedCommand() == null || main.help) { + main.usage(); + return; + } + + Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0); + command.run(); + } + + protected static void version() { + System.out.println("smali " + VERSION + " (http://smali.org)"); + System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)"); + System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)"); + System.exit(0); + } + + private static String loadVersion() { + InputStream propertiesStream = Main.class.getClassLoader().getResourceAsStream("smali.properties"); + String version = "[unknown version]"; + if (propertiesStream != null) { + Properties properties = new Properties(); + try { + properties.load(propertiesStream); + version = properties.getProperty("application.version"); + } catch (IOException ex) { + // ignore + } + } + return version; + } +} diff --git a/smali/src/main/java/org/jf/smali/Smali.java b/smali/src/main/java/org/jf/smali/Smali.java new file mode 100644 index 00000000..7f3762af --- /dev/null +++ b/smali/src/main/java/org/jf/smali/Smali.java @@ -0,0 +1,208 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.smali; + +import com.google.common.collect.Lists; +import org.antlr.runtime.CommonTokenStream; +import org.antlr.runtime.Token; +import org.antlr.runtime.TokenSource; +import org.antlr.runtime.tree.CommonTree; +import org.antlr.runtime.tree.CommonTreeNodeStream; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.writer.builder.DexBuilder; +import org.jf.dexlib2.writer.io.FileDataStore; + +import javax.annotation.Nonnull; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +public class Smali { + + /** + * Assemble the specified files, using the given options + * + * @param options a SmaliOptions object with the options to run smali with + * @param input The files/directories to process + * @return true if assembly completed with no errors, or false if errors were encountered + */ + public static boolean assemble(final SmaliOptions options, String... input) throws IOException { + return assemble(options, Arrays.asList(input)); + } + + /** + * Assemble the specified files, using the given options + * + * @param options a SmaliOptions object with the options to run smali with + * @param input The files/directories to process + * @return true if assembly completed with no errors, or false if errors were encountered + */ + public static boolean assemble(final SmaliOptions options, List<String> input) throws IOException { + LinkedHashSet<File> filesToProcessSet = new LinkedHashSet<File>(); + + for (String fileToProcess: input) { + File argFile = new File(fileToProcess); + + if (!argFile.exists()) { + throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\""); + } + + if (argFile.isDirectory()) { + getSmaliFilesInDir(argFile, filesToProcessSet); + } else if (argFile.isFile()) { + filesToProcessSet.add(argFile); + } + } + + boolean errors = false; + + final DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(options.apiLevel)); + + ExecutorService executor = Executors.newFixedThreadPool(options.jobs); + List<Future<Boolean>> tasks = Lists.newArrayList(); + + for (final File file: filesToProcessSet) { + tasks.add(executor.submit(new Callable<Boolean>() { + @Override public Boolean call() throws Exception { + return assembleSmaliFile(file, dexBuilder, options); + } + })); + } + + for (Future<Boolean> task: tasks) { + while(true) { + try { + try { + if (!task.get()) { + errors = true; + } + } catch (ExecutionException ex) { + throw new RuntimeException(ex); + } + } catch (InterruptedException ex) { + continue; + } + break; + } + } + + executor.shutdown(); + + if (errors) { + return false; + } + + dexBuilder.writeTo(new FileDataStore(new File(options.outputDexFile))); + + return true; + } + + private static void getSmaliFilesInDir(@Nonnull File dir, @Nonnull Set<File> smaliFiles) { + File[] files = dir.listFiles(); + if (files != null) { + for(File file: files) { + if (file.isDirectory()) { + getSmaliFilesInDir(file, smaliFiles); + } else if (file.getName().endsWith(".smali")) { + smaliFiles.add(file); + } + } + } + } + + private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options) + throws Exception { + FileInputStream fis = null; + try { + fis = new FileInputStream(smaliFile); + InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); + + LexerErrorInterface lexer = new smaliFlexLexer(reader); + ((smaliFlexLexer)lexer).setSourceFile(smaliFile); + CommonTokenStream tokens = new CommonTokenStream((TokenSource)lexer); + + if (options.printTokens) { + tokens.getTokens(); + + for (int i=0; i<tokens.size(); i++) { + Token token = tokens.get(i); + if (token.getChannel() == smaliParser.HIDDEN) { + continue; + } + + System.out.println(smaliParser.tokenNames[token.getType()] + ": " + token.getText()); + } + + System.out.flush(); + } + + smaliParser parser = new smaliParser(tokens); + parser.setVerboseErrors(options.verboseErrors); + parser.setAllowOdex(options.allowOdexOpcodes); + parser.setApiLevel(options.apiLevel); + + smaliParser.smali_file_return result = parser.smali_file(); + + if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) { + return false; + } + + CommonTree t = result.getTree(); + + CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); + treeStream.setTokenStream(tokens); + + if (options.printTokens) { + System.out.println(t.toStringTree()); + } + + smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); + dexGen.setApiLevel(options.apiLevel); + + dexGen.setVerboseErrors(options.verboseErrors); + dexGen.setDexBuilder(dexBuilder); + dexGen.smali_file(); + + return dexGen.getNumberOfSyntaxErrors() == 0; + } finally { + if (fis != null) { + fis.close(); + } + } + } +} diff --git a/smali/src/main/java/org/jf/smali/SmaliOptions.java b/smali/src/main/java/org/jf/smali/SmaliOptions.java index 165c3a89..ac385fe6 100644 --- a/smali/src/main/java/org/jf/smali/SmaliOptions.java +++ b/smali/src/main/java/org/jf/smali/SmaliOptions.java @@ -36,17 +36,7 @@ public class SmaliOptions { public String outputDexFile = "out.dex"; public int jobs = Runtime.getRuntime().availableProcessors(); - public boolean allowOdex = false; + public boolean allowOdexOpcodes = false; public boolean verboseErrors = false; public boolean printTokens = false; - public boolean experimental = false; - - public boolean listMethods = false; - public String methodListFilename = null; - - public boolean listFields = false; - public String fieldListFilename = null; - - public boolean listTypes = false; - public String typeListFilename = null; } diff --git a/smali/src/main/java/org/jf/smali/SmaliTestUtils.java b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java index bef07414..a0fe55c2 100644 --- a/smali/src/main/java/org/jf/smali/SmaliTestUtils.java +++ b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java @@ -50,14 +50,14 @@ import java.io.StringReader; public class SmaliTestUtils { public static ClassDef compileSmali(String smaliText) throws RecognitionException, IOException { - return compileSmali(smaliText, 15, false); + return compileSmali(smaliText, 15); } - public static ClassDef compileSmali(String smaliText, int apiLevel, boolean experimental) + public static ClassDef compileSmali(String smaliText, int apiLevel) throws RecognitionException, IOException { CommonTokenStream tokens; LexerErrorInterface lexer; - DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(apiLevel, experimental)); + DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(apiLevel)); Reader reader = new StringReader(smaliText); @@ -67,7 +67,7 @@ public class SmaliTestUtils { smaliParser parser = new smaliParser(tokens); parser.setVerboseErrors(true); parser.setAllowOdex(false); - parser.setApiLevel(apiLevel, experimental); + parser.setApiLevel(apiLevel); smaliParser.smali_file_return result = parser.smali_file(); @@ -81,7 +81,7 @@ public class SmaliTestUtils { treeStream.setTokenStream(tokens); smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); - dexGen.setApiLevel(apiLevel, experimental); + dexGen.setApiLevel(apiLevel); dexGen.setVerboseErrors(true); dexGen.setDexBuilder(dexBuilder); dexGen.smali_file(); @@ -94,7 +94,7 @@ public class SmaliTestUtils { dexBuilder.writeTo(dataStore); - DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(apiLevel, experimental), dataStore.getData()); + DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(apiLevel), dataStore.getData()); return Iterables.getFirst(dexFile.getClasses(), null); } diff --git a/smali/src/main/java/org/jf/smali/main.java b/smali/src/main/java/org/jf/smali/main.java deleted file mode 100644 index e5562808..00000000 --- a/smali/src/main/java/org/jf/smali/main.java +++ /dev/null @@ -1,491 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2010 Ben Gruver (JesusFreke) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 org.jf.smali; - -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.common.collect.Ordering; -import org.antlr.runtime.CommonTokenStream; -import org.antlr.runtime.Token; -import org.antlr.runtime.TokenSource; -import org.antlr.runtime.tree.CommonTree; -import org.antlr.runtime.tree.CommonTreeNodeStream; -import org.apache.commons.cli.*; -import org.jf.dexlib2.Opcodes; -import org.jf.dexlib2.writer.builder.DexBuilder; -import org.jf.dexlib2.writer.io.FileDataStore; -import org.jf.util.ConsoleUtil; -import org.jf.util.SmaliHelpFormatter; - -import javax.annotation.Nonnull; -import java.io.*; -import java.util.*; -import java.util.concurrent.*; - -/** - * Main class for smali. It recognizes enough options to be able to dispatch - * to the right "actual" main. - */ -public class main { - - public static final String VERSION; - - private final static Options basicOptions; - private final static Options debugOptions; - private final static Options options; - - static { - basicOptions = new Options(); - debugOptions = new Options(); - options = new Options(); - buildOptions(); - - InputStream templateStream = main.class.getClassLoader().getResourceAsStream("smali.properties"); - if (templateStream != null) { - Properties properties = new Properties(); - String version = "(unknown)"; - try { - properties.load(templateStream); - version = properties.getProperty("application.version"); - } catch (IOException ex) { - // just eat it - } - VERSION = version; - } else { - VERSION = "[unknown version]"; - } - } - - - /** - * This class is uninstantiable. - */ - private main() { - } - - /** - * A more programmatic-friendly entry point for smali - * - * @param options a SmaliOptions object with the options to run smali with - * @param input The files/directories to process - * @return true if assembly completed with no errors, or false if errors were encountered - */ - public static boolean run(final SmaliOptions options, String... input) throws IOException { - LinkedHashSet<File> filesToProcessSet = new LinkedHashSet<File>(); - - for (String fileToProcess: input) { - File argFile = new File(fileToProcess); - - if (!argFile.exists()) { - throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\""); - } - - if (argFile.isDirectory()) { - getSmaliFilesInDir(argFile, filesToProcessSet); - } else if (argFile.isFile()) { - filesToProcessSet.add(argFile); - } - } - - boolean errors = false; - - final DexBuilder dexBuilder = DexBuilder.makeDexBuilder( - Opcodes.forApi(options.apiLevel, options.experimental)); - - ExecutorService executor = Executors.newFixedThreadPool(options.jobs); - List<Future<Boolean>> tasks = Lists.newArrayList(); - - for (final File file: filesToProcessSet) { - tasks.add(executor.submit(new Callable<Boolean>() { - @Override public Boolean call() throws Exception { - return assembleSmaliFile(file, dexBuilder, options); - } - })); - } - - for (Future<Boolean> task: tasks) { - while(true) { - try { - try { - if (!task.get()) { - errors = true; - } - } catch (ExecutionException ex) { - throw new RuntimeException(ex); - } - } catch (InterruptedException ex) { - continue; - } - break; - } - } - - executor.shutdown(); - - if (errors) { - return false; - } - - if (options.listMethods) { - if (Strings.isNullOrEmpty(options.methodListFilename)) { - options.methodListFilename = options.outputDexFile + ".methods"; - } - writeReferences(dexBuilder.getMethodReferences(), options.methodListFilename); - } - - if (options.listFields) { - if (Strings.isNullOrEmpty(options.fieldListFilename)) { - options.fieldListFilename = options.outputDexFile + ".fields"; - } - writeReferences(dexBuilder.getFieldReferences(), options.fieldListFilename); - } - - if (options.listTypes) { - if (Strings.isNullOrEmpty(options.typeListFilename)) { - options.typeListFilename = options.outputDexFile + ".types"; - } - writeReferences(dexBuilder.getTypeReferences(), options.typeListFilename); - } - - dexBuilder.writeTo(new FileDataStore(new File(options.outputDexFile))); - - return true; - } - - /** - * Run! - */ - public static void main(String[] args) { - Locale locale = new Locale("en", "US"); - Locale.setDefault(locale); - - CommandLineParser parser = new PosixParser(); - CommandLine commandLine; - - try { - commandLine = parser.parse(options, args); - } catch (ParseException ex) { - usage(); - return; - } - - SmaliOptions smaliOptions = new SmaliOptions(); - - String[] remainingArgs = commandLine.getArgs(); - - Option[] options = commandLine.getOptions(); - - for (int i=0; i<options.length; i++) { - Option option = options[i]; - String opt = option.getOpt(); - - switch (opt.charAt(0)) { - case 'v': - version(); - return; - case '?': - while (++i < options.length) { - if (options[i].getOpt().charAt(0) == '?') { - usage(true); - return; - } - } - usage(false); - return; - case 'o': - smaliOptions.outputDexFile = commandLine.getOptionValue("o"); - break; - case 'x': - smaliOptions.allowOdex = true; - break; - case 'X': - smaliOptions.experimental = true; - break; - case 'a': - smaliOptions.apiLevel = Integer.parseInt(commandLine.getOptionValue("a")); - break; - case 'j': - smaliOptions.jobs = Integer.parseInt(commandLine.getOptionValue("j")); - break; - case 'm': - smaliOptions.listMethods = true; - smaliOptions.methodListFilename = commandLine.getOptionValue("m"); - break; - case 'f': - smaliOptions.listFields = true; - smaliOptions.fieldListFilename = commandLine.getOptionValue("f"); - break; - case 't': - smaliOptions.listTypes = true; - smaliOptions.typeListFilename = commandLine.getOptionValue("t"); - break; - case 'V': - smaliOptions.verboseErrors = true; - break; - case 'T': - smaliOptions.printTokens = true; - break; - default: - assert false; - } - } - - if (remainingArgs.length == 0) { - usage(); - return; - } - - try { - if (!run(smaliOptions, remainingArgs)) { - System.exit(1); - } - } catch (RuntimeException ex) { - System.err.println("\nUNEXPECTED TOP-LEVEL EXCEPTION:"); - ex.printStackTrace(); - System.exit(2); - } catch (Throwable ex) { - System.err.println("\nUNEXPECTED TOP-LEVEL ERROR:"); - ex.printStackTrace(); - System.exit(3); - } - } - - private static void writeReferences(List<String> references, String filename) { - PrintWriter writer = null; - try { - writer = new PrintWriter(new BufferedWriter(new FileWriter(filename))); - - for (String reference: Ordering.natural().sortedCopy(references)) { - writer.println(reference); - } - } catch (IOException ex) { - throw new RuntimeException(ex); - } finally { - if (writer != null) { - writer.close(); - } - } - } - - private static void getSmaliFilesInDir(@Nonnull File dir, @Nonnull Set<File> smaliFiles) { - File[] files = dir.listFiles(); - if (files != null) { - for(File file: files) { - if (file.isDirectory()) { - getSmaliFilesInDir(file, smaliFiles); - } else if (file.getName().endsWith(".smali")) { - smaliFiles.add(file); - } - } - } - } - - private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options) - throws Exception { - CommonTokenStream tokens; - - LexerErrorInterface lexer; - - FileInputStream fis = new FileInputStream(smaliFile); - InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); - - lexer = new smaliFlexLexer(reader); - ((smaliFlexLexer)lexer).setSourceFile(smaliFile); - tokens = new CommonTokenStream((TokenSource)lexer); - - if (options.printTokens) { - tokens.getTokens(); - - for (int i=0; i<tokens.size(); i++) { - Token token = tokens.get(i); - if (token.getChannel() == smaliParser.HIDDEN) { - continue; - } - - System.out.println(smaliParser.tokenNames[token.getType()] + ": " + token.getText()); - } - - System.out.flush(); - } - - smaliParser parser = new smaliParser(tokens); - parser.setVerboseErrors(options.verboseErrors); - parser.setAllowOdex(options.allowOdex); - parser.setApiLevel(options.apiLevel, options.experimental); - - smaliParser.smali_file_return result = parser.smali_file(); - - if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) { - return false; - } - - CommonTree t = result.getTree(); - - CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); - treeStream.setTokenStream(tokens); - - if (options.printTokens) { - System.out.println(t.toStringTree()); - } - - smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); - dexGen.setApiLevel(options.apiLevel, options.experimental); - - dexGen.setVerboseErrors(options.verboseErrors); - dexGen.setDexBuilder(dexBuilder); - dexGen.smali_file(); - - return dexGen.getNumberOfSyntaxErrors() == 0; - } - - - /** - * Prints the usage message. - */ - private static void usage(boolean printDebugOptions) { - SmaliHelpFormatter formatter = new SmaliHelpFormatter(); - - int consoleWidth = ConsoleUtil.getConsoleWidth(); - if (consoleWidth <= 0) { - consoleWidth = 80; - } - - formatter.setWidth(consoleWidth); - - formatter.printHelp("java -jar smali.jar [options] [--] [<smali-file>|folder]*", - "assembles a set of smali files into a dex file", basicOptions, printDebugOptions?debugOptions:null); - } - - private static void usage() { - usage(false); - } - - /** - * Prints the version message. - */ - private static void version() { - System.out.println("smali " + VERSION + " (http://smali.googlecode.com)"); - System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)"); - System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)"); - System.exit(0); - } - - @SuppressWarnings("AccessStaticViaInstance") - private static void buildOptions() { - Option versionOption = OptionBuilder.withLongOpt("version") - .withDescription("prints the version then exits") - .create("v"); - - Option helpOption = OptionBuilder.withLongOpt("help") - .withDescription("prints the help message then exits. Specify twice for debug options") - .create("?"); - - Option outputOption = OptionBuilder.withLongOpt("output") - .withDescription("the name of the dex file that will be written. The default is out.dex") - .hasArg() - .withArgName("FILE") - .create("o"); - - Option allowOdexOption = OptionBuilder.withLongOpt("allow-odex-instructions") - .withDescription("allow odex instructions to be compiled into the dex file. Only a few" + - " instructions are supported - the ones that can exist in a dead code path and not" + - " cause dalvik to reject the class") - .create("x"); - - Option apiLevelOption = OptionBuilder.withLongOpt("api-level") - .withDescription("The numeric api-level of the file to generate, e.g. 14 for ICS. If not " + - "specified, it defaults to 15 (ICS).") - .hasArg() - .withArgName("API_LEVEL") - .create("a"); - - Option listMethodsOption = OptionBuilder.withLongOpt("list-methods") - .withDescription("Lists all the method references to FILE" + - " (<output_dex_filename>.methods by default)") - .hasOptionalArg() - .withArgName("FILE") - .create("m"); - - Option listFieldsOption = OptionBuilder.withLongOpt("list-fields") - .withDescription("Lists all the field references to FILE" + - " (<output_dex_filename>.fields by default)") - .hasOptionalArg() - .withArgName("FILE") - .create("f"); - - Option listClassesOption = OptionBuilder.withLongOpt("list-types") - .withDescription("Lists all the type references to FILE" + - " (<output_dex_filename>.types by default)") - .hasOptionalArg() - .withArgName("FILE") - .create("t"); - - Option experimentalOption = OptionBuilder.withLongOpt("experimental") - .withDescription("enable experimental opcodes to be assembled, even if they " + - " aren't necessarily supported by the Android runtime yet") - .create("X"); - - Option jobsOption = OptionBuilder.withLongOpt("jobs") - .withDescription("The number of threads to use. Defaults to the number of cores available, up to a " + - "maximum of 6") - .hasArg() - .withArgName("NUM_THREADS") - .create("j"); - - Option verboseErrorsOption = OptionBuilder.withLongOpt("verbose-errors") - .withDescription("Generate verbose error messages") - .create("V"); - - Option printTokensOption = OptionBuilder.withLongOpt("print-tokens") - .withDescription("Print the name and text of each token") - .create("T"); - - basicOptions.addOption(versionOption); - basicOptions.addOption(helpOption); - basicOptions.addOption(outputOption); - basicOptions.addOption(allowOdexOption); - basicOptions.addOption(apiLevelOption); - basicOptions.addOption(experimentalOption); - basicOptions.addOption(jobsOption); - basicOptions.addOption(listMethodsOption); - basicOptions.addOption(listFieldsOption); - basicOptions.addOption(listClassesOption); - - debugOptions.addOption(verboseErrorsOption); - debugOptions.addOption(printTokensOption); - - for (Object option: basicOptions.getOptions()) { - options.addOption((Option)option); - } - - for (Object option: debugOptions.getOptions()) { - options.addOption((Option)option); - } - } -}
\ No newline at end of file diff --git a/smali/src/main/java/org/jf/smali/smaliParser.java b/smali/src/main/java/org/jf/smali/smaliParser.java index de215488..72ef0347 100644 --- a/smali/src/main/java/org/jf/smali/smaliParser.java +++ b/smali/src/main/java/org/jf/smali/smaliParser.java @@ -1,4 +1,4 @@ -// $ANTLR 3.5.2 /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g 2016-09-09 13:35:48 +// $ANTLR 3.5.2 smaliParser.g 2017-04-20 15:20:45 package org.jf.smali; @@ -18,61 +18,61 @@ import org.antlr.runtime.tree.*; @SuppressWarnings("all") public class smaliParser extends Parser { public static final String[] tokenNames = new String[] { - "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", - "ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", - "ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", - "CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", - "CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", - "END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", - "END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", - "END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", - "ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", - "FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", - "INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", - "INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", - "INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", - "INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", - "INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", - "INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", - "INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", - "INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", - "INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", - "INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", - "INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", - "INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", - "INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", - "INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", - "INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", - "INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", - "I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", - "I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", - "I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", - "I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", - "I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", - "I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", - "I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", - "I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", - "I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", - "I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", - "I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", - "I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", - "I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", - "I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", - "I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", - "I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", - "I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", - "I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", - "I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", - "I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", - "I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", - "I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", - "LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", - "MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", - "OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", - "PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", - "PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", - "SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", - "STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", + "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", + "ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", + "ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", + "CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", + "CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", + "END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", + "END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", + "END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", + "ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", + "FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", + "INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", + "INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", + "INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", + "INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", + "INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", + "INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", + "INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", + "INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", + "INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", + "INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", + "INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", + "INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", + "INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", + "INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", + "INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", + "INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", + "I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", + "I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", + "I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", + "I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", + "I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", + "I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", + "I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", + "I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", + "I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", + "I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", + "I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", + "I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", + "I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", + "I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", + "I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", + "I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", + "I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", + "I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", + "I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", + "I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", + "I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", + "I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", + "LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", + "MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", + "OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", + "PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", + "PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", + "SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", + "STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", "VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE" }; public static final int EOF=-1; @@ -298,7 +298,7 @@ public class smaliParser extends Parser { return adaptor; } @Override public String[] getTokenNames() { return smaliParser.tokenNames; } - @Override public String getGrammarFileName() { return "/ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g"; } + @Override public String getGrammarFileName() { return "smaliParser.g"; } public static final int ERROR_CHANNEL = 100; @@ -316,8 +316,8 @@ public class smaliParser extends Parser { this.allowOdex = allowOdex; } - public void setApiLevel(int apiLevel, boolean experimental) { - this.opcodes = new Opcodes(apiLevel, experimental); + public void setApiLevel(int apiLevel) { + this.opcodes = Opcodes.forApi(apiLevel); this.apiLevel = apiLevel; } @@ -480,7 +480,7 @@ public class smaliParser extends Parser { // $ANTLR start "smali_file" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:415:1: smali_file : ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ; + // smaliParser.g:415:1: smali_file : ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ; public final smaliParser.smali_file_return smali_file() throws RecognitionException { smali_file_stack.push(new smali_file_scope()); smaliParser.smali_file_return retval = new smaliParser.smali_file_return(); @@ -509,12 +509,12 @@ public class smaliParser extends Parser { smali_file_stack.peek().hasClassSpec = smali_file_stack.peek().hasSuperSpec = smali_file_stack.peek().hasSourceSpec = false; smali_file_stack.peek().classAnnotations = new ArrayList<CommonTree>(); - + try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:427:3: ( ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF + // smaliParser.g:427:3: ( ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ) + // smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ + // smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ int cnt1=0; loop1: while (true) { @@ -544,7 +544,7 @@ public class smaliParser extends Parser { switch (alt1) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:5: {...}? => class_spec + // smaliParser.g:428:5: {...}? => class_spec { if ( !((!smali_file_stack.peek().hasClassSpec)) ) { throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasClassSpec"); @@ -558,7 +558,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:429:5: {...}? => super_spec + // smaliParser.g:429:5: {...}? => super_spec { if ( !((!smali_file_stack.peek().hasSuperSpec)) ) { throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSuperSpec"); @@ -572,7 +572,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:430:5: implements_spec + // smaliParser.g:430:5: implements_spec { pushFollow(FOLLOW_implements_spec_in_smali_file1094); implements_spec3=implements_spec(); @@ -582,7 +582,7 @@ public class smaliParser extends Parser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:431:5: {...}? => source_spec + // smaliParser.g:431:5: {...}? => source_spec { if ( !((!smali_file_stack.peek().hasSourceSpec)) ) { throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSourceSpec"); @@ -596,7 +596,7 @@ public class smaliParser extends Parser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:432:5: method + // smaliParser.g:432:5: method { pushFollow(FOLLOW_method_in_smali_file1111); method5=method(); @@ -606,7 +606,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:433:5: field + // smaliParser.g:433:5: field { pushFollow(FOLLOW_field_in_smali_file1117); field6=field(); @@ -616,7 +616,7 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:434:5: annotation + // smaliParser.g:434:5: annotation { pushFollow(FOLLOW_annotation_in_smali_file1123); annotation7=annotation(); @@ -635,7 +635,7 @@ public class smaliParser extends Parser { cnt1++; } - EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_smali_file1134); + EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_smali_file1134); stream_EOF.add(EOF8); @@ -648,48 +648,48 @@ public class smaliParser extends Parser { throw new SemanticException(input, "The file must contain a .super directive"); } } - + // AST REWRITE - // elements: implements_spec, field, class_spec, super_spec, method, source_spec - // token labels: + // elements: super_spec, method, field, implements_spec, class_spec, source_spec + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 448:3: -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:448:6: ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) + // smaliParser.g:448:6: ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CLASS_DEF, "I_CLASS_DEF"), root_1); adaptor.addChild(root_1, stream_class_spec.nextTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:450:8: ( super_spec )? + // smaliParser.g:450:8: ( super_spec )? if ( stream_super_spec.hasNext() ) { adaptor.addChild(root_1, stream_super_spec.nextTree()); } stream_super_spec.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:451:8: ( implements_spec )* + // smaliParser.g:451:8: ( implements_spec )* while ( stream_implements_spec.hasNext() ) { adaptor.addChild(root_1, stream_implements_spec.nextTree()); } stream_implements_spec.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:452:8: ( source_spec )? + // smaliParser.g:452:8: ( source_spec )? if ( stream_source_spec.hasNext() ) { adaptor.addChild(root_1, stream_source_spec.nextTree()); } stream_source_spec.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:8: ^( I_METHODS ( method )* ) + // smaliParser.g:453:8: ^( I_METHODS ( method )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHODS, "I_METHODS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:20: ( method )* + // smaliParser.g:453:20: ( method )* while ( stream_method.hasNext() ) { adaptor.addChild(root_2, stream_method.nextTree()); } @@ -698,11 +698,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:29: ^( I_FIELDS ( field )* ) + // smaliParser.g:453:29: ^( I_FIELDS ( field )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELDS, "I_FIELDS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:40: ( field )* + // smaliParser.g:453:40: ( field )* while ( stream_field.hasNext() ) { adaptor.addChild(root_2, stream_field.nextTree()); } @@ -751,7 +751,7 @@ public class smaliParser extends Parser { // $ANTLR start "class_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:455:1: class_spec returns [String className] : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ; + // smaliParser.g:455:1: class_spec returns [String className] : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ; public final smaliParser.class_spec_return class_spec() throws RecognitionException { smaliParser.class_spec_return retval = new smaliParser.class_spec_return(); retval.start = input.LT(1); @@ -769,10 +769,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_access_list=new RewriteRuleSubtreeStream(adaptor,"rule access_list"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:456:3: ( CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:456:5: CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR + // smaliParser.g:456:3: ( CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ) + // smaliParser.g:456:5: CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR { - CLASS_DIRECTIVE9=(Token)match(input,CLASS_DIRECTIVE,FOLLOW_CLASS_DIRECTIVE_in_class_spec1221); + CLASS_DIRECTIVE9=(Token)match(input,CLASS_DIRECTIVE,FOLLOW_CLASS_DIRECTIVE_in_class_spec1221); stream_CLASS_DIRECTIVE.add(CLASS_DIRECTIVE9); pushFollow(FOLLOW_access_list_in_class_spec1223); @@ -780,17 +780,17 @@ public class smaliParser extends Parser { state._fsp--; stream_access_list.add(access_list10.getTree()); - CLASS_DESCRIPTOR11=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225); + CLASS_DESCRIPTOR11=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225); stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR11); retval.className = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null); // AST REWRITE - // elements: CLASS_DESCRIPTOR, access_list - // token labels: + // elements: access_list, CLASS_DESCRIPTOR + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -833,7 +833,7 @@ public class smaliParser extends Parser { // $ANTLR start "super_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:458:1: super_spec : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ; + // smaliParser.g:458:1: super_spec : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ; public final smaliParser.super_spec_return super_spec() throws RecognitionException { smaliParser.super_spec_return retval = new smaliParser.super_spec_return(); retval.start = input.LT(1); @@ -849,29 +849,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_SUPER_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SUPER_DIRECTIVE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:3: ( SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:5: SUPER_DIRECTIVE CLASS_DESCRIPTOR + // smaliParser.g:459:3: ( SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ) + // smaliParser.g:459:5: SUPER_DIRECTIVE CLASS_DESCRIPTOR { - SUPER_DIRECTIVE12=(Token)match(input,SUPER_DIRECTIVE,FOLLOW_SUPER_DIRECTIVE_in_super_spec1243); + SUPER_DIRECTIVE12=(Token)match(input,SUPER_DIRECTIVE,FOLLOW_SUPER_DIRECTIVE_in_super_spec1243); stream_SUPER_DIRECTIVE.add(SUPER_DIRECTIVE12); - CLASS_DESCRIPTOR13=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245); + CLASS_DESCRIPTOR13=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245); stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR13); // AST REWRITE // elements: CLASS_DESCRIPTOR - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 459:38: -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:41: ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) + // smaliParser.g:459:41: ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUPER, (retval.start), "I_SUPER"), root_1); @@ -913,7 +913,7 @@ public class smaliParser extends Parser { // $ANTLR start "implements_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:461:1: implements_spec : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ; + // smaliParser.g:461:1: implements_spec : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ; public final smaliParser.implements_spec_return implements_spec() throws RecognitionException { smaliParser.implements_spec_return retval = new smaliParser.implements_spec_return(); retval.start = input.LT(1); @@ -929,29 +929,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:3: ( IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:5: IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR + // smaliParser.g:462:3: ( IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ) + // smaliParser.g:462:5: IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR { - IMPLEMENTS_DIRECTIVE14=(Token)match(input,IMPLEMENTS_DIRECTIVE,FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264); + IMPLEMENTS_DIRECTIVE14=(Token)match(input,IMPLEMENTS_DIRECTIVE,FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264); stream_IMPLEMENTS_DIRECTIVE.add(IMPLEMENTS_DIRECTIVE14); - CLASS_DESCRIPTOR15=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266); + CLASS_DESCRIPTOR15=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266); stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR15); // AST REWRITE // elements: CLASS_DESCRIPTOR - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 462:43: -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:46: ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) + // smaliParser.g:462:46: ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_IMPLEMENTS, (retval.start), "I_IMPLEMENTS"), root_1); @@ -993,7 +993,7 @@ public class smaliParser extends Parser { // $ANTLR start "source_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:464:1: source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ; + // smaliParser.g:464:1: source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ; public final smaliParser.source_spec_return source_spec() throws RecognitionException { smaliParser.source_spec_return retval = new smaliParser.source_spec_return(); retval.start = input.LT(1); @@ -1009,29 +1009,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:3: ( SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:5: SOURCE_DIRECTIVE STRING_LITERAL + // smaliParser.g:465:3: ( SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ) + // smaliParser.g:465:5: SOURCE_DIRECTIVE STRING_LITERAL { - SOURCE_DIRECTIVE16=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285); + SOURCE_DIRECTIVE16=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285); stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE16); - STRING_LITERAL17=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_spec1287); + STRING_LITERAL17=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_spec1287); stream_STRING_LITERAL.add(STRING_LITERAL17); // AST REWRITE // elements: STRING_LITERAL - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 465:37: -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:40: ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) + // smaliParser.g:465:40: ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1); @@ -1073,7 +1073,7 @@ public class smaliParser extends Parser { // $ANTLR start "access_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:467:1: access_list : ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ; + // smaliParser.g:467:1: access_list : ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ; public final smaliParser.access_list_return access_list() throws RecognitionException { smaliParser.access_list_return retval = new smaliParser.access_list_return(); retval.start = input.LT(1); @@ -1086,10 +1086,10 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_ACCESS_SPEC=new RewriteRuleTokenStream(adaptor,"token ACCESS_SPEC"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:3: ( ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ( ACCESS_SPEC )* + // smaliParser.g:468:3: ( ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ) + // smaliParser.g:468:5: ( ACCESS_SPEC )* { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ( ACCESS_SPEC )* + // smaliParser.g:468:5: ( ACCESS_SPEC )* loop2: while (true) { int alt2=2; @@ -1104,9 +1104,9 @@ public class smaliParser extends Parser { switch (alt2) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ACCESS_SPEC + // smaliParser.g:468:5: ACCESS_SPEC { - ACCESS_SPEC18=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list1306); + ACCESS_SPEC18=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list1306); stream_ACCESS_SPEC.add(ACCESS_SPEC18); } @@ -1119,22 +1119,22 @@ public class smaliParser extends Parser { // AST REWRITE // elements: ACCESS_SPEC - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 468:18: -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:21: ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) + // smaliParser.g:468:21: ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ACCESS_LIST, (retval.start), "I_ACCESS_LIST"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:61: ( ACCESS_SPEC )* + // smaliParser.g:468:61: ( ACCESS_SPEC )* while ( stream_ACCESS_SPEC.hasNext() ) { adaptor.addChild(root_1, stream_ACCESS_SPEC.nextNode()); } @@ -1177,7 +1177,7 @@ public class smaliParser extends Parser { // $ANTLR start "field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:475:1: field : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ; + // smaliParser.g:475:1: field : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ; public final smaliParser.field_return field() throws RecognitionException { smaliParser.field_return retval = new smaliParser.field_return(); retval.start = input.LT(1); @@ -1210,10 +1210,10 @@ public class smaliParser extends Parser { List<CommonTree> annotations = new ArrayList<CommonTree>(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:3: ( FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:5: FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) + // smaliParser.g:477:3: ( FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ) + // smaliParser.g:477:5: FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) { - FIELD_DIRECTIVE19=(Token)match(input,FIELD_DIRECTIVE,FOLLOW_FIELD_DIRECTIVE_in_field1337); + FIELD_DIRECTIVE19=(Token)match(input,FIELD_DIRECTIVE,FOLLOW_FIELD_DIRECTIVE_in_field1337); stream_FIELD_DIRECTIVE.add(FIELD_DIRECTIVE19); pushFollow(FOLLOW_access_list_in_field1339); @@ -1226,7 +1226,7 @@ public class smaliParser extends Parser { state._fsp--; stream_member_name.add(member_name21.getTree()); - COLON22=(Token)match(input,COLON,FOLLOW_COLON_in_field1343); + COLON22=(Token)match(input,COLON,FOLLOW_COLON_in_field1343); stream_COLON.add(COLON22); pushFollow(FOLLOW_nonvoid_type_descriptor_in_field1345); @@ -1234,7 +1234,7 @@ public class smaliParser extends Parser { state._fsp--; stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor23.getTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:75: ( EQUAL literal )? + // smaliParser.g:477:75: ( EQUAL literal )? int alt3=2; int LA3_0 = input.LA(1); if ( (LA3_0==EQUAL) ) { @@ -1242,9 +1242,9 @@ public class smaliParser extends Parser { } switch (alt3) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:76: EQUAL literal + // smaliParser.g:477:76: EQUAL literal { - EQUAL24=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_field1348); + EQUAL24=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_field1348); stream_EQUAL.add(EQUAL24); pushFollow(FOLLOW_literal_in_field1350); @@ -1257,10 +1257,10 @@ public class smaliParser extends Parser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:5: ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:7: ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) + // smaliParser.g:478:5: ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) + // smaliParser.g:478:7: ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:7: ({...}? annotation )* + // smaliParser.g:478:7: ({...}? annotation )* loop4: while (true) { int alt4=2; @@ -1275,7 +1275,7 @@ public class smaliParser extends Parser { switch (alt4) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:8: {...}? annotation + // smaliParser.g:478:8: {...}? annotation { if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) { throw new FailedPredicateException(input, "field", "input.LA(1) == ANNOTATION_DIRECTIVE"); @@ -1294,7 +1294,7 @@ public class smaliParser extends Parser { } } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:479:7: ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) + // smaliParser.g:479:7: ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) int alt5=2; int LA5_0 = input.LA(1); if ( (LA5_0==END_FIELD_DIRECTIVE) ) { @@ -1312,31 +1312,31 @@ public class smaliParser extends Parser { switch (alt5) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:479:9: END_FIELD_DIRECTIVE + // smaliParser.g:479:9: END_FIELD_DIRECTIVE { - END_FIELD_DIRECTIVE27=(Token)match(input,END_FIELD_DIRECTIVE,FOLLOW_END_FIELD_DIRECTIVE_in_field1377); + END_FIELD_DIRECTIVE27=(Token)match(input,END_FIELD_DIRECTIVE,FOLLOW_END_FIELD_DIRECTIVE_in_field1377); stream_END_FIELD_DIRECTIVE.add(END_FIELD_DIRECTIVE27); // AST REWRITE - // elements: nonvoid_type_descriptor, literal, access_list, member_name, annotation - // token labels: + // elements: access_list, nonvoid_type_descriptor, annotation, member_name, literal + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 480:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) + // smaliParser.g:480:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1); adaptor.addChild(root_1, stream_member_name.nextTree()); adaptor.addChild(root_1, stream_access_list.nextTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:65: ^( I_FIELD_TYPE nonvoid_type_descriptor ) + // smaliParser.g:480:65: ^( I_FIELD_TYPE nonvoid_type_descriptor ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2); @@ -1344,9 +1344,9 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )? + // smaliParser.g:480:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )? if ( stream_literal.hasNext() ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:105: ^( I_FIELD_INITIAL_VALUE literal ) + // smaliParser.g:480:105: ^( I_FIELD_INITIAL_VALUE literal ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2); @@ -1357,11 +1357,11 @@ public class smaliParser extends Parser { } stream_literal.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:139: ^( I_ANNOTATIONS ( annotation )* ) + // smaliParser.g:480:139: ^( I_ANNOTATIONS ( annotation )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:155: ( annotation )* + // smaliParser.g:480:155: ( annotation )* while ( stream_annotation.hasNext() ) { adaptor.addChild(root_2, stream_annotation.nextTree()); } @@ -1381,29 +1381,29 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:481:21: + // smaliParser.g:481:21: { smali_file_stack.peek().classAnnotations.addAll(annotations); // AST REWRITE - // elements: literal, nonvoid_type_descriptor, member_name, access_list - // token labels: + // elements: member_name, access_list, literal, nonvoid_type_descriptor + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 482:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) + // smaliParser.g:482:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1); adaptor.addChild(root_1, stream_member_name.nextTree()); adaptor.addChild(root_1, stream_access_list.nextTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:65: ^( I_FIELD_TYPE nonvoid_type_descriptor ) + // smaliParser.g:482:65: ^( I_FIELD_TYPE nonvoid_type_descriptor ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2); @@ -1411,9 +1411,9 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )? + // smaliParser.g:482:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )? if ( stream_literal.hasNext() ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:105: ^( I_FIELD_INITIAL_VALUE literal ) + // smaliParser.g:482:105: ^( I_FIELD_INITIAL_VALUE literal ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2); @@ -1424,7 +1424,7 @@ public class smaliParser extends Parser { } stream_literal.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:139: ^( I_ANNOTATIONS ) + // smaliParser.g:482:139: ^( I_ANNOTATIONS ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2); @@ -1475,7 +1475,7 @@ public class smaliParser extends Parser { // $ANTLR start "method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:486:1: method : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ; + // smaliParser.g:486:1: method : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ; public final smaliParser.method_return method() throws RecognitionException { smaliParser.method_return retval = new smaliParser.method_return(); retval.start = input.LT(1); @@ -1499,10 +1499,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_statements_and_directives=new RewriteRuleSubtreeStream(adaptor,"rule statements_and_directives"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:487:3: ( METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:487:5: METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE + // smaliParser.g:487:3: ( METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ) + // smaliParser.g:487:5: METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE { - METHOD_DIRECTIVE28=(Token)match(input,METHOD_DIRECTIVE,FOLLOW_METHOD_DIRECTIVE_in_method1488); + METHOD_DIRECTIVE28=(Token)match(input,METHOD_DIRECTIVE,FOLLOW_METHOD_DIRECTIVE_in_method1488); stream_METHOD_DIRECTIVE.add(METHOD_DIRECTIVE28); pushFollow(FOLLOW_access_list_in_method1490); @@ -1525,23 +1525,23 @@ public class smaliParser extends Parser { state._fsp--; stream_statements_and_directives.add(statements_and_directives32.getTree()); - END_METHOD_DIRECTIVE33=(Token)match(input,END_METHOD_DIRECTIVE,FOLLOW_END_METHOD_DIRECTIVE_in_method1502); + END_METHOD_DIRECTIVE33=(Token)match(input,END_METHOD_DIRECTIVE,FOLLOW_END_METHOD_DIRECTIVE_in_method1502); stream_END_METHOD_DIRECTIVE.add(END_METHOD_DIRECTIVE33); // AST REWRITE - // elements: access_list, member_name, method_prototype, statements_and_directives - // token labels: + // elements: method_prototype, access_list, member_name, statements_and_directives + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 489:5: -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:489:8: ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) + // smaliParser.g:489:8: ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD, (retval.start), "I_METHOD"), root_1); @@ -1592,7 +1592,7 @@ public class smaliParser extends Parser { // $ANTLR start "statements_and_directives" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:491:1: statements_and_directives : ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ; + // smaliParser.g:491:1: statements_and_directives : ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ; public final smaliParser.statements_and_directives_return statements_and_directives() throws RecognitionException { statements_and_directives_stack.push(new statements_and_directives_scope()); smaliParser.statements_and_directives_return retval = new smaliParser.statements_and_directives_return(); @@ -1615,14 +1615,14 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_parameter_directive=new RewriteRuleSubtreeStream(adaptor,"rule parameter_directive"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:497:3: ( ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:497:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* + // smaliParser.g:497:3: ( ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ) + // smaliParser.g:497:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* { statements_and_directives_stack.peek().hasRegistersDirective = false; statements_and_directives_stack.peek().methodAnnotations = new ArrayList<CommonTree>(); - - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:501:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* + + // smaliParser.g:501:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* loop6: while (true) { int alt6=7; @@ -1717,7 +1717,7 @@ public class smaliParser extends Parser { } switch (alt6) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:501:7: ordered_method_item + // smaliParser.g:501:7: ordered_method_item { pushFollow(FOLLOW_ordered_method_item_in_statements_and_directives1547); ordered_method_item34=ordered_method_item(); @@ -1727,7 +1727,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:502:7: registers_directive + // smaliParser.g:502:7: registers_directive { pushFollow(FOLLOW_registers_directive_in_statements_and_directives1555); registers_directive35=registers_directive(); @@ -1737,7 +1737,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:503:7: catch_directive + // smaliParser.g:503:7: catch_directive { pushFollow(FOLLOW_catch_directive_in_statements_and_directives1563); catch_directive36=catch_directive(); @@ -1747,7 +1747,7 @@ public class smaliParser extends Parser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:504:7: catchall_directive + // smaliParser.g:504:7: catchall_directive { pushFollow(FOLLOW_catchall_directive_in_statements_and_directives1571); catchall_directive37=catchall_directive(); @@ -1757,7 +1757,7 @@ public class smaliParser extends Parser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:505:7: parameter_directive + // smaliParser.g:505:7: parameter_directive { pushFollow(FOLLOW_parameter_directive_in_statements_and_directives1579); parameter_directive38=parameter_directive(); @@ -1767,7 +1767,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:506:7: annotation + // smaliParser.g:506:7: annotation { pushFollow(FOLLOW_annotation_in_statements_and_directives1587); annotation39=annotation(); @@ -1784,29 +1784,29 @@ public class smaliParser extends Parser { } // AST REWRITE - // elements: parameter_directive, catch_directive, catchall_directive, ordered_method_item, registers_directive - // token labels: + // elements: ordered_method_item, catch_directive, catchall_directive, parameter_directive, registers_directive + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 508:5: -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:508:8: ( registers_directive )? + // smaliParser.g:508:8: ( registers_directive )? if ( stream_registers_directive.hasNext() ) { adaptor.addChild(root_0, stream_registers_directive.nextTree()); } stream_registers_directive.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:509:8: ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) + // smaliParser.g:509:8: ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ORDERED_METHOD_ITEMS, "I_ORDERED_METHOD_ITEMS"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:509:33: ( ordered_method_item )* + // smaliParser.g:509:33: ( ordered_method_item )* while ( stream_ordered_method_item.hasNext() ) { adaptor.addChild(root_1, stream_ordered_method_item.nextTree()); } @@ -1815,17 +1815,17 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, root_1); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:8: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) + // smaliParser.g:510:8: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHES, "I_CATCHES"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:20: ( catch_directive )* + // smaliParser.g:510:20: ( catch_directive )* while ( stream_catch_directive.hasNext() ) { adaptor.addChild(root_1, stream_catch_directive.nextTree()); } stream_catch_directive.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:37: ( catchall_directive )* + // smaliParser.g:510:37: ( catchall_directive )* while ( stream_catchall_directive.hasNext() ) { adaptor.addChild(root_1, stream_catchall_directive.nextTree()); } @@ -1834,11 +1834,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, root_1); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:511:8: ^( I_PARAMETERS ( parameter_directive )* ) + // smaliParser.g:511:8: ^( I_PARAMETERS ( parameter_directive )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETERS, "I_PARAMETERS"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:511:23: ( parameter_directive )* + // smaliParser.g:511:23: ( parameter_directive )* while ( stream_parameter_directive.hasNext() ) { adaptor.addChild(root_1, stream_parameter_directive.nextTree()); } @@ -1883,7 +1883,7 @@ public class smaliParser extends Parser { // $ANTLR start "ordered_method_item" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:515:1: ordered_method_item : ( label | instruction | debug_directive ); + // smaliParser.g:515:1: ordered_method_item : ( label | instruction | debug_directive ); public final smaliParser.ordered_method_item_return ordered_method_item() throws RecognitionException { smaliParser.ordered_method_item_return retval = new smaliParser.ordered_method_item_return(); retval.start = input.LT(1); @@ -1896,7 +1896,7 @@ public class smaliParser extends Parser { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:516:3: ( label | instruction | debug_directive ) + // smaliParser.g:516:3: ( label | instruction | debug_directive ) int alt7=3; switch ( input.LA(1) ) { case COLON: @@ -1975,7 +1975,7 @@ public class smaliParser extends Parser { } switch (alt7) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:516:5: label + // smaliParser.g:516:5: label { root_0 = (CommonTree)adaptor.nil(); @@ -1989,7 +1989,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:517:5: instruction + // smaliParser.g:517:5: instruction { root_0 = (CommonTree)adaptor.nil(); @@ -2003,7 +2003,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:518:5: debug_directive + // smaliParser.g:518:5: debug_directive { root_0 = (CommonTree)adaptor.nil(); @@ -2045,7 +2045,7 @@ public class smaliParser extends Parser { // $ANTLR start "registers_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:520:1: registers_directive : (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ; + // smaliParser.g:520:1: registers_directive : (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ; public final smaliParser.registers_directive_return registers_directive() throws RecognitionException { smaliParser.registers_directive_return retval = new smaliParser.registers_directive_return(); retval.start = input.LT(1); @@ -2062,10 +2062,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:3: ( (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) + // smaliParser.g:521:3: ( (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ) + // smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) + // smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) int alt8=2; int LA8_0 = input.LA(1); if ( (LA8_0==REGISTERS_DIRECTIVE) ) { @@ -2083,9 +2083,9 @@ public class smaliParser extends Parser { switch (alt8) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:522:7: directive= REGISTERS_DIRECTIVE regCount= integral_literal + // smaliParser.g:522:7: directive= REGISTERS_DIRECTIVE regCount= integral_literal { - directive=(Token)match(input,REGISTERS_DIRECTIVE,FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704); + directive=(Token)match(input,REGISTERS_DIRECTIVE,FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704); stream_REGISTERS_DIRECTIVE.add(directive); pushFollow(FOLLOW_integral_literal_in_registers_directive1708); @@ -2095,11 +2095,11 @@ public class smaliParser extends Parser { stream_integral_literal.add(regCount.getTree()); // AST REWRITE // elements: regCount - // token labels: + // token labels: // rule labels: regCount, retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_regCount=new RewriteRuleSubtreeStream(adaptor,"rule regCount",regCount!=null?regCount.getTree():null); RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2107,7 +2107,7 @@ public class smaliParser extends Parser { root_0 = (CommonTree)adaptor.nil(); // 522:63: -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:522:66: ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) + // smaliParser.g:522:66: ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTERS, directive, "I_REGISTERS"), root_1); @@ -2123,9 +2123,9 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:523:7: directive= LOCALS_DIRECTIVE regCount2= integral_literal + // smaliParser.g:523:7: directive= LOCALS_DIRECTIVE regCount2= integral_literal { - directive=(Token)match(input,LOCALS_DIRECTIVE,FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728); + directive=(Token)match(input,LOCALS_DIRECTIVE,FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728); stream_LOCALS_DIRECTIVE.add(directive); pushFollow(FOLLOW_integral_literal_in_registers_directive1732); @@ -2135,11 +2135,11 @@ public class smaliParser extends Parser { stream_integral_literal.add(regCount2.getTree()); // AST REWRITE // elements: regCount2 - // token labels: + // token labels: // rule labels: regCount2, retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_regCount2=new RewriteRuleSubtreeStream(adaptor,"rule regCount2",regCount2!=null?regCount2.getTree():null); RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2147,7 +2147,7 @@ public class smaliParser extends Parser { root_0 = (CommonTree)adaptor.nil(); // 523:61: -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:523:64: ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) + // smaliParser.g:523:64: ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCALS, directive, "I_LOCALS"), root_1); @@ -2170,7 +2170,7 @@ public class smaliParser extends Parser { throw new SemanticException(input, directive, "There can only be a single .registers or .locals directive in a method"); } statements_and_directives_stack.peek().hasRegistersDirective =true; - + } retval.stop = input.LT(-1); @@ -2200,7 +2200,7 @@ public class smaliParser extends Parser { // $ANTLR start "param_list_or_id" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:532:1: param_list_or_id : ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ; + // smaliParser.g:532:1: param_list_or_id : ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ; public final smaliParser.param_list_or_id_return param_list_or_id() throws RecognitionException { smaliParser.param_list_or_id_return retval = new smaliParser.param_list_or_id_return(); retval.start = input.LT(1); @@ -2212,13 +2212,13 @@ public class smaliParser extends Parser { CommonTree PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:3: ( ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ + // smaliParser.g:533:3: ( ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ) + // smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ { root_0 = (CommonTree)adaptor.nil(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ + // smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ int cnt9=0; loop9: while (true) { @@ -2230,9 +2230,9 @@ public class smaliParser extends Parser { switch (alt9) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE + // smaliParser.g:533:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE { - PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764); + PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764); PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree = (CommonTree)adaptor.create(PARAM_LIST_OR_ID_PRIMITIVE_TYPE43); adaptor.addChild(root_0, PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree); @@ -2276,7 +2276,7 @@ public class smaliParser extends Parser { // $ANTLR start "simple_name" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:537:1: simple_name : ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] ); + // smaliParser.g:537:1: simple_name : ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] ); public final smaliParser.simple_name_return simple_name() throws RecognitionException { smaliParser.simple_name_return retval = new smaliParser.simple_name_return(); retval.start = input.LT(1); @@ -2407,7 +2407,7 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_param_list_or_id=new RewriteRuleSubtreeStream(adaptor,"rule param_list_or_id"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:538:3: ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] ) + // smaliParser.g:538:3: ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] ) int alt10=41; switch ( input.LA(1) ) { case SIMPLE_NAME: @@ -2622,30 +2622,30 @@ public class smaliParser extends Parser { } switch (alt10) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:538:5: SIMPLE_NAME + // smaliParser.g:538:5: SIMPLE_NAME { root_0 = (CommonTree)adaptor.nil(); - SIMPLE_NAME44=(Token)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_simple_name1777); + SIMPLE_NAME44=(Token)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_simple_name1777); SIMPLE_NAME44_tree = (CommonTree)adaptor.create(SIMPLE_NAME44); adaptor.addChild(root_0, SIMPLE_NAME44_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:539:5: ACCESS_SPEC + // smaliParser.g:539:5: ACCESS_SPEC { - ACCESS_SPEC45=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_simple_name1783); + ACCESS_SPEC45=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_simple_name1783); stream_ACCESS_SPEC.add(ACCESS_SPEC45); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2661,18 +2661,18 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:540:5: VERIFICATION_ERROR_TYPE + // smaliParser.g:540:5: VERIFICATION_ERROR_TYPE { - VERIFICATION_ERROR_TYPE46=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794); + VERIFICATION_ERROR_TYPE46=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794); stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE46); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2688,18 +2688,18 @@ public class smaliParser extends Parser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:541:5: POSITIVE_INTEGER_LITERAL + // smaliParser.g:541:5: POSITIVE_INTEGER_LITERAL { - POSITIVE_INTEGER_LITERAL47=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805); + POSITIVE_INTEGER_LITERAL47=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805); stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL47); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2715,18 +2715,18 @@ public class smaliParser extends Parser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:542:5: NEGATIVE_INTEGER_LITERAL + // smaliParser.g:542:5: NEGATIVE_INTEGER_LITERAL { - NEGATIVE_INTEGER_LITERAL48=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816); + NEGATIVE_INTEGER_LITERAL48=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816); stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL48); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2742,18 +2742,18 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:543:5: FLOAT_LITERAL_OR_ID + // smaliParser.g:543:5: FLOAT_LITERAL_OR_ID { - FLOAT_LITERAL_OR_ID49=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827); + FLOAT_LITERAL_OR_ID49=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827); stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID49); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2769,18 +2769,18 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:544:5: DOUBLE_LITERAL_OR_ID + // smaliParser.g:544:5: DOUBLE_LITERAL_OR_ID { - DOUBLE_LITERAL_OR_ID50=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838); + DOUBLE_LITERAL_OR_ID50=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838); stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID50); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2796,18 +2796,18 @@ public class smaliParser extends Parser { } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:545:5: BOOL_LITERAL + // smaliParser.g:545:5: BOOL_LITERAL { - BOOL_LITERAL51=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_simple_name1849); + BOOL_LITERAL51=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_simple_name1849); stream_BOOL_LITERAL.add(BOOL_LITERAL51); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2823,18 +2823,18 @@ public class smaliParser extends Parser { } break; case 9 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:546:5: NULL_LITERAL + // smaliParser.g:546:5: NULL_LITERAL { - NULL_LITERAL52=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_simple_name1860); + NULL_LITERAL52=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_simple_name1860); stream_NULL_LITERAL.add(NULL_LITERAL52); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2850,18 +2850,18 @@ public class smaliParser extends Parser { } break; case 10 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:547:5: REGISTER + // smaliParser.g:547:5: REGISTER { - REGISTER53=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_simple_name1871); + REGISTER53=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_simple_name1871); stream_REGISTER.add(REGISTER53); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2877,7 +2877,7 @@ public class smaliParser extends Parser { } break; case 11 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:548:5: param_list_or_id + // smaliParser.g:548:5: param_list_or_id { pushFollow(FOLLOW_param_list_or_id_in_simple_name1882); param_list_or_id54=param_list_or_id(); @@ -2885,12 +2885,12 @@ public class smaliParser extends Parser { stream_param_list_or_id.add(param_list_or_id54.getTree()); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2906,18 +2906,18 @@ public class smaliParser extends Parser { } break; case 12 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:549:5: PRIMITIVE_TYPE + // smaliParser.g:549:5: PRIMITIVE_TYPE { - PRIMITIVE_TYPE55=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_simple_name1892); + PRIMITIVE_TYPE55=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_simple_name1892); stream_PRIMITIVE_TYPE.add(PRIMITIVE_TYPE55); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2933,18 +2933,18 @@ public class smaliParser extends Parser { } break; case 13 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:550:5: VOID_TYPE + // smaliParser.g:550:5: VOID_TYPE { - VOID_TYPE56=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_simple_name1903); + VOID_TYPE56=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_simple_name1903); stream_VOID_TYPE.add(VOID_TYPE56); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2960,18 +2960,18 @@ public class smaliParser extends Parser { } break; case 14 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:551:5: ANNOTATION_VISIBILITY + // smaliParser.g:551:5: ANNOTATION_VISIBILITY { - ANNOTATION_VISIBILITY57=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914); + ANNOTATION_VISIBILITY57=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914); stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY57); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -2987,18 +2987,18 @@ public class smaliParser extends Parser { } break; case 15 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:552:5: INSTRUCTION_FORMAT10t + // smaliParser.g:552:5: INSTRUCTION_FORMAT10t { - INSTRUCTION_FORMAT10t58=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925); + INSTRUCTION_FORMAT10t58=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925); stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t58); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3014,18 +3014,18 @@ public class smaliParser extends Parser { } break; case 16 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:553:5: INSTRUCTION_FORMAT10x + // smaliParser.g:553:5: INSTRUCTION_FORMAT10x { - INSTRUCTION_FORMAT10x59=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936); + INSTRUCTION_FORMAT10x59=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936); stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x59); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3041,18 +3041,18 @@ public class smaliParser extends Parser { } break; case 17 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:554:5: INSTRUCTION_FORMAT10x_ODEX + // smaliParser.g:554:5: INSTRUCTION_FORMAT10x_ODEX { - INSTRUCTION_FORMAT10x_ODEX60=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947); + INSTRUCTION_FORMAT10x_ODEX60=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947); stream_INSTRUCTION_FORMAT10x_ODEX.add(INSTRUCTION_FORMAT10x_ODEX60); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3068,18 +3068,18 @@ public class smaliParser extends Parser { } break; case 18 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:555:5: INSTRUCTION_FORMAT11x + // smaliParser.g:555:5: INSTRUCTION_FORMAT11x { - INSTRUCTION_FORMAT11x61=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958); + INSTRUCTION_FORMAT11x61=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958); stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x61); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3095,18 +3095,18 @@ public class smaliParser extends Parser { } break; case 19 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:556:5: INSTRUCTION_FORMAT12x_OR_ID + // smaliParser.g:556:5: INSTRUCTION_FORMAT12x_OR_ID { - INSTRUCTION_FORMAT12x_OR_ID62=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969); + INSTRUCTION_FORMAT12x_OR_ID62=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969); stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID62); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3122,18 +3122,18 @@ public class smaliParser extends Parser { } break; case 20 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:557:5: INSTRUCTION_FORMAT21c_FIELD + // smaliParser.g:557:5: INSTRUCTION_FORMAT21c_FIELD { - INSTRUCTION_FORMAT21c_FIELD63=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980); + INSTRUCTION_FORMAT21c_FIELD63=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980); stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD63); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3149,18 +3149,18 @@ public class smaliParser extends Parser { } break; case 21 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:558:5: INSTRUCTION_FORMAT21c_FIELD_ODEX + // smaliParser.g:558:5: INSTRUCTION_FORMAT21c_FIELD_ODEX { - INSTRUCTION_FORMAT21c_FIELD_ODEX64=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991); + INSTRUCTION_FORMAT21c_FIELD_ODEX64=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991); stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX64); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3176,18 +3176,18 @@ public class smaliParser extends Parser { } break; case 22 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:559:5: INSTRUCTION_FORMAT21c_STRING + // smaliParser.g:559:5: INSTRUCTION_FORMAT21c_STRING { - INSTRUCTION_FORMAT21c_STRING65=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002); + INSTRUCTION_FORMAT21c_STRING65=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002); stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING65); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3203,18 +3203,18 @@ public class smaliParser extends Parser { } break; case 23 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:560:5: INSTRUCTION_FORMAT21c_TYPE + // smaliParser.g:560:5: INSTRUCTION_FORMAT21c_TYPE { - INSTRUCTION_FORMAT21c_TYPE66=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013); + INSTRUCTION_FORMAT21c_TYPE66=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013); stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE66); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3230,18 +3230,18 @@ public class smaliParser extends Parser { } break; case 24 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:561:5: INSTRUCTION_FORMAT21t + // smaliParser.g:561:5: INSTRUCTION_FORMAT21t { - INSTRUCTION_FORMAT21t67=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024); + INSTRUCTION_FORMAT21t67=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024); stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t67); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3257,18 +3257,18 @@ public class smaliParser extends Parser { } break; case 25 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:562:5: INSTRUCTION_FORMAT22c_FIELD + // smaliParser.g:562:5: INSTRUCTION_FORMAT22c_FIELD { - INSTRUCTION_FORMAT22c_FIELD68=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035); + INSTRUCTION_FORMAT22c_FIELD68=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035); stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD68); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3284,18 +3284,18 @@ public class smaliParser extends Parser { } break; case 26 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:563:5: INSTRUCTION_FORMAT22c_FIELD_ODEX + // smaliParser.g:563:5: INSTRUCTION_FORMAT22c_FIELD_ODEX { - INSTRUCTION_FORMAT22c_FIELD_ODEX69=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046); + INSTRUCTION_FORMAT22c_FIELD_ODEX69=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046); stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX69); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3311,18 +3311,18 @@ public class smaliParser extends Parser { } break; case 27 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:564:5: INSTRUCTION_FORMAT22c_TYPE + // smaliParser.g:564:5: INSTRUCTION_FORMAT22c_TYPE { - INSTRUCTION_FORMAT22c_TYPE70=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057); + INSTRUCTION_FORMAT22c_TYPE70=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057); stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE70); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3338,18 +3338,18 @@ public class smaliParser extends Parser { } break; case 28 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:565:5: INSTRUCTION_FORMAT22cs_FIELD + // smaliParser.g:565:5: INSTRUCTION_FORMAT22cs_FIELD { - INSTRUCTION_FORMAT22cs_FIELD71=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068); + INSTRUCTION_FORMAT22cs_FIELD71=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068); stream_INSTRUCTION_FORMAT22cs_FIELD.add(INSTRUCTION_FORMAT22cs_FIELD71); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3365,18 +3365,18 @@ public class smaliParser extends Parser { } break; case 29 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:566:5: INSTRUCTION_FORMAT22s_OR_ID + // smaliParser.g:566:5: INSTRUCTION_FORMAT22s_OR_ID { - INSTRUCTION_FORMAT22s_OR_ID72=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079); + INSTRUCTION_FORMAT22s_OR_ID72=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079); stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID72); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3392,18 +3392,18 @@ public class smaliParser extends Parser { } break; case 30 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:567:5: INSTRUCTION_FORMAT22t + // smaliParser.g:567:5: INSTRUCTION_FORMAT22t { - INSTRUCTION_FORMAT22t73=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090); + INSTRUCTION_FORMAT22t73=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090); stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t73); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3419,18 +3419,18 @@ public class smaliParser extends Parser { } break; case 31 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:568:5: INSTRUCTION_FORMAT23x + // smaliParser.g:568:5: INSTRUCTION_FORMAT23x { - INSTRUCTION_FORMAT23x74=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101); + INSTRUCTION_FORMAT23x74=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101); stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x74); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3446,18 +3446,18 @@ public class smaliParser extends Parser { } break; case 32 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:569:5: INSTRUCTION_FORMAT31i_OR_ID + // smaliParser.g:569:5: INSTRUCTION_FORMAT31i_OR_ID { - INSTRUCTION_FORMAT31i_OR_ID75=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112); + INSTRUCTION_FORMAT31i_OR_ID75=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112); stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID75); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3473,18 +3473,18 @@ public class smaliParser extends Parser { } break; case 33 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:570:5: INSTRUCTION_FORMAT31t + // smaliParser.g:570:5: INSTRUCTION_FORMAT31t { - INSTRUCTION_FORMAT31t76=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123); + INSTRUCTION_FORMAT31t76=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123); stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t76); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3500,18 +3500,18 @@ public class smaliParser extends Parser { } break; case 34 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:571:5: INSTRUCTION_FORMAT35c_METHOD + // smaliParser.g:571:5: INSTRUCTION_FORMAT35c_METHOD { - INSTRUCTION_FORMAT35c_METHOD77=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134); + INSTRUCTION_FORMAT35c_METHOD77=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134); stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD77); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3527,18 +3527,18 @@ public class smaliParser extends Parser { } break; case 35 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:572:5: INSTRUCTION_FORMAT35c_METHOD_ODEX + // smaliParser.g:572:5: INSTRUCTION_FORMAT35c_METHOD_ODEX { - INSTRUCTION_FORMAT35c_METHOD_ODEX78=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145); + INSTRUCTION_FORMAT35c_METHOD_ODEX78=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145); stream_INSTRUCTION_FORMAT35c_METHOD_ODEX.add(INSTRUCTION_FORMAT35c_METHOD_ODEX78); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3554,18 +3554,18 @@ public class smaliParser extends Parser { } break; case 36 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:573:5: INSTRUCTION_FORMAT35c_TYPE + // smaliParser.g:573:5: INSTRUCTION_FORMAT35c_TYPE { - INSTRUCTION_FORMAT35c_TYPE79=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156); + INSTRUCTION_FORMAT35c_TYPE79=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156); stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE79); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3581,18 +3581,18 @@ public class smaliParser extends Parser { } break; case 37 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:574:5: INSTRUCTION_FORMAT35mi_METHOD + // smaliParser.g:574:5: INSTRUCTION_FORMAT35mi_METHOD { - INSTRUCTION_FORMAT35mi_METHOD80=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167); + INSTRUCTION_FORMAT35mi_METHOD80=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167); stream_INSTRUCTION_FORMAT35mi_METHOD.add(INSTRUCTION_FORMAT35mi_METHOD80); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3608,18 +3608,18 @@ public class smaliParser extends Parser { } break; case 38 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:575:5: INSTRUCTION_FORMAT35ms_METHOD + // smaliParser.g:575:5: INSTRUCTION_FORMAT35ms_METHOD { - INSTRUCTION_FORMAT35ms_METHOD81=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178); + INSTRUCTION_FORMAT35ms_METHOD81=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178); stream_INSTRUCTION_FORMAT35ms_METHOD.add(INSTRUCTION_FORMAT35ms_METHOD81); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3635,18 +3635,18 @@ public class smaliParser extends Parser { } break; case 39 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:576:5: INSTRUCTION_FORMAT45cc_METHOD + // smaliParser.g:576:5: INSTRUCTION_FORMAT45cc_METHOD { - INSTRUCTION_FORMAT45cc_METHOD82=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189); + INSTRUCTION_FORMAT45cc_METHOD82=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189); stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD82); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3662,18 +3662,18 @@ public class smaliParser extends Parser { } break; case 40 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:577:5: INSTRUCTION_FORMAT4rcc_METHOD + // smaliParser.g:577:5: INSTRUCTION_FORMAT4rcc_METHOD { - INSTRUCTION_FORMAT4rcc_METHOD83=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200); + INSTRUCTION_FORMAT4rcc_METHOD83=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200); stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD83); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3689,18 +3689,18 @@ public class smaliParser extends Parser { } break; case 41 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:578:5: INSTRUCTION_FORMAT51l + // smaliParser.g:578:5: INSTRUCTION_FORMAT51l { - INSTRUCTION_FORMAT51l84=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211); + INSTRUCTION_FORMAT51l84=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211); stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l84); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3744,7 +3744,7 @@ public class smaliParser extends Parser { // $ANTLR start "member_name" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:580:1: member_name : ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] ); + // smaliParser.g:580:1: member_name : ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] ); public final smaliParser.member_name_return member_name() throws RecognitionException { smaliParser.member_name_return retval = new smaliParser.member_name_return(); retval.start = input.LT(1); @@ -3758,7 +3758,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_MEMBER_NAME=new RewriteRuleTokenStream(adaptor,"token MEMBER_NAME"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:581:3: ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] ) + // smaliParser.g:581:3: ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] ) int alt11=2; int LA11_0 = input.LA(1); if ( (LA11_0==ACCESS_SPEC||LA11_0==ANNOTATION_VISIBILITY||LA11_0==BOOL_LITERAL||LA11_0==DOUBLE_LITERAL_OR_ID||LA11_0==FLOAT_LITERAL_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT10t && LA11_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA11_0==INSTRUCTION_FORMAT11x||LA11_0==INSTRUCTION_FORMAT12x_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT21c_FIELD && LA11_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA11_0==INSTRUCTION_FORMAT21t||(LA11_0 >= INSTRUCTION_FORMAT22c_FIELD && LA11_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA11_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA11_0 <= INSTRUCTION_FORMAT22t)||LA11_0==INSTRUCTION_FORMAT23x||(LA11_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA11_0 <= INSTRUCTION_FORMAT31t)||(LA11_0 >= INSTRUCTION_FORMAT35c_METHOD && LA11_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA11_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA11_0 <= INSTRUCTION_FORMAT51l)||(LA11_0 >= NEGATIVE_INTEGER_LITERAL && LA11_0 <= NULL_LITERAL)||(LA11_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA11_0 <= PRIMITIVE_TYPE)||LA11_0==REGISTER||LA11_0==SIMPLE_NAME||(LA11_0 >= VERIFICATION_ERROR_TYPE && LA11_0 <= VOID_TYPE)) ) { @@ -3776,7 +3776,7 @@ public class smaliParser extends Parser { switch (alt11) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:581:5: simple_name + // smaliParser.g:581:5: simple_name { root_0 = (CommonTree)adaptor.nil(); @@ -3790,18 +3790,18 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:582:5: MEMBER_NAME + // smaliParser.g:582:5: MEMBER_NAME { - MEMBER_NAME86=(Token)match(input,MEMBER_NAME,FOLLOW_MEMBER_NAME_in_member_name2232); + MEMBER_NAME86=(Token)match(input,MEMBER_NAME,FOLLOW_MEMBER_NAME_in_member_name2232); stream_MEMBER_NAME.add(MEMBER_NAME86); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -3845,7 +3845,7 @@ public class smaliParser extends Parser { // $ANTLR start "method_prototype" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:584:1: method_prototype : OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ; + // smaliParser.g:584:1: method_prototype : OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ; public final smaliParser.method_prototype_return method_prototype() throws RecognitionException { smaliParser.method_prototype_return retval = new smaliParser.method_prototype_return(); retval.start = input.LT(1); @@ -3865,10 +3865,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_param_list=new RewriteRuleSubtreeStream(adaptor,"rule param_list"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:585:3: ( OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:585:5: OPEN_PAREN param_list CLOSE_PAREN type_descriptor + // smaliParser.g:585:3: ( OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ) + // smaliParser.g:585:5: OPEN_PAREN param_list CLOSE_PAREN type_descriptor { - OPEN_PAREN87=(Token)match(input,OPEN_PAREN,FOLLOW_OPEN_PAREN_in_method_prototype2247); + OPEN_PAREN87=(Token)match(input,OPEN_PAREN,FOLLOW_OPEN_PAREN_in_method_prototype2247); stream_OPEN_PAREN.add(OPEN_PAREN87); pushFollow(FOLLOW_param_list_in_method_prototype2249); @@ -3876,7 +3876,7 @@ public class smaliParser extends Parser { state._fsp--; stream_param_list.add(param_list88.getTree()); - CLOSE_PAREN89=(Token)match(input,CLOSE_PAREN,FOLLOW_CLOSE_PAREN_in_method_prototype2251); + CLOSE_PAREN89=(Token)match(input,CLOSE_PAREN,FOLLOW_CLOSE_PAREN_in_method_prototype2251); stream_CLOSE_PAREN.add(CLOSE_PAREN89); pushFollow(FOLLOW_type_descriptor_in_method_prototype2253); @@ -3885,23 +3885,23 @@ public class smaliParser extends Parser { stream_type_descriptor.add(type_descriptor90.getTree()); // AST REWRITE - // elements: param_list, type_descriptor - // token labels: + // elements: type_descriptor, param_list + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 586:5: -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:8: ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) + // smaliParser.g:586:8: ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_PROTOTYPE, (retval.start), "I_METHOD_PROTOTYPE"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:59: ^( I_METHOD_RETURN_TYPE type_descriptor ) + // smaliParser.g:586:59: ^( I_METHOD_RETURN_TYPE type_descriptor ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_RETURN_TYPE, "I_METHOD_RETURN_TYPE"), root_2); @@ -3909,7 +3909,7 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:99: ( param_list )? + // smaliParser.g:586:99: ( param_list )? if ( stream_param_list.hasNext() ) { adaptor.addChild(root_1, stream_param_list.nextTree()); } @@ -3952,7 +3952,7 @@ public class smaliParser extends Parser { // $ANTLR start "param_list_or_id_primitive_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:588:1: param_list_or_id_primitive_type : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ; + // smaliParser.g:588:1: param_list_or_id_primitive_type : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ; public final smaliParser.param_list_or_id_primitive_type_return param_list_or_id_primitive_type() throws RecognitionException { smaliParser.param_list_or_id_primitive_type_return retval = new smaliParser.param_list_or_id_primitive_type_return(); retval.start = input.LT(1); @@ -3965,19 +3965,19 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE=new RewriteRuleTokenStream(adaptor,"token PARAM_LIST_OR_ID_PRIMITIVE_TYPE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:589:3: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:589:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE + // smaliParser.g:589:3: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ) + // smaliParser.g:589:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE { - PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283); + PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283); stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE.add(PARAM_LIST_OR_ID_PRIMITIVE_TYPE91); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -4019,7 +4019,7 @@ public class smaliParser extends Parser { // $ANTLR start "param_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:591:1: param_list : ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* ); + // smaliParser.g:591:1: param_list : ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* ); public final smaliParser.param_list_return param_list() throws RecognitionException { smaliParser.param_list_return retval = new smaliParser.param_list_return(); retval.start = input.LT(1); @@ -4031,7 +4031,7 @@ public class smaliParser extends Parser { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:3: ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* ) + // smaliParser.g:592:3: ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* ) int alt14=2; int LA14_0 = input.LA(1); if ( (LA14_0==PARAM_LIST_OR_ID_PRIMITIVE_TYPE) ) { @@ -4049,12 +4049,12 @@ public class smaliParser extends Parser { switch (alt14) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: ( param_list_or_id_primitive_type )+ + // smaliParser.g:592:5: ( param_list_or_id_primitive_type )+ { root_0 = (CommonTree)adaptor.nil(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: ( param_list_or_id_primitive_type )+ + // smaliParser.g:592:5: ( param_list_or_id_primitive_type )+ int cnt12=0; loop12: while (true) { @@ -4066,7 +4066,7 @@ public class smaliParser extends Parser { switch (alt12) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: param_list_or_id_primitive_type + // smaliParser.g:592:5: param_list_or_id_primitive_type { pushFollow(FOLLOW_param_list_or_id_primitive_type_in_param_list2298); param_list_or_id_primitive_type92=param_list_or_id_primitive_type(); @@ -4088,12 +4088,12 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: ( nonvoid_type_descriptor )* + // smaliParser.g:593:5: ( nonvoid_type_descriptor )* { root_0 = (CommonTree)adaptor.nil(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: ( nonvoid_type_descriptor )* + // smaliParser.g:593:5: ( nonvoid_type_descriptor )* loop13: while (true) { int alt13=2; @@ -4104,7 +4104,7 @@ public class smaliParser extends Parser { switch (alt13) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: nonvoid_type_descriptor + // smaliParser.g:593:5: nonvoid_type_descriptor { pushFollow(FOLLOW_nonvoid_type_descriptor_in_param_list2305); nonvoid_type_descriptor93=nonvoid_type_descriptor(); @@ -4151,7 +4151,7 @@ public class smaliParser extends Parser { // $ANTLR start "array_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:595:1: array_descriptor : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ; + // smaliParser.g:595:1: array_descriptor : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ; public final smaliParser.array_descriptor_return array_descriptor() throws RecognitionException { smaliParser.array_descriptor_return retval = new smaliParser.array_descriptor_return(); retval.start = input.LT(1); @@ -4165,13 +4165,13 @@ public class smaliParser extends Parser { CommonTree set95_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:596:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:596:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) + // smaliParser.g:596:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ) + // smaliParser.g:596:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) { root_0 = (CommonTree)adaptor.nil(); - ARRAY_TYPE_PREFIX94=(Token)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316); + ARRAY_TYPE_PREFIX94=(Token)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316); ARRAY_TYPE_PREFIX94_tree = (CommonTree)adaptor.create(ARRAY_TYPE_PREFIX94); adaptor.addChild(root_0, ARRAY_TYPE_PREFIX94_tree); @@ -4214,7 +4214,7 @@ public class smaliParser extends Parser { // $ANTLR start "type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:598:1: type_descriptor : ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ); + // smaliParser.g:598:1: type_descriptor : ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ); public final smaliParser.type_descriptor_return type_descriptor() throws RecognitionException { smaliParser.type_descriptor_return retval = new smaliParser.type_descriptor_return(); retval.start = input.LT(1); @@ -4231,7 +4231,7 @@ public class smaliParser extends Parser { CommonTree CLASS_DESCRIPTOR98_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:599:3: ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) + // smaliParser.g:599:3: ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) int alt15=4; switch ( input.LA(1) ) { case VOID_TYPE: @@ -4261,43 +4261,43 @@ public class smaliParser extends Parser { } switch (alt15) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:599:5: VOID_TYPE + // smaliParser.g:599:5: VOID_TYPE { root_0 = (CommonTree)adaptor.nil(); - VOID_TYPE96=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor2334); + VOID_TYPE96=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor2334); VOID_TYPE96_tree = (CommonTree)adaptor.create(VOID_TYPE96); adaptor.addChild(root_0, VOID_TYPE96_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:600:5: PRIMITIVE_TYPE + // smaliParser.g:600:5: PRIMITIVE_TYPE { root_0 = (CommonTree)adaptor.nil(); - PRIMITIVE_TYPE97=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340); + PRIMITIVE_TYPE97=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340); PRIMITIVE_TYPE97_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE97); adaptor.addChild(root_0, PRIMITIVE_TYPE97_tree); } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:601:5: CLASS_DESCRIPTOR + // smaliParser.g:601:5: CLASS_DESCRIPTOR { root_0 = (CommonTree)adaptor.nil(); - CLASS_DESCRIPTOR98=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346); + CLASS_DESCRIPTOR98=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346); CLASS_DESCRIPTOR98_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR98); adaptor.addChild(root_0, CLASS_DESCRIPTOR98_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:602:5: array_descriptor + // smaliParser.g:602:5: array_descriptor { root_0 = (CommonTree)adaptor.nil(); @@ -4339,7 +4339,7 @@ public class smaliParser extends Parser { // $ANTLR start "nonvoid_type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:604:1: nonvoid_type_descriptor : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ); + // smaliParser.g:604:1: nonvoid_type_descriptor : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ); public final smaliParser.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException { smaliParser.nonvoid_type_descriptor_return retval = new smaliParser.nonvoid_type_descriptor_return(); retval.start = input.LT(1); @@ -4354,7 +4354,7 @@ public class smaliParser extends Parser { CommonTree CLASS_DESCRIPTOR101_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:605:3: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) + // smaliParser.g:605:3: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) int alt16=3; switch ( input.LA(1) ) { case PRIMITIVE_TYPE: @@ -4379,31 +4379,31 @@ public class smaliParser extends Parser { } switch (alt16) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:605:5: PRIMITIVE_TYPE + // smaliParser.g:605:5: PRIMITIVE_TYPE { root_0 = (CommonTree)adaptor.nil(); - PRIMITIVE_TYPE100=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362); + PRIMITIVE_TYPE100=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362); PRIMITIVE_TYPE100_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE100); adaptor.addChild(root_0, PRIMITIVE_TYPE100_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:606:5: CLASS_DESCRIPTOR + // smaliParser.g:606:5: CLASS_DESCRIPTOR { root_0 = (CommonTree)adaptor.nil(); - CLASS_DESCRIPTOR101=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368); + CLASS_DESCRIPTOR101=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368); CLASS_DESCRIPTOR101_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR101); adaptor.addChild(root_0, CLASS_DESCRIPTOR101_tree); } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:607:5: array_descriptor + // smaliParser.g:607:5: array_descriptor { root_0 = (CommonTree)adaptor.nil(); @@ -4445,7 +4445,7 @@ public class smaliParser extends Parser { // $ANTLR start "reference_type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:609:1: reference_type_descriptor : ( CLASS_DESCRIPTOR | array_descriptor ); + // smaliParser.g:609:1: reference_type_descriptor : ( CLASS_DESCRIPTOR | array_descriptor ); public final smaliParser.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException { smaliParser.reference_type_descriptor_return retval = new smaliParser.reference_type_descriptor_return(); retval.start = input.LT(1); @@ -4458,7 +4458,7 @@ public class smaliParser extends Parser { CommonTree CLASS_DESCRIPTOR103_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:610:3: ( CLASS_DESCRIPTOR | array_descriptor ) + // smaliParser.g:610:3: ( CLASS_DESCRIPTOR | array_descriptor ) int alt17=2; int LA17_0 = input.LA(1); if ( (LA17_0==CLASS_DESCRIPTOR) ) { @@ -4476,19 +4476,19 @@ public class smaliParser extends Parser { switch (alt17) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:610:5: CLASS_DESCRIPTOR + // smaliParser.g:610:5: CLASS_DESCRIPTOR { root_0 = (CommonTree)adaptor.nil(); - CLASS_DESCRIPTOR103=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384); + CLASS_DESCRIPTOR103=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384); CLASS_DESCRIPTOR103_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR103); adaptor.addChild(root_0, CLASS_DESCRIPTOR103_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:611:5: array_descriptor + // smaliParser.g:611:5: array_descriptor { root_0 = (CommonTree)adaptor.nil(); @@ -4530,7 +4530,7 @@ public class smaliParser extends Parser { // $ANTLR start "integer_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:613:1: integer_literal : ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] ); + // smaliParser.g:613:1: integer_literal : ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] ); public final smaliParser.integer_literal_return integer_literal() throws RecognitionException { smaliParser.integer_literal_return retval = new smaliParser.integer_literal_return(); retval.start = input.LT(1); @@ -4546,7 +4546,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_POSITIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token POSITIVE_INTEGER_LITERAL"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:614:3: ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] ) + // smaliParser.g:614:3: ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] ) int alt18=2; int LA18_0 = input.LA(1); if ( (LA18_0==POSITIVE_INTEGER_LITERAL) ) { @@ -4564,18 +4564,18 @@ public class smaliParser extends Parser { switch (alt18) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:614:5: POSITIVE_INTEGER_LITERAL + // smaliParser.g:614:5: POSITIVE_INTEGER_LITERAL { - POSITIVE_INTEGER_LITERAL105=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400); + POSITIVE_INTEGER_LITERAL105=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400); stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL105); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -4591,18 +4591,18 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:615:5: NEGATIVE_INTEGER_LITERAL + // smaliParser.g:615:5: NEGATIVE_INTEGER_LITERAL { - NEGATIVE_INTEGER_LITERAL106=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411); + NEGATIVE_INTEGER_LITERAL106=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411); stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL106); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -4646,7 +4646,7 @@ public class smaliParser extends Parser { // $ANTLR start "float_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:617:1: float_literal : ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL ); + // smaliParser.g:617:1: float_literal : ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL ); public final smaliParser.float_literal_return float_literal() throws RecognitionException { smaliParser.float_literal_return retval = new smaliParser.float_literal_return(); retval.start = input.LT(1); @@ -4661,7 +4661,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_FLOAT_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token FLOAT_LITERAL_OR_ID"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:618:3: ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL ) + // smaliParser.g:618:3: ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL ) int alt19=2; int LA19_0 = input.LA(1); if ( (LA19_0==FLOAT_LITERAL_OR_ID) ) { @@ -4679,18 +4679,18 @@ public class smaliParser extends Parser { switch (alt19) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:618:5: FLOAT_LITERAL_OR_ID + // smaliParser.g:618:5: FLOAT_LITERAL_OR_ID { - FLOAT_LITERAL_OR_ID107=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426); + FLOAT_LITERAL_OR_ID107=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426); stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID107); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -4706,12 +4706,12 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:619:5: FLOAT_LITERAL + // smaliParser.g:619:5: FLOAT_LITERAL { root_0 = (CommonTree)adaptor.nil(); - FLOAT_LITERAL108=(Token)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal2437); + FLOAT_LITERAL108=(Token)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal2437); FLOAT_LITERAL108_tree = (CommonTree)adaptor.create(FLOAT_LITERAL108); adaptor.addChild(root_0, FLOAT_LITERAL108_tree); @@ -4746,7 +4746,7 @@ public class smaliParser extends Parser { // $ANTLR start "double_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:621:1: double_literal : ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL ); + // smaliParser.g:621:1: double_literal : ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL ); public final smaliParser.double_literal_return double_literal() throws RecognitionException { smaliParser.double_literal_return retval = new smaliParser.double_literal_return(); retval.start = input.LT(1); @@ -4761,7 +4761,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_DOUBLE_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token DOUBLE_LITERAL_OR_ID"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:622:3: ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL ) + // smaliParser.g:622:3: ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL ) int alt20=2; int LA20_0 = input.LA(1); if ( (LA20_0==DOUBLE_LITERAL_OR_ID) ) { @@ -4779,18 +4779,18 @@ public class smaliParser extends Parser { switch (alt20) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:622:5: DOUBLE_LITERAL_OR_ID + // smaliParser.g:622:5: DOUBLE_LITERAL_OR_ID { - DOUBLE_LITERAL_OR_ID109=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447); + DOUBLE_LITERAL_OR_ID109=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447); stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID109); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -4806,12 +4806,12 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:623:5: DOUBLE_LITERAL + // smaliParser.g:623:5: DOUBLE_LITERAL { root_0 = (CommonTree)adaptor.nil(); - DOUBLE_LITERAL110=(Token)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal2458); + DOUBLE_LITERAL110=(Token)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal2458); DOUBLE_LITERAL110_tree = (CommonTree)adaptor.create(DOUBLE_LITERAL110); adaptor.addChild(root_0, DOUBLE_LITERAL110_tree); @@ -4846,7 +4846,7 @@ public class smaliParser extends Parser { // $ANTLR start "literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:625:1: literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal ); + // smaliParser.g:625:1: literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal ); public final smaliParser.literal_return literal() throws RecognitionException { smaliParser.literal_return retval = new smaliParser.literal_return(); retval.start = input.LT(1); @@ -4877,7 +4877,7 @@ public class smaliParser extends Parser { CommonTree NULL_LITERAL120_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:626:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal ) + // smaliParser.g:626:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal ) int alt21=14; switch ( input.LA(1) ) { case LONG_LITERAL: @@ -5123,19 +5123,19 @@ public class smaliParser extends Parser { } switch (alt21) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:626:5: LONG_LITERAL + // smaliParser.g:626:5: LONG_LITERAL { root_0 = (CommonTree)adaptor.nil(); - LONG_LITERAL111=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_literal2468); + LONG_LITERAL111=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_literal2468); LONG_LITERAL111_tree = (CommonTree)adaptor.create(LONG_LITERAL111); adaptor.addChild(root_0, LONG_LITERAL111_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:627:5: integer_literal + // smaliParser.g:627:5: integer_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5149,31 +5149,31 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:628:5: SHORT_LITERAL + // smaliParser.g:628:5: SHORT_LITERAL { root_0 = (CommonTree)adaptor.nil(); - SHORT_LITERAL113=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_literal2480); + SHORT_LITERAL113=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_literal2480); SHORT_LITERAL113_tree = (CommonTree)adaptor.create(SHORT_LITERAL113); adaptor.addChild(root_0, SHORT_LITERAL113_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:629:5: BYTE_LITERAL + // smaliParser.g:629:5: BYTE_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BYTE_LITERAL114=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_literal2486); + BYTE_LITERAL114=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_literal2486); BYTE_LITERAL114_tree = (CommonTree)adaptor.create(BYTE_LITERAL114); adaptor.addChild(root_0, BYTE_LITERAL114_tree); } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:630:5: float_literal + // smaliParser.g:630:5: float_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5187,7 +5187,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:631:5: double_literal + // smaliParser.g:631:5: double_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5201,55 +5201,55 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:632:5: CHAR_LITERAL + // smaliParser.g:632:5: CHAR_LITERAL { root_0 = (CommonTree)adaptor.nil(); - CHAR_LITERAL117=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_literal2504); + CHAR_LITERAL117=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_literal2504); CHAR_LITERAL117_tree = (CommonTree)adaptor.create(CHAR_LITERAL117); adaptor.addChild(root_0, CHAR_LITERAL117_tree); } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:633:5: STRING_LITERAL + // smaliParser.g:633:5: STRING_LITERAL { root_0 = (CommonTree)adaptor.nil(); - STRING_LITERAL118=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_literal2510); + STRING_LITERAL118=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_literal2510); STRING_LITERAL118_tree = (CommonTree)adaptor.create(STRING_LITERAL118); adaptor.addChild(root_0, STRING_LITERAL118_tree); } break; case 9 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:634:5: BOOL_LITERAL + // smaliParser.g:634:5: BOOL_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BOOL_LITERAL119=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_literal2516); + BOOL_LITERAL119=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_literal2516); BOOL_LITERAL119_tree = (CommonTree)adaptor.create(BOOL_LITERAL119); adaptor.addChild(root_0, BOOL_LITERAL119_tree); } break; case 10 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:635:5: NULL_LITERAL + // smaliParser.g:635:5: NULL_LITERAL { root_0 = (CommonTree)adaptor.nil(); - NULL_LITERAL120=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal2522); + NULL_LITERAL120=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal2522); NULL_LITERAL120_tree = (CommonTree)adaptor.create(NULL_LITERAL120); adaptor.addChild(root_0, NULL_LITERAL120_tree); } break; case 11 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:636:5: array_literal + // smaliParser.g:636:5: array_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5263,7 +5263,7 @@ public class smaliParser extends Parser { } break; case 12 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:637:5: subannotation + // smaliParser.g:637:5: subannotation { root_0 = (CommonTree)adaptor.nil(); @@ -5277,7 +5277,7 @@ public class smaliParser extends Parser { } break; case 13 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:638:5: type_field_method_literal + // smaliParser.g:638:5: type_field_method_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5291,7 +5291,7 @@ public class smaliParser extends Parser { } break; case 14 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:639:5: enum_literal + // smaliParser.g:639:5: enum_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5334,7 +5334,7 @@ public class smaliParser extends Parser { // $ANTLR start "parsed_integer_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:641:1: parsed_integer_literal returns [int value] : integer_literal ; + // smaliParser.g:641:1: parsed_integer_literal returns [int value] : integer_literal ; public final smaliParser.parsed_integer_literal_return parsed_integer_literal() throws RecognitionException { smaliParser.parsed_integer_literal_return retval = new smaliParser.parsed_integer_literal_return(); retval.start = input.LT(1); @@ -5345,8 +5345,8 @@ public class smaliParser extends Parser { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:642:3: ( integer_literal ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:642:5: integer_literal + // smaliParser.g:642:3: ( integer_literal ) + // smaliParser.g:642:5: integer_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5357,7 +5357,7 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, integer_literal125.getTree()); - retval.value = LiteralTools.parseInt((integer_literal125!=null?input.toString(integer_literal125.start,integer_literal125.stop):null)); + retval.value = LiteralTools.parseInt((integer_literal125!=null?input.toString(integer_literal125.start,integer_literal125.stop):null)); } retval.stop = input.LT(-1); @@ -5387,7 +5387,7 @@ public class smaliParser extends Parser { // $ANTLR start "integral_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:644:1: integral_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL ); + // smaliParser.g:644:1: integral_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL ); public final smaliParser.integral_literal_return integral_literal() throws RecognitionException { smaliParser.integral_literal_return retval = new smaliParser.integral_literal_return(); retval.start = input.LT(1); @@ -5406,7 +5406,7 @@ public class smaliParser extends Parser { CommonTree BYTE_LITERAL130_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:645:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL ) + // smaliParser.g:645:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL ) int alt22=5; switch ( input.LA(1) ) { case LONG_LITERAL: @@ -5442,19 +5442,19 @@ public class smaliParser extends Parser { } switch (alt22) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:645:5: LONG_LITERAL + // smaliParser.g:645:5: LONG_LITERAL { root_0 = (CommonTree)adaptor.nil(); - LONG_LITERAL126=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_integral_literal2571); + LONG_LITERAL126=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_integral_literal2571); LONG_LITERAL126_tree = (CommonTree)adaptor.create(LONG_LITERAL126); adaptor.addChild(root_0, LONG_LITERAL126_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:646:5: integer_literal + // smaliParser.g:646:5: integer_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5468,36 +5468,36 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:647:5: SHORT_LITERAL + // smaliParser.g:647:5: SHORT_LITERAL { root_0 = (CommonTree)adaptor.nil(); - SHORT_LITERAL128=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_integral_literal2583); + SHORT_LITERAL128=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_integral_literal2583); SHORT_LITERAL128_tree = (CommonTree)adaptor.create(SHORT_LITERAL128); adaptor.addChild(root_0, SHORT_LITERAL128_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:648:5: CHAR_LITERAL + // smaliParser.g:648:5: CHAR_LITERAL { root_0 = (CommonTree)adaptor.nil(); - CHAR_LITERAL129=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_integral_literal2589); + CHAR_LITERAL129=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_integral_literal2589); CHAR_LITERAL129_tree = (CommonTree)adaptor.create(CHAR_LITERAL129); adaptor.addChild(root_0, CHAR_LITERAL129_tree); } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:649:5: BYTE_LITERAL + // smaliParser.g:649:5: BYTE_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BYTE_LITERAL130=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_integral_literal2595); + BYTE_LITERAL130=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_integral_literal2595); BYTE_LITERAL130_tree = (CommonTree)adaptor.create(BYTE_LITERAL130); adaptor.addChild(root_0, BYTE_LITERAL130_tree); @@ -5532,7 +5532,7 @@ public class smaliParser extends Parser { // $ANTLR start "fixed_32bit_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:651:1: fixed_32bit_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL ); + // smaliParser.g:651:1: fixed_32bit_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL ); public final smaliParser.fixed_32bit_literal_return fixed_32bit_literal() throws RecognitionException { smaliParser.fixed_32bit_literal_return retval = new smaliParser.fixed_32bit_literal_return(); retval.start = input.LT(1); @@ -5554,7 +5554,7 @@ public class smaliParser extends Parser { CommonTree BOOL_LITERAL137_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:652:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL ) + // smaliParser.g:652:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL ) int alt23=7; switch ( input.LA(1) ) { case LONG_LITERAL: @@ -5601,19 +5601,19 @@ public class smaliParser extends Parser { } switch (alt23) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:652:5: LONG_LITERAL + // smaliParser.g:652:5: LONG_LITERAL { root_0 = (CommonTree)adaptor.nil(); - LONG_LITERAL131=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605); + LONG_LITERAL131=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605); LONG_LITERAL131_tree = (CommonTree)adaptor.create(LONG_LITERAL131); adaptor.addChild(root_0, LONG_LITERAL131_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:653:5: integer_literal + // smaliParser.g:653:5: integer_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5627,31 +5627,31 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:654:5: SHORT_LITERAL + // smaliParser.g:654:5: SHORT_LITERAL { root_0 = (CommonTree)adaptor.nil(); - SHORT_LITERAL133=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617); + SHORT_LITERAL133=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617); SHORT_LITERAL133_tree = (CommonTree)adaptor.create(SHORT_LITERAL133); adaptor.addChild(root_0, SHORT_LITERAL133_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:655:5: BYTE_LITERAL + // smaliParser.g:655:5: BYTE_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BYTE_LITERAL134=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623); + BYTE_LITERAL134=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623); BYTE_LITERAL134_tree = (CommonTree)adaptor.create(BYTE_LITERAL134); adaptor.addChild(root_0, BYTE_LITERAL134_tree); } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:656:5: float_literal + // smaliParser.g:656:5: float_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5665,24 +5665,24 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:657:5: CHAR_LITERAL + // smaliParser.g:657:5: CHAR_LITERAL { root_0 = (CommonTree)adaptor.nil(); - CHAR_LITERAL136=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635); + CHAR_LITERAL136=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635); CHAR_LITERAL136_tree = (CommonTree)adaptor.create(CHAR_LITERAL136); adaptor.addChild(root_0, CHAR_LITERAL136_tree); } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:658:5: BOOL_LITERAL + // smaliParser.g:658:5: BOOL_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BOOL_LITERAL137=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641); + BOOL_LITERAL137=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641); BOOL_LITERAL137_tree = (CommonTree)adaptor.create(BOOL_LITERAL137); adaptor.addChild(root_0, BOOL_LITERAL137_tree); @@ -5717,7 +5717,7 @@ public class smaliParser extends Parser { // $ANTLR start "fixed_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:660:1: fixed_literal : ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL ); + // smaliParser.g:660:1: fixed_literal : ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL ); public final smaliParser.fixed_literal_return fixed_literal() throws RecognitionException { smaliParser.fixed_literal_return retval = new smaliParser.fixed_literal_return(); retval.start = input.LT(1); @@ -5740,7 +5740,7 @@ public class smaliParser extends Parser { CommonTree BOOL_LITERAL145_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:661:3: ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL ) + // smaliParser.g:661:3: ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL ) int alt24=8; switch ( input.LA(1) ) { case NEGATIVE_INTEGER_LITERAL: @@ -5793,7 +5793,7 @@ public class smaliParser extends Parser { } switch (alt24) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:661:5: integer_literal + // smaliParser.g:661:5: integer_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5807,43 +5807,43 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:662:5: LONG_LITERAL + // smaliParser.g:662:5: LONG_LITERAL { root_0 = (CommonTree)adaptor.nil(); - LONG_LITERAL139=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_literal2657); + LONG_LITERAL139=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_literal2657); LONG_LITERAL139_tree = (CommonTree)adaptor.create(LONG_LITERAL139); adaptor.addChild(root_0, LONG_LITERAL139_tree); } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:663:5: SHORT_LITERAL + // smaliParser.g:663:5: SHORT_LITERAL { root_0 = (CommonTree)adaptor.nil(); - SHORT_LITERAL140=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_literal2663); + SHORT_LITERAL140=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_literal2663); SHORT_LITERAL140_tree = (CommonTree)adaptor.create(SHORT_LITERAL140); adaptor.addChild(root_0, SHORT_LITERAL140_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:664:5: BYTE_LITERAL + // smaliParser.g:664:5: BYTE_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BYTE_LITERAL141=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_literal2669); + BYTE_LITERAL141=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_literal2669); BYTE_LITERAL141_tree = (CommonTree)adaptor.create(BYTE_LITERAL141); adaptor.addChild(root_0, BYTE_LITERAL141_tree); } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:665:5: float_literal + // smaliParser.g:665:5: float_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5857,7 +5857,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:666:5: double_literal + // smaliParser.g:666:5: double_literal { root_0 = (CommonTree)adaptor.nil(); @@ -5871,24 +5871,24 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:667:5: CHAR_LITERAL + // smaliParser.g:667:5: CHAR_LITERAL { root_0 = (CommonTree)adaptor.nil(); - CHAR_LITERAL144=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_literal2687); + CHAR_LITERAL144=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_literal2687); CHAR_LITERAL144_tree = (CommonTree)adaptor.create(CHAR_LITERAL144); adaptor.addChild(root_0, CHAR_LITERAL144_tree); } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:668:5: BOOL_LITERAL + // smaliParser.g:668:5: BOOL_LITERAL { root_0 = (CommonTree)adaptor.nil(); - BOOL_LITERAL145=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_literal2693); + BOOL_LITERAL145=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_literal2693); BOOL_LITERAL145_tree = (CommonTree)adaptor.create(BOOL_LITERAL145); adaptor.addChild(root_0, BOOL_LITERAL145_tree); @@ -5923,7 +5923,7 @@ public class smaliParser extends Parser { // $ANTLR start "array_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:670:1: array_literal : OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ; + // smaliParser.g:670:1: array_literal : OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ; public final smaliParser.array_literal_return array_literal() throws RecognitionException { smaliParser.array_literal_return retval = new smaliParser.array_literal_return(); retval.start = input.LT(1); @@ -5945,13 +5945,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:3: ( OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:5: OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE + // smaliParser.g:671:3: ( OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ) + // smaliParser.g:671:5: OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE { - OPEN_BRACE146=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_array_literal2703); + OPEN_BRACE146=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_array_literal2703); stream_OPEN_BRACE.add(OPEN_BRACE146); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:16: ( literal ( COMMA literal )* |) + // smaliParser.g:671:16: ( literal ( COMMA literal )* |) int alt26=2; int LA26_0 = input.LA(1); if ( (LA26_0==ACCESS_SPEC||LA26_0==ANNOTATION_VISIBILITY||LA26_0==ARRAY_TYPE_PREFIX||(LA26_0 >= BOOL_LITERAL && LA26_0 <= BYTE_LITERAL)||(LA26_0 >= CHAR_LITERAL && LA26_0 <= CLASS_DESCRIPTOR)||(LA26_0 >= DOUBLE_LITERAL && LA26_0 <= DOUBLE_LITERAL_OR_ID)||LA26_0==ENUM_DIRECTIVE||(LA26_0 >= FLOAT_LITERAL && LA26_0 <= FLOAT_LITERAL_OR_ID)||(LA26_0 >= INSTRUCTION_FORMAT10t && LA26_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA26_0==INSTRUCTION_FORMAT11x||LA26_0==INSTRUCTION_FORMAT12x_OR_ID||(LA26_0 >= INSTRUCTION_FORMAT21c_FIELD && LA26_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA26_0==INSTRUCTION_FORMAT21t||(LA26_0 >= INSTRUCTION_FORMAT22c_FIELD && LA26_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA26_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA26_0 <= INSTRUCTION_FORMAT22t)||LA26_0==INSTRUCTION_FORMAT23x||(LA26_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA26_0 <= INSTRUCTION_FORMAT31t)||(LA26_0 >= INSTRUCTION_FORMAT35c_METHOD && LA26_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA26_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA26_0 <= INSTRUCTION_FORMAT51l)||(LA26_0 >= LONG_LITERAL && LA26_0 <= MEMBER_NAME)||(LA26_0 >= NEGATIVE_INTEGER_LITERAL && LA26_0 <= OPEN_BRACE)||(LA26_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA26_0 <= PRIMITIVE_TYPE)||LA26_0==REGISTER||(LA26_0 >= SHORT_LITERAL && LA26_0 <= SIMPLE_NAME)||(LA26_0 >= STRING_LITERAL && LA26_0 <= SUBANNOTATION_DIRECTIVE)||(LA26_0 >= VERIFICATION_ERROR_TYPE && LA26_0 <= VOID_TYPE)) ) { @@ -5969,14 +5969,14 @@ public class smaliParser extends Parser { switch (alt26) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:17: literal ( COMMA literal )* + // smaliParser.g:671:17: literal ( COMMA literal )* { pushFollow(FOLLOW_literal_in_array_literal2706); literal147=literal(); state._fsp--; stream_literal.add(literal147.getTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:25: ( COMMA literal )* + // smaliParser.g:671:25: ( COMMA literal )* loop25: while (true) { int alt25=2; @@ -5987,9 +5987,9 @@ public class smaliParser extends Parser { switch (alt25) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:26: COMMA literal + // smaliParser.g:671:26: COMMA literal { - COMMA148=(Token)match(input,COMMA,FOLLOW_COMMA_in_array_literal2709); + COMMA148=(Token)match(input,COMMA,FOLLOW_COMMA_in_array_literal2709); stream_COMMA.add(COMMA148); pushFollow(FOLLOW_literal_in_array_literal2711); @@ -6008,34 +6008,34 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:44: + // smaliParser.g:671:44: { } break; } - CLOSE_BRACE150=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_array_literal2719); + CLOSE_BRACE150=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_array_literal2719); stream_CLOSE_BRACE.add(CLOSE_BRACE150); // AST REWRITE // elements: literal - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 672:5: -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:672:8: ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) + // smaliParser.g:672:8: ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ARRAY, (retval.start), "I_ENCODED_ARRAY"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:672:53: ( literal )* + // smaliParser.g:672:53: ( literal )* while ( stream_literal.hasNext() ) { adaptor.addChild(root_1, stream_literal.nextTree()); } @@ -6078,7 +6078,7 @@ public class smaliParser extends Parser { // $ANTLR start "annotation_element" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:674:1: annotation_element : simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ; + // smaliParser.g:674:1: annotation_element : simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ; public final smaliParser.annotation_element_return annotation_element() throws RecognitionException { smaliParser.annotation_element_return retval = new smaliParser.annotation_element_return(); retval.start = input.LT(1); @@ -6095,15 +6095,15 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:675:3: ( simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:675:5: simple_name EQUAL literal + // smaliParser.g:675:3: ( simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ) + // smaliParser.g:675:5: simple_name EQUAL literal { pushFollow(FOLLOW_simple_name_in_annotation_element2743); simple_name151=simple_name(); state._fsp--; stream_simple_name.add(simple_name151.getTree()); - EQUAL152=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_annotation_element2745); + EQUAL152=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_annotation_element2745); stream_EQUAL.add(EQUAL152); pushFollow(FOLLOW_literal_in_annotation_element2747); @@ -6113,18 +6113,18 @@ public class smaliParser extends Parser { stream_literal.add(literal153.getTree()); // AST REWRITE // elements: simple_name, literal - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 676:5: -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:676:8: ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) + // smaliParser.g:676:8: ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION_ELEMENT, (retval.start), "I_ANNOTATION_ELEMENT"), root_1); @@ -6167,7 +6167,7 @@ public class smaliParser extends Parser { // $ANTLR start "annotation" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:678:1: annotation : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ; + // smaliParser.g:678:1: annotation : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ; public final smaliParser.annotation_return annotation() throws RecognitionException { smaliParser.annotation_return retval = new smaliParser.annotation_return(); retval.start = input.LT(1); @@ -6191,19 +6191,19 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:679:3: ( ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:679:5: ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE + // smaliParser.g:679:3: ( ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ) + // smaliParser.g:679:5: ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE { - ANNOTATION_DIRECTIVE154=(Token)match(input,ANNOTATION_DIRECTIVE,FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772); + ANNOTATION_DIRECTIVE154=(Token)match(input,ANNOTATION_DIRECTIVE,FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772); stream_ANNOTATION_DIRECTIVE.add(ANNOTATION_DIRECTIVE154); - ANNOTATION_VISIBILITY155=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774); + ANNOTATION_VISIBILITY155=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774); stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY155); - CLASS_DESCRIPTOR156=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_annotation2776); + CLASS_DESCRIPTOR156=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_annotation2776); stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR156); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:680:5: ( annotation_element )* + // smaliParser.g:680:5: ( annotation_element )* loop27: while (true) { int alt27=2; @@ -6214,7 +6214,7 @@ public class smaliParser extends Parser { switch (alt27) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:680:5: annotation_element + // smaliParser.g:680:5: annotation_element { pushFollow(FOLLOW_annotation_element_in_annotation2782); annotation_element157=annotation_element(); @@ -6229,33 +6229,33 @@ public class smaliParser extends Parser { } } - END_ANNOTATION_DIRECTIVE158=(Token)match(input,END_ANNOTATION_DIRECTIVE,FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785); + END_ANNOTATION_DIRECTIVE158=(Token)match(input,END_ANNOTATION_DIRECTIVE,FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785); stream_END_ANNOTATION_DIRECTIVE.add(END_ANNOTATION_DIRECTIVE158); // AST REWRITE - // elements: CLASS_DESCRIPTOR, ANNOTATION_VISIBILITY, annotation_element - // token labels: + // elements: CLASS_DESCRIPTOR, annotation_element, ANNOTATION_VISIBILITY + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 681:5: -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:8: ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) + // smaliParser.g:681:8: ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION, (retval.start), "I_ANNOTATION"), root_1); adaptor.addChild(root_1, stream_ANNOTATION_VISIBILITY.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:69: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) + // smaliParser.g:681:69: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_2); adaptor.addChild(root_2, stream_CLASS_DESCRIPTOR.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:131: ( annotation_element )* + // smaliParser.g:681:131: ( annotation_element )* while ( stream_annotation_element.hasNext() ) { adaptor.addChild(root_2, stream_annotation_element.nextTree()); } @@ -6301,7 +6301,7 @@ public class smaliParser extends Parser { // $ANTLR start "subannotation" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:683:1: subannotation : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ; + // smaliParser.g:683:1: subannotation : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ; public final smaliParser.subannotation_return subannotation() throws RecognitionException { smaliParser.subannotation_return retval = new smaliParser.subannotation_return(); retval.start = input.LT(1); @@ -6322,16 +6322,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:3: ( SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:5: SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE + // smaliParser.g:684:3: ( SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) + // smaliParser.g:684:5: SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE { - SUBANNOTATION_DIRECTIVE159=(Token)match(input,SUBANNOTATION_DIRECTIVE,FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818); + SUBANNOTATION_DIRECTIVE159=(Token)match(input,SUBANNOTATION_DIRECTIVE,FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818); stream_SUBANNOTATION_DIRECTIVE.add(SUBANNOTATION_DIRECTIVE159); - CLASS_DESCRIPTOR160=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820); + CLASS_DESCRIPTOR160=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820); stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR160); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:46: ( annotation_element )* + // smaliParser.g:684:46: ( annotation_element )* loop28: while (true) { int alt28=2; @@ -6342,7 +6342,7 @@ public class smaliParser extends Parser { switch (alt28) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:46: annotation_element + // smaliParser.g:684:46: annotation_element { pushFollow(FOLLOW_annotation_element_in_subannotation2822); annotation_element161=annotation_element(); @@ -6357,28 +6357,28 @@ public class smaliParser extends Parser { } } - END_SUBANNOTATION_DIRECTIVE162=(Token)match(input,END_SUBANNOTATION_DIRECTIVE,FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825); + END_SUBANNOTATION_DIRECTIVE162=(Token)match(input,END_SUBANNOTATION_DIRECTIVE,FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825); stream_END_SUBANNOTATION_DIRECTIVE.add(END_SUBANNOTATION_DIRECTIVE162); // AST REWRITE - // elements: annotation_element, CLASS_DESCRIPTOR - // token labels: + // elements: CLASS_DESCRIPTOR, annotation_element + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 685:5: -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:685:8: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) + // smaliParser.g:685:8: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_1); adaptor.addChild(root_1, stream_CLASS_DESCRIPTOR.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:685:70: ( annotation_element )* + // smaliParser.g:685:70: ( annotation_element )* while ( stream_annotation_element.hasNext() ) { adaptor.addChild(root_1, stream_annotation_element.nextTree()); } @@ -6421,7 +6421,7 @@ public class smaliParser extends Parser { // $ANTLR start "enum_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:688:1: enum_literal : ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ; + // smaliParser.g:688:1: enum_literal : ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ; public final smaliParser.enum_literal_return enum_literal() throws RecognitionException { smaliParser.enum_literal_return retval = new smaliParser.enum_literal_return(); retval.start = input.LT(1); @@ -6436,10 +6436,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:689:3: ( ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:689:5: ENUM_DIRECTIVE field_reference + // smaliParser.g:689:3: ( ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ) + // smaliParser.g:689:5: ENUM_DIRECTIVE field_reference { - ENUM_DIRECTIVE163=(Token)match(input,ENUM_DIRECTIVE,FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852); + ENUM_DIRECTIVE163=(Token)match(input,ENUM_DIRECTIVE,FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852); stream_ENUM_DIRECTIVE.add(ENUM_DIRECTIVE163); pushFollow(FOLLOW_field_reference_in_enum_literal2854); @@ -6449,18 +6449,18 @@ public class smaliParser extends Parser { stream_field_reference.add(field_reference164.getTree()); // AST REWRITE // elements: field_reference - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 690:3: -> ^( I_ENCODED_ENUM field_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:690:6: ^( I_ENCODED_ENUM field_reference ) + // smaliParser.g:690:6: ^( I_ENCODED_ENUM field_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ENUM, "I_ENCODED_ENUM"), root_1); @@ -6502,7 +6502,7 @@ public class smaliParser extends Parser { // $ANTLR start "type_field_method_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:692:1: type_field_method_literal : ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE ); + // smaliParser.g:692:1: type_field_method_literal : ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE ); public final smaliParser.type_field_method_literal_return type_field_method_literal() throws RecognitionException { smaliParser.type_field_method_literal_return retval = new smaliParser.type_field_method_literal_return(); retval.start = input.LT(1); @@ -6532,7 +6532,7 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:693:3: ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE ) + // smaliParser.g:693:3: ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE ) int alt31=4; switch ( input.LA(1) ) { case CLASS_DESCRIPTOR: @@ -6700,7 +6700,7 @@ public class smaliParser extends Parser { } switch (alt31) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:693:5: reference_type_descriptor + // smaliParser.g:693:5: reference_type_descriptor { root_0 = (CommonTree)adaptor.nil(); @@ -6714,12 +6714,12 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) + // smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:7: ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) + // smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) + // smaliParser.g:694:7: ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:7: ( reference_type_descriptor ARROW )? + // smaliParser.g:694:7: ( reference_type_descriptor ARROW )? int alt29=2; int LA29_0 = input.LA(1); if ( (LA29_0==ARRAY_TYPE_PREFIX||LA29_0==CLASS_DESCRIPTOR) ) { @@ -6727,14 +6727,14 @@ public class smaliParser extends Parser { } switch (alt29) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:8: reference_type_descriptor ARROW + // smaliParser.g:694:8: reference_type_descriptor ARROW { pushFollow(FOLLOW_reference_type_descriptor_in_type_field_method_literal2883); reference_type_descriptor166=reference_type_descriptor(); state._fsp--; stream_reference_type_descriptor.add(reference_type_descriptor166.getTree()); - ARROW167=(Token)match(input,ARROW,FOLLOW_ARROW_in_type_field_method_literal2885); + ARROW167=(Token)match(input,ARROW,FOLLOW_ARROW_in_type_field_method_literal2885); stream_ARROW.add(ARROW167); } @@ -6742,19 +6742,19 @@ public class smaliParser extends Parser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) + // smaliParser.g:695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) int alt30=2; alt30 = dfa30.predict(input); switch (alt30) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:9: member_name COLON nonvoid_type_descriptor + // smaliParser.g:695:9: member_name COLON nonvoid_type_descriptor { pushFollow(FOLLOW_member_name_in_type_field_method_literal2897); member_name168=member_name(); state._fsp--; stream_member_name.add(member_name168.getTree()); - COLON169=(Token)match(input,COLON,FOLLOW_COLON_in_type_field_method_literal2899); + COLON169=(Token)match(input,COLON,FOLLOW_COLON_in_type_field_method_literal2899); stream_COLON.add(COLON169); pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_field_method_literal2901); @@ -6763,23 +6763,23 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor170.getTree()); // AST REWRITE - // elements: member_name, nonvoid_type_descriptor, reference_type_descriptor - // token labels: + // elements: reference_type_descriptor, member_name, nonvoid_type_descriptor + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 695:51: -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:54: ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) + // smaliParser.g:695:54: ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_FIELD, "I_ENCODED_FIELD"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:72: ( reference_type_descriptor )? + // smaliParser.g:695:72: ( reference_type_descriptor )? if ( stream_reference_type_descriptor.hasNext() ) { adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree()); } @@ -6798,7 +6798,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:9: member_name method_prototype + // smaliParser.g:696:9: member_name method_prototype { pushFollow(FOLLOW_member_name_in_type_field_method_literal2924); member_name171=member_name(); @@ -6811,23 +6811,23 @@ public class smaliParser extends Parser { stream_method_prototype.add(method_prototype172.getTree()); // AST REWRITE - // elements: reference_type_descriptor, method_prototype, member_name - // token labels: + // elements: member_name, method_prototype, reference_type_descriptor + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 696:38: -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:41: ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) + // smaliParser.g:696:41: ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_METHOD, "I_ENCODED_METHOD"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:60: ( reference_type_descriptor )? + // smaliParser.g:696:60: ( reference_type_descriptor )? if ( stream_reference_type_descriptor.hasNext() ) { adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree()); } @@ -6853,24 +6853,24 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:699:5: PRIMITIVE_TYPE + // smaliParser.g:699:5: PRIMITIVE_TYPE { root_0 = (CommonTree)adaptor.nil(); - PRIMITIVE_TYPE173=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959); + PRIMITIVE_TYPE173=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959); PRIMITIVE_TYPE173_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE173); adaptor.addChild(root_0, PRIMITIVE_TYPE173_tree); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:700:5: VOID_TYPE + // smaliParser.g:700:5: VOID_TYPE { root_0 = (CommonTree)adaptor.nil(); - VOID_TYPE174=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_field_method_literal2965); + VOID_TYPE174=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_field_method_literal2965); VOID_TYPE174_tree = (CommonTree)adaptor.create(VOID_TYPE174); adaptor.addChild(root_0, VOID_TYPE174_tree); @@ -6905,7 +6905,7 @@ public class smaliParser extends Parser { // $ANTLR start "method_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:702:1: method_reference : ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ; + // smaliParser.g:702:1: method_reference : ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ; public final smaliParser.method_reference_return method_reference() throws RecognitionException { smaliParser.method_reference_return retval = new smaliParser.method_reference_return(); retval.start = input.LT(1); @@ -6924,10 +6924,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:3: ( ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:5: ( reference_type_descriptor ARROW )? member_name method_prototype + // smaliParser.g:703:3: ( ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ) + // smaliParser.g:703:5: ( reference_type_descriptor ARROW )? member_name method_prototype { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:5: ( reference_type_descriptor ARROW )? + // smaliParser.g:703:5: ( reference_type_descriptor ARROW )? int alt32=2; int LA32_0 = input.LA(1); if ( (LA32_0==ARRAY_TYPE_PREFIX||LA32_0==CLASS_DESCRIPTOR) ) { @@ -6935,14 +6935,14 @@ public class smaliParser extends Parser { } switch (alt32) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:6: reference_type_descriptor ARROW + // smaliParser.g:703:6: reference_type_descriptor ARROW { pushFollow(FOLLOW_reference_type_descriptor_in_method_reference2976); reference_type_descriptor175=reference_type_descriptor(); state._fsp--; stream_reference_type_descriptor.add(reference_type_descriptor175.getTree()); - ARROW176=(Token)match(input,ARROW,FOLLOW_ARROW_in_method_reference2978); + ARROW176=(Token)match(input,ARROW,FOLLOW_ARROW_in_method_reference2978); stream_ARROW.add(ARROW176); } @@ -6961,19 +6961,19 @@ public class smaliParser extends Parser { stream_method_prototype.add(method_prototype178.getTree()); // AST REWRITE - // elements: method_prototype, member_name, reference_type_descriptor - // token labels: + // elements: method_prototype, reference_type_descriptor, member_name + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 704:3: -> ( reference_type_descriptor )? member_name method_prototype { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:704:6: ( reference_type_descriptor )? + // smaliParser.g:704:6: ( reference_type_descriptor )? if ( stream_reference_type_descriptor.hasNext() ) { adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree()); } @@ -7015,7 +7015,7 @@ public class smaliParser extends Parser { // $ANTLR start "field_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:706:1: field_reference : ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ; + // smaliParser.g:706:1: field_reference : ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ; public final smaliParser.field_reference_return field_reference() throws RecognitionException { smaliParser.field_reference_return retval = new smaliParser.field_reference_return(); retval.start = input.LT(1); @@ -7037,10 +7037,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:3: ( ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:5: ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor + // smaliParser.g:707:3: ( ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) + // smaliParser.g:707:5: ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:5: ( reference_type_descriptor ARROW )? + // smaliParser.g:707:5: ( reference_type_descriptor ARROW )? int alt33=2; int LA33_0 = input.LA(1); if ( (LA33_0==ARRAY_TYPE_PREFIX||LA33_0==CLASS_DESCRIPTOR) ) { @@ -7048,14 +7048,14 @@ public class smaliParser extends Parser { } switch (alt33) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:6: reference_type_descriptor ARROW + // smaliParser.g:707:6: reference_type_descriptor ARROW { pushFollow(FOLLOW_reference_type_descriptor_in_field_reference3006); reference_type_descriptor179=reference_type_descriptor(); state._fsp--; stream_reference_type_descriptor.add(reference_type_descriptor179.getTree()); - ARROW180=(Token)match(input,ARROW,FOLLOW_ARROW_in_field_reference3008); + ARROW180=(Token)match(input,ARROW,FOLLOW_ARROW_in_field_reference3008); stream_ARROW.add(ARROW180); } @@ -7068,7 +7068,7 @@ public class smaliParser extends Parser { state._fsp--; stream_member_name.add(member_name181.getTree()); - COLON182=(Token)match(input,COLON,FOLLOW_COLON_in_field_reference3014); + COLON182=(Token)match(input,COLON,FOLLOW_COLON_in_field_reference3014); stream_COLON.add(COLON182); pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference3016); @@ -7077,19 +7077,19 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor183.getTree()); // AST REWRITE - // elements: nonvoid_type_descriptor, member_name, reference_type_descriptor - // token labels: + // elements: reference_type_descriptor, nonvoid_type_descriptor, member_name + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 708:3: -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:708:6: ( reference_type_descriptor )? + // smaliParser.g:708:6: ( reference_type_descriptor )? if ( stream_reference_type_descriptor.hasNext() ) { adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree()); } @@ -7131,7 +7131,7 @@ public class smaliParser extends Parser { // $ANTLR start "label" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:710:1: label : COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ; + // smaliParser.g:710:1: label : COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ; public final smaliParser.label_return label() throws RecognitionException { smaliParser.label_return retval = new smaliParser.label_return(); retval.start = input.LT(1); @@ -7146,10 +7146,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:3: ( COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:5: COLON simple_name + // smaliParser.g:711:3: ( COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ) + // smaliParser.g:711:5: COLON simple_name { - COLON184=(Token)match(input,COLON,FOLLOW_COLON_in_label3037); + COLON184=(Token)match(input,COLON,FOLLOW_COLON_in_label3037); stream_COLON.add(COLON184); pushFollow(FOLLOW_simple_name_in_label3039); @@ -7159,18 +7159,18 @@ public class smaliParser extends Parser { stream_simple_name.add(simple_name185.getTree()); // AST REWRITE // elements: simple_name - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 711:23: -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:26: ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) + // smaliParser.g:711:26: ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LABEL, COLON184, "I_LABEL"), root_1); @@ -7212,7 +7212,7 @@ public class smaliParser extends Parser { // $ANTLR start "label_ref" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:713:1: label_ref : COLON simple_name -> simple_name ; + // smaliParser.g:713:1: label_ref : COLON simple_name -> simple_name ; public final smaliParser.label_ref_return label_ref() throws RecognitionException { smaliParser.label_ref_return retval = new smaliParser.label_ref_return(); retval.start = input.LT(1); @@ -7227,10 +7227,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:714:3: ( COLON simple_name -> simple_name ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:714:5: COLON simple_name + // smaliParser.g:714:3: ( COLON simple_name -> simple_name ) + // smaliParser.g:714:5: COLON simple_name { - COLON186=(Token)match(input,COLON,FOLLOW_COLON_in_label_ref3058); + COLON186=(Token)match(input,COLON,FOLLOW_COLON_in_label_ref3058); stream_COLON.add(COLON186); pushFollow(FOLLOW_simple_name_in_label_ref3060); @@ -7240,11 +7240,11 @@ public class smaliParser extends Parser { stream_simple_name.add(simple_name187.getTree()); // AST REWRITE // elements: simple_name - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -7286,7 +7286,7 @@ public class smaliParser extends Parser { // $ANTLR start "register_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:716:1: register_list : ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) ); + // smaliParser.g:716:1: register_list : ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) ); public final smaliParser.register_list_return register_list() throws RecognitionException { smaliParser.register_list_return retval = new smaliParser.register_list_return(); retval.start = input.LT(1); @@ -7304,7 +7304,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:3: ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) ) + // smaliParser.g:717:3: ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) ) int alt35=2; int LA35_0 = input.LA(1); if ( (LA35_0==REGISTER) ) { @@ -7322,12 +7322,12 @@ public class smaliParser extends Parser { switch (alt35) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:5: REGISTER ( COMMA REGISTER )* + // smaliParser.g:717:5: REGISTER ( COMMA REGISTER )* { - REGISTER188=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3074); + REGISTER188=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3074); stream_REGISTER.add(REGISTER188); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:14: ( COMMA REGISTER )* + // smaliParser.g:717:14: ( COMMA REGISTER )* loop34: while (true) { int alt34=2; @@ -7338,12 +7338,12 @@ public class smaliParser extends Parser { switch (alt34) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:15: COMMA REGISTER + // smaliParser.g:717:15: COMMA REGISTER { - COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_register_list3077); + COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_register_list3077); stream_COMMA.add(COMMA189); - REGISTER190=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3079); + REGISTER190=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3079); stream_REGISTER.add(REGISTER190); } @@ -7356,22 +7356,22 @@ public class smaliParser extends Parser { // AST REWRITE // elements: REGISTER - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 717:32: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:35: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) + // smaliParser.g:717:35: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:80: ( REGISTER )* + // smaliParser.g:717:80: ( REGISTER )* while ( stream_REGISTER.hasNext() ) { adaptor.addChild(root_1, stream_REGISTER.nextNode()); } @@ -7388,22 +7388,22 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:718:5: + // smaliParser.g:718:5: { // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 718:5: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:718:7: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) + // smaliParser.g:718:7: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1); @@ -7446,7 +7446,7 @@ public class smaliParser extends Parser { // $ANTLR start "register_range" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:720:1: register_range : (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ; + // smaliParser.g:720:1: register_range : (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ; public final smaliParser.register_range_return register_range() throws RecognitionException { smaliParser.register_range_return retval = new smaliParser.register_range_return(); retval.start = input.LT(1); @@ -7464,10 +7464,10 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_DOTDOT=new RewriteRuleTokenStream(adaptor,"token DOTDOT"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:3: ( (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? + // smaliParser.g:721:3: ( (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ) + // smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? + // smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? int alt37=2; int LA37_0 = input.LA(1); if ( (LA37_0==REGISTER) ) { @@ -7475,12 +7475,12 @@ public class smaliParser extends Parser { } switch (alt37) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:6: startreg= REGISTER ( DOTDOT endreg= REGISTER )? + // smaliParser.g:721:6: startreg= REGISTER ( DOTDOT endreg= REGISTER )? { - startreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3114); + startreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3114); stream_REGISTER.add(startreg); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:24: ( DOTDOT endreg= REGISTER )? + // smaliParser.g:721:24: ( DOTDOT endreg= REGISTER )? int alt36=2; int LA36_0 = input.LA(1); if ( (LA36_0==DOTDOT) ) { @@ -7488,12 +7488,12 @@ public class smaliParser extends Parser { } switch (alt36) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:25: DOTDOT endreg= REGISTER + // smaliParser.g:721:25: DOTDOT endreg= REGISTER { - DOTDOT191=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_register_range3117); + DOTDOT191=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_register_range3117); stream_DOTDOT.add(DOTDOT191); - endreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3121); + endreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3121); stream_REGISTER.add(endreg); } @@ -7507,31 +7507,31 @@ public class smaliParser extends Parser { } // AST REWRITE - // elements: endreg, startreg - // token labels: endreg, startreg + // elements: startreg, endreg + // token labels: startreg, endreg // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; - RewriteRuleTokenStream stream_endreg=new RewriteRuleTokenStream(adaptor,"token endreg",endreg); RewriteRuleTokenStream stream_startreg=new RewriteRuleTokenStream(adaptor,"token startreg",startreg); + RewriteRuleTokenStream stream_endreg=new RewriteRuleTokenStream(adaptor,"token endreg",endreg); RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 721:52: -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:55: ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) + // smaliParser.g:721:55: ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_RANGE, (retval.start), "I_REGISTER_RANGE"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:103: ( $startreg)? + // smaliParser.g:721:103: ( $startreg)? if ( stream_startreg.hasNext() ) { adaptor.addChild(root_1, stream_startreg.nextNode()); } stream_startreg.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:114: ( $endreg)? + // smaliParser.g:721:114: ( $endreg)? if ( stream_endreg.hasNext() ) { adaptor.addChild(root_1, stream_endreg.nextNode()); } @@ -7574,7 +7574,7 @@ public class smaliParser extends Parser { // $ANTLR start "verification_error_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference ); + // smaliParser.g:723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference ); public final smaliParser.verification_error_reference_return verification_error_reference() throws RecognitionException { smaliParser.verification_error_reference_return retval = new smaliParser.verification_error_reference_return(); retval.start = input.LT(1); @@ -7588,24 +7588,24 @@ public class smaliParser extends Parser { CommonTree CLASS_DESCRIPTOR192_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:3: ( CLASS_DESCRIPTOR | field_reference | method_reference ) + // smaliParser.g:724:3: ( CLASS_DESCRIPTOR | field_reference | method_reference ) int alt38=3; alt38 = dfa38.predict(input); switch (alt38) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:5: CLASS_DESCRIPTOR + // smaliParser.g:724:5: CLASS_DESCRIPTOR { root_0 = (CommonTree)adaptor.nil(); - CLASS_DESCRIPTOR192=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150); + CLASS_DESCRIPTOR192=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150); CLASS_DESCRIPTOR192_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR192); adaptor.addChild(root_0, CLASS_DESCRIPTOR192_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:24: field_reference + // smaliParser.g:724:24: field_reference { root_0 = (CommonTree)adaptor.nil(); @@ -7619,7 +7619,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:42: method_reference + // smaliParser.g:724:42: method_reference { root_0 = (CommonTree)adaptor.nil(); @@ -7661,7 +7661,7 @@ public class smaliParser extends Parser { // $ANTLR start "catch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:726:1: catch_directive : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ; + // smaliParser.g:726:1: catch_directive : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ; public final smaliParser.catch_directive_return catch_directive() throws RecognitionException { smaliParser.catch_directive_return retval = new smaliParser.catch_directive_return(); retval.start = input.LT(1); @@ -7689,10 +7689,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:727:3: ( CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:727:5: CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref + // smaliParser.g:727:3: ( CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ) + // smaliParser.g:727:5: CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref { - CATCH_DIRECTIVE195=(Token)match(input,CATCH_DIRECTIVE,FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168); + CATCH_DIRECTIVE195=(Token)match(input,CATCH_DIRECTIVE,FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168); stream_CATCH_DIRECTIVE.add(CATCH_DIRECTIVE195); pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive3170); @@ -7700,7 +7700,7 @@ public class smaliParser extends Parser { state._fsp--; stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor196.getTree()); - OPEN_BRACE197=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catch_directive3172); + OPEN_BRACE197=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catch_directive3172); stream_OPEN_BRACE.add(OPEN_BRACE197); pushFollow(FOLLOW_label_ref_in_catch_directive3176); @@ -7708,7 +7708,7 @@ public class smaliParser extends Parser { state._fsp--; stream_label_ref.add(from.getTree()); - DOTDOT198=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catch_directive3178); + DOTDOT198=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catch_directive3178); stream_DOTDOT.add(DOTDOT198); pushFollow(FOLLOW_label_ref_in_catch_directive3182); @@ -7716,7 +7716,7 @@ public class smaliParser extends Parser { state._fsp--; stream_label_ref.add(to.getTree()); - CLOSE_BRACE199=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catch_directive3184); + CLOSE_BRACE199=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catch_directive3184); stream_CLOSE_BRACE.add(CLOSE_BRACE199); pushFollow(FOLLOW_label_ref_in_catch_directive3188); @@ -7725,12 +7725,12 @@ public class smaliParser extends Parser { stream_label_ref.add(using.getTree()); // AST REWRITE - // elements: using, to, from, nonvoid_type_descriptor - // token labels: + // elements: from, nonvoid_type_descriptor, using, to + // token labels: // rule labels: using, from, to, retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null); RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null); @@ -7740,7 +7740,7 @@ public class smaliParser extends Parser { root_0 = (CommonTree)adaptor.nil(); // 728:5: -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:728:8: ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) + // smaliParser.g:728:8: ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCH, (retval.start), "I_CATCH"), root_1); @@ -7785,7 +7785,7 @@ public class smaliParser extends Parser { // $ANTLR start "catchall_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:730:1: catchall_directive : CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ; + // smaliParser.g:730:1: catchall_directive : CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ; public final smaliParser.catchall_directive_return catchall_directive() throws RecognitionException { smaliParser.catchall_directive_return retval = new smaliParser.catchall_directive_return(); retval.start = input.LT(1); @@ -7811,13 +7811,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:731:3: ( CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:731:5: CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref + // smaliParser.g:731:3: ( CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ) + // smaliParser.g:731:5: CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref { - CATCHALL_DIRECTIVE200=(Token)match(input,CATCHALL_DIRECTIVE,FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220); + CATCHALL_DIRECTIVE200=(Token)match(input,CATCHALL_DIRECTIVE,FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220); stream_CATCHALL_DIRECTIVE.add(CATCHALL_DIRECTIVE200); - OPEN_BRACE201=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catchall_directive3222); + OPEN_BRACE201=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catchall_directive3222); stream_OPEN_BRACE.add(OPEN_BRACE201); pushFollow(FOLLOW_label_ref_in_catchall_directive3226); @@ -7825,7 +7825,7 @@ public class smaliParser extends Parser { state._fsp--; stream_label_ref.add(from.getTree()); - DOTDOT202=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catchall_directive3228); + DOTDOT202=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catchall_directive3228); stream_DOTDOT.add(DOTDOT202); pushFollow(FOLLOW_label_ref_in_catchall_directive3232); @@ -7833,7 +7833,7 @@ public class smaliParser extends Parser { state._fsp--; stream_label_ref.add(to.getTree()); - CLOSE_BRACE203=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catchall_directive3234); + CLOSE_BRACE203=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catchall_directive3234); stream_CLOSE_BRACE.add(CLOSE_BRACE203); pushFollow(FOLLOW_label_ref_in_catchall_directive3238); @@ -7842,12 +7842,12 @@ public class smaliParser extends Parser { stream_label_ref.add(using.getTree()); // AST REWRITE - // elements: using, from, to - // token labels: + // elements: using, to, from + // token labels: // rule labels: using, from, to, retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null); RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null); @@ -7857,7 +7857,7 @@ public class smaliParser extends Parser { root_0 = (CommonTree)adaptor.nil(); // 732:5: -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:732:8: ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) + // smaliParser.g:732:8: ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHALL, (retval.start), "I_CATCHALL"), root_1); @@ -7901,7 +7901,7 @@ public class smaliParser extends Parser { // $ANTLR start "parameter_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:738:1: parameter_directive : PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ; + // smaliParser.g:738:1: parameter_directive : PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ; public final smaliParser.parameter_directive_return parameter_directive() throws RecognitionException { smaliParser.parameter_directive_return retval = new smaliParser.parameter_directive_return(); retval.start = input.LT(1); @@ -7929,16 +7929,16 @@ public class smaliParser extends Parser { List<CommonTree> annotations = new ArrayList<CommonTree>(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:3: ( PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:5: PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) + // smaliParser.g:740:3: ( PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ) + // smaliParser.g:740:5: PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) { - PARAMETER_DIRECTIVE204=(Token)match(input,PARAMETER_DIRECTIVE,FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277); + PARAMETER_DIRECTIVE204=(Token)match(input,PARAMETER_DIRECTIVE,FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277); stream_PARAMETER_DIRECTIVE.add(PARAMETER_DIRECTIVE204); - REGISTER205=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_parameter_directive3279); + REGISTER205=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_parameter_directive3279); stream_REGISTER.add(REGISTER205); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:34: ( COMMA STRING_LITERAL )? + // smaliParser.g:740:34: ( COMMA STRING_LITERAL )? int alt39=2; int LA39_0 = input.LA(1); if ( (LA39_0==COMMA) ) { @@ -7946,12 +7946,12 @@ public class smaliParser extends Parser { } switch (alt39) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:35: COMMA STRING_LITERAL + // smaliParser.g:740:35: COMMA STRING_LITERAL { - COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameter_directive3282); + COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameter_directive3282); stream_COMMA.add(COMMA206); - STRING_LITERAL207=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_parameter_directive3284); + STRING_LITERAL207=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_parameter_directive3284); stream_STRING_LITERAL.add(STRING_LITERAL207); } @@ -7959,14 +7959,14 @@ public class smaliParser extends Parser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:741:5: ({...}? annotation )* + // smaliParser.g:741:5: ({...}? annotation )* loop40: while (true) { int alt40=2; alt40 = dfa40.predict(input); switch (alt40) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:741:6: {...}? annotation + // smaliParser.g:741:6: {...}? annotation { if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) { throw new FailedPredicateException(input, "parameter_directive", "input.LA(1) == ANNOTATION_DIRECTIVE"); @@ -7985,7 +7985,7 @@ public class smaliParser extends Parser { } } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:743:5: ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) + // smaliParser.g:743:5: ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) int alt41=2; int LA41_0 = input.LA(1); if ( (LA41_0==END_PARAMETER_DIRECTIVE) ) { @@ -8003,40 +8003,40 @@ public class smaliParser extends Parser { switch (alt41) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:743:7: END_PARAMETER_DIRECTIVE + // smaliParser.g:743:7: END_PARAMETER_DIRECTIVE { - END_PARAMETER_DIRECTIVE209=(Token)match(input,END_PARAMETER_DIRECTIVE,FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308); + END_PARAMETER_DIRECTIVE209=(Token)match(input,END_PARAMETER_DIRECTIVE,FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308); stream_END_PARAMETER_DIRECTIVE.add(END_PARAMETER_DIRECTIVE209); // AST REWRITE - // elements: REGISTER, STRING_LITERAL, annotation - // token labels: + // elements: STRING_LITERAL, annotation, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 744:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) + // smaliParser.g:744:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1); adaptor.addChild(root_1, stream_REGISTER.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:56: ( STRING_LITERAL )? + // smaliParser.g:744:56: ( STRING_LITERAL )? if ( stream_STRING_LITERAL.hasNext() ) { adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode()); } stream_STRING_LITERAL.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:72: ^( I_ANNOTATIONS ( annotation )* ) + // smaliParser.g:744:72: ^( I_ANNOTATIONS ( annotation )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:88: ( annotation )* + // smaliParser.g:744:88: ( annotation )* while ( stream_annotation.hasNext() ) { adaptor.addChild(root_2, stream_annotation.nextTree()); } @@ -8056,34 +8056,34 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:745:19: + // smaliParser.g:745:19: { statements_and_directives_stack.peek().methodAnnotations.addAll(annotations); // AST REWRITE // elements: STRING_LITERAL, REGISTER - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 746:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) + // smaliParser.g:746:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1); adaptor.addChild(root_1, stream_REGISTER.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:56: ( STRING_LITERAL )? + // smaliParser.g:746:56: ( STRING_LITERAL )? if ( stream_STRING_LITERAL.hasNext() ) { adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode()); } stream_STRING_LITERAL.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:72: ^( I_ANNOTATIONS ) + // smaliParser.g:746:72: ^( I_ANNOTATIONS ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2); @@ -8132,7 +8132,7 @@ public class smaliParser extends Parser { // $ANTLR start "debug_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:749:1: debug_directive : ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive ); + // smaliParser.g:749:1: debug_directive : ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive ); public final smaliParser.debug_directive_return debug_directive() throws RecognitionException { smaliParser.debug_directive_return retval = new smaliParser.debug_directive_return(); retval.start = input.LT(1); @@ -8149,7 +8149,7 @@ public class smaliParser extends Parser { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:750:3: ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive ) + // smaliParser.g:750:3: ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive ) int alt42=7; switch ( input.LA(1) ) { case LINE_DIRECTIVE: @@ -8194,7 +8194,7 @@ public class smaliParser extends Parser { } switch (alt42) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:750:5: line_directive + // smaliParser.g:750:5: line_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8208,7 +8208,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:751:5: local_directive + // smaliParser.g:751:5: local_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8222,7 +8222,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:752:5: end_local_directive + // smaliParser.g:752:5: end_local_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8236,7 +8236,7 @@ public class smaliParser extends Parser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:753:5: restart_local_directive + // smaliParser.g:753:5: restart_local_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8250,7 +8250,7 @@ public class smaliParser extends Parser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:754:5: prologue_directive + // smaliParser.g:754:5: prologue_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8264,7 +8264,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:755:5: epilogue_directive + // smaliParser.g:755:5: epilogue_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8278,7 +8278,7 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:756:5: source_directive + // smaliParser.g:756:5: source_directive { root_0 = (CommonTree)adaptor.nil(); @@ -8320,7 +8320,7 @@ public class smaliParser extends Parser { // $ANTLR start "line_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:758:1: line_directive : LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ; + // smaliParser.g:758:1: line_directive : LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ; public final smaliParser.line_directive_return line_directive() throws RecognitionException { smaliParser.line_directive_return retval = new smaliParser.line_directive_return(); retval.start = input.LT(1); @@ -8335,10 +8335,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:759:3: ( LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:759:5: LINE_DIRECTIVE integral_literal + // smaliParser.g:759:3: ( LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ) + // smaliParser.g:759:5: LINE_DIRECTIVE integral_literal { - LINE_DIRECTIVE217=(Token)match(input,LINE_DIRECTIVE,FOLLOW_LINE_DIRECTIVE_in_line_directive3427); + LINE_DIRECTIVE217=(Token)match(input,LINE_DIRECTIVE,FOLLOW_LINE_DIRECTIVE_in_line_directive3427); stream_LINE_DIRECTIVE.add(LINE_DIRECTIVE217); pushFollow(FOLLOW_integral_literal_in_line_directive3429); @@ -8348,18 +8348,18 @@ public class smaliParser extends Parser { stream_integral_literal.add(integral_literal218.getTree()); // AST REWRITE // elements: integral_literal - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 760:5: -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:760:8: ^( I_LINE[$start, \"I_LINE\"] integral_literal ) + // smaliParser.g:760:8: ^( I_LINE[$start, \"I_LINE\"] integral_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LINE, (retval.start), "I_LINE"), root_1); @@ -8401,7 +8401,7 @@ public class smaliParser extends Parser { // $ANTLR start "local_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:762:1: local_directive : LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ; + // smaliParser.g:762:1: local_directive : LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ; public final smaliParser.local_directive_return local_directive() throws RecognitionException { smaliParser.local_directive_return retval = new smaliParser.local_directive_return(); retval.start = input.LT(1); @@ -8438,16 +8438,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:3: ( LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:5: LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? + // smaliParser.g:763:3: ( LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ) + // smaliParser.g:763:5: LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? { - LOCAL_DIRECTIVE219=(Token)match(input,LOCAL_DIRECTIVE,FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452); + LOCAL_DIRECTIVE219=(Token)match(input,LOCAL_DIRECTIVE,FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452); stream_LOCAL_DIRECTIVE.add(LOCAL_DIRECTIVE219); - REGISTER220=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_local_directive3454); + REGISTER220=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_local_directive3454); stream_REGISTER.add(REGISTER220); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:30: ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? + // smaliParser.g:763:30: ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? int alt46=2; int LA46_0 = input.LA(1); if ( (LA46_0==COMMA) ) { @@ -8455,12 +8455,12 @@ public class smaliParser extends Parser { } switch (alt46) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:31: COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? + // smaliParser.g:763:31: COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? { - COMMA221=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3457); + COMMA221=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3457); stream_COMMA.add(COMMA221); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:37: ( NULL_LITERAL |name= STRING_LITERAL ) + // smaliParser.g:763:37: ( NULL_LITERAL |name= STRING_LITERAL ) int alt43=2; int LA43_0 = input.LA(1); if ( (LA43_0==NULL_LITERAL) ) { @@ -8478,17 +8478,17 @@ public class smaliParser extends Parser { switch (alt43) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:38: NULL_LITERAL + // smaliParser.g:763:38: NULL_LITERAL { - NULL_LITERAL222=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local_directive3460); + NULL_LITERAL222=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local_directive3460); stream_NULL_LITERAL.add(NULL_LITERAL222); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:53: name= STRING_LITERAL + // smaliParser.g:763:53: name= STRING_LITERAL { - name=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3466); + name=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3466); stream_STRING_LITERAL.add(name); } @@ -8496,10 +8496,10 @@ public class smaliParser extends Parser { } - COLON223=(Token)match(input,COLON,FOLLOW_COLON_in_local_directive3469); + COLON223=(Token)match(input,COLON,FOLLOW_COLON_in_local_directive3469); stream_COLON.add(COLON223); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:80: ( VOID_TYPE | nonvoid_type_descriptor ) + // smaliParser.g:763:80: ( VOID_TYPE | nonvoid_type_descriptor ) int alt44=2; int LA44_0 = input.LA(1); if ( (LA44_0==VOID_TYPE) ) { @@ -8517,15 +8517,15 @@ public class smaliParser extends Parser { switch (alt44) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:81: VOID_TYPE + // smaliParser.g:763:81: VOID_TYPE { - VOID_TYPE224=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_local_directive3472); + VOID_TYPE224=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_local_directive3472); stream_VOID_TYPE.add(VOID_TYPE224); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:93: nonvoid_type_descriptor + // smaliParser.g:763:93: nonvoid_type_descriptor { pushFollow(FOLLOW_nonvoid_type_descriptor_in_local_directive3476); nonvoid_type_descriptor225=nonvoid_type_descriptor(); @@ -8537,7 +8537,7 @@ public class smaliParser extends Parser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:764:31: ( COMMA signature= STRING_LITERAL )? + // smaliParser.g:764:31: ( COMMA signature= STRING_LITERAL )? int alt45=2; int LA45_0 = input.LA(1); if ( (LA45_0==COMMA) ) { @@ -8545,12 +8545,12 @@ public class smaliParser extends Parser { } switch (alt45) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:764:32: COMMA signature= STRING_LITERAL + // smaliParser.g:764:32: COMMA signature= STRING_LITERAL { - COMMA226=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3510); + COMMA226=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3510); stream_COMMA.add(COMMA226); - signature=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3514); + signature=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3514); stream_STRING_LITERAL.add(signature); } @@ -8564,12 +8564,12 @@ public class smaliParser extends Parser { } // AST REWRITE - // elements: NULL_LITERAL, REGISTER, name, signature, nonvoid_type_descriptor + // elements: name, NULL_LITERAL, nonvoid_type_descriptor, REGISTER, signature // token labels: signature, name // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleTokenStream stream_signature=new RewriteRuleTokenStream(adaptor,"token signature",signature); RewriteRuleTokenStream stream_name=new RewriteRuleTokenStream(adaptor,"token name",name); @@ -8578,30 +8578,30 @@ public class smaliParser extends Parser { root_0 = (CommonTree)adaptor.nil(); // 765:5: -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:8: ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) + // smaliParser.g:765:8: ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCAL, (retval.start), "I_LOCAL"), root_1); adaptor.addChild(root_1, stream_REGISTER.nextNode()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:46: ( NULL_LITERAL )? + // smaliParser.g:765:46: ( NULL_LITERAL )? if ( stream_NULL_LITERAL.hasNext() ) { adaptor.addChild(root_1, stream_NULL_LITERAL.nextNode()); } stream_NULL_LITERAL.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:61: ( $name)? + // smaliParser.g:765:61: ( $name)? if ( stream_name.hasNext() ) { adaptor.addChild(root_1, stream_name.nextNode()); } stream_name.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:67: ( nonvoid_type_descriptor )? + // smaliParser.g:765:67: ( nonvoid_type_descriptor )? if ( stream_nonvoid_type_descriptor.hasNext() ) { adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree()); } stream_nonvoid_type_descriptor.reset(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:93: ( $signature)? + // smaliParser.g:765:93: ( $signature)? if ( stream_signature.hasNext() ) { adaptor.addChild(root_1, stream_signature.nextNode()); } @@ -8644,7 +8644,7 @@ public class smaliParser extends Parser { // $ANTLR start "end_local_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:767:1: end_local_directive : END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ; + // smaliParser.g:767:1: end_local_directive : END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ; public final smaliParser.end_local_directive_return end_local_directive() throws RecognitionException { smaliParser.end_local_directive_return retval = new smaliParser.end_local_directive_return(); retval.start = input.LT(1); @@ -8660,29 +8660,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_END_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_LOCAL_DIRECTIVE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:768:3: ( END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:768:5: END_LOCAL_DIRECTIVE REGISTER + // smaliParser.g:768:3: ( END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ) + // smaliParser.g:768:5: END_LOCAL_DIRECTIVE REGISTER { - END_LOCAL_DIRECTIVE227=(Token)match(input,END_LOCAL_DIRECTIVE,FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556); + END_LOCAL_DIRECTIVE227=(Token)match(input,END_LOCAL_DIRECTIVE,FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556); stream_END_LOCAL_DIRECTIVE.add(END_LOCAL_DIRECTIVE227); - REGISTER228=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_end_local_directive3558); + REGISTER228=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_end_local_directive3558); stream_REGISTER.add(REGISTER228); // AST REWRITE // elements: REGISTER - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 769:5: -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:769:8: ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) + // smaliParser.g:769:8: ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_END_LOCAL, (retval.start), "I_END_LOCAL"), root_1); @@ -8724,7 +8724,7 @@ public class smaliParser extends Parser { // $ANTLR start "restart_local_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:771:1: restart_local_directive : RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ; + // smaliParser.g:771:1: restart_local_directive : RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ; public final smaliParser.restart_local_directive_return restart_local_directive() throws RecognitionException { smaliParser.restart_local_directive_return retval = new smaliParser.restart_local_directive_return(); retval.start = input.LT(1); @@ -8740,29 +8740,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_RESTART_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token RESTART_LOCAL_DIRECTIVE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:772:3: ( RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:772:5: RESTART_LOCAL_DIRECTIVE REGISTER + // smaliParser.g:772:3: ( RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ) + // smaliParser.g:772:5: RESTART_LOCAL_DIRECTIVE REGISTER { - RESTART_LOCAL_DIRECTIVE229=(Token)match(input,RESTART_LOCAL_DIRECTIVE,FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581); + RESTART_LOCAL_DIRECTIVE229=(Token)match(input,RESTART_LOCAL_DIRECTIVE,FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581); stream_RESTART_LOCAL_DIRECTIVE.add(RESTART_LOCAL_DIRECTIVE229); - REGISTER230=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local_directive3583); + REGISTER230=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local_directive3583); stream_REGISTER.add(REGISTER230); // AST REWRITE // elements: REGISTER - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 773:5: -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:773:8: ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) + // smaliParser.g:773:8: ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_RESTART_LOCAL, (retval.start), "I_RESTART_LOCAL"), root_1); @@ -8804,7 +8804,7 @@ public class smaliParser extends Parser { // $ANTLR start "prologue_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:775:1: prologue_directive : PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ; + // smaliParser.g:775:1: prologue_directive : PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ; public final smaliParser.prologue_directive_return prologue_directive() throws RecognitionException { smaliParser.prologue_directive_return retval = new smaliParser.prologue_directive_return(); retval.start = input.LT(1); @@ -8817,26 +8817,26 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_PROLOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token PROLOGUE_DIRECTIVE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:776:3: ( PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:776:5: PROLOGUE_DIRECTIVE + // smaliParser.g:776:3: ( PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ) + // smaliParser.g:776:5: PROLOGUE_DIRECTIVE { - PROLOGUE_DIRECTIVE231=(Token)match(input,PROLOGUE_DIRECTIVE,FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606); + PROLOGUE_DIRECTIVE231=(Token)match(input,PROLOGUE_DIRECTIVE,FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606); stream_PROLOGUE_DIRECTIVE.add(PROLOGUE_DIRECTIVE231); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 777:5: -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:777:8: ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) + // smaliParser.g:777:8: ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PROLOGUE, (retval.start), "I_PROLOGUE"), root_1); @@ -8877,7 +8877,7 @@ public class smaliParser extends Parser { // $ANTLR start "epilogue_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:779:1: epilogue_directive : EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ; + // smaliParser.g:779:1: epilogue_directive : EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ; public final smaliParser.epilogue_directive_return epilogue_directive() throws RecognitionException { smaliParser.epilogue_directive_return retval = new smaliParser.epilogue_directive_return(); retval.start = input.LT(1); @@ -8890,26 +8890,26 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_EPILOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token EPILOGUE_DIRECTIVE"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:780:3: ( EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:780:5: EPILOGUE_DIRECTIVE + // smaliParser.g:780:3: ( EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ) + // smaliParser.g:780:5: EPILOGUE_DIRECTIVE { - EPILOGUE_DIRECTIVE232=(Token)match(input,EPILOGUE_DIRECTIVE,FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627); + EPILOGUE_DIRECTIVE232=(Token)match(input,EPILOGUE_DIRECTIVE,FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627); stream_EPILOGUE_DIRECTIVE.add(EPILOGUE_DIRECTIVE232); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 781:5: -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:781:8: ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) + // smaliParser.g:781:8: ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_EPILOGUE, (retval.start), "I_EPILOGUE"), root_1); @@ -8950,7 +8950,7 @@ public class smaliParser extends Parser { // $ANTLR start "source_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:783:1: source_directive : SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ; + // smaliParser.g:783:1: source_directive : SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ; public final smaliParser.source_directive_return source_directive() throws RecognitionException { smaliParser.source_directive_return retval = new smaliParser.source_directive_return(); retval.start = input.LT(1); @@ -8966,13 +8966,13 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:3: ( SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:5: SOURCE_DIRECTIVE ( STRING_LITERAL )? + // smaliParser.g:784:3: ( SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ) + // smaliParser.g:784:5: SOURCE_DIRECTIVE ( STRING_LITERAL )? { - SOURCE_DIRECTIVE233=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648); + SOURCE_DIRECTIVE233=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648); stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE233); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:22: ( STRING_LITERAL )? + // smaliParser.g:784:22: ( STRING_LITERAL )? int alt47=2; int LA47_0 = input.LA(1); if ( (LA47_0==STRING_LITERAL) ) { @@ -8980,9 +8980,9 @@ public class smaliParser extends Parser { } switch (alt47) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:22: STRING_LITERAL + // smaliParser.g:784:22: STRING_LITERAL { - STRING_LITERAL234=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_directive3650); + STRING_LITERAL234=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_directive3650); stream_STRING_LITERAL.add(STRING_LITERAL234); } @@ -8992,22 +8992,22 @@ public class smaliParser extends Parser { // AST REWRITE // elements: STRING_LITERAL - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 785:5: -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:785:8: ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) + // smaliParser.g:785:8: ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:785:39: ( STRING_LITERAL )? + // smaliParser.g:785:39: ( STRING_LITERAL )? if ( stream_STRING_LITERAL.hasNext() ) { adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode()); } @@ -9050,7 +9050,7 @@ public class smaliParser extends Parser { // $ANTLR start "instruction_format12x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:787:1: instruction_format12x : ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] ); + // smaliParser.g:787:1: instruction_format12x : ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] ); public final smaliParser.instruction_format12x_return instruction_format12x() throws RecognitionException { smaliParser.instruction_format12x_return retval = new smaliParser.instruction_format12x_return(); retval.start = input.LT(1); @@ -9065,7 +9065,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT12x_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT12x_OR_ID"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:788:3: ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] ) + // smaliParser.g:788:3: ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] ) int alt48=2; int LA48_0 = input.LA(1); if ( (LA48_0==INSTRUCTION_FORMAT12x) ) { @@ -9083,30 +9083,30 @@ public class smaliParser extends Parser { switch (alt48) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:788:5: INSTRUCTION_FORMAT12x + // smaliParser.g:788:5: INSTRUCTION_FORMAT12x { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT12x235=(Token)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675); + INSTRUCTION_FORMAT12x235=(Token)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675); INSTRUCTION_FORMAT12x235_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT12x235); adaptor.addChild(root_0, INSTRUCTION_FORMAT12x235_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:789:5: INSTRUCTION_FORMAT12x_OR_ID + // smaliParser.g:789:5: INSTRUCTION_FORMAT12x_OR_ID { - INSTRUCTION_FORMAT12x_OR_ID236=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681); + INSTRUCTION_FORMAT12x_OR_ID236=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681); stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID236); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -9150,7 +9150,7 @@ public class smaliParser extends Parser { // $ANTLR start "instruction_format22s" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:791:1: instruction_format22s : ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] ); + // smaliParser.g:791:1: instruction_format22s : ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] ); public final smaliParser.instruction_format22s_return instruction_format22s() throws RecognitionException { smaliParser.instruction_format22s_return retval = new smaliParser.instruction_format22s_return(); retval.start = input.LT(1); @@ -9165,7 +9165,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22s_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22s_OR_ID"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:792:3: ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] ) + // smaliParser.g:792:3: ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] ) int alt49=2; int LA49_0 = input.LA(1); if ( (LA49_0==INSTRUCTION_FORMAT22s) ) { @@ -9183,30 +9183,30 @@ public class smaliParser extends Parser { switch (alt49) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:792:5: INSTRUCTION_FORMAT22s + // smaliParser.g:792:5: INSTRUCTION_FORMAT22s { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT22s237=(Token)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696); + INSTRUCTION_FORMAT22s237=(Token)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696); INSTRUCTION_FORMAT22s237_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22s237); adaptor.addChild(root_0, INSTRUCTION_FORMAT22s237_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:793:5: INSTRUCTION_FORMAT22s_OR_ID + // smaliParser.g:793:5: INSTRUCTION_FORMAT22s_OR_ID { - INSTRUCTION_FORMAT22s_OR_ID238=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702); + INSTRUCTION_FORMAT22s_OR_ID238=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702); stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID238); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -9250,7 +9250,7 @@ public class smaliParser extends Parser { // $ANTLR start "instruction_format31i" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:795:1: instruction_format31i : ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] ); + // smaliParser.g:795:1: instruction_format31i : ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] ); public final smaliParser.instruction_format31i_return instruction_format31i() throws RecognitionException { smaliParser.instruction_format31i_return retval = new smaliParser.instruction_format31i_return(); retval.start = input.LT(1); @@ -9265,7 +9265,7 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31i_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31i_OR_ID"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:796:3: ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] ) + // smaliParser.g:796:3: ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] ) int alt50=2; int LA50_0 = input.LA(1); if ( (LA50_0==INSTRUCTION_FORMAT31i) ) { @@ -9283,30 +9283,30 @@ public class smaliParser extends Parser { switch (alt50) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:796:5: INSTRUCTION_FORMAT31i + // smaliParser.g:796:5: INSTRUCTION_FORMAT31i { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT31i239=(Token)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717); + INSTRUCTION_FORMAT31i239=(Token)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717); INSTRUCTION_FORMAT31i239_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT31i239); adaptor.addChild(root_0, INSTRUCTION_FORMAT31i239_tree); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:797:5: INSTRUCTION_FORMAT31i_OR_ID + // smaliParser.g:797:5: INSTRUCTION_FORMAT31i_OR_ID { - INSTRUCTION_FORMAT31i_OR_ID240=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723); + INSTRUCTION_FORMAT31i_OR_ID240=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723); stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID240); // AST REWRITE - // elements: - // token labels: + // elements: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); @@ -9350,7 +9350,7 @@ public class smaliParser extends Parser { // $ANTLR start "instruction" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:801:1: instruction : ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ); + // smaliParser.g:801:1: instruction : ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ); public final smaliParser.instruction_return instruction() throws RecognitionException { smaliParser.instruction_return retval = new smaliParser.instruction_return(); retval.start = input.LT(1); @@ -9406,7 +9406,7 @@ public class smaliParser extends Parser { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:802:3: ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ) + // smaliParser.g:802:3: ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ) int alt51=46; switch ( input.LA(1) ) { case INSTRUCTION_FORMAT10t: @@ -9649,7 +9649,7 @@ public class smaliParser extends Parser { } switch (alt51) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:802:5: insn_format10t + // smaliParser.g:802:5: insn_format10t { root_0 = (CommonTree)adaptor.nil(); @@ -9663,7 +9663,7 @@ public class smaliParser extends Parser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:803:5: insn_format10x + // smaliParser.g:803:5: insn_format10x { root_0 = (CommonTree)adaptor.nil(); @@ -9677,7 +9677,7 @@ public class smaliParser extends Parser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:804:5: insn_format10x_odex + // smaliParser.g:804:5: insn_format10x_odex { root_0 = (CommonTree)adaptor.nil(); @@ -9691,7 +9691,7 @@ public class smaliParser extends Parser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:805:5: insn_format11n + // smaliParser.g:805:5: insn_format11n { root_0 = (CommonTree)adaptor.nil(); @@ -9705,7 +9705,7 @@ public class smaliParser extends Parser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:806:5: insn_format11x + // smaliParser.g:806:5: insn_format11x { root_0 = (CommonTree)adaptor.nil(); @@ -9719,7 +9719,7 @@ public class smaliParser extends Parser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:807:5: insn_format12x + // smaliParser.g:807:5: insn_format12x { root_0 = (CommonTree)adaptor.nil(); @@ -9733,7 +9733,7 @@ public class smaliParser extends Parser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:808:5: insn_format20bc + // smaliParser.g:808:5: insn_format20bc { root_0 = (CommonTree)adaptor.nil(); @@ -9747,7 +9747,7 @@ public class smaliParser extends Parser { } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:809:5: insn_format20t + // smaliParser.g:809:5: insn_format20t { root_0 = (CommonTree)adaptor.nil(); @@ -9761,7 +9761,7 @@ public class smaliParser extends Parser { } break; case 9 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:810:5: insn_format21c_field + // smaliParser.g:810:5: insn_format21c_field { root_0 = (CommonTree)adaptor.nil(); @@ -9775,7 +9775,7 @@ public class smaliParser extends Parser { } break; case 10 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:811:5: insn_format21c_field_odex + // smaliParser.g:811:5: insn_format21c_field_odex { root_0 = (CommonTree)adaptor.nil(); @@ -9789,7 +9789,7 @@ public class smaliParser extends Parser { } break; case 11 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:812:5: insn_format21c_string + // smaliParser.g:812:5: insn_format21c_string { root_0 = (CommonTree)adaptor.nil(); @@ -9803,7 +9803,7 @@ public class smaliParser extends Parser { } break; case 12 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:813:5: insn_format21c_type + // smaliParser.g:813:5: insn_format21c_type { root_0 = (CommonTree)adaptor.nil(); @@ -9817,7 +9817,7 @@ public class smaliParser extends Parser { } break; case 13 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:814:5: insn_format21ih + // smaliParser.g:814:5: insn_format21ih { root_0 = (CommonTree)adaptor.nil(); @@ -9831,7 +9831,7 @@ public class smaliParser extends Parser { } break; case 14 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:815:5: insn_format21lh + // smaliParser.g:815:5: insn_format21lh { root_0 = (CommonTree)adaptor.nil(); @@ -9845,7 +9845,7 @@ public class smaliParser extends Parser { } break; case 15 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:816:5: insn_format21s + // smaliParser.g:816:5: insn_format21s { root_0 = (CommonTree)adaptor.nil(); @@ -9859,7 +9859,7 @@ public class smaliParser extends Parser { } break; case 16 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:817:5: insn_format21t + // smaliParser.g:817:5: insn_format21t { root_0 = (CommonTree)adaptor.nil(); @@ -9873,7 +9873,7 @@ public class smaliParser extends Parser { } break; case 17 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:818:5: insn_format22b + // smaliParser.g:818:5: insn_format22b { root_0 = (CommonTree)adaptor.nil(); @@ -9887,7 +9887,7 @@ public class smaliParser extends Parser { } break; case 18 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:819:5: insn_format22c_field + // smaliParser.g:819:5: insn_format22c_field { root_0 = (CommonTree)adaptor.nil(); @@ -9901,7 +9901,7 @@ public class smaliParser extends Parser { } break; case 19 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:820:5: insn_format22c_field_odex + // smaliParser.g:820:5: insn_format22c_field_odex { root_0 = (CommonTree)adaptor.nil(); @@ -9915,7 +9915,7 @@ public class smaliParser extends Parser { } break; case 20 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:821:5: insn_format22c_type + // smaliParser.g:821:5: insn_format22c_type { root_0 = (CommonTree)adaptor.nil(); @@ -9929,7 +9929,7 @@ public class smaliParser extends Parser { } break; case 21 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:822:5: insn_format22cs_field + // smaliParser.g:822:5: insn_format22cs_field { root_0 = (CommonTree)adaptor.nil(); @@ -9943,7 +9943,7 @@ public class smaliParser extends Parser { } break; case 22 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:823:5: insn_format22s + // smaliParser.g:823:5: insn_format22s { root_0 = (CommonTree)adaptor.nil(); @@ -9957,7 +9957,7 @@ public class smaliParser extends Parser { } break; case 23 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:824:5: insn_format22t + // smaliParser.g:824:5: insn_format22t { root_0 = (CommonTree)adaptor.nil(); @@ -9971,7 +9971,7 @@ public class smaliParser extends Parser { } break; case 24 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:825:5: insn_format22x + // smaliParser.g:825:5: insn_format22x { root_0 = (CommonTree)adaptor.nil(); @@ -9985,7 +9985,7 @@ public class smaliParser extends Parser { } break; case 25 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:826:5: insn_format23x + // smaliParser.g:826:5: insn_format23x { root_0 = (CommonTree)adaptor.nil(); @@ -9999,7 +9999,7 @@ public class smaliParser extends Parser { } break; case 26 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:827:5: insn_format30t + // smaliParser.g:827:5: insn_format30t { root_0 = (CommonTree)adaptor.nil(); @@ -10013,7 +10013,7 @@ public class smaliParser extends Parser { } break; case 27 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:828:5: insn_format31c + // smaliParser.g:828:5: insn_format31c { root_0 = (CommonTree)adaptor.nil(); @@ -10027,7 +10027,7 @@ public class smaliParser extends Parser { } break; case 28 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:829:5: insn_format31i + // smaliParser.g:829:5: insn_format31i { root_0 = (CommonTree)adaptor.nil(); @@ -10041,7 +10041,7 @@ public class smaliParser extends Parser { } break; case 29 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:830:5: insn_format31t + // smaliParser.g:830:5: insn_format31t { root_0 = (CommonTree)adaptor.nil(); @@ -10055,7 +10055,7 @@ public class smaliParser extends Parser { } break; case 30 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:831:5: insn_format32x + // smaliParser.g:831:5: insn_format32x { root_0 = (CommonTree)adaptor.nil(); @@ -10069,7 +10069,7 @@ public class smaliParser extends Parser { } break; case 31 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:832:5: insn_format35c_method + // smaliParser.g:832:5: insn_format35c_method { root_0 = (CommonTree)adaptor.nil(); @@ -10083,7 +10083,7 @@ public class smaliParser extends Parser { } break; case 32 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:833:5: insn_format35c_type + // smaliParser.g:833:5: insn_format35c_type { root_0 = (CommonTree)adaptor.nil(); @@ -10097,7 +10097,7 @@ public class smaliParser extends Parser { } break; case 33 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:834:5: insn_format35c_method_odex + // smaliParser.g:834:5: insn_format35c_method_odex { root_0 = (CommonTree)adaptor.nil(); @@ -10111,7 +10111,7 @@ public class smaliParser extends Parser { } break; case 34 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:835:5: insn_format35mi_method + // smaliParser.g:835:5: insn_format35mi_method { root_0 = (CommonTree)adaptor.nil(); @@ -10125,7 +10125,7 @@ public class smaliParser extends Parser { } break; case 35 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:836:5: insn_format35ms_method + // smaliParser.g:836:5: insn_format35ms_method { root_0 = (CommonTree)adaptor.nil(); @@ -10139,7 +10139,7 @@ public class smaliParser extends Parser { } break; case 36 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:837:5: insn_format3rc_method + // smaliParser.g:837:5: insn_format3rc_method { root_0 = (CommonTree)adaptor.nil(); @@ -10153,7 +10153,7 @@ public class smaliParser extends Parser { } break; case 37 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:838:5: insn_format3rc_method_odex + // smaliParser.g:838:5: insn_format3rc_method_odex { root_0 = (CommonTree)adaptor.nil(); @@ -10167,7 +10167,7 @@ public class smaliParser extends Parser { } break; case 38 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:839:5: insn_format3rc_type + // smaliParser.g:839:5: insn_format3rc_type { root_0 = (CommonTree)adaptor.nil(); @@ -10181,7 +10181,7 @@ public class smaliParser extends Parser { } break; case 39 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:840:5: insn_format3rmi_method + // smaliParser.g:840:5: insn_format3rmi_method { root_0 = (CommonTree)adaptor.nil(); @@ -10195,7 +10195,7 @@ public class smaliParser extends Parser { } break; case 40 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:841:5: insn_format3rms_method + // smaliParser.g:841:5: insn_format3rms_method { root_0 = (CommonTree)adaptor.nil(); @@ -10209,7 +10209,7 @@ public class smaliParser extends Parser { } break; case 41 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:842:5: insn_format45cc_method + // smaliParser.g:842:5: insn_format45cc_method { root_0 = (CommonTree)adaptor.nil(); @@ -10223,7 +10223,7 @@ public class smaliParser extends Parser { } break; case 42 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:843:5: insn_format4rcc_method + // smaliParser.g:843:5: insn_format4rcc_method { root_0 = (CommonTree)adaptor.nil(); @@ -10237,7 +10237,7 @@ public class smaliParser extends Parser { } break; case 43 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:844:5: insn_format51l + // smaliParser.g:844:5: insn_format51l { root_0 = (CommonTree)adaptor.nil(); @@ -10251,7 +10251,7 @@ public class smaliParser extends Parser { } break; case 44 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:845:5: insn_array_data_directive + // smaliParser.g:845:5: insn_array_data_directive { root_0 = (CommonTree)adaptor.nil(); @@ -10265,7 +10265,7 @@ public class smaliParser extends Parser { } break; case 45 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:846:5: insn_packed_switch_directive + // smaliParser.g:846:5: insn_packed_switch_directive { root_0 = (CommonTree)adaptor.nil(); @@ -10279,7 +10279,7 @@ public class smaliParser extends Parser { } break; case 46 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:847:5: insn_sparse_switch_directive + // smaliParser.g:847:5: insn_sparse_switch_directive { root_0 = (CommonTree)adaptor.nil(); @@ -10321,7 +10321,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format10t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:849:1: insn_format10t : INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ; + // smaliParser.g:849:1: insn_format10t : INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ; public final smaliParser.insn_format10t_return insn_format10t() throws RecognitionException { smaliParser.insn_format10t_return retval = new smaliParser.insn_format10t_return(); retval.start = input.LT(1); @@ -10336,10 +10336,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:850:3: ( INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:852:5: INSTRUCTION_FORMAT10t label_ref + // smaliParser.g:850:3: ( INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ) + // smaliParser.g:852:5: INSTRUCTION_FORMAT10t label_ref { - INSTRUCTION_FORMAT10t287=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030); + INSTRUCTION_FORMAT10t287=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030); stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t287); pushFollow(FOLLOW_label_ref_in_insn_format10t4032); @@ -10348,19 +10348,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref288.getTree()); // AST REWRITE - // elements: label_ref, INSTRUCTION_FORMAT10t - // token labels: + // elements: INSTRUCTION_FORMAT10t, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 853:5: -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:853:8: ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) + // smaliParser.g:853:8: ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10t, (retval.start), "I_STATEMENT_FORMAT10t"), root_1); @@ -10403,7 +10403,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format10x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:855:1: insn_format10x : INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ; + // smaliParser.g:855:1: insn_format10x : INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ; public final smaliParser.insn_format10x_return insn_format10x() throws RecognitionException { smaliParser.insn_format10x_return retval = new smaliParser.insn_format10x_return(); retval.start = input.LT(1); @@ -10416,26 +10416,26 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:856:3: ( INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:857:5: INSTRUCTION_FORMAT10x + // smaliParser.g:856:3: ( INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ) + // smaliParser.g:857:5: INSTRUCTION_FORMAT10x { - INSTRUCTION_FORMAT10x289=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062); + INSTRUCTION_FORMAT10x289=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062); stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x289); // AST REWRITE // elements: INSTRUCTION_FORMAT10x - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 858:5: -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:858:8: ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) + // smaliParser.g:858:8: ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10x, (retval.start), "I_STATEMENT_FORMAT10x"), root_1); @@ -10477,7 +10477,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format10x_odex" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:860:1: insn_format10x_odex : INSTRUCTION_FORMAT10x_ODEX ; + // smaliParser.g:860:1: insn_format10x_odex : INSTRUCTION_FORMAT10x_ODEX ; public final smaliParser.insn_format10x_odex_return insn_format10x_odex() throws RecognitionException { smaliParser.insn_format10x_odex_return retval = new smaliParser.insn_format10x_odex_return(); retval.start = input.LT(1); @@ -10489,19 +10489,19 @@ public class smaliParser extends Parser { CommonTree INSTRUCTION_FORMAT10x_ODEX290_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:861:3: ( INSTRUCTION_FORMAT10x_ODEX ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:862:5: INSTRUCTION_FORMAT10x_ODEX + // smaliParser.g:861:3: ( INSTRUCTION_FORMAT10x_ODEX ) + // smaliParser.g:862:5: INSTRUCTION_FORMAT10x_ODEX { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT10x_ODEX290=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090); + INSTRUCTION_FORMAT10x_ODEX290=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090); INSTRUCTION_FORMAT10x_ODEX290_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT10x_ODEX290); adaptor.addChild(root_0, INSTRUCTION_FORMAT10x_ODEX290_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT10x_ODEX290!=null?INSTRUCTION_FORMAT10x_ODEX290.getText():null)); - + } retval.stop = input.LT(-1); @@ -10531,7 +10531,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format11n" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:867:1: insn_format11n : INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ; + // smaliParser.g:867:1: insn_format11n : INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ; public final smaliParser.insn_format11n_return insn_format11n() throws RecognitionException { smaliParser.insn_format11n_return retval = new smaliParser.insn_format11n_return(); retval.start = input.LT(1); @@ -10552,16 +10552,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:868:3: ( INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:869:5: INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal + // smaliParser.g:868:3: ( INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ) + // smaliParser.g:869:5: INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal { - INSTRUCTION_FORMAT11n291=(Token)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111); + INSTRUCTION_FORMAT11n291=(Token)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111); stream_INSTRUCTION_FORMAT11n.add(INSTRUCTION_FORMAT11n291); - REGISTER292=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n4113); + REGISTER292=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n4113); stream_REGISTER.add(REGISTER292); - COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format11n4115); + COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format11n4115); stream_COMMA.add(COMMA293); pushFollow(FOLLOW_integral_literal_in_insn_format11n4117); @@ -10570,19 +10570,19 @@ public class smaliParser extends Parser { stream_integral_literal.add(integral_literal294.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT11n, integral_literal, REGISTER - // token labels: + // elements: integral_literal, INSTRUCTION_FORMAT11n, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 870:5: -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:870:8: ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) + // smaliParser.g:870:8: ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11n, (retval.start), "I_STATEMENT_FORMAT11n"), root_1); @@ -10626,7 +10626,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format11x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:872:1: insn_format11x : INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ; + // smaliParser.g:872:1: insn_format11x : INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ; public final smaliParser.insn_format11x_return insn_format11x() throws RecognitionException { smaliParser.insn_format11x_return retval = new smaliParser.insn_format11x_return(); retval.start = input.LT(1); @@ -10642,29 +10642,29 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT11x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT11x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:873:3: ( INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:874:5: INSTRUCTION_FORMAT11x REGISTER + // smaliParser.g:873:3: ( INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ) + // smaliParser.g:874:5: INSTRUCTION_FORMAT11x REGISTER { - INSTRUCTION_FORMAT11x295=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149); + INSTRUCTION_FORMAT11x295=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149); stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x295); - REGISTER296=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x4151); + REGISTER296=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x4151); stream_REGISTER.add(REGISTER296); // AST REWRITE - // elements: INSTRUCTION_FORMAT11x, REGISTER - // token labels: + // elements: REGISTER, INSTRUCTION_FORMAT11x + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 875:5: -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:875:8: ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) + // smaliParser.g:875:8: ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11x, (retval.start), "I_STATEMENT_FORMAT11x"), root_1); @@ -10707,7 +10707,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format12x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:877:1: insn_format12x : instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ; + // smaliParser.g:877:1: insn_format12x : instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ; public final smaliParser.insn_format12x_return insn_format12x() throws RecognitionException { smaliParser.insn_format12x_return retval = new smaliParser.insn_format12x_return(); retval.start = input.LT(1); @@ -10727,37 +10727,37 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_instruction_format12x=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format12x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:878:3: ( instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:879:5: instruction_format12x REGISTER COMMA REGISTER + // smaliParser.g:878:3: ( instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ) + // smaliParser.g:879:5: instruction_format12x REGISTER COMMA REGISTER { pushFollow(FOLLOW_instruction_format12x_in_insn_format12x4181); instruction_format12x297=instruction_format12x(); state._fsp--; stream_instruction_format12x.add(instruction_format12x297.getTree()); - REGISTER298=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4183); + REGISTER298=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4183); stream_REGISTER.add(REGISTER298); - COMMA299=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format12x4185); + COMMA299=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format12x4185); stream_COMMA.add(COMMA299); - REGISTER300=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4187); + REGISTER300=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4187); stream_REGISTER.add(REGISTER300); // AST REWRITE // elements: REGISTER, instruction_format12x, REGISTER - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 880:5: -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:880:8: ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) + // smaliParser.g:880:8: ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT12x, (retval.start), "I_STATEMENT_FORMAT12x"), root_1); @@ -10801,7 +10801,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format20bc" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:882:1: insn_format20bc : INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ; + // smaliParser.g:882:1: insn_format20bc : INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ; public final smaliParser.insn_format20bc_return insn_format20bc() throws RecognitionException { smaliParser.insn_format20bc_return retval = new smaliParser.insn_format20bc_return(); retval.start = input.LT(1); @@ -10822,16 +10822,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_verification_error_reference=new RewriteRuleSubtreeStream(adaptor,"rule verification_error_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:883:3: ( INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:884:5: INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference + // smaliParser.g:883:3: ( INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ) + // smaliParser.g:884:5: INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference { - INSTRUCTION_FORMAT20bc301=(Token)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219); + INSTRUCTION_FORMAT20bc301=(Token)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219); stream_INSTRUCTION_FORMAT20bc.add(INSTRUCTION_FORMAT20bc301); - VERIFICATION_ERROR_TYPE302=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221); + VERIFICATION_ERROR_TYPE302=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221); stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE302); - COMMA303=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format20bc4223); + COMMA303=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format20bc4223); stream_COMMA.add(COMMA303); pushFollow(FOLLOW_verification_error_reference_in_insn_format20bc4225); @@ -10843,21 +10843,21 @@ public class smaliParser extends Parser { if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null)) == null || apiLevel >= 14) { throwOdexedInstructionException(input, (INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null)); } - + // AST REWRITE - // elements: INSTRUCTION_FORMAT20bc, verification_error_reference, VERIFICATION_ERROR_TYPE - // token labels: + // elements: VERIFICATION_ERROR_TYPE, verification_error_reference, INSTRUCTION_FORMAT20bc + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 890:5: -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:890:8: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) + // smaliParser.g:890:8: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20bc, "I_STATEMENT_FORMAT20bc"), root_1); @@ -10901,7 +10901,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format20t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:892:1: insn_format20t : INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ; + // smaliParser.g:892:1: insn_format20t : INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ; public final smaliParser.insn_format20t_return insn_format20t() throws RecognitionException { smaliParser.insn_format20t_return retval = new smaliParser.insn_format20t_return(); retval.start = input.LT(1); @@ -10916,10 +10916,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:893:3: ( INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:894:5: INSTRUCTION_FORMAT20t label_ref + // smaliParser.g:893:3: ( INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ) + // smaliParser.g:894:5: INSTRUCTION_FORMAT20t label_ref { - INSTRUCTION_FORMAT20t305=(Token)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262); + INSTRUCTION_FORMAT20t305=(Token)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262); stream_INSTRUCTION_FORMAT20t.add(INSTRUCTION_FORMAT20t305); pushFollow(FOLLOW_label_ref_in_insn_format20t4264); @@ -10928,19 +10928,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref306.getTree()); // AST REWRITE - // elements: label_ref, INSTRUCTION_FORMAT20t - // token labels: + // elements: INSTRUCTION_FORMAT20t, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 895:5: -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:895:8: ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) + // smaliParser.g:895:8: ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20t, (retval.start), "I_STATEMENT_FORMAT20t"), root_1); @@ -10983,7 +10983,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21c_field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:897:1: insn_format21c_field : INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ; + // smaliParser.g:897:1: insn_format21c_field : INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ; public final smaliParser.insn_format21c_field_return insn_format21c_field() throws RecognitionException { smaliParser.insn_format21c_field_return retval = new smaliParser.insn_format21c_field_return(); retval.start = input.LT(1); @@ -11004,16 +11004,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:898:3: ( INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:899:5: INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference + // smaliParser.g:898:3: ( INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ) + // smaliParser.g:899:5: INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference { - INSTRUCTION_FORMAT21c_FIELD307=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294); + INSTRUCTION_FORMAT21c_FIELD307=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294); stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD307); - REGISTER308=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field4296); + REGISTER308=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field4296); stream_REGISTER.add(REGISTER308); - COMMA309=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field4298); + COMMA309=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field4298); stream_COMMA.add(COMMA309); pushFollow(FOLLOW_field_reference_in_insn_format21c_field4300); @@ -11023,18 +11023,18 @@ public class smaliParser extends Parser { stream_field_reference.add(field_reference310.getTree()); // AST REWRITE // elements: REGISTER, INSTRUCTION_FORMAT21c_FIELD, field_reference - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 900:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:900:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) + // smaliParser.g:900:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1); @@ -11078,7 +11078,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21c_field_odex" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:902:1: insn_format21c_field_odex : INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ; + // smaliParser.g:902:1: insn_format21c_field_odex : INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ; public final smaliParser.insn_format21c_field_odex_return insn_format21c_field_odex() throws RecognitionException { smaliParser.insn_format21c_field_odex_return retval = new smaliParser.insn_format21c_field_odex_return(); retval.start = input.LT(1); @@ -11099,16 +11099,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:903:3: ( INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:904:5: INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference + // smaliParser.g:903:3: ( INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ) + // smaliParser.g:904:5: INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference { - INSTRUCTION_FORMAT21c_FIELD_ODEX311=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332); + INSTRUCTION_FORMAT21c_FIELD_ODEX311=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332); stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX311); - REGISTER312=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field_odex4334); + REGISTER312=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field_odex4334); stream_REGISTER.add(REGISTER312); - COMMA313=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field_odex4336); + COMMA313=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field_odex4336); stream_COMMA.add(COMMA313); pushFollow(FOLLOW_field_reference_in_insn_format21c_field_odex4338); @@ -11120,21 +11120,21 @@ public class smaliParser extends Parser { if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null)) == null || apiLevel >= 14) { throwOdexedInstructionException(input, (INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null)); } - + // AST REWRITE - // elements: INSTRUCTION_FORMAT21c_FIELD_ODEX, field_reference, REGISTER - // token labels: + // elements: INSTRUCTION_FORMAT21c_FIELD_ODEX, REGISTER, field_reference + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 910:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:910:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) + // smaliParser.g:910:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1); @@ -11178,7 +11178,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21c_string" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:912:1: insn_format21c_string : INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ; + // smaliParser.g:912:1: insn_format21c_string : INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ; public final smaliParser.insn_format21c_string_return insn_format21c_string() throws RecognitionException { smaliParser.insn_format21c_string_return retval = new smaliParser.insn_format21c_string_return(); retval.start = input.LT(1); @@ -11200,35 +11200,35 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_STRING=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_STRING"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:913:3: ( INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:914:5: INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL + // smaliParser.g:913:3: ( INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ) + // smaliParser.g:914:5: INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL { - INSTRUCTION_FORMAT21c_STRING315=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376); + INSTRUCTION_FORMAT21c_STRING315=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376); stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING315); - REGISTER316=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string4378); + REGISTER316=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string4378); stream_REGISTER.add(REGISTER316); - COMMA317=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_string4380); + COMMA317=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_string4380); stream_COMMA.add(COMMA317); - STRING_LITERAL318=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format21c_string4382); + STRING_LITERAL318=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format21c_string4382); stream_STRING_LITERAL.add(STRING_LITERAL318); // AST REWRITE - // elements: INSTRUCTION_FORMAT21c_STRING, REGISTER, STRING_LITERAL - // token labels: + // elements: STRING_LITERAL, REGISTER, INSTRUCTION_FORMAT21c_STRING + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 915:5: -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:915:8: ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) + // smaliParser.g:915:8: ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_STRING, (retval.start), "I_STATEMENT_FORMAT21c_STRING"), root_1); @@ -11272,7 +11272,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:917:1: insn_format21c_type : INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ; + // smaliParser.g:917:1: insn_format21c_type : INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ; public final smaliParser.insn_format21c_type_return insn_format21c_type() throws RecognitionException { smaliParser.insn_format21c_type_return retval = new smaliParser.insn_format21c_type_return(); retval.start = input.LT(1); @@ -11293,16 +11293,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:918:3: ( INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:919:5: INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor + // smaliParser.g:918:3: ( INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ) + // smaliParser.g:919:5: INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor { - INSTRUCTION_FORMAT21c_TYPE319=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414); + INSTRUCTION_FORMAT21c_TYPE319=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414); stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE319); - REGISTER320=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type4416); + REGISTER320=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type4416); stream_REGISTER.add(REGISTER320); - COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_type4418); + COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_type4418); stream_COMMA.add(COMMA321); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type4420); @@ -11312,18 +11312,18 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor322.getTree()); // AST REWRITE // elements: REGISTER, INSTRUCTION_FORMAT21c_TYPE, nonvoid_type_descriptor - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 920:5: -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:920:8: ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) + // smaliParser.g:920:8: ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_TYPE, (retval.start), "I_STATEMENT_FORMAT21c"), root_1); @@ -11367,7 +11367,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21ih" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:922:1: insn_format21ih : INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ; + // smaliParser.g:922:1: insn_format21ih : INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ; public final smaliParser.insn_format21ih_return insn_format21ih() throws RecognitionException { smaliParser.insn_format21ih_return retval = new smaliParser.insn_format21ih_return(); retval.start = input.LT(1); @@ -11388,16 +11388,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:923:3: ( INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:924:5: INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal + // smaliParser.g:923:3: ( INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ) + // smaliParser.g:924:5: INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal { - INSTRUCTION_FORMAT21ih323=(Token)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452); + INSTRUCTION_FORMAT21ih323=(Token)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452); stream_INSTRUCTION_FORMAT21ih.add(INSTRUCTION_FORMAT21ih323); - REGISTER324=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih4454); + REGISTER324=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih4454); stream_REGISTER.add(REGISTER324); - COMMA325=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21ih4456); + COMMA325=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21ih4456); stream_COMMA.add(COMMA325); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih4458); @@ -11406,19 +11406,19 @@ public class smaliParser extends Parser { stream_fixed_32bit_literal.add(fixed_32bit_literal326.getTree()); // AST REWRITE - // elements: fixed_32bit_literal, INSTRUCTION_FORMAT21ih, REGISTER - // token labels: + // elements: REGISTER, INSTRUCTION_FORMAT21ih, fixed_32bit_literal + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 925:5: -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:925:8: ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) + // smaliParser.g:925:8: ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21ih, (retval.start), "I_STATEMENT_FORMAT21ih"), root_1); @@ -11462,7 +11462,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21lh" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:927:1: insn_format21lh : INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ; + // smaliParser.g:927:1: insn_format21lh : INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ; public final smaliParser.insn_format21lh_return insn_format21lh() throws RecognitionException { smaliParser.insn_format21lh_return retval = new smaliParser.insn_format21lh_return(); retval.start = input.LT(1); @@ -11483,16 +11483,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:928:3: ( INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:929:5: INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal + // smaliParser.g:928:3: ( INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ) + // smaliParser.g:929:5: INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal { - INSTRUCTION_FORMAT21lh327=(Token)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490); + INSTRUCTION_FORMAT21lh327=(Token)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490); stream_INSTRUCTION_FORMAT21lh.add(INSTRUCTION_FORMAT21lh327); - REGISTER328=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh4492); + REGISTER328=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh4492); stream_REGISTER.add(REGISTER328); - COMMA329=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21lh4494); + COMMA329=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21lh4494); stream_COMMA.add(COMMA329); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21lh4496); @@ -11501,19 +11501,19 @@ public class smaliParser extends Parser { stream_fixed_32bit_literal.add(fixed_32bit_literal330.getTree()); // AST REWRITE - // elements: fixed_32bit_literal, INSTRUCTION_FORMAT21lh, REGISTER - // token labels: + // elements: INSTRUCTION_FORMAT21lh, fixed_32bit_literal, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 930:5: -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:930:8: ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) + // smaliParser.g:930:8: ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21lh, (retval.start), "I_STATEMENT_FORMAT21lh"), root_1); @@ -11557,7 +11557,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21s" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:932:1: insn_format21s : INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ; + // smaliParser.g:932:1: insn_format21s : INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ; public final smaliParser.insn_format21s_return insn_format21s() throws RecognitionException { smaliParser.insn_format21s_return retval = new smaliParser.insn_format21s_return(); retval.start = input.LT(1); @@ -11578,16 +11578,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:933:3: ( INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:934:5: INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal + // smaliParser.g:933:3: ( INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ) + // smaliParser.g:934:5: INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal { - INSTRUCTION_FORMAT21s331=(Token)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528); + INSTRUCTION_FORMAT21s331=(Token)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528); stream_INSTRUCTION_FORMAT21s.add(INSTRUCTION_FORMAT21s331); - REGISTER332=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s4530); + REGISTER332=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s4530); stream_REGISTER.add(REGISTER332); - COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21s4532); + COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21s4532); stream_COMMA.add(COMMA333); pushFollow(FOLLOW_integral_literal_in_insn_format21s4534); @@ -11596,19 +11596,19 @@ public class smaliParser extends Parser { stream_integral_literal.add(integral_literal334.getTree()); // AST REWRITE - // elements: REGISTER, integral_literal, INSTRUCTION_FORMAT21s - // token labels: + // elements: integral_literal, REGISTER, INSTRUCTION_FORMAT21s + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 935:5: -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:935:8: ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) + // smaliParser.g:935:8: ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21s, (retval.start), "I_STATEMENT_FORMAT21s"), root_1); @@ -11652,7 +11652,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format21t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:937:1: insn_format21t : INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ; + // smaliParser.g:937:1: insn_format21t : INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ; public final smaliParser.insn_format21t_return insn_format21t() throws RecognitionException { smaliParser.insn_format21t_return retval = new smaliParser.insn_format21t_return(); retval.start = input.LT(1); @@ -11673,16 +11673,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:938:3: ( INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:939:5: INSTRUCTION_FORMAT21t REGISTER COMMA label_ref + // smaliParser.g:938:3: ( INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ) + // smaliParser.g:939:5: INSTRUCTION_FORMAT21t REGISTER COMMA label_ref { - INSTRUCTION_FORMAT21t335=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566); + INSTRUCTION_FORMAT21t335=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566); stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t335); - REGISTER336=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t4568); + REGISTER336=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t4568); stream_REGISTER.add(REGISTER336); - COMMA337=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21t4570); + COMMA337=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21t4570); stream_COMMA.add(COMMA337); pushFollow(FOLLOW_label_ref_in_insn_format21t4572); @@ -11691,19 +11691,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref338.getTree()); // AST REWRITE - // elements: label_ref, REGISTER, INSTRUCTION_FORMAT21t - // token labels: + // elements: INSTRUCTION_FORMAT21t, label_ref, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 940:5: -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:940:8: ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) + // smaliParser.g:940:8: ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21t, (retval.start), "I_STATEMENT_FORMAT21t"), root_1); @@ -11747,7 +11747,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22b" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:942:1: insn_format22b : INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ; + // smaliParser.g:942:1: insn_format22b : INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ; public final smaliParser.insn_format22b_return insn_format22b() throws RecognitionException { smaliParser.insn_format22b_return retval = new smaliParser.insn_format22b_return(); retval.start = input.LT(1); @@ -11772,22 +11772,22 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:943:3: ( INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:944:5: INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal + // smaliParser.g:943:3: ( INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ) + // smaliParser.g:944:5: INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal { - INSTRUCTION_FORMAT22b339=(Token)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604); + INSTRUCTION_FORMAT22b339=(Token)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604); stream_INSTRUCTION_FORMAT22b.add(INSTRUCTION_FORMAT22b339); - REGISTER340=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4606); + REGISTER340=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4606); stream_REGISTER.add(REGISTER340); - COMMA341=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4608); + COMMA341=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4608); stream_COMMA.add(COMMA341); - REGISTER342=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4610); + REGISTER342=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4610); stream_REGISTER.add(REGISTER342); - COMMA343=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4612); + COMMA343=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4612); stream_COMMA.add(COMMA343); pushFollow(FOLLOW_integral_literal_in_insn_format22b4614); @@ -11796,19 +11796,19 @@ public class smaliParser extends Parser { stream_integral_literal.add(integral_literal344.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT22b, REGISTER, integral_literal, REGISTER - // token labels: + // elements: REGISTER, REGISTER, integral_literal, INSTRUCTION_FORMAT22b + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 945:5: -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:945:8: ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) + // smaliParser.g:945:8: ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22b, (retval.start), "I_STATEMENT_FORMAT22b"), root_1); @@ -11853,7 +11853,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22c_field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:947:1: insn_format22c_field : INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ; + // smaliParser.g:947:1: insn_format22c_field : INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ; public final smaliParser.insn_format22c_field_return insn_format22c_field() throws RecognitionException { smaliParser.insn_format22c_field_return retval = new smaliParser.insn_format22c_field_return(); retval.start = input.LT(1); @@ -11878,22 +11878,22 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:948:3: ( INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:949:5: INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference + // smaliParser.g:948:3: ( INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ) + // smaliParser.g:949:5: INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference { - INSTRUCTION_FORMAT22c_FIELD345=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648); + INSTRUCTION_FORMAT22c_FIELD345=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648); stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD345); - REGISTER346=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4650); + REGISTER346=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4650); stream_REGISTER.add(REGISTER346); - COMMA347=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4652); + COMMA347=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4652); stream_COMMA.add(COMMA347); - REGISTER348=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4654); + REGISTER348=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4654); stream_REGISTER.add(REGISTER348); - COMMA349=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4656); + COMMA349=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4656); stream_COMMA.add(COMMA349); pushFollow(FOLLOW_field_reference_in_insn_format22c_field4658); @@ -11902,19 +11902,19 @@ public class smaliParser extends Parser { stream_field_reference.add(field_reference350.getTree()); // AST REWRITE - // elements: REGISTER, INSTRUCTION_FORMAT22c_FIELD, REGISTER, field_reference - // token labels: + // elements: INSTRUCTION_FORMAT22c_FIELD, REGISTER, field_reference, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 950:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:950:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) + // smaliParser.g:950:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1); @@ -11959,7 +11959,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22c_field_odex" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:952:1: insn_format22c_field_odex : INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ; + // smaliParser.g:952:1: insn_format22c_field_odex : INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ; public final smaliParser.insn_format22c_field_odex_return insn_format22c_field_odex() throws RecognitionException { smaliParser.insn_format22c_field_odex_return retval = new smaliParser.insn_format22c_field_odex_return(); retval.start = input.LT(1); @@ -11984,22 +11984,22 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:953:3: ( INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:954:5: INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference + // smaliParser.g:953:3: ( INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ) + // smaliParser.g:954:5: INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference { - INSTRUCTION_FORMAT22c_FIELD_ODEX351=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692); + INSTRUCTION_FORMAT22c_FIELD_ODEX351=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692); stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX351); - REGISTER352=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4694); + REGISTER352=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4694); stream_REGISTER.add(REGISTER352); - COMMA353=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4696); + COMMA353=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4696); stream_COMMA.add(COMMA353); - REGISTER354=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4698); + REGISTER354=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4698); stream_REGISTER.add(REGISTER354); - COMMA355=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4700); + COMMA355=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4700); stream_COMMA.add(COMMA355); pushFollow(FOLLOW_field_reference_in_insn_format22c_field_odex4702); @@ -12011,21 +12011,21 @@ public class smaliParser extends Parser { if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null)) == null || apiLevel >= 14) { throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null)); } - + // AST REWRITE - // elements: REGISTER, REGISTER, field_reference, INSTRUCTION_FORMAT22c_FIELD_ODEX - // token labels: + // elements: INSTRUCTION_FORMAT22c_FIELD_ODEX, field_reference, REGISTER, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 960:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:960:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) + // smaliParser.g:960:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1); @@ -12070,7 +12070,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:962:1: insn_format22c_type : INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ; + // smaliParser.g:962:1: insn_format22c_type : INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ; public final smaliParser.insn_format22c_type_return insn_format22c_type() throws RecognitionException { smaliParser.insn_format22c_type_return retval = new smaliParser.insn_format22c_type_return(); retval.start = input.LT(1); @@ -12095,22 +12095,22 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:963:3: ( INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:964:5: INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor + // smaliParser.g:963:3: ( INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ) + // smaliParser.g:964:5: INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor { - INSTRUCTION_FORMAT22c_TYPE357=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742); + INSTRUCTION_FORMAT22c_TYPE357=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742); stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE357); - REGISTER358=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4744); + REGISTER358=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4744); stream_REGISTER.add(REGISTER358); - COMMA359=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4746); + COMMA359=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4746); stream_COMMA.add(COMMA359); - REGISTER360=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4748); + REGISTER360=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4748); stream_REGISTER.add(REGISTER360); - COMMA361=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4750); + COMMA361=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4750); stream_COMMA.add(COMMA361); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type4752); @@ -12119,19 +12119,19 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor362.getTree()); // AST REWRITE - // elements: nonvoid_type_descriptor, REGISTER, INSTRUCTION_FORMAT22c_TYPE, REGISTER - // token labels: + // elements: REGISTER, REGISTER, nonvoid_type_descriptor, INSTRUCTION_FORMAT22c_TYPE + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 965:5: -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:965:8: ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) + // smaliParser.g:965:8: ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_TYPE, (retval.start), "I_STATEMENT_FORMAT22c_TYPE"), root_1); @@ -12176,7 +12176,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22cs_field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:967:1: insn_format22cs_field : INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ; + // smaliParser.g:967:1: insn_format22cs_field : INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ; public final smaliParser.insn_format22cs_field_return insn_format22cs_field() throws RecognitionException { smaliParser.insn_format22cs_field_return retval = new smaliParser.insn_format22cs_field_return(); retval.start = input.LT(1); @@ -12198,39 +12198,39 @@ public class smaliParser extends Parser { CommonTree FIELD_OFFSET368_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:968:3: ( INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:969:5: INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET + // smaliParser.g:968:3: ( INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ) + // smaliParser.g:969:5: INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT22cs_FIELD363=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786); + INSTRUCTION_FORMAT22cs_FIELD363=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786); INSTRUCTION_FORMAT22cs_FIELD363_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22cs_FIELD363); adaptor.addChild(root_0, INSTRUCTION_FORMAT22cs_FIELD363_tree); - REGISTER364=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4788); + REGISTER364=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4788); REGISTER364_tree = (CommonTree)adaptor.create(REGISTER364); adaptor.addChild(root_0, REGISTER364_tree); - COMMA365=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4790); + COMMA365=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4790); COMMA365_tree = (CommonTree)adaptor.create(COMMA365); adaptor.addChild(root_0, COMMA365_tree); - REGISTER366=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4792); + REGISTER366=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4792); REGISTER366_tree = (CommonTree)adaptor.create(REGISTER366); adaptor.addChild(root_0, REGISTER366_tree); - COMMA367=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4794); + COMMA367=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4794); COMMA367_tree = (CommonTree)adaptor.create(COMMA367); adaptor.addChild(root_0, COMMA367_tree); - FIELD_OFFSET368=(Token)match(input,FIELD_OFFSET,FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796); + FIELD_OFFSET368=(Token)match(input,FIELD_OFFSET,FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796); FIELD_OFFSET368_tree = (CommonTree)adaptor.create(FIELD_OFFSET368); adaptor.addChild(root_0, FIELD_OFFSET368_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22cs_FIELD363!=null?INSTRUCTION_FORMAT22cs_FIELD363.getText():null)); - + } retval.stop = input.LT(-1); @@ -12260,7 +12260,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22s" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:974:1: insn_format22s : instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ; + // smaliParser.g:974:1: insn_format22s : instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ; public final smaliParser.insn_format22s_return insn_format22s() throws RecognitionException { smaliParser.insn_format22s_return retval = new smaliParser.insn_format22s_return(); retval.start = input.LT(1); @@ -12284,24 +12284,24 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:975:3: ( instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:976:5: instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal + // smaliParser.g:975:3: ( instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ) + // smaliParser.g:976:5: instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal { pushFollow(FOLLOW_instruction_format22s_in_insn_format22s4817); instruction_format22s369=instruction_format22s(); state._fsp--; stream_instruction_format22s.add(instruction_format22s369.getTree()); - REGISTER370=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4819); + REGISTER370=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4819); stream_REGISTER.add(REGISTER370); - COMMA371=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4821); + COMMA371=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4821); stream_COMMA.add(COMMA371); - REGISTER372=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4823); + REGISTER372=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4823); stream_REGISTER.add(REGISTER372); - COMMA373=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4825); + COMMA373=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4825); stream_COMMA.add(COMMA373); pushFollow(FOLLOW_integral_literal_in_insn_format22s4827); @@ -12310,19 +12310,19 @@ public class smaliParser extends Parser { stream_integral_literal.add(integral_literal374.getTree()); // AST REWRITE - // elements: instruction_format22s, integral_literal, REGISTER, REGISTER - // token labels: + // elements: REGISTER, REGISTER, instruction_format22s, integral_literal + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 977:5: -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:977:8: ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) + // smaliParser.g:977:8: ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22s, (retval.start), "I_STATEMENT_FORMAT22s"), root_1); @@ -12367,7 +12367,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:979:1: insn_format22t : INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ; + // smaliParser.g:979:1: insn_format22t : INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ; public final smaliParser.insn_format22t_return insn_format22t() throws RecognitionException { smaliParser.insn_format22t_return retval = new smaliParser.insn_format22t_return(); retval.start = input.LT(1); @@ -12392,22 +12392,22 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:980:3: ( INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:981:5: INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref + // smaliParser.g:980:3: ( INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ) + // smaliParser.g:981:5: INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref { - INSTRUCTION_FORMAT22t375=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861); + INSTRUCTION_FORMAT22t375=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861); stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t375); - REGISTER376=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4863); + REGISTER376=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4863); stream_REGISTER.add(REGISTER376); - COMMA377=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4865); + COMMA377=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4865); stream_COMMA.add(COMMA377); - REGISTER378=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4867); + REGISTER378=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4867); stream_REGISTER.add(REGISTER378); - COMMA379=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4869); + COMMA379=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4869); stream_COMMA.add(COMMA379); pushFollow(FOLLOW_label_ref_in_insn_format22t4871); @@ -12416,19 +12416,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref380.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT22t, REGISTER, label_ref, REGISTER - // token labels: + // elements: REGISTER, INSTRUCTION_FORMAT22t, REGISTER, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 982:5: -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:982:8: ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) + // smaliParser.g:982:8: ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22t, (retval.start), "I_STATEMENT_FFORMAT22t"), root_1); @@ -12473,7 +12473,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format22x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:984:1: insn_format22x : INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ; + // smaliParser.g:984:1: insn_format22x : INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ; public final smaliParser.insn_format22x_return insn_format22x() throws RecognitionException { smaliParser.insn_format22x_return retval = new smaliParser.insn_format22x_return(); retval.start = input.LT(1); @@ -12494,35 +12494,35 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:985:3: ( INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:986:5: INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER + // smaliParser.g:985:3: ( INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ) + // smaliParser.g:986:5: INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER { - INSTRUCTION_FORMAT22x381=(Token)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905); + INSTRUCTION_FORMAT22x381=(Token)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905); stream_INSTRUCTION_FORMAT22x.add(INSTRUCTION_FORMAT22x381); - REGISTER382=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4907); + REGISTER382=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4907); stream_REGISTER.add(REGISTER382); - COMMA383=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22x4909); + COMMA383=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22x4909); stream_COMMA.add(COMMA383); - REGISTER384=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4911); + REGISTER384=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4911); stream_REGISTER.add(REGISTER384); // AST REWRITE - // elements: REGISTER, INSTRUCTION_FORMAT22x, REGISTER - // token labels: + // elements: REGISTER, REGISTER, INSTRUCTION_FORMAT22x + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 987:5: -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:987:8: ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) + // smaliParser.g:987:8: ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22x, (retval.start), "I_STATEMENT_FORMAT22x"), root_1); @@ -12566,7 +12566,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format23x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:989:1: insn_format23x : INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ; + // smaliParser.g:989:1: insn_format23x : INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ; public final smaliParser.insn_format23x_return insn_format23x() throws RecognitionException { smaliParser.insn_format23x_return retval = new smaliParser.insn_format23x_return(); retval.start = input.LT(1); @@ -12591,41 +12591,41 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT23x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT23x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:990:3: ( INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:991:5: INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER + // smaliParser.g:990:3: ( INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ) + // smaliParser.g:991:5: INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER { - INSTRUCTION_FORMAT23x385=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943); + INSTRUCTION_FORMAT23x385=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943); stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x385); - REGISTER386=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4945); + REGISTER386=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4945); stream_REGISTER.add(REGISTER386); - COMMA387=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4947); + COMMA387=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4947); stream_COMMA.add(COMMA387); - REGISTER388=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4949); + REGISTER388=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4949); stream_REGISTER.add(REGISTER388); - COMMA389=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4951); + COMMA389=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4951); stream_COMMA.add(COMMA389); - REGISTER390=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4953); + REGISTER390=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4953); stream_REGISTER.add(REGISTER390); // AST REWRITE - // elements: REGISTER, INSTRUCTION_FORMAT23x, REGISTER, REGISTER - // token labels: + // elements: REGISTER, REGISTER, INSTRUCTION_FORMAT23x, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 992:5: -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:992:8: ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) + // smaliParser.g:992:8: ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT23x, (retval.start), "I_STATEMENT_FORMAT23x"), root_1); @@ -12670,7 +12670,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format30t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:994:1: insn_format30t : INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ; + // smaliParser.g:994:1: insn_format30t : INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ; public final smaliParser.insn_format30t_return insn_format30t() throws RecognitionException { smaliParser.insn_format30t_return retval = new smaliParser.insn_format30t_return(); retval.start = input.LT(1); @@ -12685,10 +12685,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:995:3: ( INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:996:5: INSTRUCTION_FORMAT30t label_ref + // smaliParser.g:995:3: ( INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ) + // smaliParser.g:996:5: INSTRUCTION_FORMAT30t label_ref { - INSTRUCTION_FORMAT30t391=(Token)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987); + INSTRUCTION_FORMAT30t391=(Token)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987); stream_INSTRUCTION_FORMAT30t.add(INSTRUCTION_FORMAT30t391); pushFollow(FOLLOW_label_ref_in_insn_format30t4989); @@ -12697,19 +12697,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref392.getTree()); // AST REWRITE - // elements: label_ref, INSTRUCTION_FORMAT30t - // token labels: + // elements: INSTRUCTION_FORMAT30t, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 997:5: -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:997:8: ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) + // smaliParser.g:997:8: ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT30t, (retval.start), "I_STATEMENT_FORMAT30t"), root_1); @@ -12752,7 +12752,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format31c" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:999:1: insn_format31c : INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ; + // smaliParser.g:999:1: insn_format31c : INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ; public final smaliParser.insn_format31c_return insn_format31c() throws RecognitionException { smaliParser.insn_format31c_return retval = new smaliParser.insn_format31c_return(); retval.start = input.LT(1); @@ -12774,35 +12774,35 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1000:3: ( INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1001:5: INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL + // smaliParser.g:1000:3: ( INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ) + // smaliParser.g:1001:5: INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL { - INSTRUCTION_FORMAT31c393=(Token)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019); + INSTRUCTION_FORMAT31c393=(Token)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019); stream_INSTRUCTION_FORMAT31c.add(INSTRUCTION_FORMAT31c393); - REGISTER394=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c5021); + REGISTER394=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c5021); stream_REGISTER.add(REGISTER394); - COMMA395=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31c5023); + COMMA395=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31c5023); stream_COMMA.add(COMMA395); - STRING_LITERAL396=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format31c5025); + STRING_LITERAL396=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format31c5025); stream_STRING_LITERAL.add(STRING_LITERAL396); // AST REWRITE - // elements: STRING_LITERAL, INSTRUCTION_FORMAT31c, REGISTER - // token labels: + // elements: REGISTER, STRING_LITERAL, INSTRUCTION_FORMAT31c + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1002:5: -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1002:7: ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) + // smaliParser.g:1002:7: ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31c, (retval.start), "I_STATEMENT_FORMAT31c"), root_1); @@ -12846,7 +12846,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format31i" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1004:1: insn_format31i : instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ; + // smaliParser.g:1004:1: insn_format31i : instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ; public final smaliParser.insn_format31i_return insn_format31i() throws RecognitionException { smaliParser.insn_format31i_return retval = new smaliParser.insn_format31i_return(); retval.start = input.LT(1); @@ -12866,18 +12866,18 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_instruction_format31i=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format31i"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1005:3: ( instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1006:5: instruction_format31i REGISTER COMMA fixed_32bit_literal + // smaliParser.g:1005:3: ( instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ) + // smaliParser.g:1006:5: instruction_format31i REGISTER COMMA fixed_32bit_literal { pushFollow(FOLLOW_instruction_format31i_in_insn_format31i5056); instruction_format31i397=instruction_format31i(); state._fsp--; stream_instruction_format31i.add(instruction_format31i397.getTree()); - REGISTER398=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i5058); + REGISTER398=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i5058); stream_REGISTER.add(REGISTER398); - COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31i5060); + COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31i5060); stream_COMMA.add(COMMA399); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i5062); @@ -12886,19 +12886,19 @@ public class smaliParser extends Parser { stream_fixed_32bit_literal.add(fixed_32bit_literal400.getTree()); // AST REWRITE - // elements: REGISTER, instruction_format31i, fixed_32bit_literal - // token labels: + // elements: instruction_format31i, REGISTER, fixed_32bit_literal + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1007:5: -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1007:8: ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) + // smaliParser.g:1007:8: ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31i, (retval.start), "I_STATEMENT_FORMAT31i"), root_1); @@ -12942,7 +12942,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format31t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1009:1: insn_format31t : INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ; + // smaliParser.g:1009:1: insn_format31t : INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ; public final smaliParser.insn_format31t_return insn_format31t() throws RecognitionException { smaliParser.insn_format31t_return retval = new smaliParser.insn_format31t_return(); retval.start = input.LT(1); @@ -12963,16 +12963,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1010:3: ( INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1011:5: INSTRUCTION_FORMAT31t REGISTER COMMA label_ref + // smaliParser.g:1010:3: ( INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ) + // smaliParser.g:1011:5: INSTRUCTION_FORMAT31t REGISTER COMMA label_ref { - INSTRUCTION_FORMAT31t401=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094); + INSTRUCTION_FORMAT31t401=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094); stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t401); - REGISTER402=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t5096); + REGISTER402=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t5096); stream_REGISTER.add(REGISTER402); - COMMA403=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31t5098); + COMMA403=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31t5098); stream_COMMA.add(COMMA403); pushFollow(FOLLOW_label_ref_in_insn_format31t5100); @@ -12981,19 +12981,19 @@ public class smaliParser extends Parser { stream_label_ref.add(label_ref404.getTree()); // AST REWRITE - // elements: label_ref, REGISTER, INSTRUCTION_FORMAT31t - // token labels: + // elements: INSTRUCTION_FORMAT31t, REGISTER, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1012:5: -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1012:8: ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) + // smaliParser.g:1012:8: ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31t, (retval.start), "I_STATEMENT_FORMAT31t"), root_1); @@ -13037,7 +13037,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format32x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1014:1: insn_format32x : INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ; + // smaliParser.g:1014:1: insn_format32x : INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ; public final smaliParser.insn_format32x_return insn_format32x() throws RecognitionException { smaliParser.insn_format32x_return retval = new smaliParser.insn_format32x_return(); retval.start = input.LT(1); @@ -13058,35 +13058,35 @@ public class smaliParser extends Parser { RewriteRuleTokenStream stream_INSTRUCTION_FORMAT32x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT32x"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1015:3: ( INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1016:5: INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER + // smaliParser.g:1015:3: ( INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ) + // smaliParser.g:1016:5: INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER { - INSTRUCTION_FORMAT32x405=(Token)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132); + INSTRUCTION_FORMAT32x405=(Token)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132); stream_INSTRUCTION_FORMAT32x.add(INSTRUCTION_FORMAT32x405); - REGISTER406=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5134); + REGISTER406=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5134); stream_REGISTER.add(REGISTER406); - COMMA407=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format32x5136); + COMMA407=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format32x5136); stream_COMMA.add(COMMA407); - REGISTER408=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5138); + REGISTER408=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5138); stream_REGISTER.add(REGISTER408); // AST REWRITE - // elements: REGISTER, INSTRUCTION_FORMAT32x, REGISTER - // token labels: + // elements: INSTRUCTION_FORMAT32x, REGISTER, REGISTER + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1017:5: -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1017:8: ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) + // smaliParser.g:1017:8: ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT32x, (retval.start), "I_STATEMENT_FORMAT32x"), root_1); @@ -13130,7 +13130,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format35c_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1019:1: insn_format35c_method : INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ; + // smaliParser.g:1019:1: insn_format35c_method : INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ; public final smaliParser.insn_format35c_method_return insn_format35c_method() throws RecognitionException { smaliParser.insn_format35c_method_return retval = new smaliParser.insn_format35c_method_return(); retval.start = input.LT(1); @@ -13156,13 +13156,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1020:3: ( INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1021:5: INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference + // smaliParser.g:1020:3: ( INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ) + // smaliParser.g:1021:5: INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference { - INSTRUCTION_FORMAT35c_METHOD409=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170); + INSTRUCTION_FORMAT35c_METHOD409=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170); stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD409); - OPEN_BRACE410=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method5172); + OPEN_BRACE410=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method5172); stream_OPEN_BRACE.add(OPEN_BRACE410); pushFollow(FOLLOW_register_list_in_insn_format35c_method5174); @@ -13170,10 +13170,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_list.add(register_list411.getTree()); - CLOSE_BRACE412=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176); + CLOSE_BRACE412=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176); stream_CLOSE_BRACE.add(CLOSE_BRACE412); - COMMA413=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method5178); + COMMA413=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method5178); stream_COMMA.add(COMMA413); pushFollow(FOLLOW_method_reference_in_insn_format35c_method5180); @@ -13182,19 +13182,19 @@ public class smaliParser extends Parser { stream_method_reference.add(method_reference414.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT35c_METHOD, method_reference, register_list - // token labels: + // elements: INSTRUCTION_FORMAT35c_METHOD, register_list, method_reference + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1022:5: -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1022:8: ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) + // smaliParser.g:1022:8: ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_METHOD, (retval.start), "I_STATEMENT_FORMAT35c_METHOD"), root_1); @@ -13238,7 +13238,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format35c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1024:1: insn_format35c_type : INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ; + // smaliParser.g:1024:1: insn_format35c_type : INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ; public final smaliParser.insn_format35c_type_return insn_format35c_type() throws RecognitionException { smaliParser.insn_format35c_type_return retval = new smaliParser.insn_format35c_type_return(); retval.start = input.LT(1); @@ -13264,13 +13264,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1025:3: ( INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1026:5: INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor + // smaliParser.g:1025:3: ( INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ) + // smaliParser.g:1026:5: INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor { - INSTRUCTION_FORMAT35c_TYPE415=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212); + INSTRUCTION_FORMAT35c_TYPE415=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212); stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE415); - OPEN_BRACE416=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_type5214); + OPEN_BRACE416=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_type5214); stream_OPEN_BRACE.add(OPEN_BRACE416); pushFollow(FOLLOW_register_list_in_insn_format35c_type5216); @@ -13278,10 +13278,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_list.add(register_list417.getTree()); - CLOSE_BRACE418=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218); + CLOSE_BRACE418=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218); stream_CLOSE_BRACE.add(CLOSE_BRACE418); - COMMA419=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_type5220); + COMMA419=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_type5220); stream_COMMA.add(COMMA419); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type5222); @@ -13290,19 +13290,19 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor420.getTree()); // AST REWRITE - // elements: nonvoid_type_descriptor, INSTRUCTION_FORMAT35c_TYPE, register_list - // token labels: + // elements: register_list, INSTRUCTION_FORMAT35c_TYPE, nonvoid_type_descriptor + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1027:5: -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1027:8: ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) + // smaliParser.g:1027:8: ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_TYPE, (retval.start), "I_STATEMENT_FORMAT35c_TYPE"), root_1); @@ -13346,7 +13346,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format35c_method_odex" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1029:1: insn_format35c_method_odex : INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ; + // smaliParser.g:1029:1: insn_format35c_method_odex : INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ; public final smaliParser.insn_format35c_method_odex_return insn_format35c_method_odex() throws RecognitionException { smaliParser.insn_format35c_method_odex_return retval = new smaliParser.insn_format35c_method_odex_return(); retval.start = input.LT(1); @@ -13366,17 +13366,17 @@ public class smaliParser extends Parser { CommonTree COMMA425_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1030:3: ( INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1031:5: INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference + // smaliParser.g:1030:3: ( INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ) + // smaliParser.g:1031:5: INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT35c_METHOD_ODEX421=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254); + INSTRUCTION_FORMAT35c_METHOD_ODEX421=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254); INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35c_METHOD_ODEX421); adaptor.addChild(root_0, INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree); - OPEN_BRACE422=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256); + OPEN_BRACE422=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256); OPEN_BRACE422_tree = (CommonTree)adaptor.create(OPEN_BRACE422); adaptor.addChild(root_0, OPEN_BRACE422_tree); @@ -13386,11 +13386,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_list423.getTree()); - CLOSE_BRACE424=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260); + CLOSE_BRACE424=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260); CLOSE_BRACE424_tree = (CommonTree)adaptor.create(CLOSE_BRACE424); adaptor.addChild(root_0, CLOSE_BRACE424_tree); - COMMA425=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method_odex5262); + COMMA425=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method_odex5262); COMMA425_tree = (CommonTree)adaptor.create(COMMA425); adaptor.addChild(root_0, COMMA425_tree); @@ -13402,7 +13402,7 @@ public class smaliParser extends Parser { throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35c_METHOD_ODEX421!=null?INSTRUCTION_FORMAT35c_METHOD_ODEX421.getText():null)); - + } retval.stop = input.LT(-1); @@ -13432,7 +13432,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format35mi_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1036:1: insn_format35mi_method : INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ; + // smaliParser.g:1036:1: insn_format35mi_method : INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ; public final smaliParser.insn_format35mi_method_return insn_format35mi_method() throws RecognitionException { smaliParser.insn_format35mi_method_return retval = new smaliParser.insn_format35mi_method_return(); retval.start = input.LT(1); @@ -13453,17 +13453,17 @@ public class smaliParser extends Parser { CommonTree INLINE_INDEX432_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1037:3: ( INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1038:5: INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX + // smaliParser.g:1037:3: ( INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ) + // smaliParser.g:1038:5: INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT35mi_METHOD427=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285); + INSTRUCTION_FORMAT35mi_METHOD427=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285); INSTRUCTION_FORMAT35mi_METHOD427_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35mi_METHOD427); adaptor.addChild(root_0, INSTRUCTION_FORMAT35mi_METHOD427_tree); - OPEN_BRACE428=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287); + OPEN_BRACE428=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287); OPEN_BRACE428_tree = (CommonTree)adaptor.create(OPEN_BRACE428); adaptor.addChild(root_0, OPEN_BRACE428_tree); @@ -13473,21 +13473,21 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_list429.getTree()); - CLOSE_BRACE430=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291); + CLOSE_BRACE430=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291); CLOSE_BRACE430_tree = (CommonTree)adaptor.create(CLOSE_BRACE430); adaptor.addChild(root_0, CLOSE_BRACE430_tree); - COMMA431=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35mi_method5293); + COMMA431=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35mi_method5293); COMMA431_tree = (CommonTree)adaptor.create(COMMA431); adaptor.addChild(root_0, COMMA431_tree); - INLINE_INDEX432=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295); + INLINE_INDEX432=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295); INLINE_INDEX432_tree = (CommonTree)adaptor.create(INLINE_INDEX432); adaptor.addChild(root_0, INLINE_INDEX432_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35mi_METHOD427!=null?INSTRUCTION_FORMAT35mi_METHOD427.getText():null)); - + } retval.stop = input.LT(-1); @@ -13517,7 +13517,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format35ms_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1043:1: insn_format35ms_method : INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ; + // smaliParser.g:1043:1: insn_format35ms_method : INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ; public final smaliParser.insn_format35ms_method_return insn_format35ms_method() throws RecognitionException { smaliParser.insn_format35ms_method_return retval = new smaliParser.insn_format35ms_method_return(); retval.start = input.LT(1); @@ -13538,17 +13538,17 @@ public class smaliParser extends Parser { CommonTree VTABLE_INDEX438_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1044:3: ( INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1045:5: INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX + // smaliParser.g:1044:3: ( INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ) + // smaliParser.g:1045:5: INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT35ms_METHOD433=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316); + INSTRUCTION_FORMAT35ms_METHOD433=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316); INSTRUCTION_FORMAT35ms_METHOD433_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35ms_METHOD433); adaptor.addChild(root_0, INSTRUCTION_FORMAT35ms_METHOD433_tree); - OPEN_BRACE434=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318); + OPEN_BRACE434=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318); OPEN_BRACE434_tree = (CommonTree)adaptor.create(OPEN_BRACE434); adaptor.addChild(root_0, OPEN_BRACE434_tree); @@ -13558,21 +13558,21 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_list435.getTree()); - CLOSE_BRACE436=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322); + CLOSE_BRACE436=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322); CLOSE_BRACE436_tree = (CommonTree)adaptor.create(CLOSE_BRACE436); adaptor.addChild(root_0, CLOSE_BRACE436_tree); - COMMA437=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35ms_method5324); + COMMA437=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35ms_method5324); COMMA437_tree = (CommonTree)adaptor.create(COMMA437); adaptor.addChild(root_0, COMMA437_tree); - VTABLE_INDEX438=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326); + VTABLE_INDEX438=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326); VTABLE_INDEX438_tree = (CommonTree)adaptor.create(VTABLE_INDEX438); adaptor.addChild(root_0, VTABLE_INDEX438_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35ms_METHOD433!=null?INSTRUCTION_FORMAT35ms_METHOD433.getText():null)); - + } retval.stop = input.LT(-1); @@ -13602,7 +13602,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format3rc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1050:1: insn_format3rc_method : INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ; + // smaliParser.g:1050:1: insn_format3rc_method : INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ; public final smaliParser.insn_format3rc_method_return insn_format3rc_method() throws RecognitionException { smaliParser.insn_format3rc_method_return retval = new smaliParser.insn_format3rc_method_return(); retval.start = input.LT(1); @@ -13628,13 +13628,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1051:3: ( INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1052:5: INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference + // smaliParser.g:1051:3: ( INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ) + // smaliParser.g:1052:5: INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference { - INSTRUCTION_FORMAT3rc_METHOD439=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347); + INSTRUCTION_FORMAT3rc_METHOD439=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347); stream_INSTRUCTION_FORMAT3rc_METHOD.add(INSTRUCTION_FORMAT3rc_METHOD439); - OPEN_BRACE440=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349); + OPEN_BRACE440=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349); stream_OPEN_BRACE.add(OPEN_BRACE440); pushFollow(FOLLOW_register_range_in_insn_format3rc_method5351); @@ -13642,10 +13642,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_range.add(register_range441.getTree()); - CLOSE_BRACE442=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353); + CLOSE_BRACE442=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353); stream_CLOSE_BRACE.add(CLOSE_BRACE442); - COMMA443=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method5355); + COMMA443=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method5355); stream_COMMA.add(COMMA443); pushFollow(FOLLOW_method_reference_in_insn_format3rc_method5357); @@ -13654,19 +13654,19 @@ public class smaliParser extends Parser { stream_method_reference.add(method_reference444.getTree()); // AST REWRITE - // elements: method_reference, INSTRUCTION_FORMAT3rc_METHOD, register_range - // token labels: + // elements: register_range, INSTRUCTION_FORMAT3rc_METHOD, method_reference + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1053:5: -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1053:8: ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) + // smaliParser.g:1053:8: ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_METHOD, (retval.start), "I_STATEMENT_FORMAT3rc_METHOD"), root_1); @@ -13710,7 +13710,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format3rc_method_odex" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1055:1: insn_format3rc_method_odex : INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ; + // smaliParser.g:1055:1: insn_format3rc_method_odex : INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ; public final smaliParser.insn_format3rc_method_odex_return insn_format3rc_method_odex() throws RecognitionException { smaliParser.insn_format3rc_method_odex_return retval = new smaliParser.insn_format3rc_method_odex_return(); retval.start = input.LT(1); @@ -13730,17 +13730,17 @@ public class smaliParser extends Parser { CommonTree COMMA449_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1056:3: ( INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1057:5: INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference + // smaliParser.g:1056:3: ( INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ) + // smaliParser.g:1057:5: INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT3rc_METHOD_ODEX445=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389); + INSTRUCTION_FORMAT3rc_METHOD_ODEX445=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389); INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rc_METHOD_ODEX445); adaptor.addChild(root_0, INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree); - OPEN_BRACE446=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391); + OPEN_BRACE446=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391); OPEN_BRACE446_tree = (CommonTree)adaptor.create(OPEN_BRACE446); adaptor.addChild(root_0, OPEN_BRACE446_tree); @@ -13750,11 +13750,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_list447.getTree()); - CLOSE_BRACE448=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395); + CLOSE_BRACE448=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395); CLOSE_BRACE448_tree = (CommonTree)adaptor.create(CLOSE_BRACE448); adaptor.addChild(root_0, CLOSE_BRACE448_tree); - COMMA449=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method_odex5397); + COMMA449=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method_odex5397); COMMA449_tree = (CommonTree)adaptor.create(COMMA449); adaptor.addChild(root_0, COMMA449_tree); @@ -13766,7 +13766,7 @@ public class smaliParser extends Parser { throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rc_METHOD_ODEX445!=null?INSTRUCTION_FORMAT3rc_METHOD_ODEX445.getText():null)); - + } retval.stop = input.LT(-1); @@ -13796,7 +13796,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format3rc_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1062:1: insn_format3rc_type : INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ; + // smaliParser.g:1062:1: insn_format3rc_type : INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ; public final smaliParser.insn_format3rc_type_return insn_format3rc_type() throws RecognitionException { smaliParser.insn_format3rc_type_return retval = new smaliParser.insn_format3rc_type_return(); retval.start = input.LT(1); @@ -13822,13 +13822,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1063:3: ( INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1064:5: INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor + // smaliParser.g:1063:3: ( INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ) + // smaliParser.g:1064:5: INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor { - INSTRUCTION_FORMAT3rc_TYPE451=(Token)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420); + INSTRUCTION_FORMAT3rc_TYPE451=(Token)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420); stream_INSTRUCTION_FORMAT3rc_TYPE.add(INSTRUCTION_FORMAT3rc_TYPE451); - OPEN_BRACE452=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422); + OPEN_BRACE452=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422); stream_OPEN_BRACE.add(OPEN_BRACE452); pushFollow(FOLLOW_register_range_in_insn_format3rc_type5424); @@ -13836,10 +13836,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_range.add(register_range453.getTree()); - CLOSE_BRACE454=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426); + CLOSE_BRACE454=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426); stream_CLOSE_BRACE.add(CLOSE_BRACE454); - COMMA455=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_type5428); + COMMA455=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_type5428); stream_COMMA.add(COMMA455); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type5430); @@ -13848,19 +13848,19 @@ public class smaliParser extends Parser { stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor456.getTree()); // AST REWRITE - // elements: nonvoid_type_descriptor, register_range, INSTRUCTION_FORMAT3rc_TYPE - // token labels: + // elements: nonvoid_type_descriptor, INSTRUCTION_FORMAT3rc_TYPE, register_range + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1065:5: -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1065:8: ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) + // smaliParser.g:1065:8: ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_TYPE, (retval.start), "I_STATEMENT_FORMAT3rc_TYPE"), root_1); @@ -13904,7 +13904,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format3rmi_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1067:1: insn_format3rmi_method : INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ; + // smaliParser.g:1067:1: insn_format3rmi_method : INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ; public final smaliParser.insn_format3rmi_method_return insn_format3rmi_method() throws RecognitionException { smaliParser.insn_format3rmi_method_return retval = new smaliParser.insn_format3rmi_method_return(); retval.start = input.LT(1); @@ -13925,17 +13925,17 @@ public class smaliParser extends Parser { CommonTree INLINE_INDEX462_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1068:3: ( INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1069:5: INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX + // smaliParser.g:1068:3: ( INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ) + // smaliParser.g:1069:5: INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT3rmi_METHOD457=(Token)match(input,INSTRUCTION_FORMAT3rmi_METHOD,FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462); + INSTRUCTION_FORMAT3rmi_METHOD457=(Token)match(input,INSTRUCTION_FORMAT3rmi_METHOD,FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462); INSTRUCTION_FORMAT3rmi_METHOD457_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rmi_METHOD457); adaptor.addChild(root_0, INSTRUCTION_FORMAT3rmi_METHOD457_tree); - OPEN_BRACE458=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464); + OPEN_BRACE458=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464); OPEN_BRACE458_tree = (CommonTree)adaptor.create(OPEN_BRACE458); adaptor.addChild(root_0, OPEN_BRACE458_tree); @@ -13945,21 +13945,21 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_range459.getTree()); - CLOSE_BRACE460=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468); + CLOSE_BRACE460=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468); CLOSE_BRACE460_tree = (CommonTree)adaptor.create(CLOSE_BRACE460); adaptor.addChild(root_0, CLOSE_BRACE460_tree); - COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rmi_method5470); + COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rmi_method5470); COMMA461_tree = (CommonTree)adaptor.create(COMMA461); adaptor.addChild(root_0, COMMA461_tree); - INLINE_INDEX462=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472); + INLINE_INDEX462=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472); INLINE_INDEX462_tree = (CommonTree)adaptor.create(INLINE_INDEX462); adaptor.addChild(root_0, INLINE_INDEX462_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rmi_METHOD457!=null?INSTRUCTION_FORMAT3rmi_METHOD457.getText():null)); - + } retval.stop = input.LT(-1); @@ -13989,7 +13989,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format3rms_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1074:1: insn_format3rms_method : INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ; + // smaliParser.g:1074:1: insn_format3rms_method : INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ; public final smaliParser.insn_format3rms_method_return insn_format3rms_method() throws RecognitionException { smaliParser.insn_format3rms_method_return retval = new smaliParser.insn_format3rms_method_return(); retval.start = input.LT(1); @@ -14010,17 +14010,17 @@ public class smaliParser extends Parser { CommonTree VTABLE_INDEX468_tree=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1075:3: ( INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1076:5: INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX + // smaliParser.g:1075:3: ( INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ) + // smaliParser.g:1076:5: INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX { root_0 = (CommonTree)adaptor.nil(); - INSTRUCTION_FORMAT3rms_METHOD463=(Token)match(input,INSTRUCTION_FORMAT3rms_METHOD,FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493); + INSTRUCTION_FORMAT3rms_METHOD463=(Token)match(input,INSTRUCTION_FORMAT3rms_METHOD,FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493); INSTRUCTION_FORMAT3rms_METHOD463_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rms_METHOD463); adaptor.addChild(root_0, INSTRUCTION_FORMAT3rms_METHOD463_tree); - OPEN_BRACE464=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495); + OPEN_BRACE464=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495); OPEN_BRACE464_tree = (CommonTree)adaptor.create(OPEN_BRACE464); adaptor.addChild(root_0, OPEN_BRACE464_tree); @@ -14030,21 +14030,21 @@ public class smaliParser extends Parser { adaptor.addChild(root_0, register_range465.getTree()); - CLOSE_BRACE466=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499); + CLOSE_BRACE466=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499); CLOSE_BRACE466_tree = (CommonTree)adaptor.create(CLOSE_BRACE466); adaptor.addChild(root_0, CLOSE_BRACE466_tree); - COMMA467=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rms_method5501); + COMMA467=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rms_method5501); COMMA467_tree = (CommonTree)adaptor.create(COMMA467); adaptor.addChild(root_0, COMMA467_tree); - VTABLE_INDEX468=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503); + VTABLE_INDEX468=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503); VTABLE_INDEX468_tree = (CommonTree)adaptor.create(VTABLE_INDEX468); adaptor.addChild(root_0, VTABLE_INDEX468_tree); throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rms_METHOD463!=null?INSTRUCTION_FORMAT3rms_METHOD463.getText():null)); - + } retval.stop = input.LT(-1); @@ -14074,7 +14074,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format45cc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1081:1: insn_format45cc_method : INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ; + // smaliParser.g:1081:1: insn_format45cc_method : INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ; public final smaliParser.insn_format45cc_method_return insn_format45cc_method() throws RecognitionException { smaliParser.insn_format45cc_method_return retval = new smaliParser.insn_format45cc_method_return(); retval.start = input.LT(1); @@ -14104,13 +14104,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1082:3: ( INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1083:5: INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype + // smaliParser.g:1082:3: ( INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ) + // smaliParser.g:1083:5: INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype { - INSTRUCTION_FORMAT45cc_METHOD469=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524); + INSTRUCTION_FORMAT45cc_METHOD469=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524); stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD469); - OPEN_BRACE470=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526); + OPEN_BRACE470=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526); stream_OPEN_BRACE.add(OPEN_BRACE470); pushFollow(FOLLOW_register_list_in_insn_format45cc_method5528); @@ -14118,10 +14118,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_list.add(register_list471.getTree()); - CLOSE_BRACE472=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530); + CLOSE_BRACE472=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530); stream_CLOSE_BRACE.add(CLOSE_BRACE472); - COMMA473=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5532); + COMMA473=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5532); stream_COMMA.add(COMMA473); pushFollow(FOLLOW_method_reference_in_insn_format45cc_method5534); @@ -14129,7 +14129,7 @@ public class smaliParser extends Parser { state._fsp--; stream_method_reference.add(method_reference474.getTree()); - COMMA475=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5536); + COMMA475=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5536); stream_COMMA.add(COMMA475); pushFollow(FOLLOW_method_prototype_in_insn_format45cc_method5538); @@ -14138,19 +14138,19 @@ public class smaliParser extends Parser { stream_method_prototype.add(method_prototype476.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT45cc_METHOD, method_prototype, register_list, method_reference - // token labels: + // elements: method_reference, method_prototype, INSTRUCTION_FORMAT45cc_METHOD, register_list + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1084:5: -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1084:8: ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) + // smaliParser.g:1084:8: ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT45cc_METHOD, (retval.start), "I_STATEMENT_FORMAT45cc_METHOD"), root_1); @@ -14195,7 +14195,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format4rcc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1086:1: insn_format4rcc_method : INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ; + // smaliParser.g:1086:1: insn_format4rcc_method : INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ; public final smaliParser.insn_format4rcc_method_return insn_format4rcc_method() throws RecognitionException { smaliParser.insn_format4rcc_method_return retval = new smaliParser.insn_format4rcc_method_return(); retval.start = input.LT(1); @@ -14225,13 +14225,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1087:3: ( INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1088:5: INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype + // smaliParser.g:1087:3: ( INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ) + // smaliParser.g:1088:5: INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype { - INSTRUCTION_FORMAT4rcc_METHOD477=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572); + INSTRUCTION_FORMAT4rcc_METHOD477=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572); stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD477); - OPEN_BRACE478=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574); + OPEN_BRACE478=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574); stream_OPEN_BRACE.add(OPEN_BRACE478); pushFollow(FOLLOW_register_range_in_insn_format4rcc_method5576); @@ -14239,10 +14239,10 @@ public class smaliParser extends Parser { state._fsp--; stream_register_range.add(register_range479.getTree()); - CLOSE_BRACE480=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578); + CLOSE_BRACE480=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578); stream_CLOSE_BRACE.add(CLOSE_BRACE480); - COMMA481=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5580); + COMMA481=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5580); stream_COMMA.add(COMMA481); pushFollow(FOLLOW_method_reference_in_insn_format4rcc_method5582); @@ -14250,7 +14250,7 @@ public class smaliParser extends Parser { state._fsp--; stream_method_reference.add(method_reference482.getTree()); - COMMA483=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5584); + COMMA483=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5584); stream_COMMA.add(COMMA483); pushFollow(FOLLOW_method_prototype_in_insn_format4rcc_method5586); @@ -14259,19 +14259,19 @@ public class smaliParser extends Parser { stream_method_prototype.add(method_prototype484.getTree()); // AST REWRITE - // elements: method_reference, INSTRUCTION_FORMAT4rcc_METHOD, register_range, method_prototype - // token labels: + // elements: register_range, INSTRUCTION_FORMAT4rcc_METHOD, method_reference, method_prototype + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1089:5: -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1089:8: ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) + // smaliParser.g:1089:8: ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT4rcc_METHOD, (retval.start), "I_STATEMENT_FORMAT4rcc_METHOD"), root_1); @@ -14316,7 +14316,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_format51l" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1091:1: insn_format51l : INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ; + // smaliParser.g:1091:1: insn_format51l : INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ; public final smaliParser.insn_format51l_return insn_format51l() throws RecognitionException { smaliParser.insn_format51l_return retval = new smaliParser.insn_format51l_return(); retval.start = input.LT(1); @@ -14337,16 +14337,16 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1092:3: ( INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1093:5: INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal + // smaliParser.g:1092:3: ( INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ) + // smaliParser.g:1093:5: INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal { - INSTRUCTION_FORMAT51l485=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620); + INSTRUCTION_FORMAT51l485=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620); stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l485); - REGISTER486=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l5622); + REGISTER486=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l5622); stream_REGISTER.add(REGISTER486); - COMMA487=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format51l5624); + COMMA487=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format51l5624); stream_COMMA.add(COMMA487); pushFollow(FOLLOW_fixed_literal_in_insn_format51l5626); @@ -14355,19 +14355,19 @@ public class smaliParser extends Parser { stream_fixed_literal.add(fixed_literal488.getTree()); // AST REWRITE - // elements: INSTRUCTION_FORMAT51l, REGISTER, fixed_literal - // token labels: + // elements: REGISTER, INSTRUCTION_FORMAT51l, fixed_literal + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1094:5: -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1094:8: ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) + // smaliParser.g:1094:8: ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT51l, (retval.start), "I_STATEMENT_FORMAT51l"), root_1); @@ -14411,7 +14411,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_array_data_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1096:1: insn_array_data_directive : ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ; + // smaliParser.g:1096:1: insn_array_data_directive : ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ; public final smaliParser.insn_array_data_directive_return insn_array_data_directive() throws RecognitionException { smaliParser.insn_array_data_directive_return retval = new smaliParser.insn_array_data_directive_return(); retval.start = input.LT(1); @@ -14431,10 +14431,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1097:3: ( ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1097:5: ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE + // smaliParser.g:1097:3: ( ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ) + // smaliParser.g:1097:5: ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE { - ARRAY_DATA_DIRECTIVE489=(Token)match(input,ARRAY_DATA_DIRECTIVE,FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653); + ARRAY_DATA_DIRECTIVE489=(Token)match(input,ARRAY_DATA_DIRECTIVE,FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653); stream_ARRAY_DATA_DIRECTIVE.add(ARRAY_DATA_DIRECTIVE489); pushFollow(FOLLOW_parsed_integer_literal_in_insn_array_data_directive5659); @@ -14447,8 +14447,8 @@ public class smaliParser extends Parser { if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) { throw new SemanticException(input, (retval.start), "Invalid element width: %d. Must be 1, 2, 4 or 8", elementWidth); } - - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1105:5: ( fixed_literal )* + + // smaliParser.g:1105:5: ( fixed_literal )* loop52: while (true) { int alt52=2; @@ -14459,7 +14459,7 @@ public class smaliParser extends Parser { switch (alt52) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1105:5: fixed_literal + // smaliParser.g:1105:5: fixed_literal { pushFollow(FOLLOW_fixed_literal_in_insn_array_data_directive5671); fixed_literal491=fixed_literal(); @@ -14474,27 +14474,27 @@ public class smaliParser extends Parser { } } - END_ARRAY_DATA_DIRECTIVE492=(Token)match(input,END_ARRAY_DATA_DIRECTIVE,FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674); + END_ARRAY_DATA_DIRECTIVE492=(Token)match(input,END_ARRAY_DATA_DIRECTIVE,FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674); stream_END_ARRAY_DATA_DIRECTIVE.add(END_ARRAY_DATA_DIRECTIVE492); // AST REWRITE // elements: parsed_integer_literal, fixed_literal - // token labels: + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1107:5: -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1107:8: ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) + // smaliParser.g:1107:8: ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_ARRAY_DATA, (retval.start), "I_STATEMENT_ARRAY_DATA"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1107:67: ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) + // smaliParser.g:1107:67: ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENT_SIZE, "I_ARRAY_ELEMENT_SIZE"), root_2); @@ -14502,11 +14502,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1108:8: ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) + // smaliParser.g:1108:8: ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENTS, "I_ARRAY_ELEMENTS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1108:27: ( fixed_literal )* + // smaliParser.g:1108:27: ( fixed_literal )* while ( stream_fixed_literal.hasNext() ) { adaptor.addChild(root_2, stream_fixed_literal.nextTree()); } @@ -14552,7 +14552,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_packed_switch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1110:1: insn_packed_switch_directive : PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ; + // smaliParser.g:1110:1: insn_packed_switch_directive : PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ; public final smaliParser.insn_packed_switch_directive_return insn_packed_switch_directive() throws RecognitionException { smaliParser.insn_packed_switch_directive_return retval = new smaliParser.insn_packed_switch_directive_return(); retval.start = input.LT(1); @@ -14572,10 +14572,10 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1111:5: ( PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1111:9: PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE + // smaliParser.g:1111:5: ( PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ) + // smaliParser.g:1111:9: PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE { - PACKED_SWITCH_DIRECTIVE493=(Token)match(input,PACKED_SWITCH_DIRECTIVE,FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720); + PACKED_SWITCH_DIRECTIVE493=(Token)match(input,PACKED_SWITCH_DIRECTIVE,FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720); stream_PACKED_SWITCH_DIRECTIVE.add(PACKED_SWITCH_DIRECTIVE493); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive5726); @@ -14583,7 +14583,7 @@ public class smaliParser extends Parser { state._fsp--; stream_fixed_32bit_literal.add(fixed_32bit_literal494.getTree()); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1113:5: ( label_ref )* + // smaliParser.g:1113:5: ( label_ref )* loop53: while (true) { int alt53=2; @@ -14594,7 +14594,7 @@ public class smaliParser extends Parser { switch (alt53) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1113:5: label_ref + // smaliParser.g:1113:5: label_ref { pushFollow(FOLLOW_label_ref_in_insn_packed_switch_directive5732); label_ref495=label_ref(); @@ -14609,27 +14609,27 @@ public class smaliParser extends Parser { } } - END_PACKED_SWITCH_DIRECTIVE496=(Token)match(input,END_PACKED_SWITCH_DIRECTIVE,FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739); + END_PACKED_SWITCH_DIRECTIVE496=(Token)match(input,END_PACKED_SWITCH_DIRECTIVE,FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739); stream_END_PACKED_SWITCH_DIRECTIVE.add(END_PACKED_SWITCH_DIRECTIVE496); // AST REWRITE - // elements: label_ref, fixed_32bit_literal - // token labels: + // elements: fixed_32bit_literal, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1115:5: -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1115:8: ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) + // smaliParser.g:1115:8: ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_PACKED_SWITCH, (retval.start), "I_STATEMENT_PACKED_SWITCH"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1116:10: ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) + // smaliParser.g:1116:10: ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_START_KEY, (retval.start), "I_PACKED_SWITCH_START_KEY"), root_2); @@ -14637,11 +14637,11 @@ public class smaliParser extends Parser { adaptor.addChild(root_1, root_2); } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1117:10: ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) + // smaliParser.g:1117:10: ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_ELEMENTS, (retval.start), "I_PACKED_SWITCH_ELEMENTS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1118:11: ( label_ref )* + // smaliParser.g:1118:11: ( label_ref )* while ( stream_label_ref.hasNext() ) { adaptor.addChild(root_2, stream_label_ref.nextTree()); } @@ -14687,7 +14687,7 @@ public class smaliParser extends Parser { // $ANTLR start "insn_sparse_switch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1121:1: insn_sparse_switch_directive : SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ; + // smaliParser.g:1121:1: insn_sparse_switch_directive : SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ; public final smaliParser.insn_sparse_switch_directive_return insn_sparse_switch_directive() throws RecognitionException { smaliParser.insn_sparse_switch_directive_return retval = new smaliParser.insn_sparse_switch_directive_return(); retval.start = input.LT(1); @@ -14710,13 +14710,13 @@ public class smaliParser extends Parser { RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref"); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1122:3: ( SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1122:7: SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE + // smaliParser.g:1122:3: ( SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ) + // smaliParser.g:1122:7: SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE { - SPARSE_SWITCH_DIRECTIVE497=(Token)match(input,SPARSE_SWITCH_DIRECTIVE,FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813); + SPARSE_SWITCH_DIRECTIVE497=(Token)match(input,SPARSE_SWITCH_DIRECTIVE,FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813); stream_SPARSE_SWITCH_DIRECTIVE.add(SPARSE_SWITCH_DIRECTIVE497); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1123:5: ( fixed_32bit_literal ARROW label_ref )* + // smaliParser.g:1123:5: ( fixed_32bit_literal ARROW label_ref )* loop54: while (true) { int alt54=2; @@ -14727,14 +14727,14 @@ public class smaliParser extends Parser { switch (alt54) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1123:6: fixed_32bit_literal ARROW label_ref + // smaliParser.g:1123:6: fixed_32bit_literal ARROW label_ref { pushFollow(FOLLOW_fixed_32bit_literal_in_insn_sparse_switch_directive5820); fixed_32bit_literal498=fixed_32bit_literal(); state._fsp--; stream_fixed_32bit_literal.add(fixed_32bit_literal498.getTree()); - ARROW499=(Token)match(input,ARROW,FOLLOW_ARROW_in_insn_sparse_switch_directive5822); + ARROW499=(Token)match(input,ARROW,FOLLOW_ARROW_in_insn_sparse_switch_directive5822); stream_ARROW.add(ARROW499); pushFollow(FOLLOW_label_ref_in_insn_sparse_switch_directive5824); @@ -14750,37 +14750,37 @@ public class smaliParser extends Parser { } } - END_SPARSE_SWITCH_DIRECTIVE501=(Token)match(input,END_SPARSE_SWITCH_DIRECTIVE,FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832); + END_SPARSE_SWITCH_DIRECTIVE501=(Token)match(input,END_SPARSE_SWITCH_DIRECTIVE,FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832); stream_END_SPARSE_SWITCH_DIRECTIVE.add(END_SPARSE_SWITCH_DIRECTIVE501); // AST REWRITE - // elements: label_ref, fixed_32bit_literal - // token labels: + // elements: fixed_32bit_literal, label_ref + // token labels: // rule labels: retval - // token list labels: - // rule list labels: - // wildcard labels: + // token list labels: + // rule list labels: + // wildcard labels: retval.tree = root_0; RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null); root_0 = (CommonTree)adaptor.nil(); // 1125:5: -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1125:8: ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) + // smaliParser.g:1125:8: ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) { CommonTree root_1 = (CommonTree)adaptor.nil(); root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_SPARSE_SWITCH, (retval.start), "I_STATEMENT_SPARSE_SWITCH"), root_1); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1126:8: ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) + // smaliParser.g:1126:8: ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) { CommonTree root_2 = (CommonTree)adaptor.nil(); root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SPARSE_SWITCH_ELEMENTS, (retval.start), "I_SPARSE_SWITCH_ELEMENTS"), root_2); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1126:71: ( fixed_32bit_literal label_ref )* - while ( stream_label_ref.hasNext()||stream_fixed_32bit_literal.hasNext() ) { + // smaliParser.g:1126:71: ( fixed_32bit_literal label_ref )* + while ( stream_fixed_32bit_literal.hasNext()||stream_label_ref.hasNext() ) { adaptor.addChild(root_2, stream_fixed_32bit_literal.nextTree()); adaptor.addChild(root_2, stream_label_ref.nextTree()); } - stream_label_ref.reset(); stream_fixed_32bit_literal.reset(); + stream_label_ref.reset(); adaptor.addChild(root_1, root_2); } @@ -15154,15 +15154,15 @@ public class smaliParser extends Parser { TokenStream input = (TokenStream)_input; int _s = s; switch ( s ) { - case 0 : + case 0 : int LA40_65 = input.LA(1); - + int index40_65 = input.index(); input.rewind(); s = -1; if ( ((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {s = 66;} else if ( (true) ) {s = 1;} - + input.seek(index40_65); if ( s>=0 ) return s; break; diff --git a/smali/src/main/java/org/jf/smali/smaliTreeWalker.java b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java index 667c370b..30b93c46 100644 --- a/smali/src/main/java/org/jf/smali/smaliTreeWalker.java +++ b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java @@ -1,4 +1,4 @@ -// $ANTLR 3.5.2 /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g 2016-09-09 13:35:49 +// $ANTLR 3.5.2 smaliTreeWalker.g 2017-04-20 15:20:46 package org.jf.smali; @@ -49,61 +49,61 @@ import java.util.ArrayList; @SuppressWarnings("all") public class smaliTreeWalker extends TreeParser { public static final String[] tokenNames = new String[] { - "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", - "ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", - "ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", - "CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", - "CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", - "END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", - "END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", - "END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", - "ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", - "FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", - "INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", - "INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", - "INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", - "INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", - "INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", - "INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", - "INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", - "INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", - "INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", - "INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", - "INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", - "INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", - "INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", - "INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", - "INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", - "INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", - "I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", - "I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", - "I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", - "I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", - "I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", - "I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", - "I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", - "I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", - "I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", - "I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", - "I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", - "I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", - "I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", - "I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", - "I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", - "I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", - "I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", - "I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", - "I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", - "I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", - "I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", - "I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", - "LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", - "MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", - "OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", - "PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", - "PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", - "SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", - "STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", + "<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", + "ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", + "ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", + "CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", + "CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", + "END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", + "END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", + "END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", + "ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", + "FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", + "INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", + "INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", + "INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", + "INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", + "INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", + "INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", + "INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", + "INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", + "INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", + "INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", + "INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", + "INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", + "INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", + "INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", + "INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", + "INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", + "I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", + "I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", + "I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", + "I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", + "I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", + "I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", + "I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", + "I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", + "I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", + "I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", + "I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", + "I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", + "I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", + "I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", + "I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", + "I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", + "I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", + "I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", + "I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", + "I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", + "I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", + "I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", + "LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", + "MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", + "OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", + "PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", + "PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", + "SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", + "STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", "VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE" }; public static final int EOF=-1; @@ -321,7 +321,7 @@ public class smaliTreeWalker extends TreeParser { } @Override public String[] getTokenNames() { return smaliTreeWalker.tokenNames; } - @Override public String getGrammarFileName() { return "/ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g"; } + @Override public String getGrammarFileName() { return "smaliTreeWalker.g"; } public String classType; @@ -334,8 +334,8 @@ public class smaliTreeWalker extends TreeParser { this.dexBuilder = dexBuilder; } - public void setApiLevel(int apiLevel, boolean experimental) { - this.opcodes = new Opcodes(apiLevel, experimental); + public void setApiLevel(int apiLevel) { + this.opcodes = Opcodes.forApi(apiLevel); this.apiLevel = apiLevel; } @@ -408,7 +408,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "smali_file" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:160:1: smali_file returns [ClassDef classDef] : ^( I_CLASS_DEF header methods fields annotations ) ; + // smaliTreeWalker.g:160:1: smali_file returns [ClassDef classDef] : ^( I_CLASS_DEF header methods fields annotations ) ; public final ClassDef smali_file() throws RecognitionException { ClassDef classDef = null; @@ -419,11 +419,11 @@ public class smaliTreeWalker extends TreeParser { List<BuilderMethod> methods4 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:161:3: ( ^( I_CLASS_DEF header methods fields annotations ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:161:5: ^( I_CLASS_DEF header methods fields annotations ) + // smaliTreeWalker.g:161:3: ( ^( I_CLASS_DEF header methods fields annotations ) ) + // smaliTreeWalker.g:161:5: ^( I_CLASS_DEF header methods fields annotations ) { - match(input,I_CLASS_DEF,FOLLOW_I_CLASS_DEF_in_smali_file52); - match(input, Token.DOWN, null); + match(input,I_CLASS_DEF,FOLLOW_I_CLASS_DEF_in_smali_file52); + match(input, Token.DOWN, null); pushFollow(FOLLOW_header_in_smali_file54); header1=header(); state._fsp--; @@ -440,12 +440,12 @@ public class smaliTreeWalker extends TreeParser { annotations2=annotations(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); classDef = dexBuilder.internClassDef((header1!=null?((smaliTreeWalker.header_return)header1).classType:null), (header1!=null?((smaliTreeWalker.header_return)header1).accessFlags:0), (header1!=null?((smaliTreeWalker.header_return)header1).superType:null), (header1!=null?((smaliTreeWalker.header_return)header1).implementsList:null), (header1!=null?((smaliTreeWalker.header_return)header1).sourceSpec:null), annotations2, fields3, methods4); - + } } @@ -455,7 +455,7 @@ public class smaliTreeWalker extends TreeParser { ex.printStackTrace(System.err); } reportError(new SemanticException(input, ex)); - + } finally { @@ -476,7 +476,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "header" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:174:1: header returns [String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec] : class_spec ( super_spec )? implements_list source_spec ; + // smaliTreeWalker.g:174:1: header returns [String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec] : class_spec ( super_spec )? implements_list source_spec ; public final smaliTreeWalker.header_return header() throws RecognitionException { smaliTreeWalker.header_return retval = new smaliTreeWalker.header_return(); retval.start = input.LT(1); @@ -487,14 +487,14 @@ public class smaliTreeWalker extends TreeParser { String source_spec8 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:3: ( class_spec ( super_spec )? implements_list source_spec ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:3: class_spec ( super_spec )? implements_list source_spec + // smaliTreeWalker.g:175:3: ( class_spec ( super_spec )? implements_list source_spec ) + // smaliTreeWalker.g:175:3: class_spec ( super_spec )? implements_list source_spec { pushFollow(FOLLOW_class_spec_in_header85); class_spec5=class_spec(); state._fsp--; - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:14: ( super_spec )? + // smaliTreeWalker.g:175:14: ( super_spec )? int alt1=2; int LA1_0 = input.LA(1); if ( (LA1_0==I_SUPER) ) { @@ -502,7 +502,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt1) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:14: super_spec + // smaliTreeWalker.g:175:14: super_spec { pushFollow(FOLLOW_super_spec_in_header87); super_spec6=super_spec(); @@ -528,7 +528,7 @@ public class smaliTreeWalker extends TreeParser { retval.superType = super_spec6; retval.implementsList = implements_list7; retval.sourceSpec = source_spec8; - + } } @@ -551,7 +551,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "class_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:186:1: class_spec returns [String type, int accessFlags] : CLASS_DESCRIPTOR access_list ; + // smaliTreeWalker.g:186:1: class_spec returns [String type, int accessFlags] : CLASS_DESCRIPTOR access_list ; public final smaliTreeWalker.class_spec_return class_spec() throws RecognitionException { smaliTreeWalker.class_spec_return retval = new smaliTreeWalker.class_spec_return(); retval.start = input.LT(1); @@ -560,10 +560,10 @@ public class smaliTreeWalker extends TreeParser { int access_list10 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:187:3: ( CLASS_DESCRIPTOR access_list ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:187:5: CLASS_DESCRIPTOR access_list + // smaliTreeWalker.g:187:3: ( CLASS_DESCRIPTOR access_list ) + // smaliTreeWalker.g:187:5: CLASS_DESCRIPTOR access_list { - CLASS_DESCRIPTOR9=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec110); + CLASS_DESCRIPTOR9=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec110); pushFollow(FOLLOW_access_list_in_class_spec112); access_list10=access_list(); state._fsp--; @@ -571,7 +571,7 @@ public class smaliTreeWalker extends TreeParser { retval.type = (CLASS_DESCRIPTOR9!=null?CLASS_DESCRIPTOR9.getText():null); retval.accessFlags = access_list10; - + } } @@ -589,7 +589,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "super_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:193:1: super_spec returns [String type] : ^( I_SUPER CLASS_DESCRIPTOR ) ; + // smaliTreeWalker.g:193:1: super_spec returns [String type] : ^( I_SUPER CLASS_DESCRIPTOR ) ; public final String super_spec() throws RecognitionException { String type = null; @@ -597,17 +597,17 @@ public class smaliTreeWalker extends TreeParser { CommonTree CLASS_DESCRIPTOR11=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:194:3: ( ^( I_SUPER CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:194:5: ^( I_SUPER CLASS_DESCRIPTOR ) + // smaliTreeWalker.g:194:3: ( ^( I_SUPER CLASS_DESCRIPTOR ) ) + // smaliTreeWalker.g:194:5: ^( I_SUPER CLASS_DESCRIPTOR ) { - match(input,I_SUPER,FOLLOW_I_SUPER_in_super_spec130); - match(input, Token.DOWN, null); - CLASS_DESCRIPTOR11=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec132); - match(input, Token.UP, null); + match(input,I_SUPER,FOLLOW_I_SUPER_in_super_spec130); + match(input, Token.DOWN, null); + CLASS_DESCRIPTOR11=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec132); + match(input, Token.UP, null); type = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null); - + } } @@ -625,7 +625,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "implements_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:200:1: implements_spec returns [String type] : ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ; + // smaliTreeWalker.g:200:1: implements_spec returns [String type] : ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ; public final String implements_spec() throws RecognitionException { String type = null; @@ -633,17 +633,17 @@ public class smaliTreeWalker extends TreeParser { CommonTree CLASS_DESCRIPTOR12=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:201:3: ( ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:201:5: ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) + // smaliTreeWalker.g:201:3: ( ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ) + // smaliTreeWalker.g:201:5: ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) { - match(input,I_IMPLEMENTS,FOLLOW_I_IMPLEMENTS_in_implements_spec152); - match(input, Token.DOWN, null); - CLASS_DESCRIPTOR12=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154); - match(input, Token.UP, null); + match(input,I_IMPLEMENTS,FOLLOW_I_IMPLEMENTS_in_implements_spec152); + match(input, Token.DOWN, null); + CLASS_DESCRIPTOR12=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154); + match(input, Token.UP, null); type = (CLASS_DESCRIPTOR12!=null?CLASS_DESCRIPTOR12.getText():null); - + } } @@ -661,20 +661,20 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "implements_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:206:1: implements_list returns [List<String> implementsList] : ( implements_spec )* ; + // smaliTreeWalker.g:206:1: implements_list returns [List<String> implementsList] : ( implements_spec )* ; public final List<String> implements_list() throws RecognitionException { List<String> implementsList = null; String implements_spec13 =null; - List<String> typeList; + List<String> typeList; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:208:3: ( ( implements_spec )* ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:208:5: ( implements_spec )* + // smaliTreeWalker.g:208:3: ( ( implements_spec )* ) + // smaliTreeWalker.g:208:5: ( implements_spec )* { typeList = Lists.newArrayList(); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:209:5: ( implements_spec )* + // smaliTreeWalker.g:209:5: ( implements_spec )* loop2: while (true) { int alt2=2; @@ -685,7 +685,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt2) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:209:6: implements_spec + // smaliTreeWalker.g:209:6: implements_spec { pushFollow(FOLLOW_implements_spec_in_implements_list184); implements_spec13=implements_spec(); @@ -706,7 +706,7 @@ public class smaliTreeWalker extends TreeParser { } else { implementsList = null; } - + } } @@ -724,7 +724,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "source_spec" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:218:1: source_spec returns [String source] : ( ^( I_SOURCE string_literal ) |); + // smaliTreeWalker.g:218:1: source_spec returns [String source] : ( ^( I_SOURCE string_literal ) |); public final String source_spec() throws RecognitionException { String source = null; @@ -732,7 +732,7 @@ public class smaliTreeWalker extends TreeParser { String string_literal14 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:219:3: ( ^( I_SOURCE string_literal ) |) + // smaliTreeWalker.g:219:3: ( ^( I_SOURCE string_literal ) |) int alt3=2; int LA3_0 = input.LA(1); if ( (LA3_0==I_SOURCE) ) { @@ -750,22 +750,22 @@ public class smaliTreeWalker extends TreeParser { switch (alt3) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:219:5: ^( I_SOURCE string_literal ) + // smaliTreeWalker.g:219:5: ^( I_SOURCE string_literal ) { source = null; - match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source_spec213); - match(input, Token.DOWN, null); + match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source_spec213); + match(input, Token.DOWN, null); pushFollow(FOLLOW_string_literal_in_source_spec215); string_literal14=string_literal(); state._fsp--; source = string_literal14; - match(input, Token.UP, null); + match(input, Token.UP, null); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:221:16: + // smaliTreeWalker.g:221:16: { } break; @@ -786,7 +786,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "access_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:223:1: access_list returns [int value] : ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ; + // smaliTreeWalker.g:223:1: access_list returns [int value] : ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ; public final int access_list() throws RecognitionException { int value = 0; @@ -795,15 +795,15 @@ public class smaliTreeWalker extends TreeParser { value = 0; - + try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:228:3: ( ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:228:5: ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) + // smaliTreeWalker.g:228:3: ( ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ) + // smaliTreeWalker.g:228:5: ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) { - match(input,I_ACCESS_LIST,FOLLOW_I_ACCESS_LIST_in_access_list248); + match(input,I_ACCESS_LIST,FOLLOW_I_ACCESS_LIST_in_access_list248); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:229:7: ( ACCESS_SPEC )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:229:7: ( ACCESS_SPEC )* loop4: while (true) { int alt4=2; @@ -814,12 +814,12 @@ public class smaliTreeWalker extends TreeParser { switch (alt4) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:230:9: ACCESS_SPEC + // smaliTreeWalker.g:230:9: ACCESS_SPEC { - ACCESS_SPEC15=(CommonTree)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list266); + ACCESS_SPEC15=(CommonTree)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list266); value |= AccessFlags.getAccessFlag(ACCESS_SPEC15.getText()).getValue(); - + } break; @@ -828,7 +828,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -848,7 +848,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "fields" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:237:1: fields returns [List<BuilderField> fields] : ^( I_FIELDS ( field )* ) ; + // smaliTreeWalker.g:237:1: fields returns [List<BuilderField> fields] : ^( I_FIELDS ( field )* ) ; public final List<BuilderField> fields() throws RecognitionException { List<BuilderField> fields = null; @@ -857,13 +857,13 @@ public class smaliTreeWalker extends TreeParser { fields = Lists.newArrayList(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:239:3: ( ^( I_FIELDS ( field )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:239:5: ^( I_FIELDS ( field )* ) + // smaliTreeWalker.g:239:3: ( ^( I_FIELDS ( field )* ) ) + // smaliTreeWalker.g:239:5: ^( I_FIELDS ( field )* ) { - match(input,I_FIELDS,FOLLOW_I_FIELDS_in_fields308); + match(input,I_FIELDS,FOLLOW_I_FIELDS_in_fields308); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:240:7: ( field )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:240:7: ( field )* loop5: while (true) { int alt5=2; @@ -874,7 +874,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt5) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:240:8: field + // smaliTreeWalker.g:240:8: field { pushFollow(FOLLOW_field_in_fields317); field16=field(); @@ -882,7 +882,7 @@ public class smaliTreeWalker extends TreeParser { fields.add(field16); - + } break; @@ -891,7 +891,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -911,7 +911,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "methods" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:245:1: methods returns [List<BuilderMethod> methods] : ^( I_METHODS ( method )* ) ; + // smaliTreeWalker.g:245:1: methods returns [List<BuilderMethod> methods] : ^( I_METHODS ( method )* ) ; public final List<BuilderMethod> methods() throws RecognitionException { List<BuilderMethod> methods = null; @@ -920,13 +920,13 @@ public class smaliTreeWalker extends TreeParser { methods = Lists.newArrayList(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:247:3: ( ^( I_METHODS ( method )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:247:5: ^( I_METHODS ( method )* ) + // smaliTreeWalker.g:247:3: ( ^( I_METHODS ( method )* ) ) + // smaliTreeWalker.g:247:5: ^( I_METHODS ( method )* ) { - match(input,I_METHODS,FOLLOW_I_METHODS_in_methods349); + match(input,I_METHODS,FOLLOW_I_METHODS_in_methods349); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:248:7: ( method )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:248:7: ( method )* loop6: while (true) { int alt6=2; @@ -937,7 +937,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt6) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:248:8: method + // smaliTreeWalker.g:248:8: method { pushFollow(FOLLOW_method_in_methods358); method17=method(); @@ -945,7 +945,7 @@ public class smaliTreeWalker extends TreeParser { methods.add(method17); - + } break; @@ -954,7 +954,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -974,7 +974,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:253:1: field returns [BuilderField field] : ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ; + // smaliTreeWalker.g:253:1: field returns [BuilderField field] : ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ; public final BuilderField field() throws RecognitionException { BuilderField field = null; @@ -986,29 +986,29 @@ public class smaliTreeWalker extends TreeParser { Set<Annotation> annotations22 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:3: ( ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:4: ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) + // smaliTreeWalker.g:254:3: ( ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ) + // smaliTreeWalker.g:254:4: ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) { - match(input,I_FIELD,FOLLOW_I_FIELD_in_field383); - match(input, Token.DOWN, null); - SIMPLE_NAME20=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field385); + match(input,I_FIELD,FOLLOW_I_FIELD_in_field383); + match(input, Token.DOWN, null); + SIMPLE_NAME20=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field385); pushFollow(FOLLOW_access_list_in_field387); access_list18=access_list(); state._fsp--; - match(input,I_FIELD_TYPE,FOLLOW_I_FIELD_TYPE_in_field390); - match(input, Token.DOWN, null); + match(input,I_FIELD_TYPE,FOLLOW_I_FIELD_TYPE_in_field390); + match(input, Token.DOWN, null); pushFollow(FOLLOW_nonvoid_type_descriptor_in_field392); nonvoid_type_descriptor21=nonvoid_type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); pushFollow(FOLLOW_field_initial_value_in_field395); field_initial_value19=field_initial_value(); state._fsp--; - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:98: ( annotations )? + // smaliTreeWalker.g:254:98: ( annotations )? int alt7=2; int LA7_0 = input.LA(1); if ( (LA7_0==I_ANNOTATIONS) ) { @@ -1016,7 +1016,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt7) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:98: annotations + // smaliTreeWalker.g:254:98: annotations { pushFollow(FOLLOW_annotations_in_field397); annotations22=annotations(); @@ -1027,7 +1027,7 @@ public class smaliTreeWalker extends TreeParser { } - match(input, Token.UP, null); + match(input, Token.UP, null); int accessFlags = access_list18; @@ -1039,7 +1039,7 @@ public class smaliTreeWalker extends TreeParser { field = dexBuilder.internField(classType, (SIMPLE_NAME20!=null?SIMPLE_NAME20.getText():null), (nonvoid_type_descriptor21!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor21).type:null), access_list18, field_initial_value19, annotations22); - + } } @@ -1057,7 +1057,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "field_initial_value" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:268:1: field_initial_value returns [EncodedValue encodedValue] : ( ^( I_FIELD_INITIAL_VALUE literal ) |); + // smaliTreeWalker.g:268:1: field_initial_value returns [EncodedValue encodedValue] : ( ^( I_FIELD_INITIAL_VALUE literal ) |); public final EncodedValue field_initial_value() throws RecognitionException { EncodedValue encodedValue = null; @@ -1065,7 +1065,7 @@ public class smaliTreeWalker extends TreeParser { EncodedValue literal23 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:269:3: ( ^( I_FIELD_INITIAL_VALUE literal ) |) + // smaliTreeWalker.g:269:3: ( ^( I_FIELD_INITIAL_VALUE literal ) |) int alt8=2; int LA8_0 = input.LA(1); if ( (LA8_0==I_FIELD_INITIAL_VALUE) ) { @@ -1083,21 +1083,21 @@ public class smaliTreeWalker extends TreeParser { switch (alt8) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:269:5: ^( I_FIELD_INITIAL_VALUE literal ) + // smaliTreeWalker.g:269:5: ^( I_FIELD_INITIAL_VALUE literal ) { - match(input,I_FIELD_INITIAL_VALUE,FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418); - match(input, Token.DOWN, null); + match(input,I_FIELD_INITIAL_VALUE,FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418); + match(input, Token.DOWN, null); pushFollow(FOLLOW_literal_in_field_initial_value420); literal23=literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); encodedValue = literal23; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:270:16: + // smaliTreeWalker.g:270:16: { } break; @@ -1118,7 +1118,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:272:1: literal returns [EncodedValue encodedValue] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal ); + // smaliTreeWalker.g:272:1: literal returns [EncodedValue encodedValue] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal ); public final EncodedValue literal() throws RecognitionException { EncodedValue encodedValue = null; @@ -1140,7 +1140,7 @@ public class smaliTreeWalker extends TreeParser { FieldReference enum_literal38 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:273:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal ) + // smaliTreeWalker.g:273:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal ) int alt9=16; switch ( input.LA(1) ) { case INTEGER_LITERAL: @@ -1233,160 +1233,160 @@ public class smaliTreeWalker extends TreeParser { } switch (alt9) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:273:5: integer_literal + // smaliTreeWalker.g:273:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_literal442); integer_literal24=integer_literal(); state._fsp--; - encodedValue = new ImmutableIntEncodedValue(integer_literal24); + encodedValue = new ImmutableIntEncodedValue(integer_literal24); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:274:5: long_literal + // smaliTreeWalker.g:274:5: long_literal { pushFollow(FOLLOW_long_literal_in_literal450); long_literal25=long_literal(); state._fsp--; - encodedValue = new ImmutableLongEncodedValue(long_literal25); + encodedValue = new ImmutableLongEncodedValue(long_literal25); } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:275:5: short_literal + // smaliTreeWalker.g:275:5: short_literal { pushFollow(FOLLOW_short_literal_in_literal458); short_literal26=short_literal(); state._fsp--; - encodedValue = new ImmutableShortEncodedValue(short_literal26); + encodedValue = new ImmutableShortEncodedValue(short_literal26); } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:276:5: byte_literal + // smaliTreeWalker.g:276:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_literal466); byte_literal27=byte_literal(); state._fsp--; - encodedValue = new ImmutableByteEncodedValue(byte_literal27); + encodedValue = new ImmutableByteEncodedValue(byte_literal27); } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:277:5: float_literal + // smaliTreeWalker.g:277:5: float_literal { pushFollow(FOLLOW_float_literal_in_literal474); float_literal28=float_literal(); state._fsp--; - encodedValue = new ImmutableFloatEncodedValue(float_literal28); + encodedValue = new ImmutableFloatEncodedValue(float_literal28); } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:278:5: double_literal + // smaliTreeWalker.g:278:5: double_literal { pushFollow(FOLLOW_double_literal_in_literal482); double_literal29=double_literal(); state._fsp--; - encodedValue = new ImmutableDoubleEncodedValue(double_literal29); + encodedValue = new ImmutableDoubleEncodedValue(double_literal29); } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:279:5: char_literal + // smaliTreeWalker.g:279:5: char_literal { pushFollow(FOLLOW_char_literal_in_literal490); char_literal30=char_literal(); state._fsp--; - encodedValue = new ImmutableCharEncodedValue(char_literal30); + encodedValue = new ImmutableCharEncodedValue(char_literal30); } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:280:5: string_literal + // smaliTreeWalker.g:280:5: string_literal { pushFollow(FOLLOW_string_literal_in_literal498); string_literal31=string_literal(); state._fsp--; - encodedValue = new ImmutableStringEncodedValue(string_literal31); + encodedValue = new ImmutableStringEncodedValue(string_literal31); } break; case 9 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:281:5: bool_literal + // smaliTreeWalker.g:281:5: bool_literal { pushFollow(FOLLOW_bool_literal_in_literal506); bool_literal32=bool_literal(); state._fsp--; - encodedValue = ImmutableBooleanEncodedValue.forBoolean(bool_literal32); + encodedValue = ImmutableBooleanEncodedValue.forBoolean(bool_literal32); } break; case 10 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:282:5: NULL_LITERAL + // smaliTreeWalker.g:282:5: NULL_LITERAL { - match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal514); - encodedValue = ImmutableNullEncodedValue.INSTANCE; + match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal514); + encodedValue = ImmutableNullEncodedValue.INSTANCE; } break; case 11 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:283:5: type_descriptor + // smaliTreeWalker.g:283:5: type_descriptor { pushFollow(FOLLOW_type_descriptor_in_literal522); type_descriptor33=type_descriptor(); state._fsp--; - encodedValue = new ImmutableTypeEncodedValue(type_descriptor33); + encodedValue = new ImmutableTypeEncodedValue(type_descriptor33); } break; case 12 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:284:5: array_literal + // smaliTreeWalker.g:284:5: array_literal { pushFollow(FOLLOW_array_literal_in_literal530); array_literal34=array_literal(); state._fsp--; - encodedValue = new ImmutableArrayEncodedValue(array_literal34); + encodedValue = new ImmutableArrayEncodedValue(array_literal34); } break; case 13 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:285:5: subannotation + // smaliTreeWalker.g:285:5: subannotation { pushFollow(FOLLOW_subannotation_in_literal538); subannotation35=subannotation(); state._fsp--; - encodedValue = new ImmutableAnnotationEncodedValue((subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).annotationType:null), (subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).elements:null)); + encodedValue = new ImmutableAnnotationEncodedValue((subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).annotationType:null), (subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).elements:null)); } break; case 14 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:286:5: field_literal + // smaliTreeWalker.g:286:5: field_literal { pushFollow(FOLLOW_field_literal_in_literal546); field_literal36=field_literal(); state._fsp--; - encodedValue = new ImmutableFieldEncodedValue(field_literal36); + encodedValue = new ImmutableFieldEncodedValue(field_literal36); } break; case 15 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:287:5: method_literal + // smaliTreeWalker.g:287:5: method_literal { pushFollow(FOLLOW_method_literal_in_literal554); method_literal37=method_literal(); state._fsp--; - encodedValue = new ImmutableMethodEncodedValue(method_literal37); + encodedValue = new ImmutableMethodEncodedValue(method_literal37); } break; case 16 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:288:5: enum_literal + // smaliTreeWalker.g:288:5: enum_literal { pushFollow(FOLLOW_enum_literal_in_literal562); enum_literal38=enum_literal(); state._fsp--; - encodedValue = new ImmutableEnumEncodedValue(enum_literal38); + encodedValue = new ImmutableEnumEncodedValue(enum_literal38); } break; @@ -1406,7 +1406,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "fixed_64bit_literal_number" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:291:1: fixed_64bit_literal_number returns [Number value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ); + // smaliTreeWalker.g:291:1: fixed_64bit_literal_number returns [Number value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ); public final Number fixed_64bit_literal_number() throws RecognitionException { Number value = null; @@ -1421,7 +1421,7 @@ public class smaliTreeWalker extends TreeParser { boolean bool_literal46 =false; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:292:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ) + // smaliTreeWalker.g:292:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ) int alt10=8; switch ( input.LA(1) ) { case INTEGER_LITERAL: @@ -1471,83 +1471,83 @@ public class smaliTreeWalker extends TreeParser { } switch (alt10) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:292:5: integer_literal + // smaliTreeWalker.g:292:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal_number578); integer_literal39=integer_literal(); state._fsp--; - value = integer_literal39; + value = integer_literal39; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:293:5: long_literal + // smaliTreeWalker.g:293:5: long_literal { pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal_number586); long_literal40=long_literal(); state._fsp--; - value = long_literal40; + value = long_literal40; } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:294:5: short_literal + // smaliTreeWalker.g:294:5: short_literal { pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal_number594); short_literal41=short_literal(); state._fsp--; - value = short_literal41; + value = short_literal41; } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:295:5: byte_literal + // smaliTreeWalker.g:295:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal_number602); byte_literal42=byte_literal(); state._fsp--; - value = byte_literal42; + value = byte_literal42; } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:296:5: float_literal + // smaliTreeWalker.g:296:5: float_literal { pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal_number610); float_literal43=float_literal(); state._fsp--; - value = Float.floatToRawIntBits(float_literal43); + value = Float.floatToRawIntBits(float_literal43); } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:297:5: double_literal + // smaliTreeWalker.g:297:5: double_literal { pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal_number618); double_literal44=double_literal(); state._fsp--; - value = Double.doubleToRawLongBits(double_literal44); + value = Double.doubleToRawLongBits(double_literal44); } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:298:5: char_literal + // smaliTreeWalker.g:298:5: char_literal { pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal_number626); char_literal45=char_literal(); state._fsp--; - value = (int)char_literal45; + value = (int)char_literal45; } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:299:5: bool_literal + // smaliTreeWalker.g:299:5: bool_literal { pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal_number634); bool_literal46=bool_literal(); state._fsp--; - value = bool_literal46?1:0; + value = bool_literal46?1:0; } break; @@ -1567,7 +1567,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "fixed_64bit_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:301:1: fixed_64bit_literal returns [long value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ); + // smaliTreeWalker.g:301:1: fixed_64bit_literal returns [long value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ); public final long fixed_64bit_literal() throws RecognitionException { long value = 0; @@ -1582,7 +1582,7 @@ public class smaliTreeWalker extends TreeParser { boolean bool_literal54 =false; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:302:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ) + // smaliTreeWalker.g:302:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal ) int alt11=8; switch ( input.LA(1) ) { case INTEGER_LITERAL: @@ -1632,83 +1632,83 @@ public class smaliTreeWalker extends TreeParser { } switch (alt11) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:302:5: integer_literal + // smaliTreeWalker.g:302:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal649); integer_literal47=integer_literal(); state._fsp--; - value = integer_literal47; + value = integer_literal47; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:303:5: long_literal + // smaliTreeWalker.g:303:5: long_literal { pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal657); long_literal48=long_literal(); state._fsp--; - value = long_literal48; + value = long_literal48; } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:304:5: short_literal + // smaliTreeWalker.g:304:5: short_literal { pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal665); short_literal49=short_literal(); state._fsp--; - value = short_literal49; + value = short_literal49; } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:305:5: byte_literal + // smaliTreeWalker.g:305:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal673); byte_literal50=byte_literal(); state._fsp--; - value = byte_literal50; + value = byte_literal50; } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:306:5: float_literal + // smaliTreeWalker.g:306:5: float_literal { pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal681); float_literal51=float_literal(); state._fsp--; - value = Float.floatToRawIntBits(float_literal51); + value = Float.floatToRawIntBits(float_literal51); } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:307:5: double_literal + // smaliTreeWalker.g:307:5: double_literal { pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal689); double_literal52=double_literal(); state._fsp--; - value = Double.doubleToRawLongBits(double_literal52); + value = Double.doubleToRawLongBits(double_literal52); } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:308:5: char_literal + // smaliTreeWalker.g:308:5: char_literal { pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal697); char_literal53=char_literal(); state._fsp--; - value = char_literal53; + value = char_literal53; } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:309:5: bool_literal + // smaliTreeWalker.g:309:5: bool_literal { pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal705); bool_literal54=bool_literal(); state._fsp--; - value = bool_literal54?1:0; + value = bool_literal54?1:0; } break; @@ -1728,7 +1728,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "fixed_32bit_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:313:1: fixed_32bit_literal returns [int value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal ); + // smaliTreeWalker.g:313:1: fixed_32bit_literal returns [int value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal ); public final int fixed_32bit_literal() throws RecognitionException { int value = 0; @@ -1742,7 +1742,7 @@ public class smaliTreeWalker extends TreeParser { boolean bool_literal61 =false; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:314:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal ) + // smaliTreeWalker.g:314:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal ) int alt12=7; switch ( input.LA(1) ) { case INTEGER_LITERAL: @@ -1787,73 +1787,73 @@ public class smaliTreeWalker extends TreeParser { } switch (alt12) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:314:5: integer_literal + // smaliTreeWalker.g:314:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_fixed_32bit_literal722); integer_literal55=integer_literal(); state._fsp--; - value = integer_literal55; + value = integer_literal55; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:315:5: long_literal + // smaliTreeWalker.g:315:5: long_literal { pushFollow(FOLLOW_long_literal_in_fixed_32bit_literal730); long_literal56=long_literal(); state._fsp--; - LiteralTools.checkInt(long_literal56); value = (int)long_literal56; + LiteralTools.checkInt(long_literal56); value = (int)long_literal56; } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:316:5: short_literal + // smaliTreeWalker.g:316:5: short_literal { pushFollow(FOLLOW_short_literal_in_fixed_32bit_literal738); short_literal57=short_literal(); state._fsp--; - value = short_literal57; + value = short_literal57; } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:317:5: byte_literal + // smaliTreeWalker.g:317:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_fixed_32bit_literal746); byte_literal58=byte_literal(); state._fsp--; - value = byte_literal58; + value = byte_literal58; } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:318:5: float_literal + // smaliTreeWalker.g:318:5: float_literal { pushFollow(FOLLOW_float_literal_in_fixed_32bit_literal754); float_literal59=float_literal(); state._fsp--; - value = Float.floatToRawIntBits(float_literal59); + value = Float.floatToRawIntBits(float_literal59); } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:319:5: char_literal + // smaliTreeWalker.g:319:5: char_literal { pushFollow(FOLLOW_char_literal_in_fixed_32bit_literal762); char_literal60=char_literal(); state._fsp--; - value = char_literal60; + value = char_literal60; } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:320:5: bool_literal + // smaliTreeWalker.g:320:5: bool_literal { pushFollow(FOLLOW_bool_literal_in_fixed_32bit_literal770); bool_literal61=bool_literal(); state._fsp--; - value = bool_literal61?1:0; + value = bool_literal61?1:0; } break; @@ -1873,7 +1873,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "array_elements" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:322:1: array_elements returns [List<Number> elements] : ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ; + // smaliTreeWalker.g:322:1: array_elements returns [List<Number> elements] : ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ; public final List<Number> array_elements() throws RecognitionException { List<Number> elements = null; @@ -1881,14 +1881,14 @@ public class smaliTreeWalker extends TreeParser { Number fixed_64bit_literal_number62 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:323:3: ( ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:323:5: ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) + // smaliTreeWalker.g:323:3: ( ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ) + // smaliTreeWalker.g:323:5: ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) { elements = Lists.newArrayList(); - match(input,I_ARRAY_ELEMENTS,FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792); + match(input,I_ARRAY_ELEMENTS,FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:325:7: ( fixed_64bit_literal_number )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:325:7: ( fixed_64bit_literal_number )* loop13: while (true) { int alt13=2; @@ -1899,7 +1899,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt13) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:325:8: fixed_64bit_literal_number + // smaliTreeWalker.g:325:8: fixed_64bit_literal_number { pushFollow(FOLLOW_fixed_64bit_literal_number_in_array_elements801); fixed_64bit_literal_number62=fixed_64bit_literal_number(); @@ -1907,7 +1907,7 @@ public class smaliTreeWalker extends TreeParser { elements.add(fixed_64bit_literal_number62); - + } break; @@ -1916,7 +1916,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -1936,7 +1936,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "packed_switch_elements" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:330:1: packed_switch_elements returns [List<Label> elements] : ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ; + // smaliTreeWalker.g:330:1: packed_switch_elements returns [List<Label> elements] : ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ; public final List<Label> packed_switch_elements() throws RecognitionException { List<Label> elements = null; @@ -1945,13 +1945,13 @@ public class smaliTreeWalker extends TreeParser { elements = Lists.newArrayList(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:332:3: ( ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:333:5: ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) + // smaliTreeWalker.g:332:3: ( ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ) + // smaliTreeWalker.g:333:5: ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) { - match(input,I_PACKED_SWITCH_ELEMENTS,FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837); + match(input,I_PACKED_SWITCH_ELEMENTS,FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:334:7: ( label_ref )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:334:7: ( label_ref )* loop14: while (true) { int alt14=2; @@ -1962,13 +1962,13 @@ public class smaliTreeWalker extends TreeParser { switch (alt14) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:334:8: label_ref + // smaliTreeWalker.g:334:8: label_ref { pushFollow(FOLLOW_label_ref_in_packed_switch_elements846); label_ref63=label_ref(); state._fsp--; - elements.add(label_ref63); + elements.add(label_ref63); } break; @@ -1977,7 +1977,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -1997,7 +1997,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "sparse_switch_elements" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:337:1: sparse_switch_elements returns [List<SwitchLabelElement> elements] : ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ; + // smaliTreeWalker.g:337:1: sparse_switch_elements returns [List<SwitchLabelElement> elements] : ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ; public final List<SwitchLabelElement> sparse_switch_elements() throws RecognitionException { List<SwitchLabelElement> elements = null; @@ -2007,13 +2007,13 @@ public class smaliTreeWalker extends TreeParser { elements = Lists.newArrayList(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:339:3: ( ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:340:5: ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) + // smaliTreeWalker.g:339:3: ( ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ) + // smaliTreeWalker.g:340:5: ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) { - match(input,I_SPARSE_SWITCH_ELEMENTS,FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881); + match(input,I_SPARSE_SWITCH_ELEMENTS,FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:341:8: ( fixed_32bit_literal label_ref )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:341:8: ( fixed_32bit_literal label_ref )* loop15: while (true) { int alt15=2; @@ -2024,7 +2024,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt15) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:341:9: fixed_32bit_literal label_ref + // smaliTreeWalker.g:341:9: fixed_32bit_literal label_ref { pushFollow(FOLLOW_fixed_32bit_literal_in_sparse_switch_elements891); fixed_32bit_literal64=fixed_32bit_literal(); @@ -2036,7 +2036,7 @@ public class smaliTreeWalker extends TreeParser { elements.add(new SwitchLabelElement(fixed_32bit_literal64, label_ref65)); - + } break; @@ -2045,7 +2045,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -2073,7 +2073,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:347:1: method returns [BuilderMethod ret] : ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ; + // smaliTreeWalker.g:347:1: method returns [BuilderMethod ret] : ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ; public final BuilderMethod method() throws RecognitionException { method_stack.push(new method_scope()); BuilderMethod ret = null; @@ -2091,13 +2091,13 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodParameterRegisters = 0; int accessFlags = 0; method_stack.peek().isStatic = false; - + try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:362:3: ( ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:363:5: ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) + // smaliTreeWalker.g:362:3: ( ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ) + // smaliTreeWalker.g:363:5: ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) { - I_METHOD70=(CommonTree)match(input,I_METHOD,FOLLOW_I_METHOD_in_method945); - match(input, Token.DOWN, null); + I_METHOD70=(CommonTree)match(input,I_METHOD,FOLLOW_I_METHOD_in_method945); + match(input, Token.DOWN, null); pushFollow(FOLLOW_method_name_and_prototype_in_method953); method_name_and_prototype67=method_name_and_prototype(); state._fsp--; @@ -2111,8 +2111,8 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().isStatic = AccessFlags.STATIC.isSet(accessFlags); method_stack.peek().methodParameterRegisters = MethodUtil.getParameterRegisterCount((method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).parameters:null), method_stack.peek().isStatic); - - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:372:7: ( ( registers_directive ) |) + + // smaliTreeWalker.g:372:7: ( ( registers_directive ) |) int alt16=2; int LA16_0 = input.LA(1); if ( (LA16_0==I_LOCALS||LA16_0==I_REGISTERS) ) { @@ -2130,10 +2130,10 @@ public class smaliTreeWalker extends TreeParser { switch (alt16) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:9: ( registers_directive ) + // smaliTreeWalker.g:373:9: ( registers_directive ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:9: ( registers_directive ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:10: registers_directive + // smaliTreeWalker.g:373:9: ( registers_directive ) + // smaliTreeWalker.g:373:10: registers_directive { pushFollow(FOLLOW_registers_directive_in_method988); registers_directive68=registers_directive(); @@ -2148,17 +2148,17 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder = new MethodImplementationBuilder(method_stack.peek().totalMethodRegisters); - + } } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:386:9: + // smaliTreeWalker.g:386:9: { method_stack.peek().methodBuilder = new MethodImplementationBuilder(0); - + } break; @@ -2180,7 +2180,7 @@ public class smaliTreeWalker extends TreeParser { annotations71=annotations(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); MethodImplementation methodImplementation = null; @@ -2253,7 +2253,7 @@ public class smaliTreeWalker extends TreeParser { accessFlags, annotations71, methodImplementation); - + } } @@ -2277,7 +2277,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method_prototype" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:468:1: method_prototype returns [List<String> parameters, String returnType] : ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ; + // smaliTreeWalker.g:468:1: method_prototype returns [List<String> parameters, String returnType] : ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ; public final smaliTreeWalker.method_prototype_return method_prototype() throws RecognitionException { smaliTreeWalker.method_prototype_return retval = new smaliTreeWalker.method_prototype_return(); retval.start = input.LT(1); @@ -2286,29 +2286,29 @@ public class smaliTreeWalker extends TreeParser { List<String> method_type_list73 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:469:3: ( ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:469:5: ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) + // smaliTreeWalker.g:469:3: ( ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ) + // smaliTreeWalker.g:469:5: ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) { - match(input,I_METHOD_PROTOTYPE,FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094); - match(input, Token.DOWN, null); - match(input,I_METHOD_RETURN_TYPE,FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097); - match(input, Token.DOWN, null); + match(input,I_METHOD_PROTOTYPE,FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094); + match(input, Token.DOWN, null); + match(input,I_METHOD_RETURN_TYPE,FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097); + match(input, Token.DOWN, null); pushFollow(FOLLOW_type_descriptor_in_method_prototype1099); type_descriptor72=type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); pushFollow(FOLLOW_method_type_list_in_method_prototype1102); method_type_list73=method_type_list(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); retval.returnType = type_descriptor72; retval.parameters = method_type_list73; - + } } @@ -2332,7 +2332,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method_name_and_prototype" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:475:1: method_name_and_prototype returns [String name, List<SmaliMethodParameter> parameters, String returnType] : SIMPLE_NAME method_prototype ; + // smaliTreeWalker.g:475:1: method_name_and_prototype returns [String name, List<SmaliMethodParameter> parameters, String returnType] : SIMPLE_NAME method_prototype ; public final smaliTreeWalker.method_name_and_prototype_return method_name_and_prototype() throws RecognitionException { smaliTreeWalker.method_name_and_prototype_return retval = new smaliTreeWalker.method_name_and_prototype_return(); retval.start = input.LT(1); @@ -2341,10 +2341,10 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope method_prototype75 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:476:3: ( SIMPLE_NAME method_prototype ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:476:5: SIMPLE_NAME method_prototype + // smaliTreeWalker.g:476:3: ( SIMPLE_NAME method_prototype ) + // smaliTreeWalker.g:476:5: SIMPLE_NAME method_prototype { - SIMPLE_NAME74=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120); + SIMPLE_NAME74=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120); pushFollow(FOLLOW_method_prototype_in_method_name_and_prototype1122); method_prototype75=method_prototype(); state._fsp--; @@ -2362,7 +2362,7 @@ public class smaliTreeWalker extends TreeParser { } } retval.returnType = (method_prototype75!=null?((smaliTreeWalker.method_prototype_return)method_prototype75).returnType:null); - + } } @@ -2380,7 +2380,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method_type_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:492:1: method_type_list returns [List<String> types] : ( nonvoid_type_descriptor )* ; + // smaliTreeWalker.g:492:1: method_type_list returns [List<String> types] : ( nonvoid_type_descriptor )* ; public final List<String> method_type_list() throws RecognitionException { List<String> types = null; @@ -2389,12 +2389,12 @@ public class smaliTreeWalker extends TreeParser { types = Lists.newArrayList(); - + try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:3: ( ( nonvoid_type_descriptor )* ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )* + // smaliTreeWalker.g:497:3: ( ( nonvoid_type_descriptor )* ) + // smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )* { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )* + // smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )* loop17: while (true) { int alt17=2; @@ -2405,7 +2405,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt17) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:498:7: nonvoid_type_descriptor + // smaliTreeWalker.g:498:7: nonvoid_type_descriptor { pushFollow(FOLLOW_nonvoid_type_descriptor_in_method_type_list1156); nonvoid_type_descriptor76=nonvoid_type_descriptor(); @@ -2413,7 +2413,7 @@ public class smaliTreeWalker extends TreeParser { types.add((nonvoid_type_descriptor76!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor76).type:null)); - + } break; @@ -2439,7 +2439,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:505:1: method_reference returns [ImmutableMethodReference methodReference] : ( reference_type_descriptor )? SIMPLE_NAME method_prototype ; + // smaliTreeWalker.g:505:1: method_reference returns [ImmutableMethodReference methodReference] : ( reference_type_descriptor )? SIMPLE_NAME method_prototype ; public final ImmutableMethodReference method_reference() throws RecognitionException { ImmutableMethodReference methodReference = null; @@ -2449,10 +2449,10 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope method_prototype79 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:3: ( ( reference_type_descriptor )? SIMPLE_NAME method_prototype ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: ( reference_type_descriptor )? SIMPLE_NAME method_prototype + // smaliTreeWalker.g:506:3: ( ( reference_type_descriptor )? SIMPLE_NAME method_prototype ) + // smaliTreeWalker.g:506:5: ( reference_type_descriptor )? SIMPLE_NAME method_prototype { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: ( reference_type_descriptor )? + // smaliTreeWalker.g:506:5: ( reference_type_descriptor )? int alt18=2; int LA18_0 = input.LA(1); if ( (LA18_0==ARRAY_TYPE_PREFIX||LA18_0==CLASS_DESCRIPTOR) ) { @@ -2460,7 +2460,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt18) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: reference_type_descriptor + // smaliTreeWalker.g:506:5: reference_type_descriptor { pushFollow(FOLLOW_reference_type_descriptor_in_method_reference1185); reference_type_descriptor77=reference_type_descriptor(); @@ -2471,7 +2471,7 @@ public class smaliTreeWalker extends TreeParser { } - SIMPLE_NAME78=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_reference1188); + SIMPLE_NAME78=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_reference1188); pushFollow(FOLLOW_method_prototype_in_method_reference1190); method_prototype79=method_prototype(); state._fsp--; @@ -2485,7 +2485,7 @@ public class smaliTreeWalker extends TreeParser { } methodReference = new ImmutableMethodReference(type, (SIMPLE_NAME78!=null?SIMPLE_NAME78.getText():null), (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).parameters:null), (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).returnType:null)); - + } } @@ -2503,7 +2503,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "field_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:518:1: field_reference returns [ImmutableFieldReference fieldReference] : ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ; + // smaliTreeWalker.g:518:1: field_reference returns [ImmutableFieldReference fieldReference] : ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ; public final ImmutableFieldReference field_reference() throws RecognitionException { ImmutableFieldReference fieldReference = null; @@ -2513,10 +2513,10 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope nonvoid_type_descriptor82 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:3: ( ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor + // smaliTreeWalker.g:519:3: ( ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ) + // smaliTreeWalker.g:519:5: ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: ( reference_type_descriptor )? + // smaliTreeWalker.g:519:5: ( reference_type_descriptor )? int alt19=2; int LA19_0 = input.LA(1); if ( (LA19_0==ARRAY_TYPE_PREFIX||LA19_0==CLASS_DESCRIPTOR) ) { @@ -2524,7 +2524,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt19) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: reference_type_descriptor + // smaliTreeWalker.g:519:5: reference_type_descriptor { pushFollow(FOLLOW_reference_type_descriptor_in_field_reference1207); reference_type_descriptor80=reference_type_descriptor(); @@ -2535,7 +2535,7 @@ public class smaliTreeWalker extends TreeParser { } - SIMPLE_NAME81=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field_reference1210); + SIMPLE_NAME81=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field_reference1210); pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference1212); nonvoid_type_descriptor82=nonvoid_type_descriptor(); state._fsp--; @@ -2549,7 +2549,7 @@ public class smaliTreeWalker extends TreeParser { } fieldReference = new ImmutableFieldReference(type, (SIMPLE_NAME81!=null?SIMPLE_NAME81.getText():null), (nonvoid_type_descriptor82!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor82).type:null)); - + } } @@ -2572,7 +2572,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "registers_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:531:1: registers_directive returns [boolean isLocalsDirective, int registers] : ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ; + // smaliTreeWalker.g:531:1: registers_directive returns [boolean isLocalsDirective, int registers] : ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ; public final smaliTreeWalker.registers_directive_return registers_directive() throws RecognitionException { smaliTreeWalker.registers_directive_return retval = new smaliTreeWalker.registers_directive_return(); retval.start = input.LT(1); @@ -2580,11 +2580,11 @@ public class smaliTreeWalker extends TreeParser { short short_integral_literal83 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:532:3: ( ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:532:5: ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) + // smaliTreeWalker.g:532:3: ( ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ) + // smaliTreeWalker.g:532:5: ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) { retval.registers = 0; - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:533:7: ( I_REGISTERS | I_LOCALS ) + // smaliTreeWalker.g:533:7: ( I_REGISTERS | I_LOCALS ) int alt20=2; int LA20_0 = input.LA(1); if ( (LA20_0==I_REGISTERS) ) { @@ -2602,29 +2602,29 @@ public class smaliTreeWalker extends TreeParser { switch (alt20) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:533:9: I_REGISTERS + // smaliTreeWalker.g:533:9: I_REGISTERS { - match(input,I_REGISTERS,FOLLOW_I_REGISTERS_in_registers_directive1238); + match(input,I_REGISTERS,FOLLOW_I_REGISTERS_in_registers_directive1238); retval.isLocalsDirective = false; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:534:9: I_LOCALS + // smaliTreeWalker.g:534:9: I_LOCALS { - match(input,I_LOCALS,FOLLOW_I_LOCALS_in_registers_directive1250); + match(input,I_LOCALS,FOLLOW_I_LOCALS_in_registers_directive1250); retval.isLocalsDirective = true; } break; } - match(input, Token.DOWN, null); + match(input, Token.DOWN, null); pushFollow(FOLLOW_short_integral_literal_in_registers_directive1268); short_integral_literal83=short_integral_literal(); state._fsp--; retval.registers = short_integral_literal83 & 0xFFFF; - match(input, Token.UP, null); + match(input, Token.UP, null); } @@ -2643,22 +2643,22 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "label_def" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:539:1: label_def : ^( I_LABEL SIMPLE_NAME ) ; + // smaliTreeWalker.g:539:1: label_def : ^( I_LABEL SIMPLE_NAME ) ; public final void label_def() throws RecognitionException { CommonTree SIMPLE_NAME84=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:540:3: ( ^( I_LABEL SIMPLE_NAME ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:540:5: ^( I_LABEL SIMPLE_NAME ) + // smaliTreeWalker.g:540:3: ( ^( I_LABEL SIMPLE_NAME ) ) + // smaliTreeWalker.g:540:5: ^( I_LABEL SIMPLE_NAME ) { - match(input,I_LABEL,FOLLOW_I_LABEL_in_label_def1288); - match(input, Token.DOWN, null); - SIMPLE_NAME84=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_def1290); - match(input, Token.UP, null); + match(input,I_LABEL,FOLLOW_I_LABEL_in_label_def1288); + match(input, Token.DOWN, null); + SIMPLE_NAME84=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_def1290); + match(input, Token.UP, null); method_stack.peek().methodBuilder.addLabel((SIMPLE_NAME84!=null?SIMPLE_NAME84.getText():null)); - + } } @@ -2675,20 +2675,20 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "catches" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:545:1: catches returns [List<BuilderTryBlock> tryBlocks] : ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ; + // smaliTreeWalker.g:545:1: catches returns [List<BuilderTryBlock> tryBlocks] : ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ; public final List<BuilderTryBlock> catches() throws RecognitionException { List<BuilderTryBlock> tryBlocks = null; tryBlocks = Lists.newArrayList(); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:3: ( ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:5: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) + // smaliTreeWalker.g:547:3: ( ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ) + // smaliTreeWalker.g:547:5: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) { - match(input,I_CATCHES,FOLLOW_I_CATCHES_in_catches1316); + match(input,I_CATCHES,FOLLOW_I_CATCHES_in_catches1316); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:17: ( catch_directive )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:547:17: ( catch_directive )* loop21: while (true) { int alt21=2; @@ -2699,7 +2699,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt21) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:17: catch_directive + // smaliTreeWalker.g:547:17: catch_directive { pushFollow(FOLLOW_catch_directive_in_catches1318); catch_directive(); @@ -2713,7 +2713,7 @@ public class smaliTreeWalker extends TreeParser { } } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:34: ( catchall_directive )* + // smaliTreeWalker.g:547:34: ( catchall_directive )* loop22: while (true) { int alt22=2; @@ -2724,7 +2724,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt22) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:34: catchall_directive + // smaliTreeWalker.g:547:34: catchall_directive { pushFollow(FOLLOW_catchall_directive_in_catches1321); catchall_directive(); @@ -2738,7 +2738,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -2758,7 +2758,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "catch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:549:1: catch_directive : ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ; + // smaliTreeWalker.g:549:1: catch_directive : ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ; public final void catch_directive() throws RecognitionException { Label from =null; Label to =null; @@ -2766,11 +2766,11 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope nonvoid_type_descriptor85 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:550:3: ( ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:550:5: ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) + // smaliTreeWalker.g:550:3: ( ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ) + // smaliTreeWalker.g:550:5: ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) { - match(input,I_CATCH,FOLLOW_I_CATCH_in_catch_directive1334); - match(input, Token.DOWN, null); + match(input,I_CATCH,FOLLOW_I_CATCH_in_catch_directive1334); + match(input, Token.DOWN, null); pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive1336); nonvoid_type_descriptor85=nonvoid_type_descriptor(); state._fsp--; @@ -2787,12 +2787,12 @@ public class smaliTreeWalker extends TreeParser { using=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); method_stack.peek().methodBuilder.addCatch(dexBuilder.internTypeReference((nonvoid_type_descriptor85!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor85).type:null)), from, to, using); - + } } @@ -2809,18 +2809,18 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "catchall_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:556:1: catchall_directive : ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ; + // smaliTreeWalker.g:556:1: catchall_directive : ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ; public final void catchall_directive() throws RecognitionException { Label from =null; Label to =null; Label using =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:557:3: ( ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:557:5: ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) + // smaliTreeWalker.g:557:3: ( ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ) + // smaliTreeWalker.g:557:5: ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) { - match(input,I_CATCHALL,FOLLOW_I_CATCHALL_in_catchall_directive1364); - match(input, Token.DOWN, null); + match(input,I_CATCHALL,FOLLOW_I_CATCHALL_in_catchall_directive1364); + match(input, Token.DOWN, null); pushFollow(FOLLOW_label_ref_in_catchall_directive1368); from=label_ref(); state._fsp--; @@ -2833,11 +2833,11 @@ public class smaliTreeWalker extends TreeParser { using=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); method_stack.peek().methodBuilder.addCatch(from, to, using); - + } } @@ -2854,16 +2854,16 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "parameters" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:562:1: parameters[List<SmaliMethodParameter> parameters] : ^( I_PARAMETERS ( parameter[parameters] )* ) ; + // smaliTreeWalker.g:562:1: parameters[List<SmaliMethodParameter> parameters] : ^( I_PARAMETERS ( parameter[parameters] )* ) ; public final void parameters(List<SmaliMethodParameter> parameters) throws RecognitionException { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:3: ( ^( I_PARAMETERS ( parameter[parameters] )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:5: ^( I_PARAMETERS ( parameter[parameters] )* ) + // smaliTreeWalker.g:563:3: ( ^( I_PARAMETERS ( parameter[parameters] )* ) ) + // smaliTreeWalker.g:563:5: ^( I_PARAMETERS ( parameter[parameters] )* ) { - match(input,I_PARAMETERS,FOLLOW_I_PARAMETERS_in_parameters1393); + match(input,I_PARAMETERS,FOLLOW_I_PARAMETERS_in_parameters1393); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:20: ( parameter[parameters] )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:563:20: ( parameter[parameters] )* loop23: while (true) { int alt23=2; @@ -2874,7 +2874,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt23) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:21: parameter[parameters] + // smaliTreeWalker.g:563:21: parameter[parameters] { pushFollow(FOLLOW_parameter_in_parameters1396); parameter(parameters); @@ -2888,7 +2888,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -2907,7 +2907,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "parameter" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:565:1: parameter[List<SmaliMethodParameter> parameters] : ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ; + // smaliTreeWalker.g:565:1: parameter[List<SmaliMethodParameter> parameters] : ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ; public final void parameter(List<SmaliMethodParameter> parameters) throws RecognitionException { CommonTree REGISTER86=null; CommonTree I_PARAMETER87=null; @@ -2915,13 +2915,13 @@ public class smaliTreeWalker extends TreeParser { Set<Annotation> annotations89 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:3: ( ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:5: ^( I_PARAMETER REGISTER ( string_literal )? annotations ) + // smaliTreeWalker.g:566:3: ( ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ) + // smaliTreeWalker.g:566:5: ^( I_PARAMETER REGISTER ( string_literal )? annotations ) { - I_PARAMETER87=(CommonTree)match(input,I_PARAMETER,FOLLOW_I_PARAMETER_in_parameter1412); - match(input, Token.DOWN, null); - REGISTER86=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_parameter1414); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:28: ( string_literal )? + I_PARAMETER87=(CommonTree)match(input,I_PARAMETER,FOLLOW_I_PARAMETER_in_parameter1412); + match(input, Token.DOWN, null); + REGISTER86=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_parameter1414); + // smaliTreeWalker.g:566:28: ( string_literal )? int alt24=2; int LA24_0 = input.LA(1); if ( (LA24_0==STRING_LITERAL) ) { @@ -2929,7 +2929,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt24) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:28: string_literal + // smaliTreeWalker.g:566:28: string_literal { pushFollow(FOLLOW_string_literal_in_parameter1416); string_literal88=string_literal(); @@ -2944,7 +2944,7 @@ public class smaliTreeWalker extends TreeParser { annotations89=annotations(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); final int registerNumber = parseRegister_short((REGISTER86!=null?REGISTER86.getText():null)); @@ -2976,7 +2976,7 @@ public class smaliTreeWalker extends TreeParser { if (annotations89 != null && annotations89.size() > 0) { methodParameter.annotations = annotations89; } - + } } @@ -2993,10 +2993,10 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "debug_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:599:1: debug_directive : ( line | local | end_local | restart_local | prologue | epilogue | source ); + // smaliTreeWalker.g:599:1: debug_directive : ( line | local | end_local | restart_local | prologue | epilogue | source ); public final void debug_directive() throws RecognitionException { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:600:3: ( line | local | end_local | restart_local | prologue | epilogue | source ) + // smaliTreeWalker.g:600:3: ( line | local | end_local | restart_local | prologue | epilogue | source ) int alt25=7; switch ( input.LA(1) ) { case I_LINE: @@ -3041,7 +3041,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt25) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:600:5: line + // smaliTreeWalker.g:600:5: line { pushFollow(FOLLOW_line_in_debug_directive1436); line(); @@ -3050,7 +3050,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:601:5: local + // smaliTreeWalker.g:601:5: local { pushFollow(FOLLOW_local_in_debug_directive1442); local(); @@ -3059,7 +3059,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:602:5: end_local + // smaliTreeWalker.g:602:5: end_local { pushFollow(FOLLOW_end_local_in_debug_directive1448); end_local(); @@ -3068,7 +3068,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:603:5: restart_local + // smaliTreeWalker.g:603:5: restart_local { pushFollow(FOLLOW_restart_local_in_debug_directive1454); restart_local(); @@ -3077,7 +3077,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:604:5: prologue + // smaliTreeWalker.g:604:5: prologue { pushFollow(FOLLOW_prologue_in_debug_directive1460); prologue(); @@ -3086,7 +3086,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:605:5: epilogue + // smaliTreeWalker.g:605:5: epilogue { pushFollow(FOLLOW_epilogue_in_debug_directive1466); epilogue(); @@ -3095,7 +3095,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:606:5: source + // smaliTreeWalker.g:606:5: source { pushFollow(FOLLOW_source_in_debug_directive1472); source(); @@ -3119,25 +3119,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "line" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:608:1: line : ^( I_LINE integral_literal ) ; + // smaliTreeWalker.g:608:1: line : ^( I_LINE integral_literal ) ; public final void line() throws RecognitionException { int integral_literal90 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:609:3: ( ^( I_LINE integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:609:5: ^( I_LINE integral_literal ) + // smaliTreeWalker.g:609:3: ( ^( I_LINE integral_literal ) ) + // smaliTreeWalker.g:609:5: ^( I_LINE integral_literal ) { - match(input,I_LINE,FOLLOW_I_LINE_in_line1483); - match(input, Token.DOWN, null); + match(input,I_LINE,FOLLOW_I_LINE_in_line1483); + match(input, Token.DOWN, null); pushFollow(FOLLOW_integral_literal_in_line1485); integral_literal90=integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); method_stack.peek().methodBuilder.addLineNumber(integral_literal90); - + } } @@ -3154,7 +3154,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "local" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:614:1: local : ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ; + // smaliTreeWalker.g:614:1: local : ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ; public final void local() throws RecognitionException { CommonTree REGISTER91=null; String name =null; @@ -3162,13 +3162,13 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope nonvoid_type_descriptor92 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:3: ( ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:5: ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) + // smaliTreeWalker.g:615:3: ( ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ) + // smaliTreeWalker.g:615:5: ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) { - match(input,I_LOCAL,FOLLOW_I_LOCAL_in_local1503); - match(input, Token.DOWN, null); - REGISTER91=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_local1505); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:24: ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? + match(input,I_LOCAL,FOLLOW_I_LOCAL_in_local1503); + match(input, Token.DOWN, null); + REGISTER91=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_local1505); + // smaliTreeWalker.g:615:24: ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? int alt29=2; int LA29_0 = input.LA(1); if ( (LA29_0==NULL_LITERAL||LA29_0==STRING_LITERAL) ) { @@ -3176,9 +3176,9 @@ public class smaliTreeWalker extends TreeParser { } switch (alt29) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? + // smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) + // smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) int alt26=2; int LA26_0 = input.LA(1); if ( (LA26_0==NULL_LITERAL) ) { @@ -3196,13 +3196,13 @@ public class smaliTreeWalker extends TreeParser { switch (alt26) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:26: NULL_LITERAL + // smaliTreeWalker.g:615:26: NULL_LITERAL { - match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local1509); + match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local1509); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:41: name= string_literal + // smaliTreeWalker.g:615:41: name= string_literal { pushFollow(FOLLOW_string_literal_in_local1515); name=string_literal(); @@ -3213,7 +3213,7 @@ public class smaliTreeWalker extends TreeParser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:62: ( nonvoid_type_descriptor )? + // smaliTreeWalker.g:615:62: ( nonvoid_type_descriptor )? int alt27=2; int LA27_0 = input.LA(1); if ( (LA27_0==ARRAY_TYPE_PREFIX||LA27_0==CLASS_DESCRIPTOR||LA27_0==PRIMITIVE_TYPE) ) { @@ -3221,7 +3221,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt27) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:62: nonvoid_type_descriptor + // smaliTreeWalker.g:615:62: nonvoid_type_descriptor { pushFollow(FOLLOW_nonvoid_type_descriptor_in_local1518); nonvoid_type_descriptor92=nonvoid_type_descriptor(); @@ -3232,7 +3232,7 @@ public class smaliTreeWalker extends TreeParser { } - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:96: (signature= string_literal )? + // smaliTreeWalker.g:615:96: (signature= string_literal )? int alt28=2; int LA28_0 = input.LA(1); if ( (LA28_0==STRING_LITERAL) ) { @@ -3240,7 +3240,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt28) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:96: signature= string_literal + // smaliTreeWalker.g:615:96: signature= string_literal { pushFollow(FOLLOW_string_literal_in_local1523); signature=string_literal(); @@ -3256,7 +3256,7 @@ public class smaliTreeWalker extends TreeParser { } - match(input, Token.UP, null); + match(input, Token.UP, null); int registerNumber = parseRegister_short((REGISTER91!=null?REGISTER91.getText():null)); @@ -3264,7 +3264,7 @@ public class smaliTreeWalker extends TreeParser { dexBuilder.internNullableStringReference(name), dexBuilder.internNullableTypeReference((nonvoid_type_descriptor92!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor92).type:null)), dexBuilder.internNullableStringReference(signature)); - + } } @@ -3281,23 +3281,23 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "end_local" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:624:1: end_local : ^( I_END_LOCAL REGISTER ) ; + // smaliTreeWalker.g:624:1: end_local : ^( I_END_LOCAL REGISTER ) ; public final void end_local() throws RecognitionException { CommonTree REGISTER93=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:625:3: ( ^( I_END_LOCAL REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:625:5: ^( I_END_LOCAL REGISTER ) + // smaliTreeWalker.g:625:3: ( ^( I_END_LOCAL REGISTER ) ) + // smaliTreeWalker.g:625:5: ^( I_END_LOCAL REGISTER ) { - match(input,I_END_LOCAL,FOLLOW_I_END_LOCAL_in_end_local1544); - match(input, Token.DOWN, null); - REGISTER93=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_end_local1546); - match(input, Token.UP, null); + match(input,I_END_LOCAL,FOLLOW_I_END_LOCAL_in_end_local1544); + match(input, Token.DOWN, null); + REGISTER93=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_end_local1546); + match(input, Token.UP, null); int registerNumber = parseRegister_short((REGISTER93!=null?REGISTER93.getText():null)); method_stack.peek().methodBuilder.addEndLocal(registerNumber); - + } } @@ -3314,23 +3314,23 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "restart_local" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:631:1: restart_local : ^( I_RESTART_LOCAL REGISTER ) ; + // smaliTreeWalker.g:631:1: restart_local : ^( I_RESTART_LOCAL REGISTER ) ; public final void restart_local() throws RecognitionException { CommonTree REGISTER94=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:632:3: ( ^( I_RESTART_LOCAL REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:632:5: ^( I_RESTART_LOCAL REGISTER ) + // smaliTreeWalker.g:632:3: ( ^( I_RESTART_LOCAL REGISTER ) ) + // smaliTreeWalker.g:632:5: ^( I_RESTART_LOCAL REGISTER ) { - match(input,I_RESTART_LOCAL,FOLLOW_I_RESTART_LOCAL_in_restart_local1564); - match(input, Token.DOWN, null); - REGISTER94=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local1566); - match(input, Token.UP, null); + match(input,I_RESTART_LOCAL,FOLLOW_I_RESTART_LOCAL_in_restart_local1564); + match(input, Token.DOWN, null); + REGISTER94=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local1566); + match(input, Token.UP, null); int registerNumber = parseRegister_short((REGISTER94!=null?REGISTER94.getText():null)); method_stack.peek().methodBuilder.addRestartLocal(registerNumber); - + } } @@ -3347,16 +3347,16 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "prologue" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:638:1: prologue : I_PROLOGUE ; + // smaliTreeWalker.g:638:1: prologue : I_PROLOGUE ; public final void prologue() throws RecognitionException { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:639:3: ( I_PROLOGUE ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:639:5: I_PROLOGUE + // smaliTreeWalker.g:639:3: ( I_PROLOGUE ) + // smaliTreeWalker.g:639:5: I_PROLOGUE { - match(input,I_PROLOGUE,FOLLOW_I_PROLOGUE_in_prologue1583); + match(input,I_PROLOGUE,FOLLOW_I_PROLOGUE_in_prologue1583); method_stack.peek().methodBuilder.addPrologue(); - + } } @@ -3373,16 +3373,16 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "epilogue" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:644:1: epilogue : I_EPILOGUE ; + // smaliTreeWalker.g:644:1: epilogue : I_EPILOGUE ; public final void epilogue() throws RecognitionException { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:645:3: ( I_EPILOGUE ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:645:5: I_EPILOGUE + // smaliTreeWalker.g:645:3: ( I_EPILOGUE ) + // smaliTreeWalker.g:645:5: I_EPILOGUE { - match(input,I_EPILOGUE,FOLLOW_I_EPILOGUE_in_epilogue1599); + match(input,I_EPILOGUE,FOLLOW_I_EPILOGUE_in_epilogue1599); method_stack.peek().methodBuilder.addEpilogue(); - + } } @@ -3399,18 +3399,18 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "source" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:650:1: source : ^( I_SOURCE ( string_literal )? ) ; + // smaliTreeWalker.g:650:1: source : ^( I_SOURCE ( string_literal )? ) ; public final void source() throws RecognitionException { String string_literal95 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:3: ( ^( I_SOURCE ( string_literal )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:5: ^( I_SOURCE ( string_literal )? ) + // smaliTreeWalker.g:651:3: ( ^( I_SOURCE ( string_literal )? ) ) + // smaliTreeWalker.g:651:5: ^( I_SOURCE ( string_literal )? ) { - match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source1616); + match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source1616); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:16: ( string_literal )? + match(input, Token.DOWN, null); + // smaliTreeWalker.g:651:16: ( string_literal )? int alt30=2; int LA30_0 = input.LA(1); if ( (LA30_0==STRING_LITERAL) ) { @@ -3418,7 +3418,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt30) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:16: string_literal + // smaliTreeWalker.g:651:16: string_literal { pushFollow(FOLLOW_string_literal_in_source1618); string_literal95=string_literal(); @@ -3429,12 +3429,12 @@ public class smaliTreeWalker extends TreeParser { } - match(input, Token.UP, null); + match(input, Token.UP, null); } method_stack.peek().methodBuilder.addSetSourceFile(dexBuilder.internNullableStringReference(string_literal95)); - + } } @@ -3451,16 +3451,16 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "ordered_method_items" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:656:1: ordered_method_items : ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ; + // smaliTreeWalker.g:656:1: ordered_method_items : ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ; public final void ordered_method_items() throws RecognitionException { try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:3: ( ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:5: ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) + // smaliTreeWalker.g:657:3: ( ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ) + // smaliTreeWalker.g:657:5: ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) { - match(input,I_ORDERED_METHOD_ITEMS,FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637); + match(input,I_ORDERED_METHOD_ITEMS,FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:30: ( label_def | instruction | debug_directive )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:657:30: ( label_def | instruction | debug_directive )* loop31: while (true) { int alt31=4; @@ -3524,7 +3524,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt31) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:31: label_def + // smaliTreeWalker.g:657:31: label_def { pushFollow(FOLLOW_label_def_in_ordered_method_items1640); label_def(); @@ -3533,7 +3533,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:43: instruction + // smaliTreeWalker.g:657:43: instruction { pushFollow(FOLLOW_instruction_in_ordered_method_items1644); instruction(); @@ -3542,7 +3542,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:57: debug_directive + // smaliTreeWalker.g:657:57: debug_directive { pushFollow(FOLLOW_debug_directive_in_ordered_method_items1648); debug_directive(); @@ -3556,7 +3556,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -3575,7 +3575,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "label_ref" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:659:1: label_ref returns [Label label] : SIMPLE_NAME ; + // smaliTreeWalker.g:659:1: label_ref returns [Label label] : SIMPLE_NAME ; public final Label label_ref() throws RecognitionException { Label label = null; @@ -3583,11 +3583,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree SIMPLE_NAME96=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:660:3: ( SIMPLE_NAME ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:660:5: SIMPLE_NAME + // smaliTreeWalker.g:660:3: ( SIMPLE_NAME ) + // smaliTreeWalker.g:660:5: SIMPLE_NAME { - SIMPLE_NAME96=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_ref1664); - label = method_stack.peek().methodBuilder.getLabel((SIMPLE_NAME96!=null?SIMPLE_NAME96.getText():null)); + SIMPLE_NAME96=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_ref1664); + label = method_stack.peek().methodBuilder.getLabel((SIMPLE_NAME96!=null?SIMPLE_NAME96.getText():null)); } } @@ -3610,7 +3610,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "register_list" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:662:1: register_list returns [byte[] registers, byte registerCount] : ^( I_REGISTER_LIST ( REGISTER )* ) ; + // smaliTreeWalker.g:662:1: register_list returns [byte[] registers, byte registerCount] : ^( I_REGISTER_LIST ( REGISTER )* ) ; public final smaliTreeWalker.register_list_return register_list() throws RecognitionException { smaliTreeWalker.register_list_return retval = new smaliTreeWalker.register_list_return(); retval.start = input.LT(1); @@ -3621,15 +3621,15 @@ public class smaliTreeWalker extends TreeParser { retval.registers = new byte[5]; retval.registerCount = 0; - + try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:668:3: ( ^( I_REGISTER_LIST ( REGISTER )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:668:5: ^( I_REGISTER_LIST ( REGISTER )* ) + // smaliTreeWalker.g:668:3: ( ^( I_REGISTER_LIST ( REGISTER )* ) ) + // smaliTreeWalker.g:668:5: ^( I_REGISTER_LIST ( REGISTER )* ) { - I_REGISTER_LIST97=(CommonTree)match(input,I_REGISTER_LIST,FOLLOW_I_REGISTER_LIST_in_register_list1689); + I_REGISTER_LIST97=(CommonTree)match(input,I_REGISTER_LIST,FOLLOW_I_REGISTER_LIST_in_register_list1689); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:669:7: ( REGISTER )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:669:7: ( REGISTER )* loop32: while (true) { int alt32=2; @@ -3640,16 +3640,16 @@ public class smaliTreeWalker extends TreeParser { switch (alt32) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:669:8: REGISTER + // smaliTreeWalker.g:669:8: REGISTER { - REGISTER98=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_list1698); + REGISTER98=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_list1698); if (retval.registerCount == 5) { throw new SemanticException(input, I_REGISTER_LIST97, "A list of registers can only have a maximum of 5 " + "registers. Use the <op>/range alternate opcode instead."); } retval.registers[retval.registerCount++] = parseRegister_nibble((REGISTER98!=null?REGISTER98.getText():null)); - + } break; @@ -3658,7 +3658,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -3683,7 +3683,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "register_range" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:678:1: register_range returns [int startRegister, int endRegister] : ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ; + // smaliTreeWalker.g:678:1: register_range returns [int startRegister, int endRegister] : ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ; public final smaliTreeWalker.register_range_return register_range() throws RecognitionException { smaliTreeWalker.register_range_return retval = new smaliTreeWalker.register_range_return(); retval.start = input.LT(1); @@ -3693,13 +3693,13 @@ public class smaliTreeWalker extends TreeParser { CommonTree I_REGISTER_RANGE99=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:3: ( ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:5: ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) + // smaliTreeWalker.g:679:3: ( ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ) + // smaliTreeWalker.g:679:5: ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) { - I_REGISTER_RANGE99=(CommonTree)match(input,I_REGISTER_RANGE,FOLLOW_I_REGISTER_RANGE_in_register_range1723); + I_REGISTER_RANGE99=(CommonTree)match(input,I_REGISTER_RANGE,FOLLOW_I_REGISTER_RANGE_in_register_range1723); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:24: (startReg= REGISTER (endReg= REGISTER )? )? + match(input, Token.DOWN, null); + // smaliTreeWalker.g:679:24: (startReg= REGISTER (endReg= REGISTER )? )? int alt34=2; int LA34_0 = input.LA(1); if ( (LA34_0==REGISTER) ) { @@ -3707,10 +3707,10 @@ public class smaliTreeWalker extends TreeParser { } switch (alt34) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:25: startReg= REGISTER (endReg= REGISTER )? + // smaliTreeWalker.g:679:25: startReg= REGISTER (endReg= REGISTER )? { - startReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1728); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:49: (endReg= REGISTER )? + startReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1728); + // smaliTreeWalker.g:679:49: (endReg= REGISTER )? int alt33=2; int LA33_0 = input.LA(1); if ( (LA33_0==REGISTER) ) { @@ -3718,9 +3718,9 @@ public class smaliTreeWalker extends TreeParser { } switch (alt33) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:49: endReg= REGISTER + // smaliTreeWalker.g:679:49: endReg= REGISTER { - endReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1732); + endReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1732); } break; @@ -3731,7 +3731,7 @@ public class smaliTreeWalker extends TreeParser { } - match(input, Token.UP, null); + match(input, Token.UP, null); } @@ -3751,7 +3751,7 @@ public class smaliTreeWalker extends TreeParser { throw new SemanticException(input, I_REGISTER_RANGE99, "A register range must have the lower register listed first"); } } - + } } @@ -3769,7 +3769,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "verification_error_reference" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:699:1: verification_error_reference returns [ImmutableReference reference] : ( CLASS_DESCRIPTOR | field_reference | method_reference ); + // smaliTreeWalker.g:699:1: verification_error_reference returns [ImmutableReference reference] : ( CLASS_DESCRIPTOR | field_reference | method_reference ); public final ImmutableReference verification_error_reference() throws RecognitionException { ImmutableReference reference = null; @@ -3779,7 +3779,7 @@ public class smaliTreeWalker extends TreeParser { ImmutableMethodReference method_reference102 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:700:3: ( CLASS_DESCRIPTOR | field_reference | method_reference ) + // smaliTreeWalker.g:700:3: ( CLASS_DESCRIPTOR | field_reference | method_reference ) int alt35=3; switch ( input.LA(1) ) { case CLASS_DESCRIPTOR: @@ -3960,16 +3960,16 @@ public class smaliTreeWalker extends TreeParser { } switch (alt35) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:700:5: CLASS_DESCRIPTOR + // smaliTreeWalker.g:700:5: CLASS_DESCRIPTOR { - CLASS_DESCRIPTOR100=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755); + CLASS_DESCRIPTOR100=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755); reference = new ImmutableTypeReference((CLASS_DESCRIPTOR100!=null?CLASS_DESCRIPTOR100.getText():null)); - + } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:704:5: field_reference + // smaliTreeWalker.g:704:5: field_reference { pushFollow(FOLLOW_field_reference_in_verification_error_reference1765); field_reference101=field_reference(); @@ -3977,11 +3977,11 @@ public class smaliTreeWalker extends TreeParser { reference = field_reference101; - + } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:708:5: method_reference + // smaliTreeWalker.g:708:5: method_reference { pushFollow(FOLLOW_method_reference_in_verification_error_reference1775); method_reference102=method_reference(); @@ -3989,7 +3989,7 @@ public class smaliTreeWalker extends TreeParser { reference = method_reference102; - + } break; @@ -4009,7 +4009,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "verification_error_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:713:1: verification_error_type returns [int verificationError] : VERIFICATION_ERROR_TYPE ; + // smaliTreeWalker.g:713:1: verification_error_type returns [int verificationError] : VERIFICATION_ERROR_TYPE ; public final int verification_error_type() throws RecognitionException { int verificationError = 0; @@ -4017,13 +4017,13 @@ public class smaliTreeWalker extends TreeParser { CommonTree VERIFICATION_ERROR_TYPE103=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:714:3: ( VERIFICATION_ERROR_TYPE ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:714:5: VERIFICATION_ERROR_TYPE + // smaliTreeWalker.g:714:3: ( VERIFICATION_ERROR_TYPE ) + // smaliTreeWalker.g:714:5: VERIFICATION_ERROR_TYPE { - VERIFICATION_ERROR_TYPE103=(CommonTree)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792); + VERIFICATION_ERROR_TYPE103=(CommonTree)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792); verificationError = VerificationError.getVerificationError((VERIFICATION_ERROR_TYPE103!=null?VERIFICATION_ERROR_TYPE103.getText():null)); - + } } @@ -4044,13 +4044,13 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "instruction" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:719:1: instruction : ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ); + // smaliTreeWalker.g:719:1: instruction : ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ); public final smaliTreeWalker.instruction_return instruction() throws RecognitionException { smaliTreeWalker.instruction_return retval = new smaliTreeWalker.instruction_return(); retval.start = input.LT(1); try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:720:3: ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ) + // smaliTreeWalker.g:720:3: ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive ) int alt36=36; switch ( input.LA(1) ) { case I_STATEMENT_FORMAT10t: @@ -4240,7 +4240,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt36) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:720:5: insn_format10t + // smaliTreeWalker.g:720:5: insn_format10t { pushFollow(FOLLOW_insn_format10t_in_instruction1806); insn_format10t(); @@ -4249,7 +4249,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:721:5: insn_format10x + // smaliTreeWalker.g:721:5: insn_format10x { pushFollow(FOLLOW_insn_format10x_in_instruction1812); insn_format10x(); @@ -4258,7 +4258,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:722:5: insn_format11n + // smaliTreeWalker.g:722:5: insn_format11n { pushFollow(FOLLOW_insn_format11n_in_instruction1818); insn_format11n(); @@ -4267,7 +4267,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:723:5: insn_format11x + // smaliTreeWalker.g:723:5: insn_format11x { pushFollow(FOLLOW_insn_format11x_in_instruction1824); insn_format11x(); @@ -4276,7 +4276,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:724:5: insn_format12x + // smaliTreeWalker.g:724:5: insn_format12x { pushFollow(FOLLOW_insn_format12x_in_instruction1830); insn_format12x(); @@ -4285,7 +4285,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 6 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:725:5: insn_format20bc + // smaliTreeWalker.g:725:5: insn_format20bc { pushFollow(FOLLOW_insn_format20bc_in_instruction1836); insn_format20bc(); @@ -4294,7 +4294,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 7 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:726:5: insn_format20t + // smaliTreeWalker.g:726:5: insn_format20t { pushFollow(FOLLOW_insn_format20t_in_instruction1842); insn_format20t(); @@ -4303,7 +4303,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 8 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:727:5: insn_format21c_field + // smaliTreeWalker.g:727:5: insn_format21c_field { pushFollow(FOLLOW_insn_format21c_field_in_instruction1848); insn_format21c_field(); @@ -4312,7 +4312,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 9 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:728:5: insn_format21c_string + // smaliTreeWalker.g:728:5: insn_format21c_string { pushFollow(FOLLOW_insn_format21c_string_in_instruction1854); insn_format21c_string(); @@ -4321,7 +4321,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 10 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:729:5: insn_format21c_type + // smaliTreeWalker.g:729:5: insn_format21c_type { pushFollow(FOLLOW_insn_format21c_type_in_instruction1860); insn_format21c_type(); @@ -4330,7 +4330,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 11 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:730:5: insn_format21ih + // smaliTreeWalker.g:730:5: insn_format21ih { pushFollow(FOLLOW_insn_format21ih_in_instruction1866); insn_format21ih(); @@ -4339,7 +4339,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 12 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:731:5: insn_format21lh + // smaliTreeWalker.g:731:5: insn_format21lh { pushFollow(FOLLOW_insn_format21lh_in_instruction1872); insn_format21lh(); @@ -4348,7 +4348,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 13 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:732:5: insn_format21s + // smaliTreeWalker.g:732:5: insn_format21s { pushFollow(FOLLOW_insn_format21s_in_instruction1878); insn_format21s(); @@ -4357,7 +4357,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 14 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:733:5: insn_format21t + // smaliTreeWalker.g:733:5: insn_format21t { pushFollow(FOLLOW_insn_format21t_in_instruction1884); insn_format21t(); @@ -4366,7 +4366,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 15 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:734:5: insn_format22b + // smaliTreeWalker.g:734:5: insn_format22b { pushFollow(FOLLOW_insn_format22b_in_instruction1890); insn_format22b(); @@ -4375,7 +4375,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 16 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:735:5: insn_format22c_field + // smaliTreeWalker.g:735:5: insn_format22c_field { pushFollow(FOLLOW_insn_format22c_field_in_instruction1896); insn_format22c_field(); @@ -4384,7 +4384,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 17 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:736:5: insn_format22c_type + // smaliTreeWalker.g:736:5: insn_format22c_type { pushFollow(FOLLOW_insn_format22c_type_in_instruction1902); insn_format22c_type(); @@ -4393,7 +4393,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 18 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:737:5: insn_format22s + // smaliTreeWalker.g:737:5: insn_format22s { pushFollow(FOLLOW_insn_format22s_in_instruction1908); insn_format22s(); @@ -4402,7 +4402,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 19 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:738:5: insn_format22t + // smaliTreeWalker.g:738:5: insn_format22t { pushFollow(FOLLOW_insn_format22t_in_instruction1914); insn_format22t(); @@ -4411,7 +4411,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 20 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:739:5: insn_format22x + // smaliTreeWalker.g:739:5: insn_format22x { pushFollow(FOLLOW_insn_format22x_in_instruction1920); insn_format22x(); @@ -4420,7 +4420,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 21 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:740:5: insn_format23x + // smaliTreeWalker.g:740:5: insn_format23x { pushFollow(FOLLOW_insn_format23x_in_instruction1926); insn_format23x(); @@ -4429,7 +4429,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 22 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:741:5: insn_format30t + // smaliTreeWalker.g:741:5: insn_format30t { pushFollow(FOLLOW_insn_format30t_in_instruction1932); insn_format30t(); @@ -4438,7 +4438,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 23 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:742:5: insn_format31c + // smaliTreeWalker.g:742:5: insn_format31c { pushFollow(FOLLOW_insn_format31c_in_instruction1938); insn_format31c(); @@ -4447,7 +4447,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 24 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:743:5: insn_format31i + // smaliTreeWalker.g:743:5: insn_format31i { pushFollow(FOLLOW_insn_format31i_in_instruction1944); insn_format31i(); @@ -4456,7 +4456,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 25 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:744:5: insn_format31t + // smaliTreeWalker.g:744:5: insn_format31t { pushFollow(FOLLOW_insn_format31t_in_instruction1950); insn_format31t(); @@ -4465,7 +4465,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 26 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:745:5: insn_format32x + // smaliTreeWalker.g:745:5: insn_format32x { pushFollow(FOLLOW_insn_format32x_in_instruction1956); insn_format32x(); @@ -4474,7 +4474,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 27 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:746:5: insn_format35c_method + // smaliTreeWalker.g:746:5: insn_format35c_method { pushFollow(FOLLOW_insn_format35c_method_in_instruction1962); insn_format35c_method(); @@ -4483,7 +4483,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 28 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:747:5: insn_format35c_type + // smaliTreeWalker.g:747:5: insn_format35c_type { pushFollow(FOLLOW_insn_format35c_type_in_instruction1968); insn_format35c_type(); @@ -4492,7 +4492,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 29 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:748:5: insn_format3rc_method + // smaliTreeWalker.g:748:5: insn_format3rc_method { pushFollow(FOLLOW_insn_format3rc_method_in_instruction1974); insn_format3rc_method(); @@ -4501,7 +4501,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 30 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:749:5: insn_format3rc_type + // smaliTreeWalker.g:749:5: insn_format3rc_type { pushFollow(FOLLOW_insn_format3rc_type_in_instruction1980); insn_format3rc_type(); @@ -4510,7 +4510,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 31 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:750:5: insn_format45cc_method + // smaliTreeWalker.g:750:5: insn_format45cc_method { pushFollow(FOLLOW_insn_format45cc_method_in_instruction1986); insn_format45cc_method(); @@ -4519,7 +4519,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 32 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:751:5: insn_format4rcc_method + // smaliTreeWalker.g:751:5: insn_format4rcc_method { pushFollow(FOLLOW_insn_format4rcc_method_in_instruction1992); insn_format4rcc_method(); @@ -4528,7 +4528,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 33 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:752:5: insn_format51l_type + // smaliTreeWalker.g:752:5: insn_format51l_type { pushFollow(FOLLOW_insn_format51l_type_in_instruction1998); insn_format51l_type(); @@ -4537,7 +4537,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 34 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:753:5: insn_array_data_directive + // smaliTreeWalker.g:753:5: insn_array_data_directive { pushFollow(FOLLOW_insn_array_data_directive_in_instruction2004); insn_array_data_directive(); @@ -4546,7 +4546,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 35 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:754:5: insn_packed_switch_directive + // smaliTreeWalker.g:754:5: insn_packed_switch_directive { pushFollow(FOLLOW_insn_packed_switch_directive_in_instruction2010); insn_packed_switch_directive(); @@ -4555,7 +4555,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 36 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:755:5: insn_sparse_switch_directive + // smaliTreeWalker.g:755:5: insn_sparse_switch_directive { pushFollow(FOLLOW_insn_sparse_switch_directive_in_instruction2016); insn_sparse_switch_directive(); @@ -4570,7 +4570,7 @@ public class smaliTreeWalker extends TreeParser { reportError(new SemanticException(input, ((CommonTree)retval.start), ex.getMessage())); recover(input, null); - + } finally { @@ -4583,28 +4583,28 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format10t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:761:1: insn_format10t : ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ; + // smaliTreeWalker.g:761:1: insn_format10t : ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ; public final void insn_format10t() throws RecognitionException { CommonTree INSTRUCTION_FORMAT10t104=null; Label label_ref105 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:762:3: ( ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:763:5: ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) + // smaliTreeWalker.g:762:3: ( ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ) + // smaliTreeWalker.g:763:5: ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) { - match(input,I_STATEMENT_FORMAT10t,FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT10t104=(CommonTree)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042); + match(input,I_STATEMENT_FORMAT10t,FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT10t104=(CommonTree)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042); pushFollow(FOLLOW_label_ref_in_insn_format10t2044); label_ref105=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10t104!=null?INSTRUCTION_FORMAT10t104.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10t(opcode, label_ref105)); - + } } @@ -4621,23 +4621,23 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format10x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:769:1: insn_format10x : ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ; + // smaliTreeWalker.g:769:1: insn_format10x : ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ; public final void insn_format10x() throws RecognitionException { CommonTree INSTRUCTION_FORMAT10x106=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:770:3: ( ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:771:5: ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) + // smaliTreeWalker.g:770:3: ( ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ) + // smaliTreeWalker.g:771:5: ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) { - match(input,I_STATEMENT_FORMAT10x,FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT10x106=(CommonTree)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT10x,FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT10x106=(CommonTree)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10x106!=null?INSTRUCTION_FORMAT10x106.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10x(opcode)); - + } } @@ -4654,25 +4654,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format11n" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:777:1: insn_format11n : ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ; + // smaliTreeWalker.g:777:1: insn_format11n : ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ; public final void insn_format11n() throws RecognitionException { CommonTree INSTRUCTION_FORMAT11n107=null; CommonTree REGISTER108=null; short short_integral_literal109 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:778:3: ( ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:779:5: ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) + // smaliTreeWalker.g:778:3: ( ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ) + // smaliTreeWalker.g:779:5: ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) { - match(input,I_STATEMENT_FORMAT11n,FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT11n107=(CommonTree)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094); - REGISTER108=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n2096); + match(input,I_STATEMENT_FORMAT11n,FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT11n107=(CommonTree)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094); + REGISTER108=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n2096); pushFollow(FOLLOW_short_integral_literal_in_insn_format11n2098); short_integral_literal109=short_integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11n107!=null?INSTRUCTION_FORMAT11n107.getText():null)); @@ -4682,7 +4682,7 @@ public class smaliTreeWalker extends TreeParser { LiteralTools.checkNibble(litB); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11n(opcode, regA, litB)); - + } } @@ -4699,27 +4699,27 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format11x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:790:1: insn_format11x : ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ; + // smaliTreeWalker.g:790:1: insn_format11x : ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ; public final void insn_format11x() throws RecognitionException { CommonTree INSTRUCTION_FORMAT11x110=null; CommonTree REGISTER111=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:791:3: ( ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:792:5: ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) + // smaliTreeWalker.g:791:3: ( ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ) + // smaliTreeWalker.g:792:5: ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) { - match(input,I_STATEMENT_FORMAT11x,FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT11x110=(CommonTree)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123); - REGISTER111=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x2125); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT11x,FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT11x110=(CommonTree)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123); + REGISTER111=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x2125); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11x110!=null?INSTRUCTION_FORMAT11x110.getText():null)); short regA = parseRegister_byte((REGISTER111!=null?REGISTER111.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11x(opcode, regA)); - + } } @@ -4736,22 +4736,22 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format12x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:800:1: insn_format12x : ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ; + // smaliTreeWalker.g:800:1: insn_format12x : ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ; public final void insn_format12x() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; CommonTree INSTRUCTION_FORMAT12x112=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:801:3: ( ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:802:5: ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) + // smaliTreeWalker.g:801:3: ( ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ) + // smaliTreeWalker.g:802:5: ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) { - match(input,I_STATEMENT_FORMAT12x,FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT12x112=(CommonTree)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2154); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2158); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT12x,FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT12x112=(CommonTree)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2154); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2158); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT12x112!=null?INSTRUCTION_FORMAT12x112.getText():null)); @@ -4759,7 +4759,7 @@ public class smaliTreeWalker extends TreeParser { byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction12x(opcode, regA, regB)); - + } } @@ -4776,19 +4776,19 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format20bc" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:811:1: insn_format20bc : ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ; + // smaliTreeWalker.g:811:1: insn_format20bc : ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ; public final void insn_format20bc() throws RecognitionException { CommonTree INSTRUCTION_FORMAT20bc113=null; int verification_error_type114 =0; ImmutableReference verification_error_reference115 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:812:3: ( ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:813:5: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) + // smaliTreeWalker.g:812:3: ( ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ) + // smaliTreeWalker.g:813:5: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) { - match(input,I_STATEMENT_FORMAT20bc,FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT20bc113=(CommonTree)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183); + match(input,I_STATEMENT_FORMAT20bc,FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT20bc113=(CommonTree)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183); pushFollow(FOLLOW_verification_error_type_in_insn_format20bc2185); verification_error_type114=verification_error_type(); state._fsp--; @@ -4797,7 +4797,7 @@ public class smaliTreeWalker extends TreeParser { verification_error_reference115=verification_error_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc113!=null?INSTRUCTION_FORMAT20bc113.getText():null)); @@ -4807,7 +4807,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20bc(opcode, verificationError, dexBuilder.internReference(referencedItem))); - + } } @@ -4824,28 +4824,28 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format20t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:824:1: insn_format20t : ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ; + // smaliTreeWalker.g:824:1: insn_format20t : ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ; public final void insn_format20t() throws RecognitionException { CommonTree INSTRUCTION_FORMAT20t116=null; Label label_ref117 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:825:3: ( ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:826:5: ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) + // smaliTreeWalker.g:825:3: ( ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ) + // smaliTreeWalker.g:826:5: ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) { - match(input,I_STATEMENT_FORMAT20t,FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT20t116=(CommonTree)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212); + match(input,I_STATEMENT_FORMAT20t,FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT20t116=(CommonTree)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212); pushFollow(FOLLOW_label_ref_in_insn_format20t2214); label_ref117=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20t116!=null?INSTRUCTION_FORMAT20t116.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20t(opcode, label_ref117)); - + } } @@ -4862,18 +4862,18 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21c_field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:832:1: insn_format21c_field : ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ; + // smaliTreeWalker.g:832:1: insn_format21c_field : ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ; public final void insn_format21c_field() throws RecognitionException { CommonTree inst=null; CommonTree REGISTER118=null; ImmutableFieldReference field_reference119 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:833:3: ( ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:834:5: ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) + // smaliTreeWalker.g:833:3: ( ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ) + // smaliTreeWalker.g:834:5: ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) { - match(input,I_STATEMENT_FORMAT21c_FIELD,FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237); - match(input, Token.DOWN, null); + match(input,I_STATEMENT_FORMAT21c_FIELD,FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237); + match(input, Token.DOWN, null); inst=(CommonTree)input.LT(1); if ( (input.LA(1) >= INSTRUCTION_FORMAT21c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT21c_FIELD_ODEX) ) { input.consume(); @@ -4883,12 +4883,12 @@ public class smaliTreeWalker extends TreeParser { MismatchedSetException mse = new MismatchedSetException(null,input); throw mse; } - REGISTER118=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field2249); + REGISTER118=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field2249); pushFollow(FOLLOW_field_reference_in_insn_format21c_field2251); field_reference119=field_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null)); @@ -4898,7 +4898,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA, dexBuilder.internFieldReference(fieldReference))); - + } } @@ -4915,25 +4915,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21c_string" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:845:1: insn_format21c_string : ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ; + // smaliTreeWalker.g:845:1: insn_format21c_string : ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ; public final void insn_format21c_string() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21c_STRING120=null; CommonTree REGISTER121=null; String string_literal122 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:846:3: ( ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:847:5: ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) + // smaliTreeWalker.g:846:3: ( ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ) + // smaliTreeWalker.g:847:5: ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) { - match(input,I_STATEMENT_FORMAT21c_STRING,FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21c_STRING120=(CommonTree)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276); - REGISTER121=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string2278); + match(input,I_STATEMENT_FORMAT21c_STRING,FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21c_STRING120=(CommonTree)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276); + REGISTER121=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string2278); pushFollow(FOLLOW_string_literal_in_insn_format21c_string2280); string_literal122=string_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_STRING120!=null?INSTRUCTION_FORMAT21c_STRING120.getText():null)); @@ -4941,7 +4941,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA, dexBuilder.internStringReference(string_literal122))); - + } } @@ -4958,25 +4958,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:856:1: insn_format21c_type : ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ; + // smaliTreeWalker.g:856:1: insn_format21c_type : ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ; public final void insn_format21c_type() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21c_TYPE123=null; CommonTree REGISTER124=null; TreeRuleReturnScope nonvoid_type_descriptor125 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:857:3: ( ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:858:5: ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) + // smaliTreeWalker.g:857:3: ( ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ) + // smaliTreeWalker.g:858:5: ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) { - match(input,I_STATEMENT_FORMAT21c_TYPE,FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21c_TYPE123=(CommonTree)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305); - REGISTER124=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type2307); + match(input,I_STATEMENT_FORMAT21c_TYPE,FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21c_TYPE123=(CommonTree)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305); + REGISTER124=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type2307); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type2309); nonvoid_type_descriptor125=nonvoid_type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_TYPE123!=null?INSTRUCTION_FORMAT21c_TYPE123.getText():null)); @@ -4984,7 +4984,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA, dexBuilder.internTypeReference((nonvoid_type_descriptor125!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor125).type:null)))); - + } } @@ -5001,25 +5001,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21ih" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:867:1: insn_format21ih : ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ; + // smaliTreeWalker.g:867:1: insn_format21ih : ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ; public final void insn_format21ih() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21ih126=null; CommonTree REGISTER127=null; int fixed_32bit_literal128 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:868:3: ( ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:869:5: ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) + // smaliTreeWalker.g:868:3: ( ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ) + // smaliTreeWalker.g:869:5: ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) { - match(input,I_STATEMENT_FORMAT21ih,FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21ih126=(CommonTree)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334); - REGISTER127=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih2336); + match(input,I_STATEMENT_FORMAT21ih,FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21ih126=(CommonTree)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334); + REGISTER127=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih2336); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih2338); fixed_32bit_literal128=fixed_32bit_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21ih126!=null?INSTRUCTION_FORMAT21ih126.getText():null)); @@ -5028,7 +5028,7 @@ public class smaliTreeWalker extends TreeParser { int litB = fixed_32bit_literal128; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21ih(opcode, regA, litB)); - + } } @@ -5045,25 +5045,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21lh" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:879:1: insn_format21lh : ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ; + // smaliTreeWalker.g:879:1: insn_format21lh : ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ; public final void insn_format21lh() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21lh129=null; CommonTree REGISTER130=null; long fixed_64bit_literal131 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:880:3: ( ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:881:5: ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) + // smaliTreeWalker.g:880:3: ( ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ) + // smaliTreeWalker.g:881:5: ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) { - match(input,I_STATEMENT_FORMAT21lh,FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21lh129=(CommonTree)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363); - REGISTER130=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh2365); + match(input,I_STATEMENT_FORMAT21lh,FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21lh129=(CommonTree)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363); + REGISTER130=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh2365); pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format21lh2367); fixed_64bit_literal131=fixed_64bit_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21lh129!=null?INSTRUCTION_FORMAT21lh129.getText():null)); @@ -5072,7 +5072,7 @@ public class smaliTreeWalker extends TreeParser { long litB = fixed_64bit_literal131; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21lh(opcode, regA, litB)); - + } } @@ -5089,25 +5089,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21s" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:891:1: insn_format21s : ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ; + // smaliTreeWalker.g:891:1: insn_format21s : ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ; public final void insn_format21s() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21s132=null; CommonTree REGISTER133=null; short short_integral_literal134 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:892:3: ( ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:893:5: ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) + // smaliTreeWalker.g:892:3: ( ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ) + // smaliTreeWalker.g:893:5: ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) { - match(input,I_STATEMENT_FORMAT21s,FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21s132=(CommonTree)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392); - REGISTER133=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s2394); + match(input,I_STATEMENT_FORMAT21s,FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21s132=(CommonTree)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392); + REGISTER133=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s2394); pushFollow(FOLLOW_short_integral_literal_in_insn_format21s2396); short_integral_literal134=short_integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21s132!=null?INSTRUCTION_FORMAT21s132.getText():null)); @@ -5116,7 +5116,7 @@ public class smaliTreeWalker extends TreeParser { short litB = short_integral_literal134; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21s(opcode, regA, litB)); - + } } @@ -5133,32 +5133,32 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format21t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:903:1: insn_format21t : ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ; + // smaliTreeWalker.g:903:1: insn_format21t : ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ; public final void insn_format21t() throws RecognitionException { CommonTree INSTRUCTION_FORMAT21t135=null; CommonTree REGISTER136=null; Label label_ref137 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:904:3: ( ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:905:5: ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) + // smaliTreeWalker.g:904:3: ( ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ) + // smaliTreeWalker.g:905:5: ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) { - match(input,I_STATEMENT_FORMAT21t,FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT21t135=(CommonTree)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421); - REGISTER136=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t2423); + match(input,I_STATEMENT_FORMAT21t,FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT21t135=(CommonTree)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421); + REGISTER136=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t2423); pushFollow(FOLLOW_label_ref_in_insn_format21t2425); label_ref137=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21t135!=null?INSTRUCTION_FORMAT21t135.getText():null)); short regA = parseRegister_byte((REGISTER136!=null?REGISTER136.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21t(opcode, regA, label_ref137)); - + } } @@ -5175,7 +5175,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22b" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:913:1: insn_format22b : ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ; + // smaliTreeWalker.g:913:1: insn_format22b : ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ; public final void insn_format22b() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; @@ -5183,19 +5183,19 @@ public class smaliTreeWalker extends TreeParser { short short_integral_literal139 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:914:3: ( ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:915:5: ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) + // smaliTreeWalker.g:914:3: ( ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ) + // smaliTreeWalker.g:915:5: ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) { - match(input,I_STATEMENT_FORMAT22b,FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT22b138=(CommonTree)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2454); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2458); + match(input,I_STATEMENT_FORMAT22b,FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT22b138=(CommonTree)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2454); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2458); pushFollow(FOLLOW_short_integral_literal_in_insn_format22b2460); short_integral_literal139=short_integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22b138!=null?INSTRUCTION_FORMAT22b138.getText():null)); @@ -5206,7 +5206,7 @@ public class smaliTreeWalker extends TreeParser { LiteralTools.checkByte(litC); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22b(opcode, regA, regB, litC)); - + } } @@ -5223,7 +5223,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22c_field" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:927:1: insn_format22c_field : ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ; + // smaliTreeWalker.g:927:1: insn_format22c_field : ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ; public final void insn_format22c_field() throws RecognitionException { CommonTree inst=null; CommonTree registerA=null; @@ -5231,11 +5231,11 @@ public class smaliTreeWalker extends TreeParser { ImmutableFieldReference field_reference140 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:928:3: ( ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:929:5: ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) + // smaliTreeWalker.g:928:3: ( ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ) + // smaliTreeWalker.g:929:5: ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) { - match(input,I_STATEMENT_FORMAT22c_FIELD,FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483); - match(input, Token.DOWN, null); + match(input,I_STATEMENT_FORMAT22c_FIELD,FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483); + match(input, Token.DOWN, null); inst=(CommonTree)input.LT(1); if ( (input.LA(1) >= INSTRUCTION_FORMAT22c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT22c_FIELD_ODEX) ) { input.consume(); @@ -5245,13 +5245,13 @@ public class smaliTreeWalker extends TreeParser { MismatchedSetException mse = new MismatchedSetException(null,input); throw mse; } - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2497); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2501); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2497); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2501); pushFollow(FOLLOW_field_reference_in_insn_format22c_field2503); field_reference140=field_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null)); @@ -5262,7 +5262,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB, dexBuilder.internFieldReference(fieldReference))); - + } } @@ -5279,7 +5279,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:941:1: insn_format22c_type : ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ; + // smaliTreeWalker.g:941:1: insn_format22c_type : ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ; public final void insn_format22c_type() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; @@ -5287,19 +5287,19 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope nonvoid_type_descriptor142 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:942:3: ( ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:943:5: ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) + // smaliTreeWalker.g:942:3: ( ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ) + // smaliTreeWalker.g:943:5: ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) { - match(input,I_STATEMENT_FORMAT22c_TYPE,FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT22c_TYPE141=(CommonTree)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2532); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2536); + match(input,I_STATEMENT_FORMAT22c_TYPE,FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT22c_TYPE141=(CommonTree)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2532); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2536); pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type2538); nonvoid_type_descriptor142=nonvoid_type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_TYPE141!=null?INSTRUCTION_FORMAT22c_TYPE141.getText():null)); @@ -5308,7 +5308,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB, dexBuilder.internTypeReference((nonvoid_type_descriptor142!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor142).type:null)))); - + } } @@ -5325,7 +5325,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22s" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:953:1: insn_format22s : ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ; + // smaliTreeWalker.g:953:1: insn_format22s : ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ; public final void insn_format22s() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; @@ -5333,19 +5333,19 @@ public class smaliTreeWalker extends TreeParser { short short_integral_literal144 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:954:3: ( ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:955:5: ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) + // smaliTreeWalker.g:954:3: ( ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ) + // smaliTreeWalker.g:955:5: ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) { - match(input,I_STATEMENT_FORMAT22s,FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT22s143=(CommonTree)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2567); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2571); + match(input,I_STATEMENT_FORMAT22s,FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT22s143=(CommonTree)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2567); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2571); pushFollow(FOLLOW_short_integral_literal_in_insn_format22s2573); short_integral_literal144=short_integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22s143!=null?INSTRUCTION_FORMAT22s143.getText():null)); @@ -5355,7 +5355,7 @@ public class smaliTreeWalker extends TreeParser { short litC = short_integral_literal144; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22s(opcode, regA, regB, litC)); - + } } @@ -5372,7 +5372,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:966:1: insn_format22t : ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ; + // smaliTreeWalker.g:966:1: insn_format22t : ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ; public final void insn_format22t() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; @@ -5380,19 +5380,19 @@ public class smaliTreeWalker extends TreeParser { Label label_ref146 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:967:3: ( ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:968:5: ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) + // smaliTreeWalker.g:967:3: ( ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ) + // smaliTreeWalker.g:968:5: ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) { - match(input,I_STATEMENT_FORMAT22t,FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT22t145=(CommonTree)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2602); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2606); + match(input,I_STATEMENT_FORMAT22t,FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT22t145=(CommonTree)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2602); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2606); pushFollow(FOLLOW_label_ref_in_insn_format22t2608); label_ref146=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22t145!=null?INSTRUCTION_FORMAT22t145.getText():null)); @@ -5400,7 +5400,7 @@ public class smaliTreeWalker extends TreeParser { byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22t(opcode, regA, regB, label_ref146)); - + } } @@ -5417,22 +5417,22 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format22x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:977:1: insn_format22x : ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ; + // smaliTreeWalker.g:977:1: insn_format22x : ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ; public final void insn_format22x() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; CommonTree INSTRUCTION_FORMAT22x147=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:978:3: ( ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:979:5: ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) + // smaliTreeWalker.g:978:3: ( ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ) + // smaliTreeWalker.g:979:5: ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) { - match(input,I_STATEMENT_FORMAT22x,FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT22x147=(CommonTree)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2637); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2641); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT22x,FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT22x147=(CommonTree)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2637); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2641); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22x147!=null?INSTRUCTION_FORMAT22x147.getText():null)); @@ -5440,7 +5440,7 @@ public class smaliTreeWalker extends TreeParser { int regB = parseRegister_short((registerB!=null?registerB.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22x(opcode, regA, regB)); - + } } @@ -5457,7 +5457,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format23x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:988:1: insn_format23x : ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ; + // smaliTreeWalker.g:988:1: insn_format23x : ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ; public final void insn_format23x() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; @@ -5465,16 +5465,16 @@ public class smaliTreeWalker extends TreeParser { CommonTree INSTRUCTION_FORMAT23x148=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:989:3: ( ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:990:5: ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) + // smaliTreeWalker.g:989:3: ( ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ) + // smaliTreeWalker.g:990:5: ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) { - match(input,I_STATEMENT_FORMAT23x,FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT23x148=(CommonTree)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2670); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2674); - registerC=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2678); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT23x,FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT23x148=(CommonTree)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2670); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2674); + registerC=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2678); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT23x148!=null?INSTRUCTION_FORMAT23x148.getText():null)); @@ -5483,7 +5483,7 @@ public class smaliTreeWalker extends TreeParser { short regC = parseRegister_byte((registerC!=null?registerC.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction23x(opcode, regA, regB, regC)); - + } } @@ -5500,29 +5500,29 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format30t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1000:1: insn_format30t : ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ; + // smaliTreeWalker.g:1000:1: insn_format30t : ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ; public final void insn_format30t() throws RecognitionException { CommonTree INSTRUCTION_FORMAT30t149=null; Label label_ref150 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1001:3: ( ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1002:5: ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) + // smaliTreeWalker.g:1001:3: ( ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ) + // smaliTreeWalker.g:1002:5: ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) { - match(input,I_STATEMENT_FORMAT30t,FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT30t149=(CommonTree)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703); + match(input,I_STATEMENT_FORMAT30t,FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT30t149=(CommonTree)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703); pushFollow(FOLLOW_label_ref_in_insn_format30t2705); label_ref150=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT30t149!=null?INSTRUCTION_FORMAT30t149.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction30t(opcode, label_ref150)); - + } } @@ -5539,25 +5539,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format31c" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1009:1: insn_format31c : ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ; + // smaliTreeWalker.g:1009:1: insn_format31c : ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ; public final void insn_format31c() throws RecognitionException { CommonTree INSTRUCTION_FORMAT31c151=null; CommonTree REGISTER152=null; String string_literal153 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1010:3: ( ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1011:5: ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) + // smaliTreeWalker.g:1010:3: ( ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ) + // smaliTreeWalker.g:1011:5: ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) { - match(input,I_STATEMENT_FORMAT31c,FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT31c151=(CommonTree)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730); - REGISTER152=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c2732); + match(input,I_STATEMENT_FORMAT31c,FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT31c151=(CommonTree)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730); + REGISTER152=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c2732); pushFollow(FOLLOW_string_literal_in_insn_format31c2734); string_literal153=string_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31c151!=null?INSTRUCTION_FORMAT31c151.getText():null)); @@ -5565,7 +5565,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31c(opcode, regA, dexBuilder.internStringReference(string_literal153))); - + } } @@ -5582,25 +5582,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format31i" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1020:1: insn_format31i : ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ; + // smaliTreeWalker.g:1020:1: insn_format31i : ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ; public final void insn_format31i() throws RecognitionException { CommonTree INSTRUCTION_FORMAT31i154=null; CommonTree REGISTER155=null; int fixed_32bit_literal156 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1021:3: ( ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1022:5: ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) + // smaliTreeWalker.g:1021:3: ( ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ) + // smaliTreeWalker.g:1022:5: ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) { - match(input,I_STATEMENT_FORMAT31i,FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT31i154=(CommonTree)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759); - REGISTER155=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i2761); + match(input,I_STATEMENT_FORMAT31i,FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT31i154=(CommonTree)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759); + REGISTER155=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i2761); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i2763); fixed_32bit_literal156=fixed_32bit_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31i154!=null?INSTRUCTION_FORMAT31i154.getText():null)); @@ -5609,7 +5609,7 @@ public class smaliTreeWalker extends TreeParser { int litB = fixed_32bit_literal156; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31i(opcode, regA, litB)); - + } } @@ -5626,25 +5626,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format31t" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1032:1: insn_format31t : ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ; + // smaliTreeWalker.g:1032:1: insn_format31t : ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ; public final void insn_format31t() throws RecognitionException { CommonTree INSTRUCTION_FORMAT31t157=null; CommonTree REGISTER158=null; Label label_ref159 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1033:3: ( ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1034:5: ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) + // smaliTreeWalker.g:1033:3: ( ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ) + // smaliTreeWalker.g:1034:5: ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) { - match(input,I_STATEMENT_FORMAT31t,FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT31t157=(CommonTree)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788); - REGISTER158=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t2790); + match(input,I_STATEMENT_FORMAT31t,FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT31t157=(CommonTree)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788); + REGISTER158=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t2790); pushFollow(FOLLOW_label_ref_in_insn_format31t2792); label_ref159=label_ref(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31t157!=null?INSTRUCTION_FORMAT31t157.getText():null)); @@ -5652,7 +5652,7 @@ public class smaliTreeWalker extends TreeParser { short regA = parseRegister_byte((REGISTER158!=null?REGISTER158.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31t(opcode, regA, label_ref159)); - + } } @@ -5669,22 +5669,22 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format32x" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1043:1: insn_format32x : ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ; + // smaliTreeWalker.g:1043:1: insn_format32x : ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ; public final void insn_format32x() throws RecognitionException { CommonTree registerA=null; CommonTree registerB=null; CommonTree INSTRUCTION_FORMAT32x160=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1044:3: ( ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1045:5: ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) + // smaliTreeWalker.g:1044:3: ( ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ) + // smaliTreeWalker.g:1045:5: ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) { - match(input,I_STATEMENT_FORMAT32x,FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT32x160=(CommonTree)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817); - registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2821); - registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2825); - match(input, Token.UP, null); + match(input,I_STATEMENT_FORMAT32x,FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT32x160=(CommonTree)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817); + registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2821); + registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2825); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT32x160!=null?INSTRUCTION_FORMAT32x160.getText():null)); @@ -5692,7 +5692,7 @@ public class smaliTreeWalker extends TreeParser { int regB = parseRegister_short((registerB!=null?registerB.getText():null)); method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction32x(opcode, regA, regB)); - + } } @@ -5709,19 +5709,19 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format35c_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1054:1: insn_format35c_method : ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ; + // smaliTreeWalker.g:1054:1: insn_format35c_method : ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ; public final void insn_format35c_method() throws RecognitionException { CommonTree INSTRUCTION_FORMAT35c_METHOD161=null; TreeRuleReturnScope register_list162 =null; ImmutableMethodReference method_reference163 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1055:3: ( ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1056:5: ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) + // smaliTreeWalker.g:1055:3: ( ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ) + // smaliTreeWalker.g:1056:5: ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) { - match(input,I_STATEMENT_FORMAT35c_METHOD,FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT35c_METHOD161=(CommonTree)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850); + match(input,I_STATEMENT_FORMAT35c_METHOD,FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT35c_METHOD161=(CommonTree)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850); pushFollow(FOLLOW_register_list_in_insn_format35c_method2852); register_list162=register_list(); state._fsp--; @@ -5730,7 +5730,7 @@ public class smaliTreeWalker extends TreeParser { method_reference163=method_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_METHOD161!=null?INSTRUCTION_FORMAT35c_METHOD161.getText():null)); @@ -5743,7 +5743,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], dexBuilder.internMethodReference(methodReference))); - + } } @@ -5760,19 +5760,19 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format35c_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1070:1: insn_format35c_type : ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ; + // smaliTreeWalker.g:1070:1: insn_format35c_type : ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ; public final void insn_format35c_type() throws RecognitionException { CommonTree INSTRUCTION_FORMAT35c_TYPE164=null; TreeRuleReturnScope register_list165 =null; TreeRuleReturnScope nonvoid_type_descriptor166 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1071:3: ( ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1072:5: ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) + // smaliTreeWalker.g:1071:3: ( ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ) + // smaliTreeWalker.g:1072:5: ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) { - match(input,I_STATEMENT_FORMAT35c_TYPE,FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT35c_TYPE164=(CommonTree)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879); + match(input,I_STATEMENT_FORMAT35c_TYPE,FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT35c_TYPE164=(CommonTree)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879); pushFollow(FOLLOW_register_list_in_insn_format35c_type2881); register_list165=register_list(); state._fsp--; @@ -5781,7 +5781,7 @@ public class smaliTreeWalker extends TreeParser { nonvoid_type_descriptor166=nonvoid_type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_TYPE164!=null?INSTRUCTION_FORMAT35c_TYPE164.getText():null)); @@ -5792,7 +5792,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1], registers[2], registers[3], registers[4], dexBuilder.internTypeReference((nonvoid_type_descriptor166!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor166).type:null)))); - + } } @@ -5809,19 +5809,19 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format3rc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1084:1: insn_format3rc_method : ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ; + // smaliTreeWalker.g:1084:1: insn_format3rc_method : ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ; public final void insn_format3rc_method() throws RecognitionException { CommonTree INSTRUCTION_FORMAT3rc_METHOD167=null; TreeRuleReturnScope register_range168 =null; ImmutableMethodReference method_reference169 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1085:3: ( ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1086:5: ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) + // smaliTreeWalker.g:1085:3: ( ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ) + // smaliTreeWalker.g:1086:5: ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) { - match(input,I_STATEMENT_FORMAT3rc_METHOD,FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT3rc_METHOD167=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908); + match(input,I_STATEMENT_FORMAT3rc_METHOD,FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT3rc_METHOD167=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908); pushFollow(FOLLOW_register_range_in_insn_format3rc_method2910); register_range168=register_range(); state._fsp--; @@ -5830,7 +5830,7 @@ public class smaliTreeWalker extends TreeParser { method_reference169=method_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_METHOD167!=null?INSTRUCTION_FORMAT3rc_METHOD167.getText():null)); @@ -5843,7 +5843,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount, dexBuilder.internMethodReference(methodReference))); - + } } @@ -5860,19 +5860,19 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format3rc_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1100:1: insn_format3rc_type : ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ; + // smaliTreeWalker.g:1100:1: insn_format3rc_type : ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ; public final void insn_format3rc_type() throws RecognitionException { CommonTree INSTRUCTION_FORMAT3rc_TYPE170=null; TreeRuleReturnScope register_range171 =null; TreeRuleReturnScope nonvoid_type_descriptor172 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1101:3: ( ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1102:5: ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) + // smaliTreeWalker.g:1101:3: ( ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ) + // smaliTreeWalker.g:1102:5: ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) { - match(input,I_STATEMENT_FORMAT3rc_TYPE,FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT3rc_TYPE170=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937); + match(input,I_STATEMENT_FORMAT3rc_TYPE,FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT3rc_TYPE170=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937); pushFollow(FOLLOW_register_range_in_insn_format3rc_type2939); register_range171=register_range(); state._fsp--; @@ -5881,7 +5881,7 @@ public class smaliTreeWalker extends TreeParser { nonvoid_type_descriptor172=nonvoid_type_descriptor(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_TYPE170!=null?INSTRUCTION_FORMAT3rc_TYPE170.getText():null)); @@ -5892,7 +5892,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount, dexBuilder.internTypeReference((nonvoid_type_descriptor172!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor172).type:null)))); - + } } @@ -5909,7 +5909,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format45cc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1114:1: insn_format45cc_method : ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ; + // smaliTreeWalker.g:1114:1: insn_format45cc_method : ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ; public final void insn_format45cc_method() throws RecognitionException { CommonTree INSTRUCTION_FORMAT45cc_METHOD173=null; TreeRuleReturnScope register_list174 =null; @@ -5917,12 +5917,12 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope method_prototype176 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1115:3: ( ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1116:5: ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) + // smaliTreeWalker.g:1115:3: ( ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ) + // smaliTreeWalker.g:1116:5: ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) { - match(input,I_STATEMENT_FORMAT45cc_METHOD,FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT45cc_METHOD173=(CommonTree)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966); + match(input,I_STATEMENT_FORMAT45cc_METHOD,FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT45cc_METHOD173=(CommonTree)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966); pushFollow(FOLLOW_register_list_in_insn_format45cc_method2968); register_list174=register_list(); state._fsp--; @@ -5935,7 +5935,7 @@ public class smaliTreeWalker extends TreeParser { method_prototype176=method_prototype(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT45cc_METHOD173!=null?INSTRUCTION_FORMAT45cc_METHOD173.getText():null)); @@ -5953,7 +5953,7 @@ public class smaliTreeWalker extends TreeParser { registers[2], registers[3], registers[4], dexBuilder.internMethodReference(methodReference), dexBuilder.internMethodProtoReference(methodProtoReference))); - + } } @@ -5970,7 +5970,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format4rcc_method" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1135:1: insn_format4rcc_method : ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ; + // smaliTreeWalker.g:1135:1: insn_format4rcc_method : ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ; public final void insn_format4rcc_method() throws RecognitionException { CommonTree INSTRUCTION_FORMAT4rcc_METHOD177=null; TreeRuleReturnScope register_range178 =null; @@ -5978,12 +5978,12 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope method_prototype180 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1136:3: ( ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1137:5: ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) + // smaliTreeWalker.g:1136:3: ( ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ) + // smaliTreeWalker.g:1137:5: ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) { - match(input,I_STATEMENT_FORMAT4rcc_METHOD,FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT4rcc_METHOD177=(CommonTree)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997); + match(input,I_STATEMENT_FORMAT4rcc_METHOD,FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT4rcc_METHOD177=(CommonTree)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997); pushFollow(FOLLOW_register_range_in_insn_format4rcc_method2999); register_range178=register_range(); state._fsp--; @@ -5996,7 +5996,7 @@ public class smaliTreeWalker extends TreeParser { method_prototype180=method_prototype(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT4rcc_METHOD177!=null?INSTRUCTION_FORMAT4rcc_METHOD177.getText():null)); @@ -6013,7 +6013,7 @@ public class smaliTreeWalker extends TreeParser { method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction4rcc(opcode, startRegister, registerCount, dexBuilder.internMethodReference(methodReference), dexBuilder.internMethodProtoReference(methodProtoReference))); - + } } @@ -6030,25 +6030,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_format51l_type" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1155:1: insn_format51l_type : ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ; + // smaliTreeWalker.g:1155:1: insn_format51l_type : ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ; public final void insn_format51l_type() throws RecognitionException { CommonTree INSTRUCTION_FORMAT51l181=null; CommonTree REGISTER182=null; long fixed_64bit_literal183 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1156:3: ( ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1157:5: ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) + // smaliTreeWalker.g:1156:3: ( ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ) + // smaliTreeWalker.g:1157:5: ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) { - match(input,I_STATEMENT_FORMAT51l,FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026); - match(input, Token.DOWN, null); - INSTRUCTION_FORMAT51l181=(CommonTree)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028); - REGISTER182=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l_type3030); + match(input,I_STATEMENT_FORMAT51l,FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026); + match(input, Token.DOWN, null); + INSTRUCTION_FORMAT51l181=(CommonTree)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028); + REGISTER182=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l_type3030); pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format51l_type3032); fixed_64bit_literal183=fixed_64bit_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT51l181!=null?INSTRUCTION_FORMAT51l181.getText():null)); @@ -6057,7 +6057,7 @@ public class smaliTreeWalker extends TreeParser { long litB = fixed_64bit_literal183; method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction51l(opcode, regA, litB)); - + } } @@ -6074,37 +6074,37 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_array_data_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1167:1: insn_array_data_directive : ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ; + // smaliTreeWalker.g:1167:1: insn_array_data_directive : ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ; public final void insn_array_data_directive() throws RecognitionException { short short_integral_literal184 =0; List<Number> array_elements185 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1168:3: ( ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1169:5: ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) + // smaliTreeWalker.g:1168:3: ( ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ) + // smaliTreeWalker.g:1169:5: ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) { - match(input,I_STATEMENT_ARRAY_DATA,FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055); - match(input, Token.DOWN, null); - match(input,I_ARRAY_ELEMENT_SIZE,FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058); - match(input, Token.DOWN, null); + match(input,I_STATEMENT_ARRAY_DATA,FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055); + match(input, Token.DOWN, null); + match(input,I_ARRAY_ELEMENT_SIZE,FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058); + match(input, Token.DOWN, null); pushFollow(FOLLOW_short_integral_literal_in_insn_array_data_directive3060); short_integral_literal184=short_integral_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); pushFollow(FOLLOW_array_elements_in_insn_array_data_directive3063); array_elements185=array_elements(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); int elementWidth = short_integral_literal184; List<Number> elements = array_elements185; method_stack.peek().methodBuilder.addInstruction(new BuilderArrayPayload(elementWidth, array_elements185)); - + } } @@ -6121,36 +6121,36 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_packed_switch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1177:1: insn_packed_switch_directive : ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ; + // smaliTreeWalker.g:1177:1: insn_packed_switch_directive : ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ; public final void insn_packed_switch_directive() throws RecognitionException { int fixed_32bit_literal186 =0; List<Label> packed_switch_elements187 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1178:3: ( ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1179:5: ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) + // smaliTreeWalker.g:1178:3: ( ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ) + // smaliTreeWalker.g:1179:5: ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) { - match(input,I_STATEMENT_PACKED_SWITCH,FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085); - match(input, Token.DOWN, null); - match(input,I_PACKED_SWITCH_START_KEY,FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088); - match(input, Token.DOWN, null); + match(input,I_STATEMENT_PACKED_SWITCH,FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085); + match(input, Token.DOWN, null); + match(input,I_PACKED_SWITCH_START_KEY,FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088); + match(input, Token.DOWN, null); pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive3090); fixed_32bit_literal186=fixed_32bit_literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); pushFollow(FOLLOW_packed_switch_elements_in_insn_packed_switch_directive3093); packed_switch_elements187=packed_switch_elements(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); int startKey = fixed_32bit_literal186; method_stack.peek().methodBuilder.addInstruction(new BuilderPackedSwitchPayload(startKey, packed_switch_elements187)); - + } } @@ -6167,25 +6167,25 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "insn_sparse_switch_directive" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1186:1: insn_sparse_switch_directive : ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ; + // smaliTreeWalker.g:1186:1: insn_sparse_switch_directive : ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ; public final void insn_sparse_switch_directive() throws RecognitionException { List<SwitchLabelElement> sparse_switch_elements188 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1187:3: ( ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1188:5: ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) + // smaliTreeWalker.g:1187:3: ( ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ) + // smaliTreeWalker.g:1188:5: ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) { - match(input,I_STATEMENT_SPARSE_SWITCH,FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117); - match(input, Token.DOWN, null); + match(input,I_STATEMENT_SPARSE_SWITCH,FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117); + match(input, Token.DOWN, null); pushFollow(FOLLOW_sparse_switch_elements_in_insn_sparse_switch_directive3119); sparse_switch_elements188=sparse_switch_elements(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); method_stack.peek().methodBuilder.addInstruction(new BuilderSparseSwitchPayload(sparse_switch_elements188)); - + } } @@ -6202,7 +6202,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "array_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1193:1: array_descriptor returns [String type] : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ; + // smaliTreeWalker.g:1193:1: array_descriptor returns [String type] : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ; public final String array_descriptor() throws RecognitionException { String type = null; @@ -6212,11 +6212,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree CLASS_DESCRIPTOR191=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) + // smaliTreeWalker.g:1194:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ) + // smaliTreeWalker.g:1194:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) { - ARRAY_TYPE_PREFIX189=(CommonTree)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:23: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) + ARRAY_TYPE_PREFIX189=(CommonTree)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140); + // smaliTreeWalker.g:1194:23: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) int alt37=2; int LA37_0 = input.LA(1); if ( (LA37_0==PRIMITIVE_TYPE) ) { @@ -6234,17 +6234,17 @@ public class smaliTreeWalker extends TreeParser { switch (alt37) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:25: PRIMITIVE_TYPE + // smaliTreeWalker.g:1194:25: PRIMITIVE_TYPE { - PRIMITIVE_TYPE190=(CommonTree)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144); - type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (PRIMITIVE_TYPE190!=null?PRIMITIVE_TYPE190.getText():null); + PRIMITIVE_TYPE190=(CommonTree)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144); + type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (PRIMITIVE_TYPE190!=null?PRIMITIVE_TYPE190.getText():null); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1195:25: CLASS_DESCRIPTOR + // smaliTreeWalker.g:1195:25: CLASS_DESCRIPTOR { - CLASS_DESCRIPTOR191=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172); - type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (CLASS_DESCRIPTOR191!=null?CLASS_DESCRIPTOR191.getText():null); + CLASS_DESCRIPTOR191=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172); + type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (CLASS_DESCRIPTOR191!=null?CLASS_DESCRIPTOR191.getText():null); } break; @@ -6271,7 +6271,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "nonvoid_type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1197:1: nonvoid_type_descriptor returns [String type] : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ; + // smaliTreeWalker.g:1197:1: nonvoid_type_descriptor returns [String type] : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ; public final smaliTreeWalker.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException { smaliTreeWalker.nonvoid_type_descriptor_return retval = new smaliTreeWalker.nonvoid_type_descriptor_return(); retval.start = input.LT(1); @@ -6279,10 +6279,10 @@ public class smaliTreeWalker extends TreeParser { String array_descriptor192 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:3: ( ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) + // smaliTreeWalker.g:1198:3: ( ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ) + // smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) + // smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) int alt38=3; switch ( input.LA(1) ) { case PRIMITIVE_TYPE: @@ -6307,27 +6307,27 @@ public class smaliTreeWalker extends TreeParser { } switch (alt38) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:6: PRIMITIVE_TYPE + // smaliTreeWalker.g:1198:6: PRIMITIVE_TYPE { - match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190); - retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); + match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190); + retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1199:5: CLASS_DESCRIPTOR + // smaliTreeWalker.g:1199:5: CLASS_DESCRIPTOR { - match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198); - retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); + match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198); + retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1200:5: array_descriptor + // smaliTreeWalker.g:1200:5: array_descriptor { pushFollow(FOLLOW_array_descriptor_in_nonvoid_type_descriptor3206); array_descriptor192=array_descriptor(); state._fsp--; - retval.type = array_descriptor192; + retval.type = array_descriptor192; } break; @@ -6354,7 +6354,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "reference_type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1203:1: reference_type_descriptor returns [String type] : ( CLASS_DESCRIPTOR | array_descriptor ) ; + // smaliTreeWalker.g:1203:1: reference_type_descriptor returns [String type] : ( CLASS_DESCRIPTOR | array_descriptor ) ; public final smaliTreeWalker.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException { smaliTreeWalker.reference_type_descriptor_return retval = new smaliTreeWalker.reference_type_descriptor_return(); retval.start = input.LT(1); @@ -6362,10 +6362,10 @@ public class smaliTreeWalker extends TreeParser { String array_descriptor193 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:3: ( ( CLASS_DESCRIPTOR | array_descriptor ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor ) + // smaliTreeWalker.g:1204:3: ( ( CLASS_DESCRIPTOR | array_descriptor ) ) + // smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor ) { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor ) + // smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor ) int alt39=2; int LA39_0 = input.LA(1); if ( (LA39_0==CLASS_DESCRIPTOR) ) { @@ -6383,20 +6383,20 @@ public class smaliTreeWalker extends TreeParser { switch (alt39) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:6: CLASS_DESCRIPTOR + // smaliTreeWalker.g:1204:6: CLASS_DESCRIPTOR { - match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227); - retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); + match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227); + retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1205:5: array_descriptor + // smaliTreeWalker.g:1205:5: array_descriptor { pushFollow(FOLLOW_array_descriptor_in_reference_type_descriptor3235); array_descriptor193=array_descriptor(); state._fsp--; - retval.type = array_descriptor193; + retval.type = array_descriptor193; } break; @@ -6419,7 +6419,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "type_descriptor" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1208:1: type_descriptor returns [String type] : ( VOID_TYPE | nonvoid_type_descriptor ); + // smaliTreeWalker.g:1208:1: type_descriptor returns [String type] : ( VOID_TYPE | nonvoid_type_descriptor ); public final String type_descriptor() throws RecognitionException { String type = null; @@ -6427,7 +6427,7 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope nonvoid_type_descriptor194 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1209:3: ( VOID_TYPE | nonvoid_type_descriptor ) + // smaliTreeWalker.g:1209:3: ( VOID_TYPE | nonvoid_type_descriptor ) int alt40=2; int LA40_0 = input.LA(1); if ( (LA40_0==VOID_TYPE) ) { @@ -6445,14 +6445,14 @@ public class smaliTreeWalker extends TreeParser { switch (alt40) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1209:5: VOID_TYPE + // smaliTreeWalker.g:1209:5: VOID_TYPE { - match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor3255); + match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor3255); type = "V"; } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1210:5: nonvoid_type_descriptor + // smaliTreeWalker.g:1210:5: nonvoid_type_descriptor { pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_descriptor3263); nonvoid_type_descriptor194=nonvoid_type_descriptor(); @@ -6478,7 +6478,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "short_integral_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1213:1: short_integral_literal returns [short value] : ( long_literal | integer_literal | short_literal | char_literal | byte_literal ); + // smaliTreeWalker.g:1213:1: short_integral_literal returns [short value] : ( long_literal | integer_literal | short_literal | char_literal | byte_literal ); public final short short_integral_literal() throws RecognitionException { short value = 0; @@ -6490,7 +6490,7 @@ public class smaliTreeWalker extends TreeParser { byte byte_literal199 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1214:3: ( long_literal | integer_literal | short_literal | char_literal | byte_literal ) + // smaliTreeWalker.g:1214:3: ( long_literal | integer_literal | short_literal | char_literal | byte_literal ) int alt41=5; switch ( input.LA(1) ) { case LONG_LITERAL: @@ -6525,7 +6525,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt41) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1214:5: long_literal + // smaliTreeWalker.g:1214:5: long_literal { pushFollow(FOLLOW_long_literal_in_short_integral_literal3281); long_literal195=long_literal(); @@ -6534,11 +6534,11 @@ public class smaliTreeWalker extends TreeParser { LiteralTools.checkShort(long_literal195); value = (short)long_literal195; - + } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1219:5: integer_literal + // smaliTreeWalker.g:1219:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_short_integral_literal3293); integer_literal196=integer_literal(); @@ -6547,11 +6547,11 @@ public class smaliTreeWalker extends TreeParser { LiteralTools.checkShort(integer_literal196); value = (short)integer_literal196; - + } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1224:5: short_literal + // smaliTreeWalker.g:1224:5: short_literal { pushFollow(FOLLOW_short_literal_in_short_integral_literal3305); short_literal197=short_literal(); @@ -6561,7 +6561,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1225:5: char_literal + // smaliTreeWalker.g:1225:5: char_literal { pushFollow(FOLLOW_char_literal_in_short_integral_literal3313); char_literal198=char_literal(); @@ -6571,7 +6571,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 5 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1226:5: byte_literal + // smaliTreeWalker.g:1226:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_short_integral_literal3321); byte_literal199=byte_literal(); @@ -6597,7 +6597,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "integral_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1228:1: integral_literal returns [int value] : ( long_literal | integer_literal | short_literal | byte_literal ); + // smaliTreeWalker.g:1228:1: integral_literal returns [int value] : ( long_literal | integer_literal | short_literal | byte_literal ); public final int integral_literal() throws RecognitionException { int value = 0; @@ -6608,7 +6608,7 @@ public class smaliTreeWalker extends TreeParser { byte byte_literal203 =0; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1229:3: ( long_literal | integer_literal | short_literal | byte_literal ) + // smaliTreeWalker.g:1229:3: ( long_literal | integer_literal | short_literal | byte_literal ) int alt42=4; switch ( input.LA(1) ) { case LONG_LITERAL: @@ -6638,7 +6638,7 @@ public class smaliTreeWalker extends TreeParser { } switch (alt42) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1229:5: long_literal + // smaliTreeWalker.g:1229:5: long_literal { pushFollow(FOLLOW_long_literal_in_integral_literal3336); long_literal200=long_literal(); @@ -6647,11 +6647,11 @@ public class smaliTreeWalker extends TreeParser { LiteralTools.checkInt(long_literal200); value = (int)long_literal200; - + } break; case 2 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1234:5: integer_literal + // smaliTreeWalker.g:1234:5: integer_literal { pushFollow(FOLLOW_integer_literal_in_integral_literal3348); integer_literal201=integer_literal(); @@ -6661,7 +6661,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 3 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1235:5: short_literal + // smaliTreeWalker.g:1235:5: short_literal { pushFollow(FOLLOW_short_literal_in_integral_literal3356); short_literal202=short_literal(); @@ -6671,7 +6671,7 @@ public class smaliTreeWalker extends TreeParser { } break; case 4 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1236:5: byte_literal + // smaliTreeWalker.g:1236:5: byte_literal { pushFollow(FOLLOW_byte_literal_in_integral_literal3364); byte_literal203=byte_literal(); @@ -6697,7 +6697,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "integer_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1239:1: integer_literal returns [int value] : INTEGER_LITERAL ; + // smaliTreeWalker.g:1239:1: integer_literal returns [int value] : INTEGER_LITERAL ; public final int integer_literal() throws RecognitionException { int value = 0; @@ -6705,11 +6705,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree INTEGER_LITERAL204=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1240:3: ( INTEGER_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1240:5: INTEGER_LITERAL + // smaliTreeWalker.g:1240:3: ( INTEGER_LITERAL ) + // smaliTreeWalker.g:1240:5: INTEGER_LITERAL { - INTEGER_LITERAL204=(CommonTree)match(input,INTEGER_LITERAL,FOLLOW_INTEGER_LITERAL_in_integer_literal3380); - value = LiteralTools.parseInt((INTEGER_LITERAL204!=null?INTEGER_LITERAL204.getText():null)); + INTEGER_LITERAL204=(CommonTree)match(input,INTEGER_LITERAL,FOLLOW_INTEGER_LITERAL_in_integer_literal3380); + value = LiteralTools.parseInt((INTEGER_LITERAL204!=null?INTEGER_LITERAL204.getText():null)); } } @@ -6727,7 +6727,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "long_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1242:1: long_literal returns [long value] : LONG_LITERAL ; + // smaliTreeWalker.g:1242:1: long_literal returns [long value] : LONG_LITERAL ; public final long long_literal() throws RecognitionException { long value = 0; @@ -6735,11 +6735,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree LONG_LITERAL205=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1243:3: ( LONG_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1243:5: LONG_LITERAL + // smaliTreeWalker.g:1243:3: ( LONG_LITERAL ) + // smaliTreeWalker.g:1243:5: LONG_LITERAL { - LONG_LITERAL205=(CommonTree)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_long_literal3395); - value = LiteralTools.parseLong((LONG_LITERAL205!=null?LONG_LITERAL205.getText():null)); + LONG_LITERAL205=(CommonTree)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_long_literal3395); + value = LiteralTools.parseLong((LONG_LITERAL205!=null?LONG_LITERAL205.getText():null)); } } @@ -6757,7 +6757,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "short_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1245:1: short_literal returns [short value] : SHORT_LITERAL ; + // smaliTreeWalker.g:1245:1: short_literal returns [short value] : SHORT_LITERAL ; public final short short_literal() throws RecognitionException { short value = 0; @@ -6765,11 +6765,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree SHORT_LITERAL206=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1246:3: ( SHORT_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1246:5: SHORT_LITERAL + // smaliTreeWalker.g:1246:3: ( SHORT_LITERAL ) + // smaliTreeWalker.g:1246:5: SHORT_LITERAL { - SHORT_LITERAL206=(CommonTree)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_short_literal3410); - value = LiteralTools.parseShort((SHORT_LITERAL206!=null?SHORT_LITERAL206.getText():null)); + SHORT_LITERAL206=(CommonTree)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_short_literal3410); + value = LiteralTools.parseShort((SHORT_LITERAL206!=null?SHORT_LITERAL206.getText():null)); } } @@ -6787,7 +6787,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "byte_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1248:1: byte_literal returns [byte value] : BYTE_LITERAL ; + // smaliTreeWalker.g:1248:1: byte_literal returns [byte value] : BYTE_LITERAL ; public final byte byte_literal() throws RecognitionException { byte value = 0; @@ -6795,11 +6795,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree BYTE_LITERAL207=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1249:3: ( BYTE_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1249:5: BYTE_LITERAL + // smaliTreeWalker.g:1249:3: ( BYTE_LITERAL ) + // smaliTreeWalker.g:1249:5: BYTE_LITERAL { - BYTE_LITERAL207=(CommonTree)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_byte_literal3425); - value = LiteralTools.parseByte((BYTE_LITERAL207!=null?BYTE_LITERAL207.getText():null)); + BYTE_LITERAL207=(CommonTree)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_byte_literal3425); + value = LiteralTools.parseByte((BYTE_LITERAL207!=null?BYTE_LITERAL207.getText():null)); } } @@ -6817,7 +6817,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "float_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1251:1: float_literal returns [float value] : FLOAT_LITERAL ; + // smaliTreeWalker.g:1251:1: float_literal returns [float value] : FLOAT_LITERAL ; public final float float_literal() throws RecognitionException { float value = 0.0f; @@ -6825,11 +6825,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree FLOAT_LITERAL208=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1252:3: ( FLOAT_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1252:5: FLOAT_LITERAL + // smaliTreeWalker.g:1252:3: ( FLOAT_LITERAL ) + // smaliTreeWalker.g:1252:5: FLOAT_LITERAL { - FLOAT_LITERAL208=(CommonTree)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal3440); - value = LiteralTools.parseFloat((FLOAT_LITERAL208!=null?FLOAT_LITERAL208.getText():null)); + FLOAT_LITERAL208=(CommonTree)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal3440); + value = LiteralTools.parseFloat((FLOAT_LITERAL208!=null?FLOAT_LITERAL208.getText():null)); } } @@ -6847,7 +6847,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "double_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1254:1: double_literal returns [double value] : DOUBLE_LITERAL ; + // smaliTreeWalker.g:1254:1: double_literal returns [double value] : DOUBLE_LITERAL ; public final double double_literal() throws RecognitionException { double value = 0.0; @@ -6855,11 +6855,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree DOUBLE_LITERAL209=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1255:3: ( DOUBLE_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1255:5: DOUBLE_LITERAL + // smaliTreeWalker.g:1255:3: ( DOUBLE_LITERAL ) + // smaliTreeWalker.g:1255:5: DOUBLE_LITERAL { - DOUBLE_LITERAL209=(CommonTree)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal3455); - value = LiteralTools.parseDouble((DOUBLE_LITERAL209!=null?DOUBLE_LITERAL209.getText():null)); + DOUBLE_LITERAL209=(CommonTree)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal3455); + value = LiteralTools.parseDouble((DOUBLE_LITERAL209!=null?DOUBLE_LITERAL209.getText():null)); } } @@ -6877,7 +6877,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "char_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1257:1: char_literal returns [char value] : CHAR_LITERAL ; + // smaliTreeWalker.g:1257:1: char_literal returns [char value] : CHAR_LITERAL ; public final char char_literal() throws RecognitionException { char value = 0; @@ -6885,11 +6885,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree CHAR_LITERAL210=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1258:3: ( CHAR_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1258:5: CHAR_LITERAL + // smaliTreeWalker.g:1258:3: ( CHAR_LITERAL ) + // smaliTreeWalker.g:1258:5: CHAR_LITERAL { - CHAR_LITERAL210=(CommonTree)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_char_literal3470); - value = (CHAR_LITERAL210!=null?CHAR_LITERAL210.getText():null).charAt(1); + CHAR_LITERAL210=(CommonTree)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_char_literal3470); + value = (CHAR_LITERAL210!=null?CHAR_LITERAL210.getText():null).charAt(1); } } @@ -6907,7 +6907,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "string_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1260:1: string_literal returns [String value] : STRING_LITERAL ; + // smaliTreeWalker.g:1260:1: string_literal returns [String value] : STRING_LITERAL ; public final String string_literal() throws RecognitionException { String value = null; @@ -6915,14 +6915,14 @@ public class smaliTreeWalker extends TreeParser { CommonTree STRING_LITERAL211=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1261:3: ( STRING_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1261:5: STRING_LITERAL + // smaliTreeWalker.g:1261:3: ( STRING_LITERAL ) + // smaliTreeWalker.g:1261:5: STRING_LITERAL { - STRING_LITERAL211=(CommonTree)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_string_literal3485); + STRING_LITERAL211=(CommonTree)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_string_literal3485); value = (STRING_LITERAL211!=null?STRING_LITERAL211.getText():null); value = value.substring(1,value.length()-1); - + } } @@ -6940,7 +6940,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "bool_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1267:1: bool_literal returns [boolean value] : BOOL_LITERAL ; + // smaliTreeWalker.g:1267:1: bool_literal returns [boolean value] : BOOL_LITERAL ; public final boolean bool_literal() throws RecognitionException { boolean value = false; @@ -6948,11 +6948,11 @@ public class smaliTreeWalker extends TreeParser { CommonTree BOOL_LITERAL212=null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1268:3: ( BOOL_LITERAL ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1268:5: BOOL_LITERAL + // smaliTreeWalker.g:1268:3: ( BOOL_LITERAL ) + // smaliTreeWalker.g:1268:5: BOOL_LITERAL { - BOOL_LITERAL212=(CommonTree)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_bool_literal3504); - value = Boolean.parseBoolean((BOOL_LITERAL212!=null?BOOL_LITERAL212.getText():null)); + BOOL_LITERAL212=(CommonTree)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_bool_literal3504); + value = Boolean.parseBoolean((BOOL_LITERAL212!=null?BOOL_LITERAL212.getText():null)); } } @@ -6970,7 +6970,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "array_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1270:1: array_literal returns [List<EncodedValue> elements] : ^( I_ENCODED_ARRAY ( literal )* ) ; + // smaliTreeWalker.g:1270:1: array_literal returns [List<EncodedValue> elements] : ^( I_ENCODED_ARRAY ( literal )* ) ; public final List<EncodedValue> array_literal() throws RecognitionException { List<EncodedValue> elements = null; @@ -6978,14 +6978,14 @@ public class smaliTreeWalker extends TreeParser { EncodedValue literal213 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1271:3: ( ^( I_ENCODED_ARRAY ( literal )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1271:5: ^( I_ENCODED_ARRAY ( literal )* ) + // smaliTreeWalker.g:1271:3: ( ^( I_ENCODED_ARRAY ( literal )* ) ) + // smaliTreeWalker.g:1271:5: ^( I_ENCODED_ARRAY ( literal )* ) { elements = Lists.newArrayList(); - match(input,I_ENCODED_ARRAY,FOLLOW_I_ENCODED_ARRAY_in_array_literal3526); + match(input,I_ENCODED_ARRAY,FOLLOW_I_ENCODED_ARRAY_in_array_literal3526); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1272:23: ( literal )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:1272:23: ( literal )* loop43: while (true) { int alt43=2; @@ -6996,7 +6996,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt43) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1272:24: literal + // smaliTreeWalker.g:1272:24: literal { pushFollow(FOLLOW_literal_in_array_literal3529); literal213=literal(); @@ -7011,7 +7011,7 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } } @@ -7031,7 +7031,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "annotations" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1274:1: annotations returns [Set<Annotation> annotations] : ^( I_ANNOTATIONS ( annotation )* ) ; + // smaliTreeWalker.g:1274:1: annotations returns [Set<Annotation> annotations] : ^( I_ANNOTATIONS ( annotation )* ) ; public final Set<Annotation> annotations() throws RecognitionException { Set<Annotation> annotations = null; @@ -7039,14 +7039,14 @@ public class smaliTreeWalker extends TreeParser { Annotation annotation214 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1275:3: ( ^( I_ANNOTATIONS ( annotation )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1275:5: ^( I_ANNOTATIONS ( annotation )* ) + // smaliTreeWalker.g:1275:3: ( ^( I_ANNOTATIONS ( annotation )* ) ) + // smaliTreeWalker.g:1275:5: ^( I_ANNOTATIONS ( annotation )* ) { HashMap<String, Annotation> annotationMap = Maps.newHashMap(); - match(input,I_ANNOTATIONS,FOLLOW_I_ANNOTATIONS_in_annotations3554); + match(input,I_ANNOTATIONS,FOLLOW_I_ANNOTATIONS_in_annotations3554); if ( input.LA(1)==Token.DOWN ) { - match(input, Token.DOWN, null); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1276:21: ( annotation )* + match(input, Token.DOWN, null); + // smaliTreeWalker.g:1276:21: ( annotation )* loop44: while (true) { int alt44=2; @@ -7057,7 +7057,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt44) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1276:22: annotation + // smaliTreeWalker.g:1276:22: annotation { pushFollow(FOLLOW_annotation_in_annotations3557); annotation214=annotation(); @@ -7069,7 +7069,7 @@ public class smaliTreeWalker extends TreeParser { if (old != null) { throw new SemanticException(input, "Multiple annotations of type %s", anno.getType()); } - + } break; @@ -7078,14 +7078,14 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); } if (annotationMap.size() > 0) { annotations = ImmutableSet.copyOf(annotationMap.values()); } - + } } @@ -7103,7 +7103,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "annotation" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1290:1: annotation returns [Annotation annotation] : ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ; + // smaliTreeWalker.g:1290:1: annotation returns [Annotation annotation] : ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ; public final Annotation annotation() throws RecognitionException { Annotation annotation = null; @@ -7112,22 +7112,22 @@ public class smaliTreeWalker extends TreeParser { TreeRuleReturnScope subannotation216 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1291:3: ( ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1291:5: ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) + // smaliTreeWalker.g:1291:3: ( ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ) + // smaliTreeWalker.g:1291:5: ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) { - match(input,I_ANNOTATION,FOLLOW_I_ANNOTATION_in_annotation3586); - match(input, Token.DOWN, null); - ANNOTATION_VISIBILITY215=(CommonTree)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588); + match(input,I_ANNOTATION,FOLLOW_I_ANNOTATION_in_annotation3586); + match(input, Token.DOWN, null); + ANNOTATION_VISIBILITY215=(CommonTree)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588); pushFollow(FOLLOW_subannotation_in_annotation3590); subannotation216=subannotation(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); int visibility = AnnotationVisibility.getVisibility((ANNOTATION_VISIBILITY215!=null?ANNOTATION_VISIBILITY215.getText():null)); annotation = new ImmutableAnnotation(visibility, (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).annotationType:null), (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).elements:null)); - + } } @@ -7145,7 +7145,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "annotation_element" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1297:1: annotation_element returns [AnnotationElement element] : ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ; + // smaliTreeWalker.g:1297:1: annotation_element returns [AnnotationElement element] : ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ; public final AnnotationElement annotation_element() throws RecognitionException { AnnotationElement element = null; @@ -7154,21 +7154,21 @@ public class smaliTreeWalker extends TreeParser { EncodedValue literal218 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1298:3: ( ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1298:5: ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) + // smaliTreeWalker.g:1298:3: ( ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ) + // smaliTreeWalker.g:1298:5: ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) { - match(input,I_ANNOTATION_ELEMENT,FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611); - match(input, Token.DOWN, null); - SIMPLE_NAME217=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_annotation_element3613); + match(input,I_ANNOTATION_ELEMENT,FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611); + match(input, Token.DOWN, null); + SIMPLE_NAME217=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_annotation_element3613); pushFollow(FOLLOW_literal_in_annotation_element3615); literal218=literal(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); element = new ImmutableAnnotationElement((SIMPLE_NAME217!=null?SIMPLE_NAME217.getText():null), literal218); - + } } @@ -7191,7 +7191,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "subannotation" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1303:1: subannotation returns [String annotationType, List<AnnotationElement> elements] : ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ; + // smaliTreeWalker.g:1303:1: subannotation returns [String annotationType, List<AnnotationElement> elements] : ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ; public final smaliTreeWalker.subannotation_return subannotation() throws RecognitionException { smaliTreeWalker.subannotation_return retval = new smaliTreeWalker.subannotation_return(); retval.start = input.LT(1); @@ -7200,14 +7200,14 @@ public class smaliTreeWalker extends TreeParser { AnnotationElement annotation_element219 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1304:3: ( ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1304:5: ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) + // smaliTreeWalker.g:1304:3: ( ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ) + // smaliTreeWalker.g:1304:5: ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) { ArrayList<AnnotationElement> elements = Lists.newArrayList(); - match(input,I_SUBANNOTATION,FOLLOW_I_SUBANNOTATION_in_subannotation3642); - match(input, Token.DOWN, null); - CLASS_DESCRIPTOR220=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652); - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1307:9: ( annotation_element )* + match(input,I_SUBANNOTATION,FOLLOW_I_SUBANNOTATION_in_subannotation3642); + match(input, Token.DOWN, null); + CLASS_DESCRIPTOR220=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652); + // smaliTreeWalker.g:1307:9: ( annotation_element )* loop45: while (true) { int alt45=2; @@ -7218,7 +7218,7 @@ public class smaliTreeWalker extends TreeParser { switch (alt45) { case 1 : - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1307:10: annotation_element + // smaliTreeWalker.g:1307:10: annotation_element { pushFollow(FOLLOW_annotation_element_in_subannotation3663); annotation_element219=annotation_element(); @@ -7226,7 +7226,7 @@ public class smaliTreeWalker extends TreeParser { elements.add(annotation_element219); - + } break; @@ -7235,12 +7235,12 @@ public class smaliTreeWalker extends TreeParser { } } - match(input, Token.UP, null); + match(input, Token.UP, null); retval.annotationType = (CLASS_DESCRIPTOR220!=null?CLASS_DESCRIPTOR220.getText():null); retval.elements = elements; - + } } @@ -7258,7 +7258,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "field_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1317:1: field_literal returns [FieldReference value] : ^( I_ENCODED_FIELD field_reference ) ; + // smaliTreeWalker.g:1317:1: field_literal returns [FieldReference value] : ^( I_ENCODED_FIELD field_reference ) ; public final FieldReference field_literal() throws RecognitionException { FieldReference value = null; @@ -7266,20 +7266,20 @@ public class smaliTreeWalker extends TreeParser { ImmutableFieldReference field_reference221 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1318:3: ( ^( I_ENCODED_FIELD field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1318:5: ^( I_ENCODED_FIELD field_reference ) + // smaliTreeWalker.g:1318:3: ( ^( I_ENCODED_FIELD field_reference ) ) + // smaliTreeWalker.g:1318:5: ^( I_ENCODED_FIELD field_reference ) { - match(input,I_ENCODED_FIELD,FOLLOW_I_ENCODED_FIELD_in_field_literal3702); - match(input, Token.DOWN, null); + match(input,I_ENCODED_FIELD,FOLLOW_I_ENCODED_FIELD_in_field_literal3702); + match(input, Token.DOWN, null); pushFollow(FOLLOW_field_reference_in_field_literal3704); field_reference221=field_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); value = field_reference221; - + } } @@ -7297,7 +7297,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "method_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1323:1: method_literal returns [MethodReference value] : ^( I_ENCODED_METHOD method_reference ) ; + // smaliTreeWalker.g:1323:1: method_literal returns [MethodReference value] : ^( I_ENCODED_METHOD method_reference ) ; public final MethodReference method_literal() throws RecognitionException { MethodReference value = null; @@ -7305,20 +7305,20 @@ public class smaliTreeWalker extends TreeParser { ImmutableMethodReference method_reference222 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1324:3: ( ^( I_ENCODED_METHOD method_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1324:5: ^( I_ENCODED_METHOD method_reference ) + // smaliTreeWalker.g:1324:3: ( ^( I_ENCODED_METHOD method_reference ) ) + // smaliTreeWalker.g:1324:5: ^( I_ENCODED_METHOD method_reference ) { - match(input,I_ENCODED_METHOD,FOLLOW_I_ENCODED_METHOD_in_method_literal3725); - match(input, Token.DOWN, null); + match(input,I_ENCODED_METHOD,FOLLOW_I_ENCODED_METHOD_in_method_literal3725); + match(input, Token.DOWN, null); pushFollow(FOLLOW_method_reference_in_method_literal3727); method_reference222=method_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); value = method_reference222; - + } } @@ -7336,7 +7336,7 @@ public class smaliTreeWalker extends TreeParser { // $ANTLR start "enum_literal" - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1329:1: enum_literal returns [FieldReference value] : ^( I_ENCODED_ENUM field_reference ) ; + // smaliTreeWalker.g:1329:1: enum_literal returns [FieldReference value] : ^( I_ENCODED_ENUM field_reference ) ; public final FieldReference enum_literal() throws RecognitionException { FieldReference value = null; @@ -7344,20 +7344,20 @@ public class smaliTreeWalker extends TreeParser { ImmutableFieldReference field_reference223 =null; try { - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1330:3: ( ^( I_ENCODED_ENUM field_reference ) ) - // /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1330:5: ^( I_ENCODED_ENUM field_reference ) + // smaliTreeWalker.g:1330:3: ( ^( I_ENCODED_ENUM field_reference ) ) + // smaliTreeWalker.g:1330:5: ^( I_ENCODED_ENUM field_reference ) { - match(input,I_ENCODED_ENUM,FOLLOW_I_ENCODED_ENUM_in_enum_literal3748); - match(input, Token.DOWN, null); + match(input,I_ENCODED_ENUM,FOLLOW_I_ENCODED_ENUM_in_enum_literal3748); + match(input, Token.DOWN, null); pushFollow(FOLLOW_field_reference_in_enum_literal3750); field_reference223=field_reference(); state._fsp--; - match(input, Token.UP, null); + match(input, Token.UP, null); value = field_reference223; - + } } diff --git a/smalidea/build.gradle b/smalidea/build.gradle index 8cba19d2..57209762 100644 --- a/smalidea/build.gradle +++ b/smalidea/build.gradle @@ -34,9 +34,13 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } + maven { + url 'http://dl.bintray.com/jetbrains/intellij-plugin-service' + } + } dependencies { - classpath 'gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.0.40' + classpath "gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.1.10" } } @@ -44,7 +48,8 @@ apply plugin: 'java' apply plugin: 'idea' apply plugin: 'antlr' -version = '0.03' + +version = '0.05' if (!('release' in gradle.startParameter.taskNames)) { def versionSuffix @@ -86,14 +91,12 @@ if (System.env.JDK7_HOME != null) { def sandboxDir = "${buildDir}/sandbox" -// We don't want to use the org.jetbrains.intellij plugin when generating the idea project files, -// so that idea classes aren't included as project dependencies, since they will already exist -// in the plugin sdk defined for the project if (!('idea' in gradle.startParameter.taskNames)) { + apply plugin: 'org.jetbrains.intellij' intellij { - version 'IC-15.0.6' + version 'IC-2016.3.5' pluginName 'smalidea' updateSinceUntilBuild false @@ -106,8 +109,8 @@ if (!('idea' in gradle.startParameter.taskNames)) { task ideaDirs() { project.afterEvaluate { if (intellij != null) { - println "IDEA Plugin jdk: ${intellij.ideaDirectory}" - println "sources: ${project.configurations['intellij-sources'].files[0]}" + println "IDEA Plugin jdk: ${intellij.ideaDependency.classes}" + println "sources: ${intellij.ideaDependency.getSources()}" } } } @@ -115,13 +118,8 @@ if (!('idea' in gradle.startParameter.taskNames)) { dependencies { compile files("${System.properties['java.home']}/../lib/tools.jar") } -} else { - // If we're running the idea task, let's make sure nothing else is being run, since - // we have to use a special configuration for the idea task - if (gradle.startParameter.taskNames.size() > 1) { - throw new InvalidUserDataException("The idea task must be run by itself.") - } +} else { project(':') { idea { project { @@ -209,13 +207,15 @@ dependencies { } task extractTokens(type: org.gradle.api.tasks.Copy, dependsOn: ':smali:build') { - def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts - def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') } + project.afterEvaluate { + def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts + def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') } - from(zipTree(smaliArtifact.file)) { - include '**/*.tokens' + from(zipTree(smaliArtifact.file)) { + include '**/*.tokens' + } + into "${buildDir}/tokens" } - into "${buildDir}/tokens" } generateGrammarSource { @@ -225,7 +225,6 @@ generateGrammarSource { outputDirectory(file("${buildDir}/generated-src/antlr/main/org/jf/smalidea")) } generateGrammarSource.dependsOn(extractTokens) - ideaModule.dependsOn(generateGrammarSource) task release(dependsOn: 'buildPlugin') { diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java index 5e2dd0c9..82a190b7 100644 --- a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java +++ b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java @@ -61,6 +61,7 @@ import org.jf.smalidea.psi.impl.SmaliMethod; import org.jf.smalidea.util.NameUtils; import org.jf.smalidea.util.PsiUtil; +import javax.annotation.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.List; @@ -274,9 +275,14 @@ public class SmaliCodeFragmentFactory extends DefaultCodeFragmentFactory { return originalContext; } + @Nullable public static Value evaluateRegister(EvaluationContext context, final SmaliMethod smaliMethod, final int registerNum, final String type) throws EvaluateException { + if (registerNum >= smaliMethod.getRegisterCount()) { + return null; + } + final StackFrameProxy frameProxy = context.getSuspendContext().getFrameProxy(); if (frameProxy == null) { return null; @@ -304,12 +310,21 @@ public class SmaliCodeFragmentFactory extends DefaultCodeFragmentFactory { for (SmaliInstruction instruction: smaliMethod.getInstructions()) { methodSize += instruction.getInstructionSize(); } - Location endLocation = method.locationOfCodeIndex((methodSize/2) - 1); + Location endLocation = null; + for (int endCodeIndex = (methodSize/2) - 1; endCodeIndex >= 0; endCodeIndex--) { + endLocation = method.locationOfCodeIndex(endCodeIndex); + if (endLocation != null) { + break; + } + } + if (endLocation == null) { + return null; + } LocalVariable localVariable = localVariableConstructor.newInstance(vm, method, mapRegister(frameProxy.getStackFrame().virtualMachine(), smaliMethod, registerNum), - method.locationOfCodeIndex(0), + method.location(), endLocation, String.format("v%d", registerNum), type, null); diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java index 781a8569..9c0abbe6 100644 --- a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java +++ b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java @@ -38,6 +38,7 @@ import com.intellij.debugger.engine.DebugProcess; import com.intellij.debugger.requests.ClassPrepareRequestor; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; +import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import com.sun.jdi.Location; import com.sun.jdi.ReferenceType; @@ -60,10 +61,16 @@ public class SmaliPositionManager implements PositionManager { this.debugProcess = debugProcess; } - public SourcePosition getSourcePosition(String declaringType, String methodName, String methodSignature, + public SourcePosition getSourcePosition(final String declaringType, String methodName, String methodSignature, int codeIndex) throws NoDataException { - Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(declaringType, - debugProcess.getProject(), GlobalSearchScope.projectScope(debugProcess.getProject())); + + Collection<SmaliClass> classes = ApplicationManager.getApplication().runReadAction( + new Computable<Collection<SmaliClass>>() { + @Override public Collection<SmaliClass> compute() { + return SmaliClassNameIndex.INSTANCE.get(declaringType, debugProcess.getProject(), + GlobalSearchScope.projectScope(debugProcess.getProject())); + } + }); if (classes.size() > 0) { SmaliClass smaliClass = classes.iterator().next(); @@ -116,7 +123,13 @@ public class SmaliPositionManager implements PositionManager { @Override @NotNull public List<Location> locationsOfLine(@NotNull final ReferenceType type, @NotNull final SourcePosition position) throws NoDataException { - if (!(position.getElementAt().getContainingFile() instanceof SmaliFile)) { + PsiFile containingFile = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile>() { + @Override public PsiFile compute() { + return position.getElementAt().getContainingFile(); + } + }); + + if (!(containingFile instanceof SmaliFile)) { throw NoDataException.INSTANCE; } @@ -125,6 +138,8 @@ public class SmaliPositionManager implements PositionManager { ApplicationManager.getApplication().runReadAction(new Runnable() { @Override public void run() { + + String typeName = type.name(); Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(typeName, debugProcess.getProject(), GlobalSearchScope.projectScope(debugProcess.getProject())); diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java index 88fd0070..2b52e2b7 100644 --- a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java +++ b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java @@ -32,6 +32,8 @@ package org.jf.smalidea.debugging.value; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiSubstitutor; +import com.sun.jdi.ObjectReference; import com.sun.jdi.StringReference; import org.jf.smalidea.psi.impl.SmaliMethod; @@ -41,6 +43,11 @@ public class LazyStringReference extends LazyObjectReference<StringReference> im } public String value() { + ObjectReference objectReference = getValue(); + if (!(objectReference instanceof StringReference)) { + throw new IllegalStateException(String.format("Expecting type String, but got %s. method=%s, register=%d", + objectReference.type().name(), this.method.getSignature(PsiSubstitutor.EMPTY), registerNumber)); + } return getValue().value(); } } diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java index 0eeb010b..f17df6d7 100644 --- a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java +++ b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java @@ -48,10 +48,10 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; public class LazyValue<T extends Value> implements Value { - private final int registerNumber; - private final Project project; - private final SmaliMethod method; - private final String type; + protected final int registerNumber; + protected final Project project; + protected final SmaliMethod method; + protected final String type; private EvaluationContext evaluationContext; private Value value; diff --git a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java index 9d2a0fc3..6056da37 100644 --- a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java +++ b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java @@ -86,7 +86,7 @@ public class SmalideaPackedSwitchPayload extends SmalideaInstruction implements return 0; } - return label.getOffset() - baseOffset; + return (label.getOffset() - baseOffset) / 2; } }); } diff --git a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java index 15eaea2d..832c8807 100644 --- a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java +++ b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java @@ -79,7 +79,7 @@ public class SmalideaSparseSwitchPayload extends SmalideaInstruction implements return 0; } - return label.getOffset() - baseOffset; + return (label.getOffset() - baseOffset) / 2; } }; } diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java index e36313ba..ac3dd81f 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java @@ -106,7 +106,7 @@ public class SmaliAnnotation extends SmaliStubBasedPsiElement<SmaliAnnotationStu } @Nullable @Override public PsiAnnotationOwner getOwner() { - return (PsiAnnotationOwner)getStubOrPsiParent(); + return (PsiAnnotationOwner)getParentByStub(); } @Nullable @Override public PsiMetaData getMetaData() { diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java index 7bef4e94..579401cf 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java @@ -88,7 +88,7 @@ public class SmaliField extends SmaliStubBasedPsiElement<SmaliFieldStub> impleme } @Nullable @Override public PsiClass getContainingClass() { - return (PsiClass)getStubOrPsiParent(); + return (PsiClass)getParentByStub(); } @NotNull @Override public PsiType getType() { diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java index 8992ab0b..fb4a788f 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java @@ -56,7 +56,7 @@ public class SmaliImplementsList extends SmaliBaseReferenceList<SmaliImplementsL } @NotNull private SmaliClassTypeElement[] getImplementsElements() { - SmaliClass smaliClass = (SmaliClass)getStubOrPsiParent(); + SmaliClass smaliClass = (SmaliClass)getParentByStub(); assert smaliClass != null; SmaliImplementsStatement[] implementsStatements = smaliClass.getImplementsStatements(); diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java index 8cb2d77a..ecbdbb33 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java @@ -76,7 +76,7 @@ public class SmaliInstruction extends SmaliCompositeElement { assert instructionNode != null; // TODO: put a project level Opcodes instance with the appropriate api level somewhere - opcode = new Opcodes(15, false).getOpcodeByName(instructionNode.getText()); + opcode = Opcodes.getDefault().getOpcodeByName(instructionNode.getText()); if (opcode == null) { if (instructionNode.getText().equals(".packed-switch")) { return Opcode.PACKED_SWITCH_PAYLOAD; diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java index 085585bb..8ba618b3 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java @@ -259,7 +259,7 @@ public class SmaliMethod extends SmaliStubBasedPsiElement<SmaliMethodStub> } @Nullable @Override public SmaliClass getContainingClass() { - PsiElement parent = getStubOrPsiParent(); + PsiElement parent = getParentByStub(); if (parent instanceof SmaliClass) { return (SmaliClass) parent; } diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java b/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java index 0ebb1eec..87b2afff 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java @@ -31,6 +31,7 @@ package org.jf.smalidea.psi.index; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElementFinder; import com.intellij.psi.search.GlobalSearchScope; @@ -40,9 +41,16 @@ import org.jf.smalidea.psi.impl.SmaliClass; import java.util.Collection; public class SmaliClassFinder extends PsiElementFinder { + + private final Project project; + + public SmaliClassFinder(Project project) { + this.project = project; + } + @Override public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { - Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(qualifiedName, scope.getProject(), scope); + Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(qualifiedName, project, scope); if (classes != null && classes.size() == 1) { return classes.iterator().next(); } diff --git a/smalidea/src/main/resources/META-INF/plugin.xml b/smalidea/src/main/resources/META-INF/plugin.xml index 8ae92dad..91326cfe 100644 --- a/smalidea/src/main/resources/META-INF/plugin.xml +++ b/smalidea/src/main/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ <idea-plugin version="2"> <id>org.jf.smalidea</id> <name>Smalidea</name> - <version>0.02</version> + <version>0.04</version> <vendor email="jesusfreke@jesusfreke.com" url="http://smali.org">JesusFreke</vendor> <description><![CDATA[ diff --git a/util/build.gradle b/util/build.gradle index 407ef71f..23d6a3af 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -30,9 +30,9 @@ */ dependencies { - compile depends.commons_cli compile depends.findbugs compile depends.guava + compile depends.jcommander testCompile depends.junit } diff --git a/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java b/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java new file mode 100644 index 00000000..f4577179 --- /dev/null +++ b/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java @@ -0,0 +1,184 @@ +/* + * Copyright 2013, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util; + +import java.io.FilterWriter; +import java.io.IOException; +import java.io.Writer; + +/** + * Writer that wraps another writer and passes width-limited and + * optionally-prefixed output to its subordinate. When lines are + * wrapped they are automatically indented based on the start of the + * line. + */ +public final class OldWrappedIndentingWriter extends FilterWriter { + /** null-ok; optional prefix for every line */ + private final String prefix; + + /** > 0; the maximum output width */ + private final int width; + + /** > 0; the maximum indent */ + private final int maxIndent; + + /** >= 0; current output column (zero-based) */ + private int column; + + /** whether indent spaces are currently being collected */ + private boolean collectingIndent; + + /** >= 0; current indent amount */ + private int indent; + + /** + * Constructs an instance. + * + * @param out non-null; writer to send final output to + * @param width >= 0; the maximum output width (not including + * <code>prefix</code>), or <code>0</code> for no maximum + * @param prefix non-null; the prefix for each line + */ + public OldWrappedIndentingWriter(Writer out, int width, String prefix) { + super(out); + + if (out == null) { + throw new NullPointerException("out == null"); + } + + if (width < 0) { + throw new IllegalArgumentException("width < 0"); + } + + if (prefix == null) { + throw new NullPointerException("prefix == null"); + } + + this.width = (width != 0) ? width : Integer.MAX_VALUE; + this.maxIndent = width >> 1; + this.prefix = (prefix.length() == 0) ? null : prefix; + + bol(); + } + + /** + * Constructs a no-prefix instance. + * + * @param out non-null; writer to send final output to + * @param width >= 0; the maximum output width (not including + * <code>prefix</code>), or <code>0</code> for no maximum + */ + public OldWrappedIndentingWriter(Writer out, int width) { + this(out, width, ""); + } + + /** {@inheritDoc} */ + @Override + public void write(int c) throws IOException { + synchronized (lock) { + if (collectingIndent) { + if (c == ' ') { + indent++; + if (indent >= maxIndent) { + indent = maxIndent; + collectingIndent = false; + } + } else { + collectingIndent = false; + } + } + + if ((column == width) && (c != '\n')) { + out.write('\n'); + column = 0; + /* + * Note: No else, so this should fall through to the next + * if statement. + */ + } + + if (column == 0) { + if (prefix != null) { + out.write(prefix); + } + + if (!collectingIndent) { + for (int i = 0; i < indent; i++) { + out.write(' '); + } + column = indent; + } + } + + out.write(c); + + if (c == '\n') { + bol(); + } else { + column++; + } + } + } + + /** {@inheritDoc} */ + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + synchronized (lock) { + while (len > 0) { + write(cbuf[off]); + off++; + len--; + } + } + } + + /** {@inheritDoc} */ + @Override + public void write(String str, int off, int len) throws IOException { + synchronized (lock) { + while (len > 0) { + write(str.charAt(off)); + off++; + len--; + } + } + } + + /** + * Indicates that output is at the beginning of a line. + */ + private void bol() { + column = 0; + collectingIndent = (maxIndent != 0); + indent = 0; + } +} diff --git a/util/src/main/java/org/jf/util/PathUtil.java b/util/src/main/java/org/jf/util/PathUtil.java index 91eb7584..9ba9f301 100644 --- a/util/src/main/java/org/jf/util/PathUtil.java +++ b/util/src/main/java/org/jf/util/PathUtil.java @@ -28,9 +28,12 @@ package org.jf.util; +import com.google.common.collect.Lists; + import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.List; public class PathUtil { private PathUtil() { @@ -44,19 +47,9 @@ public class PathUtil { return new File(getRelativeFileInternal(baseFile.getCanonicalFile(), fileToRelativize.getCanonicalFile())); } - public static String getRelativePath(String basePath, String pathToRelativize) throws IOException { - File baseFile = new File(basePath); - if (baseFile.isFile()) { - baseFile = baseFile.getParentFile(); - } - - return getRelativeFileInternal(baseFile.getCanonicalFile(), - new File(pathToRelativize).getCanonicalFile()); - } - static String getRelativeFileInternal(File canonicalBaseFile, File canonicalFileToRelativize) { - ArrayList<String> basePath = getPathComponents(canonicalBaseFile); - ArrayList<String> pathToRelativize = getPathComponents(canonicalFileToRelativize); + List<String> basePath = getPathComponents(canonicalBaseFile); + List<String> pathToRelativize = getPathComponents(canonicalFileToRelativize); //if the roots aren't the same (i.e. different drives on a windows machine), we can't construct a relative //path from one to the other, so just return the canonical file @@ -105,21 +98,21 @@ public class PathUtil { return sb.toString(); } - private static ArrayList<String> getPathComponents(File file) { + private static List<String> getPathComponents(File file) { ArrayList<String> path = new ArrayList<String>(); while (file != null) { File parentFile = file.getParentFile(); if (parentFile == null) { - path.add(0, file.getPath()); + path.add(file.getPath()); } else { - path.add(0, file.getName()); + path.add(file.getName()); } file = parentFile; } - return path; + return Lists.reverse(path); } } diff --git a/util/src/main/java/org/jf/util/SmaliHelpFormatter.java b/util/src/main/java/org/jf/util/SmaliHelpFormatter.java deleted file mode 100644 index 3d0137e4..00000000 --- a/util/src/main/java/org/jf/util/SmaliHelpFormatter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * [The "BSD licence"] - * Copyright (c) 2010 Ben Gruver (JesusFreke) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 org.jf.util; - -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Options; - -import java.io.PrintWriter; - -public class SmaliHelpFormatter extends HelpFormatter { - public void printHelp(String cmdLineSyntax, String header, Options options, Options debugOptions) { - super.printHelp(cmdLineSyntax, header, options, ""); - if (debugOptions != null) { - System.out.println(); - System.out.println("Debug Options:"); - PrintWriter pw = new PrintWriter(System.out); - super.printOptions(pw, getWidth(), debugOptions, getLeftPadding(), getDescPadding()); - pw.flush(); - } - } -} diff --git a/util/src/main/java/org/jf/util/StringWrapper.java b/util/src/main/java/org/jf/util/StringWrapper.java index 91808300..304c2972 100644 --- a/util/src/main/java/org/jf/util/StringWrapper.java +++ b/util/src/main/java/org/jf/util/StringWrapper.java @@ -33,9 +33,92 @@ package org.jf.util; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.io.PrintStream; +import java.text.BreakIterator; +import java.util.Iterator; public class StringWrapper { /** + * Splits the given string into lines of maximum width maxWidth. The splitting is done using the current locale's + * rules for splitting lines. + * + * @param string The string to split + * @param maxWidth The maximum length of any line + * @return An iterable of Strings containing the wrapped lines + */ + public static Iterable<String> wrapStringOnBreaks(@Nonnull final String string, final int maxWidth) { + // TODO: should we strip any trailing newlines? + final BreakIterator breakIterator = BreakIterator.getLineInstance(); + breakIterator.setText(string); + + return new Iterable<String>() { + @Override + public Iterator<String> iterator() { + return new Iterator<String>() { + private int currentLineStart = 0; + private boolean nextLineSet = false; + private String nextLine; + + @Override + public boolean hasNext() { + if (!nextLineSet) { + calculateNext(); + } + return nextLine != null; + } + + private void calculateNext() { + int lineEnd = currentLineStart; + while (true) { + lineEnd = breakIterator.following(lineEnd); + if (lineEnd == BreakIterator.DONE) { + lineEnd = breakIterator.last(); + if (lineEnd <= currentLineStart) { + nextLine = null; + nextLineSet = true; + return; + } + break; + } + + if (lineEnd - currentLineStart > maxWidth) { + lineEnd = breakIterator.preceding(lineEnd); + if (lineEnd <= currentLineStart) { + lineEnd = currentLineStart + maxWidth; + } + break; + } + + if (string.charAt(lineEnd-1) == '\n') { + nextLine = string.substring(currentLineStart, lineEnd-1); + nextLineSet = true; + currentLineStart = lineEnd; + return; + } + } + nextLine = string.substring(currentLineStart, lineEnd); + nextLineSet = true; + currentLineStart = lineEnd; + } + + @Override + public String next() { + String ret = nextLine; + nextLine = null; + nextLineSet = false; + return ret; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + }; + } + + /** * Splits the given string into lines using on any embedded newlines, and wrapping the text as needed to conform to * the given maximum line width. * @@ -103,4 +186,14 @@ public class StringWrapper { System.arraycopy(arr, 0, newArr, 0, arr.length); return newArr; } + + public static void printWrappedString(@Nonnull PrintStream stream, @Nonnull String string) { + printWrappedString(stream, string, ConsoleUtil.getConsoleWidth()); + } + + public static void printWrappedString(@Nonnull PrintStream stream, @Nonnull String string, int maxWidth) { + for (String str: wrapStringOnBreaks(string, maxWidth)) { + stream.println(str); + } + } } diff --git a/util/src/main/java/org/jf/util/WrappedIndentingWriter.java b/util/src/main/java/org/jf/util/WrappedIndentingWriter.java index eb1acdae..df4575bd 100644 --- a/util/src/main/java/org/jf/util/WrappedIndentingWriter.java +++ b/util/src/main/java/org/jf/util/WrappedIndentingWriter.java @@ -1,18 +1,18 @@ /* - * Copyright 2013, Google Inc. + * Copyright 2016, Google Inc. * All rights reserved. * * 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 + * 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 + * 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 Inc. nor the names of its + * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * @@ -31,154 +31,94 @@ package org.jf.util; +import com.google.common.collect.Lists; + import java.io.FilterWriter; import java.io.IOException; import java.io.Writer; +import java.util.List; -/** - * Writer that wraps another writer and passes width-limited and - * optionally-prefixed output to its subordinate. When lines are - * wrapped they are automatically indented based on the start of the - * line. - */ -public final class WrappedIndentingWriter extends FilterWriter { - /** null-ok; optional prefix for every line */ - private final String prefix; - - /** > 0; the maximum output width */ - private final int width; +public class WrappedIndentingWriter extends FilterWriter { - /** > 0; the maximum indent */ private final int maxIndent; + private final int maxWidth; - /** >= 0; current output column (zero-based) */ - private int column; - - /** whether indent spaces are currently being collected */ - private boolean collectingIndent; - - /** >= 0; current indent amount */ - private int indent; + private int currentIndent = 0; + private final StringBuilder line = new StringBuilder(); - /** - * Constructs an instance. - * - * @param out non-null; writer to send final output to - * @param width >= 0; the maximum output width (not including - * <code>prefix</code>), or <code>0</code> for no maximum - * @param prefix non-null; the prefix for each line - */ - public WrappedIndentingWriter(Writer out, int width, String prefix) { + public WrappedIndentingWriter(Writer out, int maxIndent, int maxWidth) { super(out); + this.maxIndent = maxIndent; + this.maxWidth = maxWidth; + } - if (out == null) { - throw new NullPointerException("out == null"); + private void writeIndent() throws IOException { + for (int i=0; i<getIndent(); i++) { + write(' '); } + } - if (width < 0) { - throw new IllegalArgumentException("width < 0"); + private int getIndent() { + if (currentIndent < 0) { + return 0; } - - if (prefix == null) { - throw new NullPointerException("prefix == null"); + if (currentIndent > maxIndent) { + return maxIndent; } + return currentIndent; + } - this.width = (width != 0) ? width : Integer.MAX_VALUE; - this.maxIndent = width >> 1; - this.prefix = (prefix.length() == 0) ? null : prefix; - - bol(); + public void indent(int indent) { + currentIndent += indent; } - /** - * Constructs a no-prefix instance. - * - * @param out non-null; writer to send final output to - * @param width >= 0; the maximum output width (not including - * <code>prefix</code>), or <code>0</code> for no maximum - */ - public WrappedIndentingWriter(Writer out, int width) { - this(out, width, ""); + public void deindent(int indent) { + currentIndent -= indent; } - /** {@inheritDoc} */ - @Override - public void write(int c) throws IOException { - synchronized (lock) { - if (collectingIndent) { - if (c == ' ') { - indent++; - if (indent >= maxIndent) { - indent = maxIndent; - collectingIndent = false; - } - } else { - collectingIndent = false; - } - } + private void wrapLine() throws IOException { + List<String> wrapped = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(line.toString(), maxWidth)); + out.write(wrapped.get(0), 0, wrapped.get(0).length()); + out.write('\n'); - if ((column == width) && (c != '\n')) { - out.write('\n'); - column = 0; - /* - * Note: No else, so this should fall through to the next - * if statement. - */ - } - - if (column == 0) { - if (prefix != null) { - out.write(prefix); - } - - if (!collectingIndent) { - for (int i = 0; i < indent; i++) { - out.write(' '); - } - column = indent; - } + line.replace(0, line.length(), ""); + writeIndent(); + for (int i=1; i<wrapped.size(); i++) { + if (i > 1) { + write('\n'); } + write(wrapped.get(i)); + } + } + @Override public void write(int c) throws IOException { + if (c == '\n') { + out.write(line.toString()); out.write(c); - - if (c == '\n') { - bol(); - } else { - column++; + line.replace(0, line.length(), ""); + writeIndent(); + } else { + line.append((char)c); + if (line.length() > maxWidth) { + wrapLine(); } } } - /** {@inheritDoc} */ - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - synchronized (lock) { - while (len > 0) { - write(cbuf[off]); - off++; - len--; - } + @Override public void write(char[] cbuf, int off, int len) throws IOException { + for (int i=0; i<len; i++) { + write(cbuf[i+off]); } } - /** {@inheritDoc} */ - @Override - public void write(String str, int off, int len) throws IOException { - synchronized (lock) { - while (len > 0) { - write(str.charAt(off)); - off++; - len--; - } + @Override public void write(String str, int off, int len) throws IOException { + for (int i=0; i<len; i++) { + write(str.charAt(i+off)); } } - /** - * Indicates that output is at the beginning of a line. - */ - private void bol() { - column = 0; - collectingIndent = (maxIndent != 0); - indent = 0; + @Override public void flush() throws IOException { + out.write(line.toString()); + line.replace(0, line.length(), ""); } } diff --git a/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java new file mode 100644 index 00000000..eb628aff --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java @@ -0,0 +1,47 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import com.beust.jcommander.converters.IParameterSplitter; + +import java.util.Arrays; +import java.util.List; + +/** + * A JCommander parameter splitter that splits a parameter value by colon + */ +public class ColonParameterSplitter implements IParameterSplitter { + @Override + public List<String> split(String value) { + return Arrays.asList(value.split(":")); + } +} diff --git a/util/src/main/java/org/jf/util/jcommander/Command.java b/util/src/main/java/org/jf/util/jcommander/Command.java new file mode 100644 index 00000000..8fac0fab --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/Command.java @@ -0,0 +1,72 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import com.beust.jcommander.JCommander; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import org.jf.util.ConsoleUtil; + +import javax.annotation.Nonnull; +import java.util.List; + +public abstract class Command { + + @Nonnull + protected final List<JCommander> commandAncestors; + + public Command(@Nonnull List<JCommander> commandAncestors) { + this.commandAncestors = commandAncestors; + } + + public void usage() { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(getCommandHierarchy())); + } + + protected void setupCommand(JCommander jc) { + } + + protected JCommander getJCommander() { + JCommander parentJc = Iterables.getLast(commandAncestors); + return parentJc.getCommands().get(this.getClass().getAnnotation(ExtendedParameters.class).commandName()); + } + + public List<JCommander> getCommandHierarchy() { + List<JCommander> commandHierarchy = Lists.newArrayList(commandAncestors); + commandHierarchy.add(getJCommander()); + return commandHierarchy; + } + + public abstract void run(); +} diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java new file mode 100644 index 00000000..209d94e2 --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java @@ -0,0 +1,150 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterDescription; +import com.beust.jcommander.Parameterized; +import com.beust.jcommander.Parameters; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.lang.reflect.Field; + +/** + * Utilities related to "extended" commands - JCommander commands with additional information + */ +public class ExtendedCommands { + + @Nonnull + private static ExtendedParameters getExtendedParameters(Object command) { + ExtendedParameters anno = command.getClass().getAnnotation(ExtendedParameters.class); + if (anno == null) { + throw new IllegalStateException("All extended commands should have an ExtendedParameters annotation: " + + command.getClass().getCanonicalName()); + } + return anno; + } + + @Nonnull + public static String commandName(JCommander jc) { + return getExtendedParameters(jc.getObjects().get(0)).commandName(); + } + + @Nonnull + public static String commandName(Object command) { + return getExtendedParameters(command).commandName(); + } + + @Nonnull + public static String[] commandAliases(JCommander jc) { + return commandAliases(jc.getObjects().get(0)); + } + + @Nonnull + public static String[] commandAliases(Object command) { + return getExtendedParameters(command).commandAliases(); + } + + public static boolean includeParametersInUsage(JCommander jc) { + return includeParametersInUsage(jc.getObjects().get(0)); + } + + public static boolean includeParametersInUsage(Object command) { + return getExtendedParameters(command).includeParametersInUsage(); + } + + @Nonnull + public static String postfixDescription(JCommander jc) { + return postfixDescription(jc.getObjects().get(0)); + } + + @Nonnull + public static String postfixDescription(Object command) { + return getExtendedParameters(command).postfixDescription(); + } + + public static void addExtendedCommand(JCommander jc, Command command) { + jc.addCommand(commandName(command), command, commandAliases(command)); + command.setupCommand(command.getJCommander()); + } + + @Nonnull + public static String[] parameterArgumentNames(ParameterDescription parameterDescription) { + Parameterized parameterized = parameterDescription.getParameterized(); + + Class cls = parameterDescription.getObject().getClass(); + Field field = null; + while (cls != Object.class) { + try { + field = cls.getDeclaredField(parameterized.getName()); + } catch (NoSuchFieldException ex) { + cls = cls.getSuperclass(); + continue; + } + break; + } + + assert field != null; + ExtendedParameter extendedParameter = field.getAnnotation(ExtendedParameter.class); + if (extendedParameter != null) { + return extendedParameter.argumentNames(); + } + + return new String[0]; + } + + @Nullable + public static JCommander getSubcommand(JCommander jc, String commandName) { + if (jc.getCommands().containsKey(commandName)) { + return jc.getCommands().get(commandName); + } else { + for (JCommander command : jc.getCommands().values()) { + for (String alias: commandAliases(command)) { + if (commandName.equals(alias)) { + return command; + } + } + } + } + return null; + } + + @Nullable + public static String getCommandDescription(@Nonnull JCommander jc) { + Parameters parameters = jc.getObjects().get(0).getClass().getAnnotation(Parameters.class); + if (parameters == null) { + return null; + } + return parameters.commandDescription(); + } +} diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java new file mode 100644 index 00000000..81f78c22 --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java @@ -0,0 +1,40 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ExtendedParameter { + String[] argumentNames(); +} diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java new file mode 100644 index 00000000..965d2b2a --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java @@ -0,0 +1,43 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ExtendedParameters { + boolean includeParametersInUsage() default false; + String commandName(); + String[] commandAliases() default { }; + String postfixDescription() default ""; +} diff --git a/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java new file mode 100644 index 00000000..e807d5fe --- /dev/null +++ b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java @@ -0,0 +1,316 @@ +/* + * Copyright 2016, Google Inc. + * All rights reserved. + * + * 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 Inc. 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 org.jf.util.jcommander; + +import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterDescription; +import com.beust.jcommander.Parameters; +import com.beust.jcommander.internal.Lists; +import com.google.common.base.Joiner; +import com.google.common.collect.Iterables; +import org.jf.util.WrappedIndentingWriter; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.io.StringWriter; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class HelpFormatter { + + private int width = 80; + + @Nonnull + public HelpFormatter width(int width) { + this.width = width; + return this; + } + + @Nonnull + private static ExtendedParameters getExtendedParameters(JCommander jc) { + ExtendedParameters anno = jc.getObjects().get(0).getClass().getAnnotation(ExtendedParameters.class); + if (anno == null) { + throw new IllegalStateException("All commands should have an ExtendedParameters annotation"); + } + return anno; + } + + @Nonnull + private static List<String> getCommandAliases(JCommander jc) { + return Lists.newArrayList(getExtendedParameters(jc).commandAliases()); + } + + private static boolean includeParametersInUsage(@Nonnull JCommander jc) { + return getExtendedParameters(jc).includeParametersInUsage(); + } + + @Nonnull + private static String getPostfixDescription(@Nonnull JCommander jc) { + return getExtendedParameters(jc).postfixDescription(); + } + + private int getParameterArity(ParameterDescription param) { + if (param.getParameter().arity() > 0) { + return param.getParameter().arity(); + } + Class<?> type = param.getParameterized().getType(); + if ((type == boolean.class || type == Boolean.class)) { + return 0; + } + return 1; + } + + private List<ParameterDescription> getSortedParameters(JCommander jc) { + List<ParameterDescription> parameters = Lists.newArrayList(jc.getParameters()); + + final Pattern pattern = Pattern.compile("^-*(.*)$"); + + Collections.sort(parameters, new Comparator<ParameterDescription>() { + @Override public int compare(ParameterDescription o1, ParameterDescription o2) { + String s1; + Matcher matcher = pattern.matcher(o1.getParameter().names()[0]); + if (matcher.matches()) { + s1 = matcher.group(1); + } else { + throw new IllegalStateException(); + } + + String s2; + matcher = pattern.matcher(o2.getParameter().names()[0]); + if (matcher.matches()) { + s2 = matcher.group(1); + } else { + throw new IllegalStateException(); + } + + return s1.compareTo(s2); + } + }); + return parameters; + } + + @Nonnull + public String format(@Nonnull JCommander... jc) { + return format(Arrays.asList(jc)); + } + + @Nonnull + public String format(@Nonnull List<JCommander> commandHierarchy) { + try { + StringWriter stringWriter = new StringWriter(); + WrappedIndentingWriter writer = new WrappedIndentingWriter(stringWriter, width - 5, width); + + JCommander leafJc = Iterables.getLast(commandHierarchy); + + writer.write("usage:"); + writer.indent(2); + + for (JCommander jc: commandHierarchy) { + writer.write(" "); + writer.write(ExtendedCommands.commandName(jc)); + } + + if (includeParametersInUsage(leafJc)) { + for (ParameterDescription param : leafJc.getParameters()) { + if (!param.getParameter().hidden()) { + writer.write(" ["); + writer.write(param.getParameter().getParameter().names()[0]); + writer.write("]"); + } + } + } else { + if (!leafJc.getParameters().isEmpty()) { + writer.write(" [<options>]"); + } + } + + if (!leafJc.getCommands().isEmpty()) { + writer.write(" [<command [<args>]]"); + } + + if (leafJc.getMainParameter() != null) { + String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter()); + if (argumentNames.length == 0) { + writer.write(" <args>"); + } else { + String argumentName = argumentNames[0]; + boolean writeAngleBrackets = !argumentName.startsWith("<") && !argumentName.startsWith("["); + writer.write(" "); + if (writeAngleBrackets) { + writer.write("<"); + } + writer.write(argumentNames[0]); + if (writeAngleBrackets) { + writer.write(">"); + } + } + } + + writer.deindent(2); + + String commandDescription = ExtendedCommands.getCommandDescription(leafJc); + if (commandDescription != null) { + writer.write("\n"); + writer.write(commandDescription); + } + + if (!leafJc.getParameters().isEmpty() || leafJc.getMainParameter() != null) { + writer.write("\n\nOptions:"); + writer.indent(2); + for (ParameterDescription param : getSortedParameters(leafJc)) { + if (!param.getParameter().hidden()) { + writer.write("\n"); + writer.indent(4); + if (!param.getNames().isEmpty()) { + writer.write(Joiner.on(',').join(param.getParameter().names())); + } + if (getParameterArity(param) > 0) { + String[] argumentNames = ExtendedCommands.parameterArgumentNames(param); + for (int i = 0; i < getParameterArity(param); i++) { + writer.write(" "); + if (i < argumentNames.length) { + writer.write("<"); + writer.write(argumentNames[i]); + writer.write(">"); + } else { + writer.write("<arg>"); + } + } + } + if (param.getDescription() != null && !param.getDescription().isEmpty()) { + writer.write(" - "); + writer.write(param.getDescription()); + } + if (param.getDefault() != null) { + String defaultValue = null; + if (param.getParameterized().getType() == Boolean.class || + param.getParameterized().getType() == Boolean.TYPE) { + if ((Boolean)param.getDefault()) { + defaultValue = "True"; + } + } else if (List.class.isAssignableFrom(param.getParameterized().getType())) { + if (!((List)param.getDefault()).isEmpty()) { + defaultValue = param.getDefault().toString(); + } + } else { + defaultValue = param.getDefault().toString(); + } + if (defaultValue != null) { + writer.write(" (default: "); + writer.write(defaultValue); + writer.write(")"); + } + } + writer.deindent(4); + } + } + + if (leafJc.getMainParameter() != null) { + String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter()); + writer.write("\n"); + writer.indent(4); + if (argumentNames.length > 0) { + writer.write("<"); + writer.write(argumentNames[0]); + writer.write(">"); + } else { + writer.write("<args>"); + } + + if (leafJc.getMainParameterDescription() != null) { + writer.write(" - "); + writer.write(leafJc.getMainParameterDescription()); + } + writer.deindent(4); + } + writer.deindent(2); + } + + if (!leafJc.getCommands().isEmpty()) { + writer.write("\n\nCommands:"); + writer.indent(2); + + + List<Entry<String, JCommander>> entryList = Lists.newArrayList(leafJc.getCommands().entrySet()); + Collections.sort(entryList, new Comparator<Entry<String, JCommander>>() { + @Override public int compare(Entry<String, JCommander> o1, Entry<String, JCommander> o2) { + return o1.getKey().compareTo(o2.getKey()); + } + }); + + for (Entry<String, JCommander> entry : entryList) { + String commandName = entry.getKey(); + JCommander command = entry.getValue(); + + Object arg = command.getObjects().get(0); + Parameters parametersAnno = arg.getClass().getAnnotation(Parameters.class); + if (!parametersAnno.hidden()) { + writer.write("\n"); + writer.indent(4); + writer.write(commandName); + List<String> aliases = getCommandAliases(command); + if (!aliases.isEmpty()) { + writer.write("("); + writer.write(Joiner.on(',').join(aliases)); + writer.write(")"); + } + + String commandDesc = leafJc.getCommandDescription(commandName); + if (commandDesc != null) { + writer.write(" - "); + writer.write(commandDesc); + } + writer.deindent(4); + } + } + writer.deindent(2); + } + + String postfixDescription = getPostfixDescription(leafJc); + if (!postfixDescription.isEmpty()) { + writer.write("\n\n"); + writer.write(postfixDescription); + } + + writer.flush(); + + return stringWriter.getBuffer().toString(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/util/src/test/java/org/jf/util/StringWrapperTest.java b/util/src/test/java/org/jf/util/StringWrapperTest.java index 64dca33e..94c79142 100644 --- a/util/src/test/java/org/jf/util/StringWrapperTest.java +++ b/util/src/test/java/org/jf/util/StringWrapperTest.java @@ -31,11 +31,35 @@ package org.jf.util; +import com.google.common.collect.Lists; import org.junit.Assert; import org.junit.Test; +import java.util.List; + public class StringWrapperTest { @Test + public void testWrapStringByWords() { + validateResult2(new String[]{"abc", "abcdef", "abcdef"}, + "abc\nabcdefabcdef", 6); + + validateResult2(new String[]{"abc", "abcdef", " ", "abcdef"}, + "abc\nabcdef abcdef", 6); + + validateResult2(new String[]{"abc", "abcde ", "fabcde", "f"}, + "abc\nabcde fabcdef", 6); + + validateResult2(new String[]{"abc def ghi ", "kjl mon pqr ", "stu vwx yz"}, + "abc def ghi kjl mon pqr stu vwx yz", 14); + + validateResult2(new String[]{"abcdefg", "hikjlmo", "npqrstu", "vwxyz"}, + "abcdefghikjlmonpqrstuvwxyz", 7); + + validateResult2(new String[]{"abc", "defhig"}, + "abc\ndefhig", 20); + } + + @Test public void testWrapString() { validateResult( new String[]{"abc", "abcdef", "abcdef"}, @@ -115,4 +139,15 @@ public class StringWrapperTest { Assert.assertEquals(expected[i], actual[i]); } } + + public static void validateResult2(String[] expected, String textToWrap, int maxWidth) { + List<String> result = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(textToWrap, maxWidth)); + + Assert.assertEquals(expected.length, result.size()); + int i; + for (i=0; i<result.size(); i++) { + Assert.assertTrue(i < expected.length); + Assert.assertEquals(expected[i], result.get(i)); + } + } } |