From e202aeede5fb5fcc8de22601157b212eabb5f1c6 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 17 Oct 2015 13:50:26 -0700 Subject: Pass in the Opcodes to use for SyntheticAccessorFSM --- .../src/main/java/org/jf/baksmali/baksmali.java | 2 +- .../java/org/jf/dexlib2/analysis/ClassPath.java | 16 +++-- .../org/jf/dexlib2/dexbacked/DexBackedDexFile.java | 6 +- .../main/java/org/jf/dexlib2/iface/DexFile.java | 9 +++ .../org/jf/dexlib2/immutable/ImmutableDexFile.java | 19 +++++- .../java/org/jf/dexlib2/rewriter/DexRewriter.java | 5 ++ .../org/jf/dexlib2/util/SyntheticAccessorFSM.java | 79 ++++++++++++---------- .../jf/dexlib2/util/SyntheticAccessorResolver.java | 8 ++- dexlib2/src/main/ragel/SyntheticAccessorFSM.rl | 10 ++- .../src/test/java/org/jf/dexlib2/AccessorTest.java | 2 +- .../jf/dexlib2/analysis/CommonSuperclassTest.java | 68 ++++++++++--------- .../analysis/CustomMethodInlineTableTest.java | 7 +- .../dexlib2/analysis/util/SuperclassChainTest.java | 5 +- .../java/org/jf/dexlib2/writer/DexWriterTest.java | 4 +- 14 files changed, 146 insertions(+), 94 deletions(-) diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/baksmali.java index 1e297029..50607340 100644 --- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java +++ b/baksmali/src/main/java/org/jf/baksmali/baksmali.java @@ -135,7 +135,7 @@ public class baksmali { List classDefs = Ordering.natural().sortedCopy(dexFile.getClasses()); if (!options.noAccessorComments) { - options.syntheticAccessorResolver = new SyntheticAccessorResolver(classDefs); + options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(), classDefs); } final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDirectoryFile, ".smali"); 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 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 classes; + @Nonnull private final Opcodes opcodes; + @Deprecated public ImmutableDexFile(@Nullable Collection classes) { this.classes = ImmutableClassDef.immutableSetOf(classes); + this.opcodes = Opcodes.forApi(19); } + @Deprecated public ImmutableDexFile(@Nullable ImmutableSet classes) { this.classes = ImmutableUtils.nullToEmptySet(classes); + this.opcodes = Opcodes.forApi(19); + } + + public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection classes) { + this.classes = ImmutableClassDef.immutableSetOf(classes); + this.opcodes = opcodes; + } + + public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable ImmutableSet 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 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 getClasses() { return RewriterUtils.rewriteSet(getClassDefRewriter(), dexFile.getClasses()); } + + @Nonnull @Override public Opcodes getOpcodes() { + return dexFile.getOpcodes(); + } } @Nonnull @Override public Rewriter 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 instructions) { + @Nonnull private final Opcodes opcodes; + + public SyntheticAccessorFSM(@Nonnull Opcodes opcodes) { + this.opcodes = opcodes; + } + + public int test(List 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 classDefMap; private final Map resolvedAccessors = Maps.newConcurrentMap(); - public SyntheticAccessorResolver(Iterable classDefs) { + public SyntheticAccessorResolver(@Nonnull Opcodes opcodes, @Nonnull Iterable classDefs) { + this.syntheticAccessorFSM = new SyntheticAccessorFSM(opcodes); ImmutableMap.Builder builder = ImmutableMap.builder(); for (ClassDef classDef: classDefs) { @@ -124,7 +127,8 @@ public class SyntheticAccessorResolver { List instructions = ImmutableList.copyOf(matchedMethodImpl.getInstructions()); - int accessType = SyntheticAccessorFSM.test(instructions); + + int accessType = syntheticAccessorFSM.test(instructions); if (accessType >= 0) { AccessedMember member = diff --git a/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl b/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl index 60d297bb..96ac5367 100644 --- a/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl +++ b/dexlib2/src/main/ragel/SyntheticAccessorFSM.rl @@ -64,7 +64,13 @@ public class SyntheticAccessorFSM { public static final int NEGATIVE_ONE = -1; public static final int OTHER = 0; - public static int test(List instructions) { + @Nonnull private final Opcodes opcodes; + + public SyntheticAccessorFSM(@Nonnull Opcodes opcodes) { + this.opcodes = opcodes; + } + + public int test(List instructions) { int accessorType = -1; int cs, p = 0; int pe = instructions.size(); @@ -83,8 +89,6 @@ public class SyntheticAccessorFSM { // The return register; int returnRegister = -1; - Opcodes opcodes = Opcodes.forApi(20); - %%{ import "Opcodes.rl"; alphtype short; diff --git a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java index 924d3fd3..4c8f85bf 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java @@ -81,7 +81,7 @@ public class AccessorTest { Assert.assertNotNull(url); DexFile f = DexFileFactory.loadDexFile(url.getFile(), 15, false); - SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getClasses()); + SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses()); ClassDef accessorTypesClass = null; ClassDef accessorsClass = null; 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 f3b1094e..521290f0 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java @@ -33,6 +33,7 @@ package org.jf.dexlib2.analysis; import com.google.common.collect.ImmutableSet; import junit.framework.Assert; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.immutable.ImmutableDexFile; import org.junit.Test; @@ -53,38 +54,41 @@ public class CommonSuperclassTest { private final ClassPath classPath; public CommonSuperclassTest() throws IOException { - classPath = new ClassPath(new ImmutableDexFile(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;") + classPath = new ClassPath(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;") ))); } 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 25f7778d..90a63590 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java @@ -35,6 +35,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.Opcodes; import org.jf.dexlib2.iface.ClassDef; import org.jf.dexlib2.iface.DexFile; import org.jf.dexlib2.iface.instruction.Instruction; @@ -66,7 +67,7 @@ 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(ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); ClassPath classPath = ClassPath.fromClassPath(ImmutableList.of(), ImmutableList.of(), dexFile, 15, false); @@ -93,7 +94,7 @@ 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(ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); ClassPath classPath = ClassPath.fromClassPath(ImmutableList.of(), ImmutableList.of(), dexFile, 15, false); @@ -120,7 +121,7 @@ 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(ImmutableList.of(classDef)); + DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef)); ClassPath classPath = ClassPath.fromClassPath(ImmutableList.of(), ImmutableList.of(), dexFile, 15, false); 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 59b0d276..c9a9af95 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 @@ -34,6 +34,7 @@ package org.jf.dexlib2.analysis.util; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import junit.framework.Assert; +import org.jf.dexlib2.Opcodes; import org.jf.dexlib2.analysis.ClassPath; import org.jf.dexlib2.analysis.TestUtils; import org.jf.dexlib2.analysis.TypeProto; @@ -56,7 +57,7 @@ public class SuperclassChainTest { ImmutableSet classes = ImmutableSet.of( objectClassDef, oneClassDef, twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new ImmutableDexFile(classes)); + ClassPath classPath = new ClassPath(new ImmutableDexFile(Opcodes.forApi(19), classes)); TypeProto objectClassProto = classPath.getClass("Ljava/lang/Object;"); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); @@ -87,7 +88,7 @@ public class SuperclassChainTest { ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;"); ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;"); ImmutableSet classes = ImmutableSet.of(twoClassDef, threeClassDef); - ClassPath classPath = new ClassPath(new ImmutableDexFile(classes)); + ClassPath classPath = new ClassPath(new ImmutableDexFile(Opcodes.forApi(19), classes)); TypeProto unknownClassProto = classPath.getUnknownClass(); TypeProto oneClassProto = classPath.getClass("Ltest/one;"); 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 54372cf6..1a0a2892 100644 --- a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java +++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java @@ -72,7 +72,7 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } @@ -112,7 +112,7 @@ public class DexWriterTest { MemoryDataStore dataStore = new MemoryDataStore(); try { - DexPool.writeTo(dataStore, new ImmutableDexFile(ImmutableSet.of(classDef))); + DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef))); } catch (IOException ex) { throw new RuntimeException(ex); } -- cgit v1.2.3