Remove TODO and update expectations for more kotlin tests
Fixes: 179866251
Fixes: 179951729
Bug: 202947898
Change-Id: I0a7d76471521dbb0fac3e02ecf511ebf30453f8d
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 79880c8..5759deb 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -31,10 +31,10 @@
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import java.nio.file.Path;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.junit.Assume;
@@ -66,32 +66,49 @@
}
protected static void checkMethodIsInvokedAtLeastOnce(
- DexCode dexCode, MethodSignature... methodSignatures) {
+ MethodSubject subject, MethodSignature... methodSignatures) {
for (MethodSignature methodSignature : methodSignatures) {
- checkMethodIsInvokedAtLeastOnce(dexCode, methodSignature);
+ checkMethodIsInvokedAtLeastOnce(subject, methodSignature);
}
}
private static void checkMethodIsInvokedAtLeastOnce(
- DexCode dexCode, MethodSignature methodSignature) {
- assertTrue("No invoke to '" + methodSignature.toString() + "'",
- Arrays.stream(dexCode.instructions)
- .filter((instr) -> instr.getMethod() != null)
- .anyMatch((instr) -> instr.getMethod().name.toString().equals(methodSignature.name)));
+ MethodSubject subject, MethodSignature methodSignature) {
+ assertTrue(
+ "No invoke to '" + methodSignature.toString() + "'",
+ subject
+ .streamInstructions()
+ .filter(InstructionSubject::isInvoke)
+ .anyMatch(
+ instructionSubject ->
+ instructionSubject
+ .getMethod()
+ .getName()
+ .toString()
+ .equals(methodSignature.name)));
}
protected static void checkMethodIsNeverInvoked(
- DexCode dexCode, MethodSignature... methodSignatures) {
+ MethodSubject subject, MethodSignature... methodSignatures) {
for (MethodSignature methodSignature : methodSignatures) {
- checkMethodIsNeverInvoked(dexCode, methodSignature);
+ checkMethodIsNeverInvoked(subject, methodSignature);
}
}
- private static void checkMethodIsNeverInvoked(DexCode dexCode, MethodSignature methodSignature) {
- assertTrue("At least one invoke to '" + methodSignature.toString() + "'",
- Arrays.stream(dexCode.instructions)
- .filter((instr) -> instr.getMethod() != null)
- .noneMatch((instr) -> instr.getMethod().name.toString().equals(methodSignature.name)));
+ private static void checkMethodIsNeverInvoked(
+ MethodSubject subject, MethodSignature methodSignature) {
+ assertTrue(
+ "At least one invoke to '" + methodSignature.toString() + "'",
+ subject
+ .streamInstructions()
+ .filter(InstructionSubject::isInvoke)
+ .noneMatch(
+ instructionSubject ->
+ instructionSubject
+ .getMethod()
+ .getName()
+ .toString()
+ .equals(methodSignature.name)));
}
protected static void checkMethodsPresence(
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index 105d097..902ca67 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -14,13 +14,14 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.cf.code.CfInstruction;
+import com.android.tools.r8.cf.code.CfNew;
+import com.android.tools.r8.code.Instruction;
import com.android.tools.r8.code.NewInstance;
import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.IntBox;
@@ -35,7 +36,6 @@
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -244,15 +244,16 @@
@Test
public void testDataClass() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72) && testParameters.isDexRuntime());
String mainClassName = "class_inliner_data_class.MainKt";
runTest("class_inliner_data_class", mainClassName)
.inspect(
inspector -> {
ClassSubject clazz = inspector.clazz(mainClassName);
assertEquals(
- Collections.emptySet(),
+ // TODO(b/202947898): Should be able to class inline alpha
+ kotlinc.is(KOTLINC_1_5_0)
+ ? Collections.singleton("class_inliner_data_class.Alpha")
+ : Collections.emptySet(),
collectAccessedTypes(
type -> !type.toSourceString().startsWith("java."),
clazz,
@@ -260,7 +261,10 @@
String[].class.getCanonicalName()));
assertEquals(
Lists.newArrayList(
- "void kotlin.jvm.internal.Intrinsics.throwParameterIsNullException(java.lang.String)"),
+ kotlinc.is(KOTLINC_1_3_72)
+ ? "void kotlin.jvm.internal.Intrinsics.throwParameterIsNullException(java.lang.String)"
+ : "void kotlin.jvm.internal.Intrinsics.checkNotNullParameter(java.lang.Object,"
+ + " java.lang.String)"),
collectStaticCalls(clazz, "main", String[].class.getCanonicalName()));
});
}
@@ -272,15 +276,30 @@
String... params) {
assertNotNull(clazz);
MethodSignature signature = new MethodSignature(methodName, "void", params);
- // TODO(b/179866251): Allow for CF code here.
- DexCode code = clazz.method(signature).getMethod().getCode().asDexCode();
- return Stream.concat(
- filterInstructionKind(code, NewInstance.class)
- .map(insn -> ((NewInstance) insn).getType()),
- filterInstructionKind(code, SgetObject.class)
- .map(insn -> insn.getField().holder)
- )
- .filter(isTypeOfInterest)
+ return clazz
+ .method(signature)
+ .streamInstructions()
+ .filter(instruction -> instruction.isNewInstance() || instruction.isStaticGet())
+ .map(
+ instruction -> {
+ if (instruction.isCfInstruction()) {
+ CfInstruction baseInstruction = instruction.asCfInstruction().getInstruction();
+ if (baseInstruction instanceof CfNew) {
+ return ((CfNew) baseInstruction).getType();
+ } else if (instruction.getField().getType().isReferenceType()) {
+ return instruction.getField().getHolderType();
+ }
+ } else {
+ Instruction baseInstruction = instruction.asDexInstruction().getInstruction();
+ if (baseInstruction instanceof SgetObject) {
+ return baseInstruction.getField().getHolderType();
+ } else if (baseInstruction instanceof NewInstance) {
+ return ((NewInstance) baseInstruction).getType();
+ }
+ }
+ return null;
+ })
+ .filter(type -> type != null && isTypeOfInterest.test(type))
.map(DexType::toSourceString)
.collect(Collectors.toSet());
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
index 6ec949a..c407a5b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
@@ -3,13 +3,13 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assume.assumeTrue;
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
import com.android.tools.r8.KotlinTestBase;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
@@ -53,8 +53,6 @@
@Test
public void b139432507() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
testForR8(parameters.getBackend())
.addProgramFiles(
compiledJars.getForConfiguration(kotlinc, targetVersion),
@@ -78,7 +76,9 @@
MethodSubject isSupported = main.uniqueMethodWithName("isSupported");
assertThat(isSupported, isPresent());
assertEquals(
- allowAccessModification ? 0 : 1,
+ !kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72) || allowAccessModification
+ ? 0
+ : 1,
countCall(isSupported, "checkParameterIsNotNull"));
// In general cases, null check won't be invoked only once or twice, hence no subtle
@@ -91,21 +91,22 @@
@Test
public void b139432507_isSupported() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
assumeTrue("Different inlining behavior on CF backend", parameters.isDexRuntime());
- testSingle("isSupported");
+ testSingle(
+ "isSupported",
+ kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72) && !allowAccessModification);
}
@Test
public void b139432507_containsArray() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
assumeTrue("Different inlining behavior on CF backend", parameters.isDexRuntime());
- testSingle("containsArray");
+ // One for each of the method's own arguments, unless building with
+ // -allowaccessmodification.
+ testSingle("containsArray", allowAccessModification);
}
- private void testSingle(String methodName) throws Exception {
+ private void testSingle(String methodName, boolean checkParameterIsNotNullCountIsArity)
+ throws Exception {
testForR8(parameters.getBackend())
.addProgramFiles(
compiledJars.getForConfiguration(kotlinc, targetVersion),
@@ -129,10 +130,8 @@
MethodSubject method = main.uniqueMethodWithName(methodName);
assertThat(method, isPresent());
int arity = method.getMethod().getReference().getArity();
- // One for each of the method's own arguments, unless building with
- // -allowaccessmodification.
assertEquals(
- allowAccessModification ? 0 : arity,
+ checkParameterIsNotNullCountIsArity ? arity : 0,
countCall(method, "checkParameterIsNotNull"));
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
index 9d66188..692f73b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
@@ -3,13 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
@@ -49,8 +47,6 @@
@Test
public void b110196118() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72));
final String mainClassName = "unused_singleton.MainKt";
final String moduleName = "unused_singleton.TestModule";
runTest("unused_singleton", mainClassName)
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 2cb21d4..1da9c86 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -4,11 +4,8 @@
package com.android.tools.r8.kotlin;
-import static org.junit.Assume.assumeTrue;
-
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.BooleanUtils;
@@ -62,8 +59,6 @@
@Test
public void test_dataclass_gettersOnly() throws Exception {
- // TODO(b/179866251): Allow for CF code.
- assumeTrue(testParameters.isDexRuntime());
String mainClassName = "dataclass.MainGettersOnlyKt";
MethodSignature testMethodSignature =
new MethodSignature("testDataClassGetters", "void", Collections.emptyList());
@@ -99,20 +94,17 @@
ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
- DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
// Both getters should be inlined
- checkMethodIsNeverInvoked(dexCode, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
+ checkMethodIsNeverInvoked(testMethod, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
} else {
- checkMethodIsInvokedAtLeastOnce(dexCode, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
+ checkMethodIsInvokedAtLeastOnce(testMethod, NAME_GETTER_METHOD, AGE_GETTER_METHOD);
}
});
}
@Test
public void test_dataclass_componentOnly() throws Exception {
- // TODO(b/179866251): Allow for CF code.
- assumeTrue(testParameters.isDexRuntime());
String mainClassName = "dataclass.MainComponentOnlyKt";
MethodSignature testMethodSignature =
new MethodSignature("testAllDataClassComponentFunctions", "void", Collections.emptyList());
@@ -150,19 +142,16 @@
ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
- DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
- checkMethodIsNeverInvoked(dexCode, COMPONENT1_METHOD, COMPONENT2_METHOD);
+ checkMethodIsNeverInvoked(testMethod, COMPONENT1_METHOD, COMPONENT2_METHOD);
} else {
- checkMethodIsInvokedAtLeastOnce(dexCode, COMPONENT1_METHOD, COMPONENT2_METHOD);
+ checkMethodIsInvokedAtLeastOnce(testMethod, COMPONENT1_METHOD, COMPONENT2_METHOD);
}
});
}
@Test
public void test_dataclass_componentPartial() throws Exception {
- // TODO(b/179866251): Allow for CF code.
- assumeTrue(testParameters.isDexRuntime());
String mainClassName = "dataclass.MainComponentPartialKt";
MethodSignature testMethodSignature =
new MethodSignature("testSomeDataClassComponentFunctions", "void", Collections.emptyList());
@@ -198,11 +187,10 @@
ClassSubject classSubject = checkClassIsKept(inspector, mainClassName);
MethodSubject testMethod = checkMethodIsKept(classSubject, testMethodSignature);
- DexCode dexCode = getDexCode(testMethod);
if (allowAccessModification) {
- checkMethodIsNeverInvoked(dexCode, COMPONENT2_METHOD);
+ checkMethodIsNeverInvoked(testMethod, COMPONENT2_METHOD);
} else {
- checkMethodIsInvokedAtLeastOnce(dexCode, COMPONENT2_METHOD);
+ checkMethodIsInvokedAtLeastOnce(testMethod, COMPONENT2_METHOD);
}
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index 4457386..142e48d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -4,9 +4,7 @@
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
-import static org.junit.Assume.assumeTrue;
-
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -44,12 +42,9 @@
@Test
public void testParameterNullCheckIsInlined() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72));
final String extraRules = keepClassMethod("intrinsics.IntrinsicsKt",
new MethodSignature("expectsNonNullParameters",
"java.lang.String", Lists.newArrayList("java.lang.String", "java.lang.String")));
-
runTest(
"intrinsics",
"intrinsics.IntrinsicsKt",
@@ -67,13 +62,15 @@
"throwParameterIsNullException",
"void",
Collections.singletonList("java.lang.String")),
- true)
+ // throwParameterIsNullException is not added for test starting from 1.4
+ kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72))
.put(
new MethodSignature(
"checkParameterIsNotNull",
"void",
Lists.newArrayList("java.lang.Object", "java.lang.String")),
- !allowAccessModification)
+ kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72)
+ && !allowAccessModification)
.build());
});
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 091a8b4..6f0ac32 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -3,9 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.kotlin;
-import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_3_72;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.KotlinTestParameters;
import com.android.tools.r8.TestParameters;
@@ -69,20 +67,20 @@
// Find forMakeAndModel(...) after parameter removal.
MethodSubject testMethod = clazz.uniqueMethodWithName(testMethodSignature.name);
long ifzCount =
- testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+ testMethod
+ .streamInstructions()
+ .filter(i -> i.isIfEqz() || i.isIfNez() || i.isIfNonNull())
+ .count();
long paramNullCheckCount =
countCall(testMethod, "Intrinsics", "checkParameterIsNotNull");
// One after Iterator#hasNext, and another in the filter predicate: sinceYear != null.
- // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
- assertEquals(testParameters.isCfRuntime() ? 1 : 2, ifzCount);
+ assertEquals(2, ifzCount);
assertEquals(0, paramNullCheckCount);
});
}
@Test
public void test_example2() throws Exception {
- // TODO(b/179866251): Update tests.
- assumeTrue(kotlinc.is(KOTLINC_1_3_72) || allowAccessModification);
final TestKotlinClass ex2 = new TestKotlinClass("non_null.Example2Kt");
final MethodSignature testMethodSignature =
new MethodSignature("aOrDefault", STRING, ImmutableList.of(STRING, STRING));
@@ -93,15 +91,13 @@
.inspect(
inspector -> {
ClassSubject clazz = checkClassIsKept(inspector, ex2.getClassName());
-
MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
long ifzCount =
- testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+ testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNull()).count();
long paramNullCheckCount =
countCall(testMethod, "Intrinsics", "checkParameterIsNotNull");
// ?: in aOrDefault
- // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
- assertEquals(testParameters.isCfRuntime() ? 0 : 1, ifzCount);
+ assertEquals(1, ifzCount);
assertEquals(0, paramNullCheckCount);
});
}
@@ -118,14 +114,12 @@
.inspect(
inspector -> {
ClassSubject clazz = checkClassIsKept(inspector, ex3.getClassName());
-
MethodSubject testMethod = checkMethodIsKept(clazz, testMethodSignature);
long ifzCount =
- testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNez()).count();
+ testMethod.streamInstructions().filter(i -> i.isIfEqz() || i.isIfNull()).count();
// !! operator inside explicit null check should be gone.
// One explicit null-check as well as 4 bar? accesses.
- // TODO(b/179951729): Not the same amount of ifz on CF and DEX.
- assertEquals(testParameters.isCfRuntime() ? 0 : 5, ifzCount);
+ assertEquals(5, ifzCount);
});
}
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
index 64b3914..4465113 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfInstructionSubject.java
@@ -312,10 +312,16 @@
&& ((CfStackInstruction) instruction).getOpcode() == opcode;
}
+ @Override
public boolean isIfNull() {
return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNULL;
}
+ @Override
+ public boolean isIfNonNull() {
+ return instruction instanceof CfIf && ((CfIf) instruction).getOpcode() == Opcodes.IFNONNULL;
+ }
+
public boolean isLoad() {
return instruction instanceof CfLoad;
}
@@ -407,4 +413,8 @@
public String toString() {
return instruction.toString();
}
+
+ public CfInstruction getInstruction() {
+ return instruction;
+ }
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
index 2bfadc8..91f0ea9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -336,6 +336,18 @@
}
@Override
+ public boolean isIfNull() {
+ // Not in DEX.
+ return false;
+ }
+
+ @Override
+ public boolean isIfNonNull() {
+ // Not in DEX.
+ return false;
+ }
+
+ @Override
public boolean isReturn() {
return instruction instanceof Return;
}
@@ -496,4 +508,8 @@
public String toString() {
return instruction.toString();
}
+
+ public Instruction getInstruction() {
+ return instruction;
+ }
}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
index cf9ce0a..9f55b56 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -98,6 +98,10 @@
boolean isIfEqz();
+ boolean isIfNull();
+
+ boolean isIfNonNull();
+
boolean isReturn();
boolean isReturnVoid();