Merge "Inherit useIdentifierNameString from the inlinee."
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index df6cf56..da28ce0 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -447,6 +447,11 @@
method.accessFlags.unsetSynthetic();
method.accessFlags.unsetBridge();
}
+
+ // Record that the current method uses identifier name string if the inlinee did so.
+ if (target.getOptimizationInfo().useIdentifierNameString()) {
+ method.markUseIdentifierNameString();
+ }
}
}
}
diff --git a/src/test/examples/adaptclassstrings/keep-rules-1.txt b/src/test/examples/adaptclassstrings/keep-rules-1.txt
index 72562ed..21ab3c8 100644
--- a/src/test/examples/adaptclassstrings/keep-rules-1.txt
+++ b/src/test/examples/adaptclassstrings/keep-rules-1.txt
@@ -9,4 +9,3 @@
}
-dontshrink
--dontoptimize
diff --git a/src/test/examples/adaptclassstrings/keep-rules-2.txt b/src/test/examples/adaptclassstrings/keep-rules-2.txt
index fc8be9d..b06eebf 100644
--- a/src/test/examples/adaptclassstrings/keep-rules-2.txt
+++ b/src/test/examples/adaptclassstrings/keep-rules-2.txt
@@ -9,6 +9,5 @@
}
-dontshrink
--dontoptimize
-adaptclassstrings *.*A
diff --git a/src/test/examples/atomicfieldupdater/keep-rules.txt b/src/test/examples/atomicfieldupdater/keep-rules.txt
index 3b2d2ef..44c60f5 100644
--- a/src/test/examples/atomicfieldupdater/keep-rules.txt
+++ b/src/test/examples/atomicfieldupdater/keep-rules.txt
@@ -10,7 +10,6 @@
-keep,allowobfuscation class atomicfieldupdater.A
-dontshrink
--dontoptimize
# This will be added to CompatProguard by default.
# We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/forname/keep-rules.txt b/src/test/examples/forname/keep-rules.txt
index 34a498b..4131646 100644
--- a/src/test/examples/forname/keep-rules.txt
+++ b/src/test/examples/forname/keep-rules.txt
@@ -10,7 +10,6 @@
-keep,allowobfuscation class forname.A
-dontshrink
--dontoptimize
# This will be added to CompatProguard by default.
# We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/getmembers/A.java b/src/test/examples/getmembers/A.java
index 7a231c0..b13a28c 100644
--- a/src/test/examples/getmembers/A.java
+++ b/src/test/examples/getmembers/A.java
@@ -8,4 +8,7 @@
String bar(String s) {
return foo + s;
}
+ public static String baz() {
+ return foo;
+ }
}
diff --git a/src/test/examples/getmembers/B.java b/src/test/examples/getmembers/B.java
new file mode 100644
index 0000000..d29d0a2
--- /dev/null
+++ b/src/test/examples/getmembers/B.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package getmembers;
+
+import java.lang.reflect.Method;
+
+public class B {
+
+ private String toBeInlined() throws Exception {
+ Method baz = A.class.getMethod("baz", (Class[]) null);
+ assert baz != null;
+ String bazResult = (String) baz.invoke(null, null);
+ assert bazResult.startsWith("foo");
+ return bazResult;
+ }
+
+ synchronized static String inliner() throws Exception {
+ B self = new B();
+ return self.toBeInlined();
+ }
+
+}
diff --git a/src/test/examples/getmembers/Main.java b/src/test/examples/getmembers/Main.java
index ee82c05..7d26710 100644
--- a/src/test/examples/getmembers/Main.java
+++ b/src/test/examples/getmembers/Main.java
@@ -12,11 +12,17 @@
Field foo = a.getDeclaredField("foo");
assert foo != null;
assert foo.get(null).equals("foo");
+ System.out.println(foo.get(null));
Method bar = a.getDeclaredMethod("bar", new Class[] { String.class });
assert bar != null;
A instanceA = new A();
- String barResult = (String) bar.invoke(instanceA);
+ String barResult = (String) bar.invoke(instanceA, "bar");
assert barResult.startsWith("foo");
+ System.out.println(barResult);
+
+ String bazResult = B.inliner();
+ assert bazResult.startsWith("foo");
+ System.out.println(bazResult);
}
}
diff --git a/src/test/examples/getmembers/keep-rules.txt b/src/test/examples/getmembers/keep-rules.txt
index 23f8d6c..68c4a5d 100644
--- a/src/test/examples/getmembers/keep-rules.txt
+++ b/src/test/examples/getmembers/keep-rules.txt
@@ -7,10 +7,13 @@
public static void main(...);
}
--keep,allowobfuscation class getmembers.A
+-keep,allowobfuscation class getmembers.A {
+ <methods>;
+}
--dontshrink
--dontoptimize
+-alwaysinline class getmembers.B {
+ private String toBeInlined();
+}
# This will be added to CompatProguard by default.
# We are testing whether R8 shows the same behavior.
diff --git a/src/test/examples/identifiernamestring/keep-rules-1.txt b/src/test/examples/identifiernamestring/keep-rules-1.txt
index bc18a3f..682999f 100644
--- a/src/test/examples/identifiernamestring/keep-rules-1.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-1.txt
@@ -10,4 +10,3 @@
-keepnames class identifiernamestring.A
-dontshrink
--dontoptimize
diff --git a/src/test/examples/identifiernamestring/keep-rules-2.txt b/src/test/examples/identifiernamestring/keep-rules-2.txt
index 87584e1..74af143 100644
--- a/src/test/examples/identifiernamestring/keep-rules-2.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-2.txt
@@ -10,7 +10,6 @@
-keepnames class identifiernamestring.A
-dontshrink
--dontoptimize
-identifiernamestring class * {
@identifiernamestring.IdentifierNameString *;
diff --git a/src/test/examples/identifiernamestring/keep-rules-3.txt b/src/test/examples/identifiernamestring/keep-rules-3.txt
index 5ac8b93..aa23772 100644
--- a/src/test/examples/identifiernamestring/keep-rules-3.txt
+++ b/src/test/examples/identifiernamestring/keep-rules-3.txt
@@ -10,7 +10,6 @@
-keepnames class identifiernamestring.A
-dontshrink
--dontoptimize
-identifiernamestring class * {
static java.lang.reflect.Field *(java.lang.Class, java.lang.String);
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 0d1ca64..fa39257 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.code.ConstString;
import com.android.tools.r8.code.ConstStringJumbo;
@@ -18,6 +19,7 @@
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexValue.DexValueString;
+import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.ClassSubject;
import com.android.tools.r8.utils.DexInspector.MethodSubject;
@@ -43,15 +45,12 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class IdentifierMinifierTest {
+public class IdentifierMinifierTest extends TestBase {
private final String appFileName;
private final List<String> keepRulesFiles;
private final Consumer<DexInspector> inspection;
- @Rule
- public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
public IdentifierMinifierTest(
String test,
List<String> keepRulesFiles,
@@ -61,30 +60,28 @@
this.inspection = inspection;
}
+ private AndroidApp processedApp;
+
@Before
public void generateR8ProcessedApp() throws Exception {
Path out = temp.getRoot().toPath();
R8Command.Builder builder =
ToolHelper.addProguardConfigurationConsumer(
- R8Command.builder(),
- pgConfig -> {
- pgConfig.setPrintMapping(true);
- pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
- })
+ R8Command.builder(),
+ pgConfig -> {
+ pgConfig.setPrintMapping(true);
+ pgConfig.setPrintMappingFile(out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE));
+ })
.setOutput(out, OutputMode.DexIndexed)
.addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
.addLibraryFiles(ToolHelper.getDefaultAndroidJar());
ToolHelper.getAppBuilder(builder).addProgramFiles(Paths.get(appFileName));
- ToolHelper.runR8(builder.build());
+ processedApp = ToolHelper.runR8(builder.build(), o -> o.debug = false);
}
@Test
public void identiferMinifierTest() throws Exception {
- Path out = temp.getRoot().toPath();
- DexInspector dexInspector =
- new DexInspector(
- out.resolve("classes.dex"),
- out.resolve(ToolHelper.DEFAULT_PROGUARD_MAP_FILE).toString());
+ DexInspector dexInspector = new DexInspector(processedApp);
inspection.accept(dexInspector);
}
@@ -189,6 +186,13 @@
Set<Instruction> constStringInstructions =
getRenamedMemberIdentifierConstStrings(a, mainCode.asDexCode().instructions);
assertEquals(2, constStringInstructions.size());
+
+ ClassSubject b = inspector.clazz("getmembers.B");
+ MethodSubject inliner = b.method("java.lang.String", "inliner", ImmutableList.of());
+ Code inlinerCode = inliner.getMethod().getCode();
+ constStringInstructions =
+ getRenamedMemberIdentifierConstStrings(a, inlinerCode.asDexCode().instructions);
+ assertEquals(1, constStringInstructions.size());
}
// Without -identifiernamestring
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 62c1bec..b0e1131 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -60,12 +60,13 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstString.class,
+ IputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[1];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[2] instanceof IputObject);
- assertTrue(code.instructions[3] instanceof ReturnVoid);
}
@Test
@@ -92,17 +93,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof SgetObject);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ IputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeVirtual);
- assertTrue(code.instructions[4] instanceof ConstString);
constString = (ConstString) code.instructions[4];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[5] instanceof IputObject);
- assertTrue(code.instructions[6] instanceof ReturnVoid);
}
@Test
@@ -131,17 +133,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof SgetObject);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ IputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeVirtual);
- assertTrue(code.instructions[4] instanceof ConstString);
constString = (ConstString) code.instructions[4];
assertNotEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[5] instanceof IputObject);
- assertTrue(code.instructions[6] instanceof ReturnVoid);
}
@Test
@@ -165,11 +168,12 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ ConstString.class,
+ SputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[0];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[1] instanceof SputObject);
- assertTrue(code.instructions[2] instanceof ReturnVoid);
}
@Test
@@ -195,16 +199,17 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof SgetObject);
- assertTrue(code.instructions[1] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ SputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[1];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[2] instanceof InvokeVirtual);
- assertTrue(code.instructions[3] instanceof ConstString);
constString = (ConstString) code.instructions[3];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[4] instanceof SputObject);
- assertTrue(code.instructions[5] instanceof ReturnVoid);
}
@Test
@@ -232,16 +237,17 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof SgetObject);
- assertTrue(code.instructions[1] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ SputObject.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[1];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[2] instanceof InvokeVirtual);
- assertTrue(code.instructions[3] instanceof ConstString);
constString = (ConstString) code.instructions[3];
assertNotEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[4] instanceof SputObject);
- assertTrue(code.instructions[5] instanceof ReturnVoid);
}
@Test
@@ -252,8 +258,7 @@
List<String> pgConfigs = ImmutableList.of(
"-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
"-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
- "-dontshrink",
- "-dontoptimize");
+ "-dontshrink");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -275,8 +280,7 @@
"-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sClassName; }",
"-keep class " + CLASS_NAME + " { static java.lang.String sClassName; }",
"-keep,allowobfuscation class " + BOO,
- "-dontshrink",
- "-dontoptimize");
+ "-dontshrink");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -300,8 +304,7 @@
"-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
"-keep class " + CLASS_NAME + " { static java.lang.String sFieldName; }",
"-keep,allowobfuscation class " + BOO + " { <fields>; }",
- "-dontshrink",
- "-dontoptimize");
+ "-dontshrink");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -325,8 +328,7 @@
"-identifiernamestring class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
"-keep class " + CLASS_NAME + " { static java.lang.String sMethodName; }",
"-keep,allowobfuscation class " + BOO + " { <methods>; }",
- "-dontshrink",
- "-dontoptimize");
+ "-dontshrink");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -356,8 +358,7 @@
List<String> pgConfigs = ImmutableList.of(
"-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
- "-keep class " + CLASS_NAME,
- "-dontoptimize");
+ "-keep class " + CLASS_NAME);
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -366,15 +367,16 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstString.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[1];
assertEquals("Mixed/form.Boo", constString.getString().toString());
- assertTrue(code.instructions[2] instanceof ConstString);
constString = (ConstString) code.instructions[2];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeStatic);
- assertTrue(code.instructions[4] instanceof ReturnVoid);
}
@Test
@@ -396,8 +398,7 @@
List<String> pgConfigs = ImmutableList.of(
"-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
- "-keep class " + CLASS_NAME,
- "-dontoptimize");
+ "-keep class " + CLASS_NAME);
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -406,17 +407,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof SgetObject);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeVirtual);
- assertTrue(code.instructions[4] instanceof ConstString);
constString = (ConstString) code.instructions[4];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[5] instanceof InvokeStatic);
- assertTrue(code.instructions[6] instanceof ReturnVoid);
}
@Test
@@ -440,8 +442,7 @@
List<String> pgConfigs = ImmutableList.of(
"-identifiernamestring class " + CLASS_NAME + " { static void foo(...); }",
"-keep class " + CLASS_NAME,
- "-keep,allowobfuscation class " + BOO,
- "-dontoptimize");
+ "-keep,allowobfuscation class " + BOO);
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -450,17 +451,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof SgetObject);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ SgetObject.class,
+ ConstString.class,
+ InvokeVirtual.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeVirtual);
- assertTrue(code.instructions[4] instanceof ConstString);
constString = (ConstString) code.instructions[4];
assertNotEquals(BOO, constString.getString().toString());
- assertTrue(code.instructions[5] instanceof InvokeStatic);
- assertTrue(code.instructions[6] instanceof ReturnVoid);
}
@Test
@@ -492,8 +494,7 @@
+ " static java.lang.reflect.Field *(java.lang.Class,java.lang.String);\n"
+ "}",
"-keep class " + CLASS_NAME,
- "-keep class R { *; }",
- "-dontoptimize");
+ "-keep class R { *; }");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -502,13 +503,14 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstClass);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstClass.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertEquals("foo", constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeStatic);
- assertTrue(code.instructions[4] instanceof ReturnVoid);
}
@Test
@@ -540,8 +542,7 @@
+ " static java.lang.reflect.Field *(java.lang.Class,java.lang.String);\n"
+ "}",
"-keep class " + CLASS_NAME,
- "-keep,allowobfuscation class R { *; }",
- "-dontoptimize");
+ "-keep,allowobfuscation class R { *; }");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -550,13 +551,14 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstClass);
- assertTrue(code.instructions[2] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstClass.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[2];
assertNotEquals("foo", constString.getString().toString());
- assertTrue(code.instructions[3] instanceof InvokeStatic);
- assertTrue(code.instructions[4] instanceof ReturnVoid);
}
@Test
@@ -595,8 +597,7 @@
+ " *(java.lang.Class,java.lang.String,java.lang.Class[]);\n"
+ "}",
"-keep class " + CLASS_NAME,
- "-keep class R { *; }",
- "-dontoptimize");
+ "-keep class R { *; }");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -605,17 +606,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstClass);
- assertTrue(code.instructions[2] instanceof Const4);
- assertTrue(code.instructions[3] instanceof NewArray);
- assertTrue(code.instructions[4] instanceof Const4);
- assertTrue(code.instructions[5] instanceof AputObject);
- assertTrue(code.instructions[6] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstClass.class,
+ Const4.class,
+ NewArray.class,
+ Const4.class,
+ AputObject.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[6];
assertEquals("foo", constString.getString().toString());
- assertTrue(code.instructions[7] instanceof InvokeStatic);
- assertTrue(code.instructions[8] instanceof ReturnVoid);
}
@Test
@@ -654,8 +656,7 @@
+ " *(java.lang.Class,java.lang.String,java.lang.Class[]);\n"
+ "}",
"-keep class " + CLASS_NAME,
- "-keep,allowobfuscation class R { *; }",
- "-dontoptimize");
+ "-keep,allowobfuscation class R { *; }");
DexInspector inspector = getInspectorAfterRunR8(builder, pgConfigs);
ClassSubject clazz = inspector.clazz(CLASS_NAME);
@@ -664,17 +665,18 @@
assertNotNull(method);
DexCode code = method.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof InvokeDirect);
- assertTrue(code.instructions[1] instanceof ConstClass);
- assertTrue(code.instructions[2] instanceof Const4);
- assertTrue(code.instructions[3] instanceof NewArray);
- assertTrue(code.instructions[4] instanceof Const4);
- assertTrue(code.instructions[5] instanceof AputObject);
- assertTrue(code.instructions[6] instanceof ConstString);
+ checkInstructions(code, ImmutableList.of(
+ InvokeDirect.class,
+ ConstClass.class,
+ Const4.class,
+ NewArray.class,
+ Const4.class,
+ AputObject.class,
+ ConstString.class,
+ InvokeStatic.class,
+ ReturnVoid.class));
ConstString constString = (ConstString) code.instructions[6];
assertNotEquals("foo", constString.getString().toString());
- assertTrue(code.instructions[7] instanceof InvokeStatic);
- assertTrue(code.instructions[8] instanceof ReturnVoid);
}
private DexInspector getInspectorAfterRunR8(