diff options
author | Ben Gruver <bgruv@google.com> | 2015-10-17 13:50:26 -0700 |
---|---|---|
committer | Ben Gruver <bgruv@google.com> | 2015-10-17 13:50:26 -0700 |
commit | e202aeede5fb5fcc8de22601157b212eabb5f1c6 (patch) | |
tree | 7a41ca2fc6e6fa0167c36d9fbae1cfd9d4743bb4 /dexlib2/src/main/java | |
parent | 4c66761aea38c933ceb01c675067ba0fda3f1651 (diff) | |
download | smali-e202aeede5fb5fcc8de22601157b212eabb5f1c6.tar.gz |
Pass in the Opcodes to use for SyntheticAccessorFSM
Diffstat (limited to 'dexlib2/src/main/java')
7 files changed, 92 insertions, 50 deletions
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 9d0bb2dc..cf75dffe 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java @@ -40,6 +40,7 @@ import com.google.common.collect.*; 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; @@ -139,13 +140,14 @@ public class ClassPath { private static DexFile getBasicClasses() { // fallbacks for some special classes that we assume are present - return new ImmutableDexFile(ImmutableSet.of( - new ReflectionClassDef(Class.class), - new ReflectionClassDef(Cloneable.class), - new ReflectionClassDef(Object.class), - new ReflectionClassDef(Serializable.class), - new ReflectionClassDef(String.class), - new ReflectionClassDef(Throwable.class))); + return new ImmutableDexFile(Opcodes.forApi(19), + ImmutableSet.of( + new ReflectionClassDef(Class.class), + new ReflectionClassDef(Cloneable.class), + new ReflectionClassDef(Object.class), + new ReflectionClassDef(Serializable.class), + new ReflectionClassDef(String.class), + new ReflectionClassDef(Throwable.class))); } public boolean isArt() { 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 638fd855..32505eec 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java @@ -46,7 +46,7 @@ import java.io.InputStream; import java.util.Set; public class DexBackedDexFile extends BaseDexBuffer implements DexFile { - private final Opcodes opcodes; + @Nonnull private final Opcodes opcodes; private final int stringCount; private final int stringStartOffset; @@ -61,7 +61,7 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { private final int classCount; private final int classStartOffset; - private DexBackedDexFile(Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { + private DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) { super(buf, offset); this.opcodes = opcodes; @@ -117,7 +117,7 @@ public class DexBackedDexFile extends BaseDexBuffer implements DexFile { return new DexBackedDexFile(opcodes, buf, 0, false); } - public Opcodes getOpcodes() { + @Override @Nonnull public Opcodes getOpcodes() { return opcodes; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java index 45707f03..474bfb13 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/DexFile.java @@ -31,6 +31,8 @@ package org.jf.dexlib2.iface; +import org.jf.dexlib2.Opcodes; + import javax.annotation.Nonnull; import java.util.Set; @@ -46,4 +48,11 @@ public interface DexFile { * @return A set of the classes defined in this dex file */ @Nonnull Set<? extends ClassDef> getClasses(); + + /** + * Get the Opcodes associated with this dex file + * + * @return The Opcodes instance representing the possible opcodes that can be encountered in this dex file + */ + @Nonnull Opcodes getOpcodes(); } 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 e911eb38..2112bd07 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java @@ -32,6 +32,7 @@ package org.jf.dexlib2.immutable; import com.google.common.collect.ImmutableSet; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.DexFile; import org.jf.util.ImmutableUtils; @@ -42,21 +43,37 @@ import java.util.Collection; 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; + } + + public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable ImmutableSet<? extends ImmutableClassDef> classes) { + this.classes = ImmutableUtils.nullToEmptySet(classes); + this.opcodes = opcodes; } public static ImmutableDexFile of(DexFile dexFile) { if (dexFile instanceof ImmutableDexFile) { return (ImmutableDexFile)dexFile; } - return new ImmutableDexFile(dexFile.getClasses()); + return new ImmutableDexFile(dexFile.getOpcodes(), dexFile.getClasses()); } @Nonnull @Override public ImmutableSet<? extends ImmutableClassDef> getClasses() { return classes; } + @Nonnull @Override public Opcodes getOpcodes() { return opcodes; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java index e482cd04..839ac096 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/DexRewriter.java @@ -31,6 +31,7 @@ package org.jf.dexlib2.rewriter; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.iface.*; import org.jf.dexlib2.iface.debug.DebugItem; import org.jf.dexlib2.iface.instruction.Instruction; @@ -116,6 +117,10 @@ public class DexRewriter implements Rewriters { @Override @Nonnull public Set<? extends ClassDef> getClasses() { return RewriterUtils.rewriteSet(getClassDefRewriter(), dexFile.getClasses()); } + + @Nonnull @Override public Opcodes getOpcodes() { + return dexFile.getOpcodes(); + } } @Nonnull @Override public Rewriter<ClassDef> getClassDefRewriter() { return classDefRewriter; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java index 1e8b010b..674d5180 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java @@ -33,11 +33,12 @@ package org.jf.dexlib2.util; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.iface.instruction.Instruction; import org.jf.dexlib2.iface.instruction.OneRegisterInstruction; import org.jf.dexlib2.iface.instruction.WideLiteralInstruction; -import org.jf.dexlib2.Opcodes; +import javax.annotation.Nonnull; import java.util.List; public class SyntheticAccessorFSM { @@ -212,7 +213,13 @@ static final int SyntheticAccessorFSM_en_main = 1; public static final int NEGATIVE_ONE = -1; public static final int OTHER = 0; - public static int test(List<? extends Instruction> instructions) { + @Nonnull private final Opcodes opcodes; + + public SyntheticAccessorFSM(@Nonnull Opcodes opcodes) { + this.opcodes = opcodes; + } + + public int test(List<? extends Instruction> instructions) { int accessorType = -1; int cs, p = 0; int pe = instructions.size(); @@ -231,15 +238,13 @@ static final int SyntheticAccessorFSM_en_main = 1; // The return register; int returnRegister = -1; - Opcodes opcodes = Opcodes.forApi(20); - -// line 238 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" +// line 242 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" { cs = SyntheticAccessorFSM_start; } -// line 243 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" +// line 247 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" { int _klen; int _trans = 0; @@ -320,19 +325,19 @@ case 1: switch ( _SyntheticAccessorFSM_actions[_acts++] ) { case 0: -// line 96 "SyntheticAccessorFSM.rl" +// line 100 "SyntheticAccessorFSM.rl" { putRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA(); } break; case 1: -// line 103 "SyntheticAccessorFSM.rl" +// line 107 "SyntheticAccessorFSM.rl" { constantValue = ((WideLiteralInstruction)instructions.get(p)).getWideLiteral(); } break; case 2: -// line 107 "SyntheticAccessorFSM.rl" +// line 111 "SyntheticAccessorFSM.rl" { mathType = INT; mathOp = ADD; @@ -340,146 +345,146 @@ case 1: } break; case 3: -// line 113 "SyntheticAccessorFSM.rl" +// line 117 "SyntheticAccessorFSM.rl" { mathType = INT; } break; case 4: -// line 114 "SyntheticAccessorFSM.rl" +// line 118 "SyntheticAccessorFSM.rl" { mathType = LONG; } break; case 5: -// line 115 "SyntheticAccessorFSM.rl" +// line 119 "SyntheticAccessorFSM.rl" { mathType = FLOAT; } break; case 6: -// line 116 "SyntheticAccessorFSM.rl" +// line 120 "SyntheticAccessorFSM.rl" {mathType = DOUBLE; } break; case 7: -// line 116 "SyntheticAccessorFSM.rl" +// line 120 "SyntheticAccessorFSM.rl" { mathOp = ADD; } break; case 8: -// line 119 "SyntheticAccessorFSM.rl" +// line 123 "SyntheticAccessorFSM.rl" { mathType = INT; } break; case 9: -// line 120 "SyntheticAccessorFSM.rl" +// line 124 "SyntheticAccessorFSM.rl" { mathType = LONG; } break; case 10: -// line 121 "SyntheticAccessorFSM.rl" +// line 125 "SyntheticAccessorFSM.rl" { mathType = FLOAT; } break; case 11: -// line 122 "SyntheticAccessorFSM.rl" +// line 126 "SyntheticAccessorFSM.rl" {mathType = DOUBLE; } break; case 12: -// line 122 "SyntheticAccessorFSM.rl" +// line 126 "SyntheticAccessorFSM.rl" { mathOp = SUB; } break; case 13: -// line 126 "SyntheticAccessorFSM.rl" +// line 130 "SyntheticAccessorFSM.rl" { mathOp = MUL; } break; case 14: -// line 130 "SyntheticAccessorFSM.rl" +// line 134 "SyntheticAccessorFSM.rl" { mathOp = DIV; } break; case 15: -// line 134 "SyntheticAccessorFSM.rl" +// line 138 "SyntheticAccessorFSM.rl" { mathOp = REM; } break; case 16: -// line 137 "SyntheticAccessorFSM.rl" +// line 141 "SyntheticAccessorFSM.rl" { mathOp = AND; } break; case 17: -// line 140 "SyntheticAccessorFSM.rl" +// line 144 "SyntheticAccessorFSM.rl" { mathOp = OR; } break; case 18: -// line 143 "SyntheticAccessorFSM.rl" +// line 147 "SyntheticAccessorFSM.rl" { mathOp = XOR; } break; case 19: -// line 146 "SyntheticAccessorFSM.rl" +// line 150 "SyntheticAccessorFSM.rl" { mathOp = SHL; } break; case 20: -// line 149 "SyntheticAccessorFSM.rl" +// line 153 "SyntheticAccessorFSM.rl" { mathOp = SHR; } break; case 21: -// line 152 "SyntheticAccessorFSM.rl" +// line 156 "SyntheticAccessorFSM.rl" { mathOp = USHR; } break; case 22: -// line 158 "SyntheticAccessorFSM.rl" +// line 162 "SyntheticAccessorFSM.rl" { returnRegister = ((OneRegisterInstruction)instructions.get(p)).getRegisterA(); } break; case 23: -// line 164 "SyntheticAccessorFSM.rl" +// line 168 "SyntheticAccessorFSM.rl" { accessorType = SyntheticAccessorResolver.GETTER; { p += 1; _goto_targ = 5; if (true) continue _goto;} } break; case 24: -// line 168 "SyntheticAccessorFSM.rl" +// line 172 "SyntheticAccessorFSM.rl" { accessorType = SyntheticAccessorResolver.SETTER; { p += 1; _goto_targ = 5; if (true) continue _goto;} } break; case 25: -// line 172 "SyntheticAccessorFSM.rl" +// line 176 "SyntheticAccessorFSM.rl" { accessorType = SyntheticAccessorResolver.METHOD; { p += 1; _goto_targ = 5; if (true) continue _goto;} } break; case 26: -// line 176 "SyntheticAccessorFSM.rl" +// line 180 "SyntheticAccessorFSM.rl" { accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister); } break; case 27: -// line 180 "SyntheticAccessorFSM.rl" +// line 184 "SyntheticAccessorFSM.rl" { accessorType = getIncrementType(mathOp, mathType, constantValue, putRegister, returnRegister); } break; case 28: -// line 188 "SyntheticAccessorFSM.rl" +// line 192 "SyntheticAccessorFSM.rl" { accessorType = mathOp; { p += 1; _goto_targ = 5; if (true) continue _goto;} } break; -// line 483 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" +// line 487 "/home/jesusfreke/projects/smali/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java" } } } @@ -499,7 +504,7 @@ case 5: break; } } -// line 201 "SyntheticAccessorFSM.rl" +// line 205 "SyntheticAccessorFSM.rl" return accessorType; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java index a46a18f0..7808f84d 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/util/SyntheticAccessorResolver.java @@ -35,6 +35,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import org.jf.dexlib2.AccessFlags; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.Method; import org.jf.dexlib2.iface.MethodImplementation; @@ -68,10 +69,12 @@ public class SyntheticAccessorResolver { public static final int SHR_ASSIGNMENT = 16; public static final int USHR_ASSIGNMENT = 17; + private final SyntheticAccessorFSM syntheticAccessorFSM; private final Map<String, ClassDef> classDefMap; private final Map<String, AccessedMember> resolvedAccessors = Maps.newConcurrentMap(); - public SyntheticAccessorResolver(Iterable<? extends ClassDef> classDefs) { + public SyntheticAccessorResolver(@Nonnull Opcodes opcodes, @Nonnull Iterable<? extends ClassDef> classDefs) { + this.syntheticAccessorFSM = new SyntheticAccessorFSM(opcodes); ImmutableMap.Builder<String, ClassDef> builder = ImmutableMap.builder(); for (ClassDef classDef: classDefs) { @@ -124,7 +127,8 @@ public class SyntheticAccessorResolver { List<Instruction> instructions = ImmutableList.copyOf(matchedMethodImpl.getInstructions()); - int accessType = SyntheticAccessorFSM.test(instructions); + + int accessType = syntheticAccessorFSM.test(instructions); if (accessType >= 0) { AccessedMember member = |