Version 1.3.24 Merge: Ensure pretended members indeed do not exist while applying mappings. CL: https://r8-review.googlesource.com/c/r8/+/28260 Merge: Fix expected error message and signature for older VMs. CL: https://r8-review.googlesource.com/c/r8/+/28520 Merge: Repackage -applymapping tests. CL: https://r8-review.googlesource.com/c/r8/+/28242 Merge: Reland "Enable CF backend for JCTF tests." CL: https://r8-review.googlesource.com/c/r8/+/27562 branch d8-1.3 has been broken (in terms of JCTF tests) Bug: 117237053 Change-Id: I1254ac3250e69befbdeffa36c0fb83a59a656b2e
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java index d265881..1c1e02a 100644 --- a/src/main/java/com/android/tools/r8/Version.java +++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@ // This field is accessed from release scripts using simple pattern matching. // Therefore, changing this field could break our release scripts. - public static final String LABEL = "1.3.23"; + public static final String LABEL = "1.3.24"; private Version() { }
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java index 5dcc7b8..ba7963b 100644 --- a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java +++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
@@ -151,8 +151,8 @@ MemberNaming lookupByOriginalItem(DexField field) { for (Map.Entry<FieldSignature, MemberNaming> entry : fieldMembers.entrySet()) { FieldSignature signature = entry.getKey(); - if (signature.name.equals(field.name.toString()) - && signature.type.equals(field.type.getName())) { + if (signature.name.equals(field.name.toSourceString()) + && signature.type.equals(field.type.toSourceString())) { return entry.getValue(); } } @@ -162,11 +162,11 @@ protected MemberNaming lookupByOriginalItem(DexMethod method) { for (Map.Entry<MethodSignature, MemberNaming> entry : methodMembers.entrySet()) { MethodSignature signature = entry.getKey(); - if (signature.name.equals(method.name.toString()) - && signature.type.equals(method.proto.returnType.toString()) + if (signature.name.equals(method.name.toSourceString()) + && signature.type.equals(method.proto.returnType.toSourceString()) && Arrays.equals(signature.parameters, Arrays.stream(method.proto.parameters.values) - .map(DexType::toString).toArray(String[]::new))) { + .map(DexType::toSourceString).toArray(String[]::new))) { return entry.getValue(); } }
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java index f114a7e..3fb07fe 100644 --- a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java +++ b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
@@ -22,8 +22,8 @@ import com.android.tools.r8.utils.ArrayUtils; import com.android.tools.r8.utils.ThrowingConsumer; import com.android.tools.r8.utils.Timing; -import com.google.common.collect.Sets; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Map; import java.util.Set; @@ -128,42 +128,80 @@ private void applyMemberMapping(DexType from, ChainedClassNaming classNaming) { DexClass clazz = appInfo.definitionFor(from); - if (clazz == null) return; + if (clazz == null) { + return; + } - final Set<MemberNaming> appliedMemberNaming = Sets.newIdentityHashSet(); + // We regard mappings as _complete_ if they cover literally everything, but that's too ideal. + // When visiting members with member mappings, obviously, there are two incomplete cases: + // no matched member or no matched mapping. + // + // 1. No matched member + // class A { // : X + // void foo(); // : a + // } + // + // class B extends A { // : Y + // @Override void foo(); // no mapping + // } + // + // For this case, we have chained class naming and move upward to search for super class's + // member mapping. One corner case we should be careful here is to resolve on the correct + // mapping, e.g., + // + // class B extends A { // : Y + // private void foo(); // no mapping, should be not renamed to a + // } + + final Set<MemberNaming.Signature> appliedMemberSignature = new HashSet<>(); clazz.forEachField(encodedField -> { MemberNaming memberNaming = classNaming.lookupByOriginalItem(encodedField.field); if (memberNaming != null) { - appliedMemberNaming.add(memberNaming); + appliedMemberSignature.add(memberNaming.getOriginalSignature()); applyFieldMapping(encodedField.field, memberNaming); } }); clazz.forEachMethod(encodedMethod -> { - MemberNaming memberNaming = classNaming.lookupByOriginalItem(encodedMethod.method); + MemberNaming memberNaming = + classNaming.lookupByOriginalItem(encodedMethod.method, encodedMethod.isPrivateMethod()); if (memberNaming != null) { - appliedMemberNaming.add(memberNaming); + appliedMemberSignature.add(memberNaming.getOriginalSignature()); applyMethodMapping(encodedMethod.method, memberNaming); } }); + // 2. No matched mapping + // class A { // : X + // void foo(); // : a + // } + // + // class B extends A { // : Y + // // no overriding, but has mapping: void foo() -> a + // } + // // We need to handle a class that extends another class where some members are not overridden, // resulting in absence of definitions. References to those members need to be redirected via // the lense as well. + // The caveat is, since such members don't exist, we pretend to see their definitions. + // We should ensure that they indeed don't exist. Otherwise, legitimately different members, + // e.g., private methods with same names, could be mapped to a wrong renamed name. classNaming.forAllFieldNaming(memberNaming -> { - if (!appliedMemberNaming.contains(memberNaming)) { - DexField pretendedOriginalField = - ((FieldSignature) memberNaming.getOriginalSignature()) - .toDexField(appInfo.dexItemFactory, from); - applyFieldMapping(pretendedOriginalField, memberNaming); + FieldSignature signature = (FieldSignature) memberNaming.getOriginalSignature(); + if (!appliedMemberSignature.contains(signature)) { + DexField pretendedOriginalField = signature.toDexField(appInfo.dexItemFactory, from); + if (appInfo.definitionFor(pretendedOriginalField) == null) { + applyFieldMapping(pretendedOriginalField, memberNaming); + } } }); classNaming.forAllMethodNaming(memberNaming -> { - if (!appliedMemberNaming.contains(memberNaming)) { - DexMethod pretendedOriginalMethod = - ((MethodSignature) memberNaming.getOriginalSignature()) - .toDexMethod(appInfo.dexItemFactory, from); - applyMethodMapping(pretendedOriginalMethod, memberNaming); + MethodSignature signature = (MethodSignature) memberNaming.getOriginalSignature(); + if (!appliedMemberSignature.contains(signature)) { + DexMethod pretendedOriginalMethod = signature.toDexMethod(appInfo.dexItemFactory, from); + if (appInfo.definitionFor(pretendedOriginalMethod) == null) { + applyMethodMapping(pretendedOriginalMethod, memberNaming); + } } }); } @@ -229,6 +267,15 @@ } } + protected MemberNaming lookupByOriginalItem(DexMethod method, boolean isPrivate) { + // If the current method is overridable, use chained mappings. + if (!isPrivate) { + return lookupByOriginalItem(method); + } + // Otherwise, just look up the current class's mappings only. + return super.lookupByOriginalItem(method); + } + @Override protected MemberNaming lookupByOriginalItem(DexMethod method) { MemberNaming memberNaming = super.lookupByOriginalItem(method);
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapError.java b/src/main/java/com/android/tools/r8/naming/ProguardMapError.java index ce659e1..684c79b 100644 --- a/src/main/java/com/android/tools/r8/naming/ProguardMapError.java +++ b/src/main/java/com/android/tools/r8/naming/ProguardMapError.java
@@ -19,20 +19,20 @@ static ProguardMapError keptTypeWasRenamed(DexType type, String keptName, String rename) { return new ProguardMapError( - "Warning: " + type + createMessageForConflict(keptName, rename)); + type + createMessageForConflict(keptName, rename)); } static ProguardMapError keptMethodWasRenamed(DexMethod method, String keptName, String rename) { return new ProguardMapError( - "Warning: " + method.toSourceString() + createMessageForConflict(keptName, rename)); + method.toSourceString() + createMessageForConflict(keptName, rename)); } static ProguardMapError keptFieldWasRenamed(DexField field, String keptName, String rename) { return new ProguardMapError( - "Warning: " + field.toSourceString() + createMessageForConflict(keptName, rename)); + field.toSourceString() + createMessageForConflict(keptName, rename)); } private static String createMessageForConflict(String keptName, String rename) { - return " is not being kept as '" + keptName + "', but remapped to '" + rename + "'"; + return " is not being kept as " + keptName + ", but remapped to " + rename; } }
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java index f734ab8..7e3be90 100644 --- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java +++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -7,98 +7,104 @@ import static com.android.tools.r8.TestCondition.R8_COMPILER; import static com.android.tools.r8.TestCondition.and; import static com.android.tools.r8.TestCondition.any; +import static com.android.tools.r8.TestCondition.anyDexVm; +import static com.android.tools.r8.TestCondition.artRuntimesFromAndJava; +import static com.android.tools.r8.TestCondition.artRuntimesUpToAndJava; import static com.android.tools.r8.TestCondition.match; import static com.android.tools.r8.TestCondition.runtimes; -import static com.android.tools.r8.TestCondition.runtimesFrom; -import static com.android.tools.r8.TestCondition.runtimesUpTo; import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest; import com.android.tools.r8.R8RunArtTestsTest.DexTool; -import com.android.tools.r8.ToolHelper.DexVm; -import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.TestCondition.Runtime; import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import java.util.Collection; +import java.util.Set; import java.util.function.BiFunction; public class JctfTestSpecifications { public enum Outcome { PASSES, - FAILS_WITH_ART, - TIMEOUTS_WITH_ART, - FLAKY_WITH_ART + FAILS_WHEN_RUN, + TIMEOUTS_WHEN_RUN, + FLAKY_WHEN_RUN } public static final Multimap<String, TestCondition> failuresToTriage = new ImmutableListMultimap.Builder<String, TestCondition>() - .put("math.BigInteger.nextProbablePrime.BigInteger_nextProbablePrime_A02", any()) + .put("math.BigInteger.nextProbablePrime.BigInteger_nextProbablePrime_A02", anyDexVm()) .put("math.BigInteger.ConstructorLjava_lang_String.BigInteger_Constructor_A02", any()) .put( "lang.StringBuffer.insertILjava_lang_Object.StringBuffer_insert_A01", - match(runtimes(Version.DEFAULT))) - .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", any()) + match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA))) + .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", anyDexVm()) .put( "lang.CloneNotSupportedException.serialization.CloneNotSupportedException_serialization_A01", - any()) + anyDexVm()) .put( "lang.NumberFormatException.serialization.NumberFormatException_serialization_A01", - any()) + anyDexVm()) .put( "lang.StrictMath.roundF.StrictMath_round_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.JAVA))) .put( "lang.StrictMath.roundD.StrictMath_round_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.JAVA))) .put("lang.StrictMath.atan2DD.StrictMath_atan2_A01", any()) .put("lang.Thread.stop.Thread_stop_A05", any()) - .put("lang.Thread.resume.Thread_resume_A02", any()) - .put("lang.Thread.suspend.Thread_suspend_A02", any()) + .put("lang.Thread.resume.Thread_resume_A02", anyDexVm()) + .put("lang.Thread.suspend.Thread_suspend_A02", anyDexVm()) .put("lang.Thread.stop.Thread_stop_A03", any()) .put("lang.Thread.interrupt.Thread_interrupt_A03", any()) .put("lang.Thread.stop.Thread_stop_A04", any()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0, Runtime.ART_V6_0_1))) .put( "lang.Thread.getUncaughtExceptionHandler.Thread_getUncaughtExceptionHandler_A01", - any()) - .put("lang.Thread.getStackTrace.Thread_getStackTrace_A02", any()) - .put("lang.Thread.enumerate_Ljava_lang_Thread.Thread_enumerate_A02", any()) + anyDexVm()) + .put("lang.Thread.getStackTrace.Thread_getStackTrace_A02", anyDexVm()) + .put("lang.Thread.enumerate_Ljava_lang_Thread.Thread_enumerate_A02", anyDexVm()) .put("lang.Thread.countStackFrames.Thread_countStackFrames_A01", any()) .put( "lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A01", - match(runtimes(Version.V7_0_0))) - .put("lang.Thread.destroy.Thread_destroy_A01", match(runtimesFrom(Version.V4_4_4))) - .put("lang.Thread.isAlive.Thread_isAlive_A01", any()) + match(runtimes(Runtime.ART_V7_0_0))) + .put( + "lang.Thread.destroy.Thread_destroy_A01", + match(TestCondition.artRuntimesFrom(Runtime.ART_V4_4_4))) + .put("lang.Thread.isAlive.Thread_isAlive_A01", anyDexVm()) .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A04", any()) .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A03", any()) .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A05", any()) - .put("lang.Thread.getPriority.Thread_getPriority_A01", any()) + .put("lang.Thread.getPriority.Thread_getPriority_A01", anyDexVm()) .put( "lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A03", - match(runtimes(Version.V7_0_0))) - .put("lang.OutOfMemoryError.serialization.OutOfMemoryError_serialization_A01", any()) + match(runtimes(Runtime.ART_V7_0_0))) + .put("lang.OutOfMemoryError.serialization.OutOfMemoryError_serialization_A01", anyDexVm()) .put( "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A01", - any()) - .put("lang.RuntimePermission.serialization.RuntimePermission_serialization_A01", any()) + anyDexVm()) + .put( + "lang.RuntimePermission.serialization.RuntimePermission_serialization_A01", + anyDexVm()) .put( "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A02", - any()) + anyDexVm()) .put( "lang.RuntimePermission.ConstructorLjava_lang_StringLjava_lang_String.RuntimePermission_Constructor_A03", - any()) + anyDexVm()) .put("lang.RuntimePermission.Class.RuntimePermission_class_A17", any()) .put( "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A02", - any()) + anyDexVm()) .put( "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A03", - any()) + anyDexVm()) .put( "lang.RuntimePermission.ConstructorLjava_lang_String.RuntimePermission_Constructor_A01", - any()) + anyDexVm()) .put("lang.RuntimePermission.Class.RuntimePermission_class_A26", any()) .put("lang.RuntimePermission.Class.RuntimePermission_class_A04", any()) .put("lang.RuntimePermission.Class.RuntimePermission_class_A03", any()) @@ -123,474 +129,615 @@ .put("lang.RuntimePermission.Class.RuntimePermission_class_A01", any()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A06", - any()) + anyDexVm()) .put("lang.RuntimePermission.Class.RuntimePermission_class_A14", any()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A05", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A02", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A04", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A03", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BII.ClassLoader_defineClass_A07", - any()) + anyDexVm()) .put( "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A02", - any()) + anyDexVm()) .put( "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.setPackageAssertionStatusLjava_lang_StringZ.ClassLoader_setPackageAssertionStatus_A03", - any()) - .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A03", any()) - .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A01", any()) - .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A04", any()) + anyDexVm()) + .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A03", anyDexVm()) + .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A01", anyDexVm()) + .put("lang.ClassLoader.loadClassLjava_lang_StringZ.ClassLoader_loadClass_A04", anyDexVm()) .put( "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A02", - any()) + anyDexVm()) .put( "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.definePackageLjava_lang_String6Ljava_net_URL.ClassLoader_definePackage_A03", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A05", - any()) - .put("lang.ClassLoader.getResourceLjava_lang_String.ClassLoader_getResource_A01", any()) + anyDexVm()) + .put( + "lang.ClassLoader.getResourceLjava_lang_String.ClassLoader_getResource_A01", + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A02", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A06", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A03", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A07", - match(runtimes(Version.DEFAULT, Version.V7_0_0))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V7_0_0))) .put( "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A04", - any()) + anyDexVm()) .put( "lang.ClassLoader.setSignersLjava_lang_Class_Ljava_lang_Object.ClassLoader_setSigners_A01", - any()) - .put("lang.ClassLoader.clearAssertionStatus.ClassLoader_clearAssertionStatus_A01", any()) - .put("lang.ClassLoader.Constructor.ClassLoader_Constructor_A02", any()) + anyDexVm()) + .put( + "lang.ClassLoader.clearAssertionStatus.ClassLoader_clearAssertionStatus_A01", + anyDexVm()) + .put("lang.ClassLoader.Constructor.ClassLoader_Constructor_A02", anyDexVm()) .put( "lang.ClassLoader.getSystemResourceLjava_lang_String.ClassLoader_getSystemResource_A01", - any()) - .put("lang.ClassLoader.getResourcesLjava_lang_String.ClassLoader_getResources_A01", any()) - .put("lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A02", any()) + anyDexVm()) + .put( + "lang.ClassLoader.getResourcesLjava_lang_String.ClassLoader_getResources_A01", + anyDexVm()) + .put( + "lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A02", + anyDexVm()) .put( "lang.ClassLoader.getResourceAsStreamLjava_lang_String.ClassLoader_getResourceAsStream_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.findLoadedClassLjava_lang_String.ClassLoader_findLoadedClass_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A02", - any()) - .put("lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A01", any()) + anyDexVm()) + .put( + "lang.ClassLoader.resolveClassLjava_lang_Class.ClassLoader_resolveClass_A01", + anyDexVm()) .put( "lang.ClassLoader.setDefaultAssertionStatusZ.ClassLoader_setDefaultAssertionStatus_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A05", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A06", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A08", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A03", - any()) + anyDexVm()) .put( "lang.ClassLoader.getSystemResourcesLjava_lang_String.ClassLoader_getSystemResources_A01", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A07", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A09", - any()) + anyDexVm()) .put( "lang.ClassLoader.defineClassLjava_lang_String_BIILjava_security_ProtectionDomain.ClassLoader_defineClass_A04", - any()) - .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A02", any()) + anyDexVm()) + .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A02", anyDexVm()) .put( "lang.ClassLoader.getSystemResourceAsStreamLjava_lang_String.ClassLoader_getSystemResourceAsStream_A01", - any()) - .put("lang.ClassLoader.getPackages.ClassLoader_getPackages_A01", any()) + anyDexVm()) + .put("lang.ClassLoader.getPackages.ClassLoader_getPackages_A01", anyDexVm()) .put( "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A01", any()) - .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A03", any()) - .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A01", any()) - .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A04", any()) - .put("lang.ClassLoader.getParent.ClassLoader_getParent_A01", any()) + .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A03", anyDexVm()) + .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A01", anyDexVm()) + .put("lang.ClassLoader.defineClass_BII.ClassLoader_defineClass_A04", anyDexVm()) + .put("lang.ClassLoader.getParent.ClassLoader_getParent_A01", anyDexVm()) .put( "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A04", any()) .put( "lang.ClassLoader.setClassAssertionStatusLjava_lang_StringZ.ClassLoader_setClassAssertionStatus_A02", - any()) - .put("lang.ClassLoader.getParent.ClassLoader_getParent_A02", any()) - .put("lang.ClassLoader.getSystemClassLoader.ClassLoader_getSystemClassLoader_A02", any()) + anyDexVm()) + .put("lang.ClassLoader.getParent.ClassLoader_getParent_A02", anyDexVm()) + .put( + "lang.ClassLoader.getSystemClassLoader.ClassLoader_getSystemClassLoader_A02", + anyDexVm()) .put( "lang.ClassLoader.ConstructorLjava_lang_ClassLoader.ClassLoader_Constructor_A02", - any()) + anyDexVm()) .put( "lang.ClassLoader.findSystemClassLjava_lang_String.ClassLoader_findSystemClass_A04", - any()) - .put("lang.ClassLoader.getPackageLjava_lang_String.ClassLoader_getPackage_A01", any()) + anyDexVm()) + .put( + "lang.ClassLoader.getPackageLjava_lang_String.ClassLoader_getPackage_A01", anyDexVm()) .put( "lang.NoClassDefFoundError.serialization.NoClassDefFoundError_serialization_A01", - any()) + anyDexVm()) .put( "lang.TypeNotPresentException.serialization.TypeNotPresentException_serialization_A01", - any()) + anyDexVm()) .put( "lang.IndexOutOfBoundsException.serialization.IndexOutOfBoundsException_serialization_A01", - any()) - .put("lang.Enum.serialization.Enum_serialization_A01", any()) - .put("lang.Enum.ConstructorLjava_lang_StringI.Enum_Constructor_A01", any()) - .put("lang.InternalError.serialization.InternalError_serialization_A01", any()) - .put("lang.Error.serialization.Error_serialization_A01", any()) + anyDexVm()) + .put("lang.Enum.serialization.Enum_serialization_A01", anyDexVm()) + .put("lang.Enum.ConstructorLjava_lang_StringI.Enum_Constructor_A01", anyDexVm()) + .put("lang.InternalError.serialization.InternalError_serialization_A01", anyDexVm()) + .put("lang.Error.serialization.Error_serialization_A01", anyDexVm()) .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A02", any()) .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A05", any()) .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A03", any()) .put("lang.Runtime.loadLjava_lang_String.Runtime_load_A04", any()) - .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A02", any()) - .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A03", any()) - .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A01", any()) + .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A02", anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A03", anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A01", anyDexVm()) .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A04", any()) .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A05", any()) .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A03", any()) - .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A02", any()) - .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A03", any()) + .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A02", anyDexVm()) + .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A03", anyDexVm()) .put("lang.Runtime.loadLibraryLjava_lang_String.Runtime_loadLibrary_A02", any()) - .put("lang.Runtime.traceMethodCallsZ.Runtime_traceMethodCalls_A01", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A01", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A08", any()) - .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A01", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A03", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A07", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A05", any()) - .put("lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A06", any()) - .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A03", any()) - .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A02", any()) - .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A01", any()) + .put("lang.Runtime.traceMethodCallsZ.Runtime_traceMethodCalls_A01", anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A01", + anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A08", + anyDexVm()) + .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A01", anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A03", + anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A07", + anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A05", + anyDexVm()) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A06", + anyDexVm()) + .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A03", anyDexVm()) + .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A02", anyDexVm()) + .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A01", anyDexVm()) .put( "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A02", - any()) - .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A01", any()) + anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A01", anyDexVm()) .put( "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A01", - any()) - .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A02", any()) + anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A02", anyDexVm()) .put( "lang.Runtime.removeShutdownHookLjava_lang_Thread.Runtime_removeShutdownHook_A03", - any()) + anyDexVm()) .put( "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A01", - any()) - .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A03", any()) + anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A03", anyDexVm()) .put( "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A02", - any()) + anyDexVm()) .put("lang.Runtime.haltI.Runtime_halt_A02", any()) .put( "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A03", - any()) + anyDexVm()) .put("lang.Runtime.haltI.Runtime_halt_A03", any()) - .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A01", any()) + .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A01", anyDexVm()) .put("lang.Runtime.haltI.Runtime_halt_A01", any()) - .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A03", any()) + .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A03", anyDexVm()) .put( "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A03", - any()) + anyDexVm()) .put( "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A01", - any()) - .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A02", any()) + anyDexVm()) + .put("lang.Runtime.runFinalizersOnExitZ.Runtime_runFinalizersOnExit_A02", anyDexVm()) .put("lang.Runtime.exitI.Runtime_exit_A03", any()) .put( "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A02", - any()) + anyDexVm()) .put("lang.Runtime.exitI.Runtime_exit_A04", any()) .put( "lang.NoSuchMethodException.serialization.NoSuchMethodException_serialization_A01", - any()) + anyDexVm()) .put("lang.Runtime.exitI.Runtime_exit_A01", any()) .put("lang.Runtime.exitI.Runtime_exit_A02", any()) .put( "lang.InstantiationException.serialization.InstantiationException_serialization_A01", - any()) - .put("lang.Exception.serialization.Exception_serialization_A01", any()) - .put("lang.StackOverflowError.serialization.StackOverflowError_serialization_A01", any()) + anyDexVm()) + .put("lang.Exception.serialization.Exception_serialization_A01", anyDexVm()) + .put( + "lang.StackOverflowError.serialization.StackOverflowError_serialization_A01", + anyDexVm()) .put( "lang.NoSuchFieldException.serialization.NoSuchFieldException_serialization_A01", - any()) + anyDexVm()) .put( "lang.NegativeArraySizeException.serialization.NegativeArraySizeException_serialization_A01", - any()) + anyDexVm()) .put( "lang.ArrayIndexOutOfBoundsException.serialization.ArrayIndexOutOfBoundsException_serialization_A01", - any()) - .put("lang.VerifyError.serialization.VerifyError_serialization_A01", any()) + anyDexVm()) + .put("lang.VerifyError.serialization.VerifyError_serialization_A01", anyDexVm()) .put( "lang.IllegalArgumentException.serialization.IllegalArgumentException_serialization_A01", - any()) + anyDexVm()) .put( "lang.IllegalStateException.serialization.IllegalStateException_serialization_A01", - any()) - .put("lang.Double.serialization.Double_serialization_A01", any()) + anyDexVm()) + .put("lang.Double.serialization.Double_serialization_A01", anyDexVm()) .put("lang.Double.toStringD.Double_toString_A05", any()) .put( - "lang.ArithmeticException.serialization.ArithmeticException_serialization_A01", any()) + "lang.ArithmeticException.serialization.ArithmeticException_serialization_A01", + anyDexVm()) .put( "lang.ExceptionInInitializerError.serialization.ExceptionInInitializerError_serialization_A01", - any()) - .put("lang.ThreadLocal.Class.ThreadLocal_class_A01", any()) - .put("lang.Byte.serialization.Byte_serialization_A01", any()) + anyDexVm()) + .put("lang.ThreadLocal.Class.ThreadLocal_class_A01", anyDexVm()) + .put("lang.Byte.serialization.Byte_serialization_A01", anyDexVm()) .put( "lang.Byte.parseByteLjava_lang_StringI.Byte_parseByte_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Byte.valueOfLjava_lang_StringI.Byte_valueOf_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Byte.valueOfLjava_lang_String.Byte_ValueOf_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Byte.decodeLjava_lang_String.Byte_decode_A04", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) - .put("lang.LinkageError.serialization.LinkageError_serialization_A01", any()) - .put("lang.ClassCastException.serialization.ClassCastException_serialization_A01", any()) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) + .put("lang.LinkageError.serialization.LinkageError_serialization_A01", anyDexVm()) + .put( + "lang.ClassCastException.serialization.ClassCastException_serialization_A01", + anyDexVm()) .put( "lang.Byte.ConstructorLjava_lang_String.Byte_Constructor_A02", match( runtimes( - DexVm.Version.DEFAULT, - DexVm.Version.V7_0_0, - DexVm.Version.V6_0_1, - DexVm.Version.V5_1_1))) + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Byte.parseByteLjava_lang_String.Byte_parseByte_A02", match( runtimes( - DexVm.Version.DEFAULT, - DexVm.Version.V7_0_0, - DexVm.Version.V6_0_1, - DexVm.Version.V5_1_1))) - .put("lang.NoSuchFieldError.serialization.NoSuchFieldError_serialization_A01", any()) + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) + .put("lang.NoSuchFieldError.serialization.NoSuchFieldError_serialization_A01", anyDexVm()) .put( "lang.UnsupportedOperationException.serialization.UnsupportedOperationException_serialization_A01", - any()) - .put("lang.NoSuchMethodError.serialization.NoSuchMethodError_serialization_A01", any()) + anyDexVm()) + .put( + "lang.NoSuchMethodError.serialization.NoSuchMethodError_serialization_A01", + anyDexVm()) .put( "lang.IllegalMonitorStateException.serialization.IllegalMonitorStateException_serialization_A01", - any()) + anyDexVm()) .put( "lang.StringIndexOutOfBoundsException.serialization.StringIndexOutOfBoundsException_serialization_A01", - any()) - .put("lang.SecurityException.serialization.SecurityException_serialization_A01", any()) - .put("lang.IllegalAccessError.serialization.IllegalAccessError_serialization_A01", any()) + anyDexVm()) .put( - "lang.ArrayStoreException.serialization.ArrayStoreException_serialization_A01", any()) - .put("lang.UnknownError.serialization.UnknownError_serialization_A01", any()) - .put("lang.Boolean.serialization.Boolean_serialization_A01", any()) + "lang.SecurityException.serialization.SecurityException_serialization_A01", + anyDexVm()) + .put( + "lang.IllegalAccessError.serialization.IllegalAccessError_serialization_A01", + anyDexVm()) + .put( + "lang.ArrayStoreException.serialization.ArrayStoreException_serialization_A01", + anyDexVm()) + .put("lang.UnknownError.serialization.UnknownError_serialization_A01", anyDexVm()) + .put("lang.Boolean.serialization.Boolean_serialization_A01", anyDexVm()) .put( "lang.Integer.valueOfLjava_lang_StringI.Integer_valueOf_A02", match( runtimes( - DexVm.Version.DEFAULT, - DexVm.Version.V7_0_0, - Version.V6_0_1, - DexVm.Version.V5_1_1))) - .put("lang.Integer.serialization.Integer_serialization_A01", any()) + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) + .put("lang.Integer.serialization.Integer_serialization_A01", anyDexVm()) .put( "lang.Integer.parseIntLjava_lang_String.Integer_parseInt_A02", match( runtimes( - Version.DEFAULT, - DexVm.Version.V7_0_0, - DexVm.Version.V6_0_1, - DexVm.Version.V5_1_1))) + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.getIntegerLjava_lang_StringI.Integer_getInteger_A02", match( - runtimes(Version.DEFAULT, DexVm.Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.valueOfLjava_lang_String.Integer_valueOf_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.decodeLjava_lang_String.Integer_decode_A04", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.parseIntLjava_lang_StringI.Integer_parseInt_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.getIntegerLjava_lang_StringLjava_lang_Integer.Integer_getInteger_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.ConstructorLjava_lang_String.Integer_Constructor_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.Integer.getIntegerLjava_lang_String.Integer_getInteger_A02", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put( "lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) .put("lang.ref.SoftReference.get.SoftReference_get_A01", any()) .put( "lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V6_0_1, Version.V5_1_1))) - .put("lang.StackTraceElement.serialization.StackTraceElement_serialization_A01", any()) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V6_0_1, + Runtime.ART_V5_1_1, + Runtime.JAVA))) + .put( + "lang.StackTraceElement.serialization.StackTraceElement_serialization_A01", + anyDexVm()) .put("lang.ref.WeakReference.get.WeakReference_get_A01", any()) .put( "lang.StackTraceElement.toString.StackTraceElement_toString_A01", - match(runtimes(Version.DEFAULT))) + match(runtimes(Runtime.ART_DEFAULT))) .put( "lang.NullPointerException.serialization.NullPointerException_serialization_A01", - any()) + anyDexVm()) .put( - "lang.VirtualMachineError.serialization.VirtualMachineError_serialization_A01", any()) + "lang.VirtualMachineError.serialization.VirtualMachineError_serialization_A01", + anyDexVm()) .put( "lang.ClassCircularityError.serialization.ClassCircularityError_serialization_A01", - any()) - .put("lang.ThreadDeath.serialization.ThreadDeath_serialization_A01", any()) - .put("lang.InstantiationError.serialization.InstantiationError_serialization_A01", any()) + anyDexVm()) + .put("lang.ThreadDeath.serialization.ThreadDeath_serialization_A01", anyDexVm()) + .put( + "lang.InstantiationError.serialization.InstantiationError_serialization_A01", + anyDexVm()) .put( "lang.IllegalThreadStateException.serialization.IllegalThreadStateException_serialization_A01", - any()) - .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A05", any()) - .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A06", any()) - .put("lang.ProcessBuilder.start.ProcessBuilder_start_A05", any()) - .put("lang.ProcessBuilder.start.ProcessBuilder_start_A06", any()) - .put("lang.ClassFormatError.serialization.ClassFormatError_serialization_A01", any()) - .put("lang.Math.cbrtD.Math_cbrt_A01", match(runtimesFrom(Version.V6_0_1))) - .put("lang.Math.powDD.Math_pow_A08", any()) + anyDexVm()) + .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A05", anyDexVm()) + .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A06", anyDexVm()) + .put("lang.ProcessBuilder.start.ProcessBuilder_start_A05", anyDexVm()) + .put("lang.ProcessBuilder.start.ProcessBuilder_start_A06", anyDexVm()) + .put("lang.ClassFormatError.serialization.ClassFormatError_serialization_A01", anyDexVm()) + .put( + "lang.Math.cbrtD.Math_cbrt_A01", + match(TestCondition.artRuntimesFrom(Runtime.ART_V6_0_1))) + .put("lang.Math.powDD.Math_pow_A08", anyDexVm()) .put( "lang.IncompatibleClassChangeError.serialization.IncompatibleClassChangeError_serialization_A01", - any()) - .put("lang.Float.serialization.Float_serialization_A01", any()) + anyDexVm()) + .put("lang.Float.serialization.Float_serialization_A01", anyDexVm()) .put("lang.Float.toStringF.Float_toString_A02", any()) .put( "lang.Short.valueOfLjava_lang_StringI.Short_valueOf_A02", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put( "lang.Short.valueOfLjava_lang_String.Short_valueOf_A02", - match(runtimesFrom(Version.V5_1_1))) - .put("lang.Short.serialization.Short_serialization_A01", any()) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) + .put("lang.Short.serialization.Short_serialization_A01", anyDexVm()) .put( "lang.Short.parseShortLjava_lang_String.Short_parseShort_A02", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put( "lang.Short.decodeLjava_lang_String.Short_decode_A04", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put( "lang.Short.ConstructorLjava_lang_String.Short_Constructor_A02", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put( "lang.ClassNotFoundException.serialization.ClassNotFoundException_serialization_A01", - any()) + anyDexVm()) .put( "lang.annotation.AnnotationFormatError.serialization.AnnotationFormatError_serialization_A01", - any()) + anyDexVm()) .put( "lang.Short.parseShortLjava_lang_StringI.Short_parseShort_A02", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put( "lang.annotation.IncompleteAnnotationException.ConstructorLjava_lang_ClassLjava_lang_String.IncompleteAnnotationException_Constructor_A01", - match(runtimes(Version.DEFAULT))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA))) .put( "lang.InterruptedException.serialization.InterruptedException_serialization_A01", - any()) + anyDexVm()) .put( "lang.annotation.IncompleteAnnotationException.Class.IncompleteAnnotationException_class_A01", any()) - .put("lang.annotation.Annotation.Class.Annotation_class_A03", any()) - .put("lang.annotation.Annotation.serialization.Annotation_serialization_A01", any()) - .put("lang.annotation.Annotation.annotationType.Annotation_annotationType_A01", any()) + .put("lang.annotation.Annotation.Class.Annotation_class_A03", anyDexVm()) + .put("lang.annotation.Annotation.serialization.Annotation_serialization_A01", anyDexVm()) + .put( + "lang.annotation.Annotation.annotationType.Annotation_annotationType_A01", anyDexVm()) .put( "lang.annotation.IncompleteAnnotationException.serialization.IncompleteAnnotationException_serialization_A01", - any()) + anyDexVm()) .put("lang.annotation.Annotation.Class.Annotation_class_A02", any()) - .put("lang.annotation.Retention.Retention_class_A01", any()) + .put("lang.annotation.Retention.Retention_class_A01", anyDexVm()) .put( "lang.annotation.AnnotationTypeMismatchException.Class.AnnotationTypeMismatchException_class_A01", any()) - .put("lang.Long.serialization.Long_serialization_A01", any()) - .put("lang.ThreadGroup.resume.ThreadGroup_resume_A01", any()) + .put("lang.Long.serialization.Long_serialization_A01", anyDexVm()) + .put("lang.ThreadGroup.resume.ThreadGroup_resume_A01", anyDexVm()) .put( - "lang.AbstractMethodError.serialization.AbstractMethodError_serialization_A01", any()) - .put("lang.RuntimeException.serialization.RuntimeException_serialization_A01", any()) - .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A01", any()) + "lang.AbstractMethodError.serialization.AbstractMethodError_serialization_A01", + anyDexVm()) + .put("lang.RuntimeException.serialization.RuntimeException_serialization_A01", anyDexVm()) + .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A01", anyDexVm()) .put( "lang.ThreadGroup.ConstructorLjava_lang_ThreadGroupLjava_lang_String.ThreadGroup_Constructor_A03", - any()) - .put("lang.ThreadGroup.stop.ThreadGroup_stop_A01", any()) - .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A01", any()) + anyDexVm()) + .put("lang.ThreadGroup.stop.ThreadGroup_stop_A01", anyDexVm()) + .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A01", anyDexVm()) .put( "lang.ThreadGroup.ConstructorLjava_lang_ThreadGroupLjava_lang_String.ThreadGroup_Constructor_A04", - any()) - .put("lang.ThreadGroup.parentOfLjava_lang_ThreadGroup.ThreadGroup_parentOf_A01", any()) - .put("lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A02", any()) - .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A03", any()) - .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A01", any()) + anyDexVm()) + .put( + "lang.ThreadGroup.parentOfLjava_lang_ThreadGroup.ThreadGroup_parentOf_A01", + anyDexVm()) + .put("lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A02", anyDexVm()) + .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A03", anyDexVm()) + .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A01", anyDexVm()) .put( "lang.ThreadGroup.uncaughtExceptionLjava_lang_ThreadLjava_lang_Throwable.ThreadGroup_uncaughtException_A01", - any()) - .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A02", any()) - .put("lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A04", any()) - .put("lang.ThreadGroup.activeCount.ThreadGroup_activeCount_A01", any()) - .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A03", any()) - .put("lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A03", any()) - .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A03", any()) + anyDexVm()) + .put("lang.ThreadGroup.checkAccess.ThreadGroup_checkAccess_A02", anyDexVm()) + .put( + "lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A04", + anyDexVm()) + .put("lang.ThreadGroup.activeCount.ThreadGroup_activeCount_A01", anyDexVm()) + .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A03", anyDexVm()) + .put( + "lang.ThreadGroup.ConstructorLjava_lang_String.ThreadGroup_Constructor_A03", + anyDexVm()) + .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A03", anyDexVm()) .put("lang.Class.getDeclaredConstructors.Class_getDeclaredConstructors_A02", any()) - .put("lang.AssertionError.serialization.AssertionError_serialization_A01", any()) - .put("lang.Class.getClassLoader.Class_getClassLoader_A01", any()) - .put("lang.Class.getDeclaringClass.Class_getDeclaringClass_A01", any()) + .put("lang.AssertionError.serialization.AssertionError_serialization_A01", anyDexVm()) + .put("lang.Class.getClassLoader.Class_getClassLoader_A01", anyDexVm()) + .put("lang.Class.getDeclaringClass.Class_getDeclaringClass_A01", anyDexVm()) .put( "lang.Class.getDeclaredFields.Class_getDeclaredFields_A01", - match(runtimesFrom(Version.V5_1_1))) - .put("lang.Class.getClassLoader.Class_getClassLoader_A02", any()) - .put("lang.Class.getClassLoader.Class_getClassLoader_A03", any()) + match(TestCondition.artRuntimesFrom(Runtime.ART_V5_1_1))) + .put("lang.Class.getClassLoader.Class_getClassLoader_A02", anyDexVm()) + .put("lang.Class.getClassLoader.Class_getClassLoader_A03", anyDexVm()) .put("lang.Class.getDeclaredFields.Class_getDeclaredFields_A02", any()) - .put("lang.Class.getResourceLjava_lang_String.Class_getResource_A01", any()) - .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A03", any()) + .put("lang.Class.getResourceLjava_lang_String.Class_getResource_A01", anyDexVm()) + .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A03", anyDexVm()) .put( "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A03", any()) .put( - "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A07", any()) + "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A07", + anyDexVm()) .put( - "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A01", any()) + "lang.Class.forNameLjava_lang_StringZLjava_lang_ClassLoader.Class_forName_A01", + anyDexVm()) .put("lang.Class.getConstructor_Ljava_lang_Class.Class_getConstructor_A04", any()) - .put("lang.Class.serialization.Class_serialization_A01", any()) + .put("lang.Class.serialization.Class_serialization_A01", anyDexVm()) .put("lang.Class.getMethods.Class_getMethods_A02", any()) .put( "lang.Class.getDeclaredMethodLjava_lang_String_Ljava_lang_Class.Class_getDeclaredMethod_A05", @@ -598,28 +745,36 @@ .put("lang.Class.getClasses.Class_getClasses_A02", any()) .put( "lang.Class.getDeclaredMethodLjava_lang_String_Ljava_lang_Class.Class_getDeclaredMethod_A03", - any()) + anyDexVm()) .put( "lang.Class.getClasses.Class_getClasses_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4, Version.V4_0_4))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V4_4_4, + Runtime.ART_V4_0_4, + Runtime.JAVA))) .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A01", any()) - .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A02", any()) + .put("lang.Class.getProtectionDomain.Class_getProtectionDomain_A02", anyDexVm()) .put( "lang.Class.getDeclaredMethods.Class_getDeclaredMethods_A01", - match(runtimesFrom(Version.V7_0_0))) - .put("lang.Class.getMethods.Class_getMethods_A01", match(runtimesFrom(Version.V7_0_0))) + match(artRuntimesFromAndJava(Runtime.ART_V7_0_0))) + .put( + "lang.Class.getMethods.Class_getMethods_A01", + match(artRuntimesFromAndJava(Runtime.ART_V7_0_0))) .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A04", any()) .put("lang.Class.getDeclaredFieldLjava_lang_String.Class_getDeclaredField_A04", any()) .put("lang.Class.getDeclaredMethods.Class_getDeclaredMethods_A02", any()) .put( "lang.Class.getResourceAsStreamLjava_lang_String.Class_getResourceAsStream_A01", - any()) + anyDexVm()) .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A05", any()) .put("lang.Class.getAnnotationLjava_lang_Class.Class_getAnnotation_A01", any()) .put("lang.Class.getGenericInterfaces.Class_getGenericInterfaces_A03", any()) .put("lang.Class.getDeclaredClasses.Class_getDeclaredClasses_A02", any()) - .put("lang.Class.desiredAssertionStatus.Class_desiredAssertionStatus_A01", any()) - .put("lang.Class.getPackage.Class_getPackage_A01", any()) + .put("lang.Class.desiredAssertionStatus.Class_desiredAssertionStatus_A01", anyDexVm()) + .put("lang.Class.getPackage.Class_getPackage_A01", anyDexVm()) .put("lang.Class.getFieldLjava_lang_String.Class_getField_A04", any()) .put("lang.Class.getTypeParameters.Class_getTypeParameters_A02", any()) .put("lang.Class.getDeclaredAnnotations.Class_getDeclaredAnnotations_A01", any()) @@ -629,344 +784,384 @@ .put("lang.Class.getFields.Class_getFields_A02", any()) .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A03", any()) .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A04", any()) - .put("lang.Class.getSigners.Class_getSigners_A01", any()) + .put("lang.Class.getSigners.Class_getSigners_A01", anyDexVm()) .put( "lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A01", - match(runtimes(Version.DEFAULT, Version.V7_0_0, Version.V4_4_4, Version.V4_0_4))) - .put("lang.Class.getModifiers.Class_getModifiers_A03", match(runtimes(Version.V4_0_4))) - .put("lang.Class.newInstance.Class_newInstance_A06", match(runtimes(Version.V4_0_4))) + match( + runtimes( + Runtime.ART_DEFAULT, + Runtime.ART_V7_0_0, + Runtime.ART_V4_4_4, + Runtime.ART_V4_0_4))) + .put( + "lang.Class.getModifiers.Class_getModifiers_A03", match(runtimes(Runtime.ART_V4_0_4))) + .put("lang.Class.newInstance.Class_newInstance_A06", match(runtimes(Runtime.ART_V4_0_4))) .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A01", any()) .put("lang.Class.getGenericSuperclass.Class_getGenericSuperclass_A02", any()) .put("lang.Class.newInstance.Class_newInstance_A07", any()) .put( "lang.Class.getDeclaredConstructor_Ljava_lang_Class.Class_getDeclaredConstructor_A02", - any()) + anyDexVm()) .put("lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A05", any()) - .put("lang.Class.forNameLjava_lang_String.Class_forName_A01", any()) + .put("lang.Class.forNameLjava_lang_String.Class_forName_A01", anyDexVm()) .put( "lang.Class.getDeclaredConstructor_Ljava_lang_Class.Class_getDeclaredConstructor_A03", any()) - .put("lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A03", any()) + .put( + "lang.Class.getMethodLjava_lang_String_Ljava_lang_Class.Class_getMethod_A03", + anyDexVm()) .put("lang.Class.forNameLjava_lang_String.Class_forName_A02", any()) .put( "lang.UnsatisfiedLinkError.serialization.UnsatisfiedLinkError_serialization_A01", - any()) + anyDexVm()) .put("lang.Class.getAnnotations.Class_getAnnotations_A01", any()) .put( "lang.EnumConstantNotPresentException.serialization.EnumConstantNotPresentException_serialization_A01", - any()) + anyDexVm()) .put("lang.String.toLowerCase.String_toLowerCase_A01", any()) .put("lang.String.splitLjava_lang_StringI.String_split_A01", any()) - .put("lang.String.serialization.String_serialization_A01", any()) + .put("lang.String.serialization.String_serialization_A01", anyDexVm()) .put("lang.String.regionMatchesZILjava_lang_StringII.String_regionMatches_A01", any()) .put("lang.String.valueOfF.String_valueOf_A01", any()) .put("lang.String.Constructor_BLjava_nio_charset_Charset.String_Constructor_A01", any()) - .put("lang.String.concatLjava_lang_String.String_concat_A01", any()) - .put("lang.String.matchesLjava_lang_String.String_matches_A01", any()) - .put("lang.String.CASE_INSENSITIVE_ORDER.serialization.String_serialization_A01", any()) + .put("lang.String.concatLjava_lang_String.String_concat_A01", anyDexVm()) + .put("lang.String.matchesLjava_lang_String.String_matches_A01", anyDexVm()) + .put( + "lang.String.CASE_INSENSITIVE_ORDER.serialization.String_serialization_A01", + anyDexVm()) .put( "lang.String.getBytesLjava_lang_String.String_getBytes_A14", - match(runtimesUpTo(Version.V7_0_0))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0))) .put("lang.String.splitLjava_lang_String.String_split_A01", any()) .put("lang.String.getBytesII_BI.String_getBytes_A03", any()) - .put("lang.String.getBytesII_BI.String_getBytes_A02", any()) + .put("lang.String.getBytesII_BI.String_getBytes_A02", anyDexVm()) .put("lang.String.toLowerCaseLjava_util_Locale.String_toLowerCase_A01", any()) .put("lang.String.Constructor_BIILjava_nio_charset_Charset.String_Constructor_A01", any()) - .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A01", any()) + .put("lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A01", anyDexVm()) .put("lang.String.valueOfD.String_valueOf_A01", any()) .put( "lang.String.getBytesLjava_nio_charset_Charset.String_getBytes_A14", - match(runtimesUpTo(Version.V7_0_0))) - .put("lang.Package.isSealed.Package_isSealed_A01", any()) - .put("lang.Package.getSpecificationVersion.Package_getSpecificationVersion_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0))) + .put("lang.Package.isSealed.Package_isSealed_A01", anyDexVm()) + .put( + "lang.Package.getSpecificationRuntime.ART_Package_getSpecificationVersion_A01", + anyDexVm()) .put("lang.Package.getAnnotationLjava_lang_Class.Package_getAnnotation_A01", any()) .put( "lang.Package.isAnnotationPresentLjava_lang_Class.Package_isAnnotationPresent_A02", - match(and(runtimes(Version.V4_0_4), runtimesFrom(Version.V7_0_0)))) - .put("lang.Package.getName.Package_getName_A01", any()) - .put("lang.Package.getImplementationVersion.Package_getImplementationVersion_A01", any()) + match( + and( + runtimes(Runtime.ART_V4_0_4), + TestCondition.artRuntimesFrom(Runtime.ART_V7_0_0)))) + .put("lang.Package.getName.Package_getName_A01", anyDexVm()) + .put( + "lang.Package.getImplementationRuntime.ART_Package_getImplementationVersion_A01", + anyDexVm()) .put("lang.Package.getDeclaredAnnotations.Package_getDeclaredAnnotations_A01", any()) - .put("lang.Package.getSpecificationVendor.Package_getSpecificationVendor_A01", any()) + .put("lang.Package.getSpecificationVendor.Package_getSpecificationVendor_A01", anyDexVm()) .put( "lang.Package.getAnnotationLjava_lang_Class.Package_getAnnotation_A02", - match(and(runtimesFrom(Version.V7_0_0), runtimes(Version.V4_0_4)))) - .put("lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A01", any()) - .put("lang.Package.toString.Package_toString_A01", any()) + match( + and( + TestCondition.artRuntimesFrom(Runtime.ART_V7_0_0), + runtimes(Runtime.ART_V4_0_4)))) + .put( + "lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A01", + anyDexVm()) + .put("lang.Package.toString.Package_toString_A01", anyDexVm()) .put("lang.Package.getAnnotations.Package_getAnnotations_A01", any()) .put( "lang.Package.isAnnotationPresentLjava_lang_Class.Package_isAnnotationPresent_A01", any()) - .put("lang.Package.getSpecificationTitle.Package_getSpecificationTitle_A01", any()) - .put("lang.Package.getImplementationTitle.Package_getImplementationTitle_A01", any()) - .put("lang.Package.getPackages.Package_getPackages_A01", any()) - .put("lang.Package.hashCode.Package_hashCode_A01", any()) - .put("lang.Package.getPackageLjava_lang_String.Package_getPackage_A01", any()) - .put("lang.Package.getImplementationVendor.Package_getImplementationVendor_A01", any()) - .put("lang.Package.isSealedLjava_net_URL.Package_isSealed_A01", any()) - .put("lang.StringBuilder.serialization.StringBuilder_serialization_A01", any()) + .put("lang.Package.getSpecificationTitle.Package_getSpecificationTitle_A01", anyDexVm()) + .put("lang.Package.getImplementationTitle.Package_getImplementationTitle_A01", anyDexVm()) + .put("lang.Package.getPackages.Package_getPackages_A01", anyDexVm()) + .put("lang.Package.hashCode.Package_hashCode_A01", anyDexVm()) + .put("lang.Package.getPackageLjava_lang_String.Package_getPackage_A01", anyDexVm()) + .put( + "lang.Package.getImplementationVendor.Package_getImplementationVendor_A01", + anyDexVm()) + .put("lang.Package.isSealedLjava_net_URL.Package_isSealed_A01", anyDexVm()) + .put("lang.StringBuilder.serialization.StringBuilder_serialization_A01", anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_io_FileDescriptor.SecurityManager_checkRead_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAwtEventQueueAccess.SecurityManager_checkAwtEventQueueAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkWriteLjava_lang_String.SecurityManager_checkWrite_A02", - any()) - .put("lang.SecurityManager.inClassLoader.SecurityManager_inClassLoader_A01", any()) + anyDexVm()) + .put("lang.SecurityManager.inClassLoader.SecurityManager_inClassLoader_A01", anyDexVm()) .put( "lang.SecurityManager.checkPermissionLjava_security_PermissionLjava_lang_Object.SecurityManager_checkPermission_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_io_FileDescriptor.SecurityManager_checkRead_A01", - any()) - .put("lang.SecurityManager.inCheck.SecurityManager_inCheck_A01", any()) + anyDexVm()) + .put("lang.SecurityManager.inCheck.SecurityManager_inCheck_A01", anyDexVm()) .put( "lang.SecurityManager.currentClassLoader.SecurityManager_currentClassLoader_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPrintJobAccess.SecurityManager_checkPrintJobAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkWriteLjava_lang_String.SecurityManager_checkWrite_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPackageAccessLjava_lang_String.SecurityManager_checkPackageAccess_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAcceptLjava_lang_StringI.SecurityManager_checkAccept_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPermissionLjava_security_PermissionLjava_lang_Object.SecurityManager_checkPermission_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.currentClassLoader.SecurityManager_currentClassLoader_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkMulticastLjava_net_InetAddress.SecurityManager_checkMulticast_A02", - any()) - .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A01", any()) + anyDexVm()) + .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A01", anyDexVm()) .put( "lang.SecurityManager.getSecurityContext.SecurityManager_getSecurityContext_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPackageAccessLjava_lang_String.SecurityManager_checkPackageAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkMemberAccessLjava_lang_ClassI.SecurityManager_checkMemberAccess_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkMulticastLjava_net_InetAddressB.SecurityManager_checkMulticast_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAcceptLjava_lang_StringI.SecurityManager_checkAccept_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkMulticastLjava_net_InetAddress.SecurityManager_checkMulticast_A01", - any()) - .put("lang.SecurityManager.Constructor.SecurityManager_Constructor_A01", any()) + anyDexVm()) + .put("lang.SecurityManager.Constructor.SecurityManager_Constructor_A01", anyDexVm()) .put("lang.SecurityManager.getClassContext.SecurityManager_getClassContext_A01", any()) .put( "lang.SecurityManager.checkMemberAccessLjava_lang_ClassI.SecurityManager_checkMemberAccess_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkDeleteLjava_lang_String.SecurityManager_checkDelete_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkMulticastLjava_net_InetAddressB.SecurityManager_checkMulticast_A01", - any()) + anyDexVm()) .put("lang.SecurityManager.checkListenI.SecurityManager_checkListen_A02", any()) .put( "lang.SecurityManager.checkAccessLjava_lang_Thread.SecurityManager_checkAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkWriteLjava_io_FileDescriptor.SecurityManager_checkWrite_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkDeleteLjava_lang_String.SecurityManager_checkDelete_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPropertiesAccess.SecurityManager_checkPropertiesAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAccessLjava_lang_ThreadGroup.SecurityManager_checkAccess_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAccessLjava_lang_Thread.SecurityManager_checkAccess_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPackageDefinitionLjava_lang_String.SecurityManager_checkPackageDefinition_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_lang_String.SecurityManager_checkRead_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkWriteLjava_io_FileDescriptor.SecurityManager_checkWrite_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_lang_StringLjava_lang_Object.SecurityManager_checkRead_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPackageDefinitionLjava_lang_String.SecurityManager_checkPackageDefinition_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkCreateClassLoader.SecurityManager_checkCreateClassLoader_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkReadLjava_lang_String.SecurityManager_checkRead_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkAccessLjava_lang_ThreadGroup.SecurityManager_checkAccess_A01", - any()) - .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A03", any()) + anyDexVm()) + .put( + "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A03", + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkExecLjava_lang_String.SecurityManager_checkExec_A01", - any()) - .put("lang.SecurityManager.checkSetFactory.SecurityManager_checkSetFactory_A01", any()) + anyDexVm()) + .put( + "lang.SecurityManager.checkSetFactory.SecurityManager_checkSetFactory_A01", + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A04", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPermissionLjava_security_Permission.SecurityManager_checkPermission_A01", - any()) - .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A01", any()) - .put("lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A02", any()) + anyDexVm()) + .put( + "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A01", + anyDexVm()) + .put( + "lang.SecurityManager.inClassLjava_lang_String.SecurityManager_inClass_A02", + anyDexVm()) .put( "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A02", - any()) - .put("lang.SecurityManager.checkExitI.SecurityManager_checkExit_A01", any()) + anyDexVm()) + .put("lang.SecurityManager.checkExitI.SecurityManager_checkExit_A01", anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringILjava_lang_Object.SecurityManager_checkConnect_A01", - any()) - .put("lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A02", any()) + anyDexVm()) + .put( + "lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A02", + anyDexVm()) .put( "lang.SecurityManager.classDepthLjava_lang_String.SecurityManager_classDepth_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkPropertyAccessLjava_lang_String.SecurityManager_checkPropertyAccess_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkLinkLjava_lang_String.SecurityManager_checkLink_A02", - any()) + anyDexVm()) .put("lang.SecurityManager.classLoaderDepth.SecurityManager_classLoaderDepth_A01", any()) .put( "lang.SecurityManager.checkPermissionLjava_security_Permission.SecurityManager_checkPermission_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.currentLoadedClass.SecurityManager_currentLoadedClass_A01", any()) .put( "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A03", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkConnectLjava_lang_StringI.SecurityManager_checkConnect_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkTopLevelWindowLjava_lang_Object.SecurityManager_checkTopLevelWindow_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.currentLoadedClass.SecurityManager_currentLoadedClass_A02", - any()) + anyDexVm()) .put( "lang.SecurityManager.classDepthLjava_lang_String.SecurityManager_classDepth_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A01", - any()) - .put("lang.Throwable.serialization.Throwable_serialization_A01", any()) + anyDexVm()) + .put("lang.Throwable.serialization.Throwable_serialization_A01", anyDexVm()) .put( "lang.SecurityManager.checkTopLevelWindowLjava_lang_Object.SecurityManager_checkTopLevelWindow_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkLinkLjava_lang_String.SecurityManager_checkLink_A01", - any()) + anyDexVm()) .put("lang.Throwable.getStackTrace.Throwable_getStackTrace_A01", any()) .put( "lang.SecurityManager.checkSystemClipboardAccess.SecurityManager_checkSystemClipboardAccess_A01", - any()) + anyDexVm()) .put( "lang.SecurityManager.checkSecurityAccessLjava_lang_String.SecurityManager_checkSecurityAccess_A02", - any()) + anyDexVm()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A03", - any()) + anyDexVm()) .put( "lang.reflect.MalformedParameterizedTypeException.serialization.MalformedParameterizedTypeException_serialization_A01", - any()) + anyDexVm()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A02", - any()) + anyDexVm()) .put( "lang.UnsupportedClassVersionError.serialization.UnsupportedClassVersionError_serialization_A01", - any()) + anyDexVm()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A01", any()) - .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A01", any()) + .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A01", anyDexVm()) .put("lang.reflect.Proxy.serialization.Proxy_serialization_A01", any()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A03", - any()) + anyDexVm()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_String.ReflectPermission_Constructor_A02", - any()) - .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A02", any()) + anyDexVm()) + .put("lang.reflect.ReflectPermission.Class.ReflectPermission_class_A02", anyDexVm()) .put( "lang.reflect.ReflectPermission.Constructor_java_lang_StringLjava_lang_String.ReflectPermission_Constructor_A01", any()) .put( "lang.reflect.Proxy.getInvocationHandlerLjava_lang_Object.Proxy_getInvocationHandler_A02", - match(runtimesFrom(Version.V5_1_1))) + match(artRuntimesFromAndJava(Runtime.ART_V5_1_1))) .put("lang.reflect.Proxy.Class.Proxy_class_A01", any()) - .put("lang.reflect.Proxy.Class.Proxy_class_A02", match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Proxy.Class.Proxy_class_A03", match(runtimesUpTo(Version.V4_4_4))) + .put( + "lang.reflect.Proxy.Class.Proxy_class_A02", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.reflect.Proxy.Class.Proxy_class_A03", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) .put( "lang.reflect.Proxy.getProxyClassLjava_lang_ClassLoader_Ljava_lang_Class.Proxy_getProxyClass_A01", - any()) + anyDexVm()) .put( "lang.reflect.Proxy.getProxyClassLjava_lang_ClassLoader_Ljava_lang_Class.Proxy_getProxyClass_A03", - any()) - .put("lang.reflect.Proxy.h.Proxy_h_A01", match(runtimes(Version.DEFAULT))) + anyDexVm()) + .put( + "lang.reflect.Proxy.h.Proxy_h_A01", + match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA))) .put("lang.reflect.Proxy.serialization.Proxy_serialization_A02", any()) .put( "lang.reflect.GenericSignatureFormatError.serialization.GenericSignatureFormatError_serialization_A01", - any()) + anyDexVm()) .put( "lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A02", - any()) + anyDexVm()) .put( "lang.reflect.Proxy.ConstructorLjava_lang_reflect_InvocationHandler.Proxy_Constructor_A01", - match(runtimes(Version.DEFAULT))) + match(runtimes(Runtime.ART_DEFAULT, Runtime.JAVA))) .put( "lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A01", - any()) + anyDexVm()) .put("lang.reflect.Modifier.isStrictI.Modifier_isStrict_A01", any()) .put("lang.reflect.Method.getGenericReturnType.Method_getGenericReturnType_A03", any()) .put("lang.reflect.Method.getGenericReturnType.Method_getGenericReturnType_A02", any()) @@ -982,7 +1177,7 @@ any()) .put( "lang.reflect.Method.invokeLjava_lang_Object_Ljava_lang_Object.Method_invoke_A07", - any()) + anyDexVm()) .put( "lang.reflect.Method.getGenericExceptionTypes.Method_getGenericExceptionTypes_A04", any()) @@ -1001,85 +1196,85 @@ any()) .put( "lang.reflect.InvocationHandler.invokeLjava_lang_ObjectLjava_lang_reflect_Method_Ljava_lang_Object.InvocationHandler_invoke_A01", - match(runtimesUpTo(Version.V4_4_4))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) .put( "lang.reflect.InvocationHandler.invokeLjava_lang_ObjectLjava_lang_reflect_Method_Ljava_lang_Object.InvocationHandler_invoke_A02", - any()) + anyDexVm()) .put("lang.reflect.Method.getDefaultValue.Method_getDefaultValue_A02", any()) .put( "lang.reflect.Method.hashCode.Method_hashCode_A01", - match(runtimesUpTo(Version.V4_4_4))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) .put("lang.reflect.Method.toString.Method_toString_A01", any()) .put( "lang.reflect.Method.getGenericParameterTypes.Method_getGenericParameterTypes_A02", any()) - .put("lang.reflect.Field.getFloatLjava_lang_Object.Field_getFloat_A05", any()) - .put("lang.reflect.Field.getDeclaringClass.Field_getDeclaringClass_A01", any()) - .put("lang.reflect.Field.getByteLjava_lang_Object.Field_getByte_A05", any()) - .put("lang.reflect.Field.getCharLjava_lang_Object.Field_getChar_A05", any()) - .put("lang.reflect.Field.getBooleanLjava_lang_Object.Field_getBoolean_A05", any()) - .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A05", any()) - .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A01", any()) + .put("lang.reflect.Field.getFloatLjava_lang_Object.Field_getFloat_A05", anyDexVm()) + .put("lang.reflect.Field.getDeclaringClass.Field_getDeclaringClass_A01", anyDexVm()) + .put("lang.reflect.Field.getByteLjava_lang_Object.Field_getByte_A05", anyDexVm()) + .put("lang.reflect.Field.getCharLjava_lang_Object.Field_getChar_A05", anyDexVm()) + .put("lang.reflect.Field.getBooleanLjava_lang_Object.Field_getBoolean_A05", anyDexVm()) + .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A05", anyDexVm()) + .put("lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A01", anyDexVm()) .put( "lang.reflect.Field.setByteLjava_lang_ObjectB.Field_setByte_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A01", anyDexVm()) .put( "lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A05", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A05", anyDexVm()) .put("lang.reflect.Field.isSynthetic.Field_isSynthetic_A01", any()) - .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A05", any()) - .put("lang.reflect.Field.getType.Field_getType_A01", any()) - .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A01", any()) + .put("lang.reflect.Field.setBooleanLjava_lang_ObjectZ.Field_setBoolean_A05", anyDexVm()) + .put("lang.reflect.Field.getType.Field_getType_A01", anyDexVm()) + .put("lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A01", anyDexVm()) .put( "lang.reflect.Field.setCharLjava_lang_ObjectC.Field_setChar_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.getDoubleLjava_lang_Object.Field_getDouble_A05", any()) - .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.getDoubleLjava_lang_Object.Field_getDouble_A05", anyDexVm()) + .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A01", anyDexVm()) .put( "lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A02", - match(runtimesUpTo(Version.V4_4_4))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) .put("lang.reflect.Field.getAnnotationLjava_lang_Class.Field_getAnnotation_A01", any()) .put( "lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.getIntLjava_lang_Object.Field_getInt_A05", any()) - .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A05", any()) - .put("lang.reflect.Field.getShortLjava_lang_Object.Field_getShort_A05", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.getIntLjava_lang_Object.Field_getInt_A05", anyDexVm()) + .put("lang.reflect.Field.setFloatLjava_lang_ObjectF.Field_setFloat_A05", anyDexVm()) + .put("lang.reflect.Field.getShortLjava_lang_Object.Field_getShort_A05", anyDexVm()) .put("lang.reflect.Field.getGenericType.Field_getGenericType_A03", any()) .put("lang.reflect.Field.getDeclaredAnnotations.Field_getDeclaredAnnotations_A01", any()) - .put("lang.reflect.Field.getGenericType.Field_getGenericType_A01", any()) - .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A05", any()) + .put("lang.reflect.Field.getGenericType.Field_getGenericType_A01", anyDexVm()) + .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A05", anyDexVm()) .put("lang.reflect.Field.getGenericType.Field_getGenericType_A02", any()) - .put("lang.reflect.Field.toGenericString.Field_toGenericString_A01", any()) + .put("lang.reflect.Field.toGenericString.Field_toGenericString_A01", anyDexVm()) .put("lang.reflect.Field.getGenericType.Field_getGenericType_A04", any()) - .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A01", any()) + .put("lang.reflect.Field.setIntLjava_lang_ObjectI.Field_setInt_A01", anyDexVm()) .put( "lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A05", any()) - .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A05", anyDexVm()) + .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A01", anyDexVm()) .put( "lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A05", any()) - .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A01", any()) - .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A05", anyDexVm()) + .put("lang.reflect.Field.setLongLjava_lang_ObjectJ.Field_setLong_A01", anyDexVm()) + .put("lang.reflect.Field.setDoubleLjava_lang_ObjectD.Field_setDouble_A01", anyDexVm()) .put( "lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A05", any()) - .put("lang.reflect.Field.getLjava_lang_Object.Field_get_A05", any()) - .put("lang.reflect.Field.getLongLjava_lang_Object.Field_getLong_A05", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setShortLjava_lang_ObjectS.Field_setShort_A05", anyDexVm()) + .put("lang.reflect.Field.getLjava_lang_Object.Field_get_A05", anyDexVm()) + .put("lang.reflect.Field.getLongLjava_lang_Object.Field_getLong_A05", anyDexVm()) .put( "lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A02", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A05", any()) - .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A01", any()) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A05", anyDexVm()) + .put("lang.reflect.Field.setLjava_lang_ObjectLjava_lang_Object.Field_set_A01", anyDexVm()) .put( "lang.reflect.Constructor.newInstance_Ljava_lang_Object.Constructor_newInstance_A06", - any()) + anyDexVm()) .put("lang.reflect.Constructor.isSynthetic.Constructor_isSynthetic_A01", any()) .put( "lang.reflect.Constructor.getGenericExceptionTypes.Constructor_getGenericExceptionTypes_A03", @@ -1101,8 +1296,10 @@ any()) .put( "lang.reflect.InvocationTargetException.serialization.InvocationTargetException_serialization_A01", - any()) - .put("lang.reflect.Constructor.toGenericString.Constructor_toGenericString_A01", any()) + anyDexVm()) + .put( + "lang.reflect.Constructor.toGenericString.Constructor_toGenericString_A01", + anyDexVm()) .put( "lang.reflect.Constructor.getTypeParameters.Constructor_getTypeParameters_A02", any()) .put( @@ -1116,22 +1313,22 @@ any()) .put( "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A03", - any()) + anyDexVm()) .put( "lang.reflect.UndeclaredThrowableException.serialization.UndeclaredThrowableException_serialization_A01", - any()) + anyDexVm()) .put( "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A02", - any()) + anyDexVm()) .put( "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A03", - any()) + anyDexVm()) .put( "lang.reflect.AccessibleObject.isAnnotationPresentLjava_lang_Class.AccessibleObject_isAnnotationPresent_A01", any()) .put( "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A02", - any()) + anyDexVm()) .put( "lang.reflect.AccessibleObject.getAnnotations.AccessibleObject_getAnnotations_A01", any()) @@ -1143,453 +1340,472 @@ any()) .put( "lang.IllegalAccessException.serialization.IllegalAccessException_serialization_A01", - any()) + anyDexVm()) .put("lang.Character.getTypeI.Character_getType_A01", any()) .put("lang.Character.isDigitI.Character_isDigit_A01", any()) .put("lang.Character.getTypeC.Character_getType_A01", any()) - .put("lang.Character.serialization.Character_serialization_A01", any()) + .put("lang.Character.serialization.Character_serialization_A01", anyDexVm()) .put("lang.Character.isDigitC.Character_isDigit_A01", any()) .put("lang.Character.digitCI.Character_digit_A01", any()) .put("lang.Character.digitII.Character_digit_A01", any()) - .put("lang.Character.isLowerCaseC.Character_isLowerCase_A01", any()) + .put("lang.Character.isLowerCaseC.Character_isLowerCase_A01", anyDexVm()) .put( "lang.Character.isSpaceCharC.Character_isSpaceChar_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.Character.isSpaceCharI.Character_isSpaceChar_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.Character.isWhitespaceC.Character_isWhitespace_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.Character.isWhitespaceI.Character_isWhitespace_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put("lang.Character.getDirectionalityI.Character_getDirectionality_A01", any()) - .put( - "lang.Character.UnicodeBlock.ofC.UnicodeBlock_of_A01", - match(runtimesFrom(Version.V4_4_4))) - .put( - "lang.Character.UnicodeBlock.ofI.UnicodeBlock_of_A01", - match(runtimesFrom(Version.V4_4_4))) - .put("lang.Character.isLowerCaseI.Character_isLowerCase_A01", any()) - .put("lang.Process.waitFor.Process_waitFor_A01", any()) - .put("lang.System.getProperties.System_getProperties_A01", any()) - .put("lang.Process.getErrorStream.Process_getErrorStream_A01", any()) + .put("lang.Character.UnicodeBlock.ofC.UnicodeBlock_of_A01", any()) + .put("lang.Character.UnicodeBlock.ofI.UnicodeBlock_of_A01", any()) + .put("lang.Character.isLowerCaseI.Character_isLowerCase_A01", anyDexVm()) + .put("lang.Process.waitFor.Process_waitFor_A01", anyDexVm()) + .put("lang.System.getProperties.System_getProperties_A01", anyDexVm()) + .put("lang.Process.getErrorStream.Process_getErrorStream_A01", anyDexVm()) .put("lang.Character.getDirectionalityC.Character_getDirectionality_A01", any()) - .put("lang.Process.exitValue.Process_exitValue_A01", any()) - .put("lang.System.loadLjava_lang_String.System_load_A01", any()) - .put("lang.Process.getInputStream.Process_getInputStream_A01", any()) - .put("lang.System.loadLibraryLjava_lang_String.System_loadLibrary_A01", any()) + .put("lang.Process.exitValue.Process_exitValue_A01", anyDexVm()) + .put("lang.System.loadLjava_lang_String.System_load_A01", anyDexVm()) + .put("lang.Process.getInputStream.Process_getInputStream_A01", anyDexVm()) + .put("lang.System.loadLibraryLjava_lang_String.System_loadLibrary_A01", anyDexVm()) .put( "lang.System.setSecurityManagerLjava_lang_SecurityManager.System_setSecurityManager_A02", - any()) - .put("lang.System.runFinalizersOnExitZ.System_runFinalizersOnExit_A01", any()) - .put("lang.System.getenvLjava_lang_String.System_getenv_A01", any()) - .put("lang.System.getenv.System_getenv_A01", any()) + anyDexVm()) + .put("lang.System.runFinalizersOnExitZ.System_runFinalizersOnExit_A01", anyDexVm()) + .put("lang.System.getenvLjava_lang_String.System_getenv_A01", anyDexVm()) + .put("lang.System.getenv.System_getenv_A01", anyDexVm()) .put( "lang.System.getPropertyLjava_lang_StringLjava_lang_String.System_getProperty_A01", - any()) - .put("lang.System.exitI.System_exit_A01", any()) + anyDexVm()) + .put("lang.System.exitI.System_exit_A01", anyDexVm()) .put( "util.concurrent.ArrayBlockingQueue.serialization.ArrayBlockingQueue_serialization_A01", - any()) + anyDexVm()) .put( "lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A04", - any()) - .put("lang.System.setPropertiesLjava_util_Properties.System_setProperties_A02", any()) - .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A02", any()) - .put("lang.System.getPropertyLjava_lang_String.System_getProperty_A01", any()) + anyDexVm()) + .put( + "lang.System.setPropertiesLjava_util_Properties.System_setProperties_A02", anyDexVm()) + .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A02", anyDexVm()) + .put("lang.System.getPropertyLjava_lang_String.System_getProperty_A01", anyDexVm()) .put( "util.concurrent.LinkedBlockingQueue.serialization.LinkedBlockingQueue_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.LinkedBlockingDeque.serialization.LinkedBlockingDeque_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.ConcurrentLinkedQueue.serialization.ConcurrentLinkedQueue_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.SynchronousQueue.serialization.SynchronousQueue_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.CopyOnWriteArrayList.serialization.CopyOnWriteArrayList_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.CopyOnWriteArrayList.subListII.CopyOnWriteArrayList_subList_A01", any()) .put( "util.concurrent.ConcurrentHashMap.serialization.ConcurrentHashMap_serialization_A01", - match(runtimesFrom(Version.V5_1_1))) - .put("util.concurrent.ConcurrentHashMap.keySet.ConcurrentHashMap_keySet_A01", any()) + match(TestCondition.artRuntimesFrom(Runtime.ART_V5_1_1))) + .put("util.concurrent.ConcurrentHashMap.keySet.ConcurrentHashMap_keySet_A01", anyDexVm()) .put( "util.concurrent.Executors.privilegedThreadFactory.Executors_privilegedThreadFactory_A01", any()) .put( "util.concurrent.Executors.privilegedCallableLjava_util_concurrent_Callable.Executors_privilegedCallable_A01", - any()) + anyDexVm()) .put( "util.concurrent.CopyOnWriteArraySet.serialization.CopyOnWriteArraySet_serialization_A01", - any()) + anyDexVm()) .put( "util.concurrent.Executors.privilegedCallableUsingCurrentClassLoaderLjava_util_concurrent_Callable.Executors_privilegedCallableUsingCurrentClassLoader_A01", - any()) + anyDexVm()) .put( "util.concurrent.PriorityBlockingQueue.ConstructorLjava_util_Collection.PriorityBlockingQueue_Constructor_A01", any()) .put( "util.concurrent.PriorityBlockingQueue.serialization.PriorityBlockingQueue_serialization_A01", - any()) + anyDexVm()) .put( "lang.ThreadGroup.destroy.ThreadGroup_destroy_A01", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Thread.start.Thread_start_A01", match(runtimes(Version.V7_0_0))) + match(artRuntimesUpToAndJava(Runtime.ART_V6_0_1))) + .put("lang.Thread.start.Thread_start_A01", match(runtimes(Runtime.ART_V7_0_0))) .put( "lang.String.getBytesLjava_lang_String.String_getBytes_A02", - match(runtimesUpTo(Version.V7_0_0))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0))) .put( "util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A02", - match(runtimesUpTo(Version.V7_0_0))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0))) .put( "util.concurrent.CopyOnWriteArrayList.lastIndexOfLjava_lang_ObjectI.CopyOnWriteArrayList_lastIndexOf_A01", - match(runtimesUpTo(Version.V7_0_0))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V7_0_0))) .put( "lang.StringBuffer.getCharsII_CI.StringBuffer_getChars_A03", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.StringBuffer.appendF.StringBuffer_append_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.StringBuffer.insertI_CII.StringBuffer_insert_A02", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.StrictMath.scalbDI.StrictMath_scalb_A03", match(runtimesUpTo(Version.V6_0_1))) - .put("lang.StrictMath.scalbDI.StrictMath_scalb_A01", match(runtimesUpTo(Version.V6_0_1))) - .put("lang.StrictMath.scalbFI.StrictMath_scalb_A03", match(runtimesUpTo(Version.V6_0_1))) - .put("lang.StrictMath.scalbFI.StrictMath_scalb_A01", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.StrictMath.scalbDI.StrictMath_scalb_A03", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.StrictMath.scalbDI.StrictMath_scalb_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.StrictMath.scalbFI.StrictMath_scalb_A03", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.StrictMath.scalbFI.StrictMath_scalb_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A07", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A07", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Thread.toString.Thread_toString_A01", match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Thread.start.Thread_start_A02", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Thread.toString.Thread_toString_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Thread.start.Thread_start_A02", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Thread.setPriorityI.Thread_setPriority_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ClassLoader.ConstructorLjava_lang_ClassLoader.ClassLoader_Constructor_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Enum.compareToLjava_lang_Enum.Enum_compareTo_A03", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Enum.hashCode.Enum_hashCode_A01", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Enum.hashCode.Enum_hashCode_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.StackTraceElement.hashCode.StackTraceElement_hashCode_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ProcessBuilder.environment.ProcessBuilder_environment_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ProcessBuilder.environment.ProcessBuilder_environment_A03", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Float.toStringF.Float_toString_A04", match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Float.toStringF.Float_toString_A03", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Float.toStringF.Float_toString_A04", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Float.toStringF.Float_toString_A03", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ThreadGroup.getMaxPriority.ThreadGroup_getMaxPriority_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ThreadGroup.uncaughtExceptionLjava_lang_ThreadLjava_lang_Throwable.ThreadGroup_uncaughtException_A02", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.ThreadGroup.list.ThreadGroup_list_A01", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.ThreadGroup.list.ThreadGroup_list_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A04", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.ThreadGroup.toString.ThreadGroup_toString_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Class.getFieldLjava_lang_String.Class_getField_A01", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.String.replaceCC.String_replace_A01", match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.String.replaceCC.String_replace_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.Package.isCompatibleWithLjava_lang_String.Package_isCompatibleWith_A02", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.StringBuilder.appendF.StringBuilder_append_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.StringBuilder.insertIF.StringBuilder_insert_A01", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.reflect.AccessibleObject.setAccessibleZ.AccessibleObject_setAccessible_A04", - match(runtimesUpTo(Version.V4_4_4))) + match(runtimes(Runtime.ART_V4_4_4, Runtime.JAVA))) .put( "lang.reflect.AccessibleObject.setAccessible_Ljava_lang_reflect_AccessibleObjectZ.AccessibleObject_setAccessible_A04", - match(runtimesUpTo(Version.V6_0_1))) + match(artRuntimesUpToAndJava(Runtime.ART_V6_0_1))) .put( "lang.Character.UnicodeBlock.forName_java_lang_String.UnicodeBlock_forName_A03", - match(runtimesUpTo(Version.V6_0_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) .put( "lang.System.loadLjava_lang_String.System_load_A02", - match(runtimesUpTo(Version.V6_0_1))) - .put("lang.Math.hypotDD.Math_hypot_A04", match(runtimesUpTo(Version.V5_1_1))) + match(TestCondition.artRuntimesUpTo(Runtime.ART_V6_0_1))) + .put( + "lang.Math.hypotDD.Math_hypot_A04", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V5_1_1))) .put( "math.BigInteger.probablePrimeIjava_util_Random.BigInteger_probablePrime_A01", - match(runtimes(Version.V4_0_4))) - .put("lang.Math.sqrtD.Math_sqrt_A01", match(runtimes(Version.V4_0_4))) - .put("lang.StrictMath.cbrtD.StrictMath_cbrt_A01", match(runtimes(Version.V4_0_4))) - .put("lang.StrictMath.log10D.StrictMath_log10_A01", match(runtimes(Version.V4_0_4))) - .put("lang.StrictMath.powDD.StrictMath_pow_A01", match(runtimes(Version.V4_0_4))) - .put("lang.String.indexOfII.String_indexOf_A01", match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) + .put("lang.Math.sqrtD.Math_sqrt_A01", match(runtimes(Runtime.ART_V4_0_4))) + .put("lang.StrictMath.cbrtD.StrictMath_cbrt_A01", match(runtimes(Runtime.ART_V4_0_4))) + .put("lang.StrictMath.log10D.StrictMath_log10_A01", match(runtimes(Runtime.ART_V4_0_4))) + .put( + "lang.StrictMath.powDD.StrictMath_pow_A01", + match(runtimes(Runtime.ART_V4_0_4, Runtime.JAVA))) + .put("lang.String.indexOfII.String_indexOf_A01", match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.String.indexOfLjava_lang_StringI.String_indexOf_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getByteLjava_lang_ObjectI.Array_getByte_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getDoubleLjava_lang_ObjectI.Array_getDouble_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getDoubleLjava_lang_ObjectI.Array_getDouble_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getFloatLjava_lang_ObjectI.Array_getFloat_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getFloatLjava_lang_ObjectI.Array_getFloat_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getIntLjava_lang_ObjectI.Array_getInt_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getIntLjava_lang_ObjectI.Array_getInt_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getLongLjava_lang_ObjectI.Array_getLong_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getLongLjava_lang_ObjectI.Array_getLong_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.getShortLjava_lang_ObjectI.Array_getShort_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.setBooleanLjava_lang_ObjectIZ.Array_setBoolean_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.setCharLjava_lang_ObjectIC.Array_setChar_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.setLjava_lang_ObjectILjava_lang_Object.Array_set_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Array.setLjava_lang_ObjectILjava_lang_Object.Array_set_A03", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "lang.reflect.Constructor.toString.Constructor_toString_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "math.BigInteger.modPowLjava_math_BigIntegerLjava_math_Integer.BigInteger_modPow_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "util.concurrent.LinkedBlockingDeque.drainToLjava_util_CollectionI.LinkedBlockingDeque_drainTo_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) .put( "util.concurrent.LinkedBlockingQueue.drainToLjava_util_CollectionI.LinkedBlockingQueue_drainTo_A01", - match(runtimes(Version.V4_0_4))) + match(runtimes(Runtime.ART_V4_0_4))) + .put( + "lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", match(runtimes(Runtime.JAVA))) + .put( + "lang.AssertionError.ConstructorLjava_lang_Object.AssertionError_Constructor_A01", + match(runtimes(Runtime.ART_V4_0_4))) + .put( + "lang.RuntimePermission.Class.RuntimePermission_class_A13", + match(runtimes(Runtime.JAVA))) + .put( + "lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", match(runtimes(Runtime.JAVA))) + .put( + "lang.Runtime.addShutdownHookLjava_lang_Thread.Runtime_addShutdownHook_A02", + match(runtimes(Runtime.JAVA))) + .put( + "lang.ref.PhantomReference.clear.PhantomReference_clear_A01", + match(runtimes(Runtime.JAVA))) + .put( + "lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", + match(runtimes(Runtime.JAVA))) + .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", match(runtimes(Runtime.JAVA))) + .put( + "lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02", + match(runtimes(Runtime.JAVA))) + .put( + "lang.String.replaceFirstLjava_lang_StringLjava_lang_String.String_replaceFirst_A01", + match(runtimes(Runtime.JAVA))) + .put( + "lang.String.replaceAllLjava_lang_StringLjava_lang_String.String_replaceAll_A01", + match(runtimes(Runtime.JAVA))) + .put( + "lang.System.inheritedChannel.System_inheritedChannel_A01", + match(runtimes(Runtime.JAVA))) .build(); // end of failuresToTriage - public static final Multimap<String, TestCondition> flakyWithArt = + public static final Multimap<String, TestCondition> flakyWhenRun = new ImmutableListMultimap.Builder<String, TestCondition>() - - .put("lang.Object.notifyAll.Object_notifyAll_A03", any()) - - - - .put("lang.Object.notify.Object_notify_A03", any()) - - - + .put("lang.Object.notifyAll.Object_notifyAll_A03", anyDexVm()) + .put("lang.Object.notify.Object_notify_A03", anyDexVm()) .put( "util.concurrent.ConcurrentSkipListSet.addLjava_lang_Object.ConcurrentSkipListSet_add_A01", any()) - - - - .put("util.concurrent.SynchronousQueue.ConstructorZ", any()) - - - - - .put("lang.Thread.interrupt.Thread_interrupt_A04", any()) - - - - - .put("util.concurrent.SynchronousQueue.ConstructorZ.SynchronousQueue_Constructor_A01", - any()) - - - - - .put("lang.Thread.getState.Thread_getState_A01", any()) - - - - + .put("util.concurrent.SynchronousQueue.ConstructorZ", anyDexVm()) + .put("lang.Thread.interrupt.Thread_interrupt_A04", anyDexVm()) + .put( + "util.concurrent.SynchronousQueue.ConstructorZ.SynchronousQueue_Constructor_A01", + anyDexVm()) + .put("lang.Thread.getState.Thread_getState_A01", anyDexVm()) .put( "util.concurrent.ScheduledThreadPoolExecutor.getTaskCount.ScheduledThreadPoolExecutor_getTaskCount_A01", any()) + .put( + "lang.ref.PhantomReference.clear.PhantomReference_clear_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.SoftReference.clear.SoftReference_clear_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.WeakReference.clear.WeakReference_clear_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", anyDexVm()) + .put( + "lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put( + "lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01", + match(TestCondition.artRuntimesUpTo(Runtime.ART_V4_4_4))) + .put("lang.Runtime.gc.Runtime_gc_A01", match(runtimes(Runtime.JAVA))) + .build(); // end of flakyWhenRun - - - .put("lang.ref.PhantomReference.clear.PhantomReference_clear_A01", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.ref.SoftReference.clear.SoftReference_clear_A01", - match(runtimesUpTo(Version.V4_4_4))) - .put("lang.ref.WeakReference.clear.WeakReference_clear_A01", - match(runtimesUpTo(Version.V4_4_4))) - - - .put("lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01", - match(runtimesUpTo(Version.V4_4_4))) - - .put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", any()) - - - - .put("lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01", - match(runtimesUpTo(Version.V4_4_4))) - - - - .put("lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01", - match(runtimesUpTo(Version.V4_4_4))) - - - .put("lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01", - match(runtimesUpTo(Version.V4_4_4))) - - - - .put("lang.ref.ReferenceQueue.poll.ReferenceQueue_poll_A01", - match(runtimesUpTo(Version.V4_4_4))) - - - .put("lang.AssertionError.ConstructorLjava_lang_Object.AssertionError_Constructor_A01", - match(runtimes(Version.V4_0_4))) - - - - - .build(); // end of flakyWithArt - - public static final Multimap<String, TestCondition> timeoutsWithArt = + public static final Multimap<String, TestCondition> timeoutsWhenRun = new ImmutableListMultimap.Builder<String, TestCondition>() - .put("lang.Thread.interrupt.Thread_interrupt_A01", any()) - .put("lang.Thread.resume.Thread_resume_A01", any()) - .put("lang.Thread.stop.Thread_stop_A01", any()) - .put("lang.Thread.suspend.Thread_suspend_A01", any()) + .put("lang.Thread.interrupt.Thread_interrupt_A01", anyDexVm()) + .put("lang.Thread.resume.Thread_resume_A01", anyDexVm()) + .put("lang.Thread.stop.Thread_stop_A01", anyDexVm()) + .put("lang.Thread.suspend.Thread_suspend_A01", anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A04", - any()) + anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A03", - any()) + anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_StringJ.Thread_Constructor_A05", - any()) - .put("lang.Thread.setNameLjava_lang_String.Thread_setName_A02", any()) - .put("lang.Thread.stop.Thread_stop_A02", any()) + anyDexVm()) + .put("lang.Thread.setNameLjava_lang_String.Thread_setName_A02", anyDexVm()) + .put("lang.Thread.stop.Thread_stop_A02", anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A02", - any()) + anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A03", - any()) - .put("lang.Thread.getStackTrace.Thread_getStackTrace_A03", any()) + anyDexVm()) + .put("lang.Thread.getStackTrace.Thread_getStackTrace_A03", anyDexVm()) .put( "lang.Thread.setDefaultUncaughtExceptionHandler.Thread_setDefaultUncaughtExceptionHandler_A02", - any()) - .put("lang.Thread.checkAccess.Thread_checkAccess_A01", any()) + anyDexVm()) + .put("lang.Thread.checkAccess.Thread_checkAccess_A01", anyDexVm()) .put( "lang.Thread.ConstructorLjava_lang_ThreadGroupLjava_lang_RunnableLjava_lang_String.Thread_Constructor_A04", - any()) - .put("lang.Thread.setUncaughtExceptionHandler.Thread_setUncaughtExceptionHandler_A02", - any()) - .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", any()) - .put("lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A02", any()) + anyDexVm()) + .put( + "lang.Thread.setUncaughtExceptionHandler.Thread_setUncaughtExceptionHandler_A02", + anyDexVm()) + .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A01", anyDexVm()) + .put("lang.Thread.getAllStackTraces.Thread_getAllStackTraces_A02", anyDexVm()) .put( "lang.Thread.setContextClassLoaderLjava_lang_ClassLoader.Thread_setContextClassLoader_A02", - any()) - .put("lang.Thread.setPriorityI.Thread_setPriority_A02", any()) - .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", any()) - .put("lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04", - any()) - .put("lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A02", any()) - .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A02", any()) - .put("lang.Thread.setDaemonZ.Thread_setDaemon_A03", any()) - .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A07", any()) + anyDexVm()) + .put("lang.Thread.setPriorityI.Thread_setPriority_A02", anyDexVm()) + .put("lang.Thread.stopLjava_lang_Throwable.Thread_stop_A02", anyDexVm()) + .put( + "lang.Runtime.execLjava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04", + anyDexVm()) + .put("lang.Thread.getContextClassLoader.Thread_getContextClassLoader_A02", anyDexVm()) + .put("lang.ThreadGroup.suspend.ThreadGroup_suspend_A02", anyDexVm()) + .put("lang.Thread.setDaemonZ.Thread_setDaemon_A03", anyDexVm()) + .put("lang.ProcessBuilder.environment.ProcessBuilder_environment_A07", anyDexVm()) .put( "lang.Runtime.exec_Ljava_lang_String_Ljava_lang_StringLjava_io_File.Runtime_exec_A04", - any()) - .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A04", any()) - .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A04", any()) - .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A04", any()) - .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A03", any()) - .put("lang.System.getSecurityManager.System_getSecurityManager_A01", any()) - .put("lang.System.setInLjava_io_InputStream.System_setIn_A02", any()) - .put("lang.System.setOutLjava_io_PrintStream.System_setOut_A02", any()) - .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", any()) - .put("lang.ThreadGroup.enumerate_ThreadGroupZ.ThreadGroup_enumerate_A03", any()) - .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A03", any()) - .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A03", any()) - .put("lang.ThreadGroup.interrupt.ThreadGroup_interrupt_A02", any()) - .put("lang.ThreadGroup.resume.ThreadGroup_resume_A02", any()) - .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02", any()) - .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A04", any()) - .put("lang.System.getenvLjava_lang_String.System_getenv_A03", any()) - .put("lang.System.setPropertyLjava_lang_StringLjava_lang_String.System_setProperty_A02", - any()) - .put("lang.ThreadGroup.enumerate_ThreadGroup.ThreadGroup_enumerate_A03", any()) - .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A02", any()) - .put("lang.ThreadGroup.setDaemonZ.ThreadGroup_setDaemon_A02", any()) - .put("lang.ThreadGroup.stop.ThreadGroup_stop_A02", any()) - .put("lang.Class.getSuperclass.Class_getSuperclass_A01", any()) - .put("lang.System.getenv.System_getenv_A03", any()) - .put("lang.System.inheritedChannel.System_inheritedChannel_A01", any()) + anyDexVm()) + .put("lang.Runtime.execLjava_lang_String_Ljava_lang_String.Runtime_exec_A04", anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String.Runtime_exec_A04", anyDexVm()) + .put("lang.Runtime.execLjava_lang_String.Runtime_exec_A04", anyDexVm()) + .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A03", anyDexVm()) + .put("lang.System.getSecurityManager.System_getSecurityManager_A01", anyDexVm()) + .put("lang.System.setInLjava_io_InputStream.System_setIn_A02", anyDexVm()) + .put("lang.System.setOutLjava_io_PrintStream.System_setOut_A02", anyDexVm()) + .put("lang.ThreadGroup.destroy.ThreadGroup_destroy_A04", anyDexVm()) + .put("lang.ThreadGroup.enumerate_ThreadGroupZ.ThreadGroup_enumerate_A03", anyDexVm()) + .put("lang.ThreadGroup.enumerate_Thread.ThreadGroup_enumerate_A03", anyDexVm()) + .put("lang.ThreadGroup.enumerate_ThreadZ.ThreadGroup_enumerate_A03", anyDexVm()) + .put("lang.ThreadGroup.interrupt.ThreadGroup_interrupt_A02", anyDexVm()) + .put("lang.ThreadGroup.resume.ThreadGroup_resume_A02", anyDexVm()) + .put("lang.ThreadGroup.setMaxPriorityI.ThreadGroup_setMaxPriority_A02", anyDexVm()) + .put("lang.Runtime.exec_Ljava_lang_String_Ljava_lang_String.Runtime_exec_A04", anyDexVm()) + .put("lang.System.getenvLjava_lang_String.System_getenv_A03", anyDexVm()) + .put( + "lang.System.setPropertyLjava_lang_StringLjava_lang_String.System_setProperty_A02", + anyDexVm()) + .put("lang.ThreadGroup.enumerate_ThreadGroup.ThreadGroup_enumerate_A03", anyDexVm()) + .put("lang.ThreadGroup.getParent.ThreadGroup_getParent_A02", anyDexVm()) + .put("lang.ThreadGroup.setDaemonZ.ThreadGroup_setDaemon_A02", anyDexVm()) + .put("lang.ThreadGroup.stop.ThreadGroup_stop_A02", anyDexVm()) + .put("lang.Class.getSuperclass.Class_getSuperclass_A01", anyDexVm()) + .put("lang.System.getenv.System_getenv_A03", anyDexVm()) + .put("lang.System.inheritedChannel.System_inheritedChannel_A01", anyDexVm()) .put( "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01", - any()) - .put("lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A03", - any()) - .put("lang.System.setErrLjava_io_PrintStream.System_setErr_A02", any()) + anyDexVm()) + .put( + "lang.System.arraycopyLjava_lang_ObjectILjava_lang_ObjectII.System_arraycopy_A03", + anyDexVm()) + .put("lang.System.setErrLjava_io_PrintStream.System_setErr_A02", anyDexVm()) .put( "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01", - any()) + anyDexVm()) .put( "lang.System.setSecurityManagerLjava_lang_SecurityManager.System_setSecurityManager_A01", - any()) + anyDexVm()) .put( "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01", - any()) + anyDexVm()) .put( "util.concurrent.ArrayBlockingQueue.containsLjava_lang_Object.ArrayBlockingQueue_contains_A01", - any()) - .put("lang.System.setPropertiesLjava_util_Properties.System_setProperties_A01", any()) + anyDexVm()) + .put( + "lang.System.setPropertiesLjava_util_Properties.System_setProperties_A01", anyDexVm()) .put( "util.concurrent.CopyOnWriteArrayList.ConstructorLjava_util_Collection.CopyOnWriteArrayList_Constructor_A02", - any()) + anyDexVm()) .put("util.concurrent.CyclicBarrier.reset.CyclicBarrier_reset_A03", any()) - .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A01", any()) - .put("lang.System.getenv.System_getenv_A04", any()) - .put("lang.RuntimePermission.Class.RuntimePermission_class_A02", any()) - .put("lang.RuntimePermission.Class.RuntimePermission_class_A13", any()) - .build(); // end of timeoutsWithArt + .put("lang.System.clearPropertyLjava_lang_String.System_clearProperty_A01", anyDexVm()) + .put("lang.System.getenv.System_getenv_A04", anyDexVm()) + .put("lang.RuntimePermission.Class.RuntimePermission_class_A02", anyDexVm()) + .put("lang.RuntimePermission.Class.RuntimePermission_class_A13", anyDexVm()) + .build(); // end of timeoutsWhenRun public static final Multimap<String, TestCondition> requiresInliningDisabled = new ImmutableListMultimap.Builder<String, TestCondition>() @@ -1605,15 +1821,18 @@ .put("lang.Thread.dumpStack.Thread_dumpStack_A01", match(R8_COMPILER)) .build(); + public static final Set<String> compilationFailsWithAsmMethodTooLarge = + ImmutableSet.of("lang.StrictMath.powDD.StrictMath_pow_A01"); + private static final boolean testMatch( Multimap<String, TestCondition> testConditions, String name, CompilerUnderTest compilerUnderTest, - DexVm dexVm, + Runtime runtime, CompilationMode compilationMode) { Collection<TestCondition> entries = testConditions.get(name); for (TestCondition entry : entries) { - if (entry.test(DexTool.NONE, compilerUnderTest, dexVm.getVersion(), compilationMode)) { + if (entry.test(DexTool.NONE, compilerUnderTest, runtime, compilationMode)) { return true; } } @@ -1623,28 +1842,28 @@ public static final <T> T getExpectedOutcome( String name, CompilerUnderTest compilerUnderTest, - DexVm dexVm, + Runtime runtime, CompilationMode compilationMode, BiFunction<Outcome, Boolean, T> consumer) { Outcome outcome = null; - if (testMatch(failuresToTriage, name, compilerUnderTest, dexVm, compilationMode)) { - outcome = Outcome.FAILS_WITH_ART; + if (testMatch(failuresToTriage, name, compilerUnderTest, runtime, compilationMode)) { + outcome = Outcome.FAILS_WHEN_RUN; } - if (testMatch(timeoutsWithArt, name, compilerUnderTest, dexVm, compilationMode)) { + if (testMatch(timeoutsWhenRun, name, compilerUnderTest, runtime, compilationMode)) { assert outcome == null; - outcome = Outcome.TIMEOUTS_WITH_ART; + outcome = Outcome.TIMEOUTS_WHEN_RUN; } - if (testMatch(flakyWithArt, name, compilerUnderTest, dexVm, compilationMode)) { + if (testMatch(flakyWhenRun, name, compilerUnderTest, runtime, compilationMode)) { assert outcome == null; - outcome = Outcome.FLAKY_WITH_ART; + outcome = Outcome.FLAKY_WHEN_RUN; } if (outcome == null) { outcome = Outcome.PASSES; } - boolean disableInlining = testMatch(requiresInliningDisabled, name, compilerUnderTest, dexVm, - compilationMode); + boolean disableInlining = + testMatch(requiresInliningDisabled, name, compilerUnderTest, runtime, compilationMode); return consumer.apply(outcome, disableInlining); } }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java index 3ef4037..0f2cf17 100644 --- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java +++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -7,6 +7,7 @@ import static org.junit.Assert.fail; import com.android.tools.r8.JctfTestSpecifications.Outcome; +import com.android.tools.r8.TestCondition.Runtime; import com.android.tools.r8.TestCondition.RuntimeSet; import com.android.tools.r8.ToolHelper.ArtCommandBuilder; import com.android.tools.r8.ToolHelper.DexVm; @@ -81,7 +82,8 @@ D8, R8, R8_AFTER_D8, // refers to the R8 (default: debug) step but implies a previous D8 step as well - D8_AFTER_R8CF + D8_AFTER_R8CF, + R8CF } public static final String ART_TESTS_DIR = "tests/2017-10-04/art"; @@ -1090,8 +1092,8 @@ private final DexTool dexTool; // Native library to use for running this test - if any. private final String nativeLibrary; - // Skip running this test with Art - most likely due to timeout. - private final boolean skipArt; + // Skip running this test with Art or Java - most likely due to timeout. + private final boolean skipRun; // Skip running this test altogether. For example, there might be no input in this configuration // (e.g. no class files). private final boolean skipTest; @@ -1099,9 +1101,9 @@ private final boolean failsWithX8; // Expected to fail compilation with a CompilationError. private final boolean expectedToFailWithX8; - // Fails running the output in Art with an assertion error. Typically due to verification - // errors. - private final boolean failsWithArt; + // Fails running the output in Art or on Java with an assertion error. On Art it's typically due + // to verification errors. + private final boolean failsOnRun; // Runs in art but fails the run because it produces different results. private final boolean failsWithArtOutput; // Original fails in art but the R8/D8 version can run in art. @@ -1119,10 +1121,10 @@ String name, DexTool dexTool, File directory, - boolean skipArt, + boolean skipRun, boolean skipTest, boolean failsWithX8, - boolean failsWithArt, + boolean failsOnRun, boolean failsWithArtOutput, boolean failsWithArtOriginalOnly, String nativeLibrary, @@ -1130,16 +1132,15 @@ boolean outputMayDiffer, boolean disableInlining, boolean disableClassInlining, - boolean hasMissingClasses, - DexVm dexVm) { + boolean hasMissingClasses) { this.name = name; this.dexTool = dexTool; this.nativeLibrary = nativeLibrary; this.directory = directory; - this.skipArt = skipArt; - this.skipTest = skipTest || (ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST); + this.skipRun = skipRun; + this.skipTest = skipTest; this.failsWithX8 = failsWithX8; - this.failsWithArt = failsWithArt; + this.failsOnRun = failsOnRun; this.failsWithArtOutput = failsWithArtOutput; this.failsWithArtOriginalOnly = failsWithArtOriginalOnly; this.expectedToFailWithX8 = expectedToFailWithX8; @@ -1153,18 +1154,18 @@ String name, DexTool dexTool, File directory, - boolean skipArt, - boolean failsWithArt, + boolean skipRun, + boolean failsOnRun, boolean disableInlining, DexVm dexVm) { this( name, dexTool, directory, - skipArt, + skipRun, + ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST, false, - false, - failsWithArt, + failsOnRun, false, false, null, @@ -1172,8 +1173,32 @@ false, disableInlining, true, // Disable class inlining for JCTF tests. + false); + } + + TestSpecification( + String name, + DexTool dexTool, + File directory, + boolean skipRun, + boolean failsOnRun, + boolean disableInlining) { + this( + name, + dexTool, + directory, + skipRun, false, - dexVm); + false, + failsOnRun, + false, + false, + null, + false, + false, + disableInlining, + true, // Disable class inlining for JCTF tests. + false); } public File resolveFile(String name) { @@ -1249,7 +1274,8 @@ skipTest.addAll(failuresToTriage); File artTestDir = - dexTool == DexTool.JACK || LEGACY_RUNTIME.set.contains(version) ? legacyArtTestDir + dexTool == DexTool.JACK || LEGACY_RUNTIME.contains(Runtime.fromDexVmVersion(version)) + ? legacyArtTestDir : defaultArtTestDir; // Collect the tests failing code generation. Set<String> failsWithCompiler = @@ -1327,7 +1353,7 @@ dexTool, testDir, skipArt.contains(name), - skip, + skip || ToolHelper.isWindows() && dexVm.getKind() == Kind.HOST, failsWithCompiler.contains(name), failsWithArt.contains(name), failsRunWithArtOutput.contains(name), @@ -1337,8 +1363,7 @@ outputMayDiffer.contains(name), requireInliningToBeDisabled.contains(name), requireClassInliningToBeDisabled.contains(name), - hasMissingClasses.contains(name), - dexVm)); + hasMissingClasses.contains(name))); } } return data; @@ -1348,6 +1373,7 @@ CompilationMode compilationMode = null; switch (compilerUnderTest) { case R8: + case R8CF: compilationMode = CompilationMode.RELEASE; break; case D8: @@ -1534,19 +1560,27 @@ break; } case R8: + case R8CF: { + boolean cfBackend = compilerUnderTest == CompilerUnderTest.R8CF; R8Command.Builder builder = R8Command.builder() .setMode(mode) - .setOutput(Paths.get(resultPath), OutputMode.DexIndexed); + .setOutput( + Paths.get(resultPath), + cfBackend ? OutputMode.ClassFile : OutputMode.DexIndexed); // Add program files directly to the underlying app to avoid errors on DEX inputs. ToolHelper.getAppBuilder(builder).addProgramFiles(ListUtils.map(fileNames, Paths::get)); - AndroidApiLevel minSdkVersion = needMinSdkVersion.get(name); - if (minSdkVersion != null) { - builder.setMinApiLevel(minSdkVersion.getLevel()); - ToolHelper.addFilteredAndroidJar(builder, minSdkVersion); + if (cfBackend) { + builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar()); } else { - ToolHelper.addFilteredAndroidJar(builder, AndroidApiLevel.getDefault()); + AndroidApiLevel minSdkVersion = needMinSdkVersion.get(name); + if (minSdkVersion != null) { + builder.setMinApiLevel(minSdkVersion.getLevel()); + ToolHelper.addFilteredAndroidJar(builder, minSdkVersion); + } else { + ToolHelper.addFilteredAndroidJar(builder, AndroidApiLevel.getDefault()); + } } if (keepRulesFile != null) { builder.addProguardConfigurationFiles(Paths.get(keepRulesFile)); @@ -1632,18 +1666,36 @@ name, dexTool, resultDir, - outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WITH_ART - || outcome == JctfTestSpecifications.Outcome.FLAKY_WITH_ART, - outcome == JctfTestSpecifications.Outcome.FAILS_WITH_ART, + outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WHEN_RUN + || outcome == JctfTestSpecifications.Outcome.FLAKY_WHEN_RUN, + outcome == JctfTestSpecifications.Outcome.FAILS_WHEN_RUN, noInlining, dexVm); } + private static BiFunction<Outcome, Boolean, TestSpecification> jctfOutcomeToSpecificationJava( + String name, File resultDir) { + return (outcome, noInlining) -> + new TestSpecification( + name, + DexTool.NONE, + resultDir, + outcome == JctfTestSpecifications.Outcome.TIMEOUTS_WHEN_RUN + || outcome == JctfTestSpecifications.Outcome.FLAKY_WHEN_RUN, + outcome == JctfTestSpecifications.Outcome.FAILS_WHEN_RUN, + noInlining); + } + protected void runJctfTest(CompilerUnderTest compilerUnderTest, String classFilePath, String fullClassName) throws IOException, ProguardRuleParserException, ExecutionException, CompilationFailedException { - DexVm dexVm = ToolHelper.getDexVm(); + Runtime runtime; + if (compilerUnderTest == CompilerUnderTest.R8CF) { + runtime = Runtime.JAVA; + } else { + runtime = Runtime.fromDexVmVersion(ToolHelper.getDexVm().getVersion()); + } CompilerUnderTest firstCompilerUnderTest = compilerUnderTest == CompilerUnderTest.R8_AFTER_D8 @@ -1657,9 +1709,11 @@ JctfTestSpecifications.getExpectedOutcome( name, firstCompilerUnderTest, - dexVm, + runtime, compilationMode, - jctfOutcomeToSpecification(name, DexTool.NONE, resultDir, dexVm)); + compilerUnderTest == CompilerUnderTest.R8CF + ? jctfOutcomeToSpecificationJava(name, resultDir) + : jctfOutcomeToSpecification(name, DexTool.NONE, resultDir, ToolHelper.getDexVm())); if (specification.skipTest) { return; @@ -1724,14 +1778,19 @@ fileNames.add(f.getCanonicalPath()); } - runJctfTestDoRunOnArt( - fileNames, - specification, - firstCompilerUnderTest, - fullClassName, - compilationMode, - dexVm, - resultDir); + if (compilerUnderTest == CompilerUnderTest.R8CF) { + runJctfTestDoRunOnJava(fileNames, specification, fullClassName, compilationMode, resultDir); + } else { + + runJctfTestDoRunOnArt( + fileNames, + specification, + firstCompilerUnderTest, + fullClassName, + compilationMode, + ToolHelper.getDexVm(), + resultDir); + } // second pass if D8_R8Debug if (compilerUnderTest == CompilerUnderTest.R8_AFTER_D8) { @@ -1746,9 +1805,9 @@ JctfTestSpecifications.getExpectedOutcome( name, CompilerUnderTest.R8_AFTER_D8, - dexVm, + runtime, compilationMode, - jctfOutcomeToSpecification(name, DexTool.DX, r8ResultDir, dexVm)); + jctfOutcomeToSpecification(name, DexTool.DX, r8ResultDir, ToolHelper.getDexVm())); if (specification.skipTest) { return; } @@ -1758,7 +1817,7 @@ CompilerUnderTest.R8, fullClassName, compilationMode, - dexVm, + ToolHelper.getDexVm(), r8ResultDir); } } @@ -1771,8 +1830,7 @@ CompilationMode mode, DexVm dexVm, File resultDir) - throws IOException, ProguardRuleParserException, ExecutionException, - CompilationFailedException { + throws IOException, CompilationFailedException { executeCompilerUnderTest(compilerUnderTest, fileNames, resultDir.getAbsolutePath(), mode, specification.disableInlining, specification.disableClassInlining, specification.hasMissingClasses); @@ -1797,7 +1855,7 @@ } boolean compileOnly = System.getProperty("jctf_compile_only", "0").equals("1"); - if (compileOnly || specification.skipArt) { + if (compileOnly || specification.skipRun) { if (ToolHelper.isDex2OatSupported()) { // verify dex code instead of running it Path oatFile = temp.getRoot().toPath().resolve("all.oat"); @@ -1816,7 +1874,7 @@ builder.setMainClass(JUNIT_TEST_RUNNER); builder.appendProgramArgument(fullClassName); - if (specification.failsWithArt) { + if (specification.failsOnRun) { expectException(AssertionError.class); } @@ -1827,10 +1885,54 @@ specification.resolveFile("classes.dex"), e); throw e; } - if (specification.failsWithArt) { - System.err.println("Should have failed run with art"); + if (specification.failsOnRun) { + System.err.println("Should have failed run with art."); + } + } + + private void runJctfTestDoRunOnJava( + Collection<String> fileNames, + TestSpecification specification, + String fullClassName, + CompilationMode mode, + File resultDir) + throws IOException, CompilationFailedException { + if (JctfTestSpecifications.compilationFailsWithAsmMethodTooLarge.contains(specification.name)) { + expectException(org.objectweb.asm.MethodTooLargeException.class); + } + executeCompilerUnderTest( + CompilerUnderTest.R8CF, + fileNames, + resultDir.getAbsolutePath(), + mode, + specification.disableInlining, + specification.disableClassInlining, + specification.hasMissingClasses); + + boolean compileOnly = System.getProperty("jctf_compile_only", "0").equals("1"); + + if (compileOnly || specification.skipRun) { return; } + + if (specification.failsOnRun) { + expectException(AssertionError.class); + } + + ProcessResult result = ToolHelper.runJava(resultDir.toPath(), JUNIT_TEST_RUNNER, fullClassName); + + if (result.exitCode != 0) { + throw new AssertionError( + "Test failed on java.\nSTDOUT >>>\n" + + result.stdout + + "\n<<< STDOUT\nSTDERR >>>\n" + + result.stderr + + "\n<<< STDERR\n"); + } + + if (specification.failsOnRun) { + System.err.println("Should have failed run with java."); + } } protected void runArtTest(DexVm dexVm, CompilerUnderTest compilerUnderTest) throws Throwable { @@ -1972,7 +2074,8 @@ specification.hasMissingClasses); } - if (!specification.skipArt && (ToolHelper.artSupported() || ToolHelper.dealsWithGoldenFiles())) { + if (!specification.skipRun + && (ToolHelper.artSupported() || ToolHelper.dealsWithGoldenFiles())) { File originalFile; File processedFile; @@ -1992,7 +2095,7 @@ File expectedFile = specification.resolveFile("expected.txt"); String expected = com.google.common.io.Files.asCharSource(expectedFile, Charsets.UTF_8).read(); - if (specification.failsWithArt) { + if (specification.failsOnRun) { expectException(AssertionError.class); } @@ -2005,7 +2108,7 @@ specification.resolveFile("classes.dex"), e); throw e; } - if (specification.failsWithArt) { + if (specification.failsOnRun) { System.err.println("Should have failed run with art"); return; }
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java index b85e2f2..865ca12 100644 --- a/src/test/java/com/android/tools/r8/TestCondition.java +++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -6,13 +6,52 @@ import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest; import com.android.tools.r8.R8RunArtTestsTest.DexTool; import com.android.tools.r8.ToolHelper.DexVm; +import com.android.tools.r8.errors.Unreachable; +import com.google.common.collect.Sets; +import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; -import java.util.Set; +import java.util.List; import java.util.stream.Collectors; public class TestCondition { + enum Runtime { + ART_V4_0_4, + ART_V4_4_4, + ART_V5_1_1, + ART_V6_0_1, + ART_V7_0_0, + ART_DEFAULT, + JAVA; + + static final Runtime LOWEST_ART_VERSION = ART_V4_0_4; + static final Runtime HIGHEST_ART_VERSION = ART_DEFAULT; + + static Runtime fromDexVmVersion(DexVm.Version version) { + switch (version) { + case V4_0_4: + return ART_V4_0_4; + case V4_4_4: + return ART_V4_4_4; + case V5_1_1: + return ART_V5_1_1; + case V6_0_1: + return ART_V6_0_1; + case V7_0_0: + return ART_V7_0_0; + case DEFAULT: + return ART_DEFAULT; + default: + throw new Unreachable(); + } + } + + static boolean isArt(Runtime runtime) { + return EnumSet.range(LOWEST_ART_VERSION, HIGHEST_ART_VERSION).contains(runtime); + } + } + static class ToolSet { final EnumSet<DexTool> set; @@ -33,14 +72,22 @@ static class RuntimeSet { - final EnumSet<DexVm.Version> set; + private EnumSet<Runtime> set; - public RuntimeSet(EnumSet<DexVm.Version> set) { + public RuntimeSet(EnumSet<Runtime> set) { this.set = set; } - public RuntimeSet(Set<DexVm.Version> set) { - this.set = EnumSet.copyOf(set); + public static RuntimeSet fromDexVmVersionSet(EnumSet<DexVm.Version> dexVmSet) { + List<Runtime> list = new ArrayList<>(dexVmSet.size()); + for (DexVm.Version version : dexVmSet) { + list.add(Runtime.fromDexVmVersion(version)); + } + return new RuntimeSet(EnumSet.copyOf(list)); + } + + boolean contains(Runtime runtime) { + return set.contains(runtime); } } @@ -63,12 +110,15 @@ // settings, respectively public static final CompilerSet R8_COMPILER = compilers( - CompilerUnderTest.R8, CompilerUnderTest.R8_AFTER_D8, CompilerUnderTest.D8_AFTER_R8CF); + CompilerUnderTest.R8, + CompilerUnderTest.R8_AFTER_D8, + CompilerUnderTest.D8_AFTER_R8CF, + CompilerUnderTest.R8CF); public static final CompilerSet R8DEX_COMPILER = compilers(CompilerUnderTest.R8, CompilerUnderTest.R8_AFTER_D8); public static final CompilerSet R8_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8_AFTER_D8); public static final CompilerSet R8_NOT_AFTER_D8_COMPILER = - compilers(CompilerUnderTest.R8, CompilerUnderTest.D8_AFTER_R8CF); + compilers(CompilerUnderTest.R8, CompilerUnderTest.D8_AFTER_R8CF, CompilerUnderTest.R8CF); public static final CompilerSet R8DEX_NOT_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8); public static final CompilationModeSet DEBUG_MODE = @@ -79,23 +129,25 @@ private static final ToolSet ANY_TOOL = new ToolSet(EnumSet.allOf(DexTool.class)); private static final CompilerSet ANY_COMPILER = new CompilerSet(EnumSet.allOf(CompilerUnderTest.class)); - private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(DexVm.Version.class)); + private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(Runtime.class)); + private static final RuntimeSet ANY_DEX_VM_RUNTIME = + RuntimeSet.fromDexVmVersionSet(EnumSet.allOf(ToolHelper.DexVm.Version.class)); private static final CompilationModeSet ANY_MODE = new CompilationModeSet(EnumSet.allOf(CompilationMode.class)); private final EnumSet<DexTool> dexTools; private final EnumSet<CompilerUnderTest> compilers; - private final EnumSet<DexVm.Version> dexVms; + private final EnumSet<Runtime> runtimes; private final EnumSet<CompilationMode> compilationModes; public TestCondition( EnumSet<DexTool> dexTools, EnumSet<CompilerUnderTest> compilers, - EnumSet<DexVm.Version> dexVms, + EnumSet<Runtime> runtimes, EnumSet<CompilationMode> compilationModes) { this.dexTools = dexTools; this.compilers = compilers; - this.dexVms = dexVms; + this.runtimes = runtimes; this.compilationModes = compilationModes; } @@ -111,20 +163,48 @@ public static RuntimeSet runtimes(DexVm.Version... runtimes) { assert runtimes.length > 0; + return RuntimeSet.fromDexVmVersionSet(EnumSet.copyOf(Arrays.asList(runtimes))); + } + + public static RuntimeSet runtimes(Runtime... runtimes) { + assert runtimes.length > 0; return new RuntimeSet(EnumSet.copyOf(Arrays.asList(runtimes))); } public static RuntimeSet runtimesUpTo(DexVm.Version upto) { - return new RuntimeSet(EnumSet.range(DexVm.Version.first(), upto)); + return RuntimeSet.fromDexVmVersionSet(EnumSet.range(DexVm.Version.first(), upto)); + } + + public static RuntimeSet artRuntimesUpTo(Runtime upto) { + assert Runtime.isArt(upto); + return new RuntimeSet(EnumSet.range(Runtime.LOWEST_ART_VERSION, upto)); + } + + public static RuntimeSet artRuntimesUpToAndJava(Runtime upto) { + return runtimes( + Sets.union(artRuntimesUpTo(upto).set, runtimes(Runtime.JAVA).set).toArray(new Runtime[0])); } public static RuntimeSet runtimesFrom(DexVm.Version start) { - return new RuntimeSet(EnumSet.range(start, DexVm.Version.last())); + return RuntimeSet.fromDexVmVersionSet(EnumSet.range(start, DexVm.Version.last())); + } + + public static RuntimeSet artRuntimesFrom(Runtime start) { + assert Runtime.isArt(start); + return new RuntimeSet(EnumSet.range(start, Runtime.HIGHEST_ART_VERSION)); + } + + public static RuntimeSet artRuntimesFromAndJava(Runtime start) { + return runtimes( + Sets.union(artRuntimesFrom(start).set, runtimes(Runtime.JAVA).set).toArray(new Runtime[0])); } public static RuntimeSet and(RuntimeSet... sets) { - return new RuntimeSet(Arrays.stream(sets).flatMap(runtimeSet -> runtimeSet.set.stream()) - .collect(Collectors.toSet())); + return new RuntimeSet( + EnumSet.copyOf( + Arrays.stream(sets) + .flatMap(runtimeSet -> runtimeSet.set.stream()) + .collect(Collectors.toSet()))); } public static TestCondition match( @@ -143,6 +223,11 @@ return match(TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME); } + public static TestCondition anyDexVm() { + return match( + TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, TestCondition.ANY_DEX_VM_RUNTIME); + } + public static TestCondition match(ToolSet tools) { return match(tools, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME); } @@ -174,11 +259,19 @@ public boolean test( DexTool dexTool, CompilerUnderTest compilerUnderTest, - DexVm.Version dexVmVersion, + Runtime runtime, CompilationMode compilationMode) { return dexTools.contains(dexTool) && compilers.contains(compilerUnderTest) - && dexVms.contains(dexVmVersion) + && runtimes.contains(runtime) && compilationModes.contains(compilationMode); } + + public boolean test( + DexTool dexTool, + CompilerUnderTest compilerUnderTest, + DexVm.Version version, + CompilationMode compilationMode) { + return test(dexTool, compilerUnderTest, Runtime.fromDexVmVersion(version), compilationMode); + } }
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingTest.java similarity index 98% rename from src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java rename to src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingTest.java index 7ce8a05..3b552c8 100644 --- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java +++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingTest.java
@@ -2,7 +2,7 @@ // 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 com.android.tools.r8.naming; +package com.android.tools.r8.naming.applymapping; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; @@ -18,6 +18,7 @@ import com.android.tools.r8.ToolHelper; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; +import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.FileUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector;
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/CompositionalLenseTest.java similarity index 89% rename from src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java rename to src/test/java/com/android/tools/r8/naming/applymapping/CompositionalLenseTest.java index 711ae60..446a481 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java +++ b/src/test/java/com/android/tools/r8/naming/applymapping/CompositionalLenseTest.java
@@ -1,7 +1,7 @@ // 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 com.android.tools.r8.memberrebinding; +package com.android.tools.r8.naming.applymapping; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static org.junit.Assert.assertEquals; @@ -44,7 +44,7 @@ // Sub#foo ~> Base#foo by member rebinding analysis } -class TestMain { +class CompositionalLenseTestMain { public static void main(String[] args) { // Without regard to the order of member rebinding and apply mapping, // this call should be mapped to X.bar(), not Y.bar() nor Base.foo(). @@ -55,7 +55,7 @@ @RunWith(Parameterized.class) public class CompositionalLenseTest extends TestBase { private final static List<Class> CLASSES = - ImmutableList.of(Base.class, Sub.class, TestMain.class); + ImmutableList.of(Base.class, Sub.class, CompositionalLenseTestMain.class); private Backend backend; @@ -72,9 +72,9 @@ public void test() throws Exception { Path mapPath = temp.newFile("test-mapping.txt").toPath(); List<String> pgMap = ImmutableList.of( - "com.android.tools.r8.memberrebinding.Base -> X:", + "com.android.tools.r8.naming.applymapping.Base -> X:", " void foo() -> bar", - "com.android.tools.r8.memberrebinding.Sub -> Y:", + "com.android.tools.r8.naming.applymapping.Sub -> Y:", " void foo() -> bar" ); FileUtils.writeTextFile(mapPath, pgMap); @@ -84,7 +84,7 @@ builder .addProguardConfiguration( ImmutableList.of( - keepMainProguardConfiguration(TestMain.class), + keepMainProguardConfiguration(CompositionalLenseTestMain.class), "-applymapping " + mapPath, "-dontobfuscate"), // to use the renamed names in test-mapping.txt Origin.unknown()) @@ -97,7 +97,7 @@ options.enableVerticalClassMerging = false; }); CodeInspector codeInspector = new CodeInspector(processedApp); - ClassSubject classSubject = codeInspector.clazz(TestMain.class); + ClassSubject classSubject = codeInspector.clazz(CompositionalLenseTestMain.class); assertThat(classSubject, isPresent()); MethodSubject methodSubject = classSubject.method(CodeInspector.MAIN); assertThat(methodSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionAsmTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionAsmTest.java new file mode 100644 index 0000000..102a6a3 --- /dev/null +++ b/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionAsmTest.java
@@ -0,0 +1,230 @@ +// 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 com.android.tools.r8.naming.applymapping; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertThat; + +import com.android.tools.r8.AsmTestBase; +import com.android.tools.r8.R8Command; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.ToolHelper.ProcessResult; +import com.android.tools.r8.origin.Origin; +import com.android.tools.r8.utils.AndroidApp; +import com.android.tools.r8.utils.FileUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.MethodSubject; +import com.google.common.collect.ImmutableList; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class MemberResolutionAsmTest extends AsmTestBase { + private final Backend backend; + + @Parameterized.Parameters(name = "backend: {0}") + public static Collection<Backend> data() { + return Arrays.asList(Backend.values()); + } + + public MemberResolutionAsmTest(Backend backend) { + this.backend = backend; + } + + // class HasMapping { // : X + // HasMapping() { + // foo(); + // } + // + // void foo() { // : a + // System.out.println("HasMapping#foo"); + // } + // } + // + // class NoMapping extends HasMapping { // : Y + // NoMapping() { + // super(); + // foo(); + // } + // + // private void foo() { // no mapping + // System.out.println("NoMapping#foo"); + // } + // } + // + // class NoMappingMain { + // public static void main(String[] args) { + // new NoMapping(); + // } + // } + @Test + public void test_noMapping() throws Exception { + String main = "NoMappingMain"; + AndroidApp input = buildAndroidApp( + HasMappingDump.dump(), NoMappingDump.dump(), NoMappingMainDump.dump()); + + Path mapPath = temp.newFile("test-mapping.txt").toPath(); + List<String> pgMap = ImmutableList.of( + "HasMapping -> X:", + " void foo() -> a", + "NoMapping -> Y:" + // Intentionally missing a mapping for `private` foo(). + ); + FileUtils.writeTextFile(mapPath, pgMap); + + R8Command.Builder builder = ToolHelper.prepareR8CommandBuilder(input, emptyConsumer(backend)); + builder + .addProguardConfiguration( + ImmutableList.of( + keepMainProguardConfiguration(main), + // Do not turn on -allowaccessmodification + "-applymapping " + mapPath, + "-dontobfuscate"), // to use the renamed names in test-mapping.txt + Origin.unknown()) + .addLibraryFiles(runtimeJar(backend)); + AndroidApp processedApp = + ToolHelper.runR8( + builder.build(), + options -> { + options.enableInlining = false; + options.enableVerticalClassMerging = false; + }); + + List<byte[]> classBytes = ImmutableList.of( + HasMappingDump.dump(), NoMappingDump.dump(), NoMappingMainDump.dump()); + ProcessResult outputBefore = runOnJavaRaw(main, classBytes, ImmutableList.of()); + assertEquals(0, outputBefore.exitCode); + String outputAfter = runOnVM(processedApp, main, backend); + assertEquals(outputBefore.stdout.trim(), outputAfter.trim()); + + CodeInspector codeInspector = new CodeInspector(processedApp, mapPath); + ClassSubject base = codeInspector.clazz("HasMapping"); + assertThat(base, isPresent()); + assertThat(base, isRenamed()); + assertEquals("X", base.getFinalName()); + MethodSubject x = base.method("void", "foo", ImmutableList.of()); + assertThat(x, isPresent()); + assertThat(x, isRenamed()); + assertEquals("a", x.getFinalName()); + + ClassSubject sub = codeInspector.clazz("NoMapping"); + assertThat(sub, isPresent()); + assertThat(sub, isRenamed()); + assertEquals("Y", sub.getFinalName()); + MethodSubject y = sub.method("void", "foo", ImmutableList.of()); + assertThat(y, isPresent()); + assertThat(y, not(isRenamed())); + assertEquals("foo", y.getFinalName()); + } + + // class A { // : X + // A() { + // x(); + // y(); + // } + // + // private void x() { // : y + // System.out.println("A#x"); + // } + // + // public void y() { // : x + // System.out.println("A#y"); + // } + // } + // + // class B extends A { // : Y + // } + // + // class Main { + // public static void main(String[] args) { + // new B().x(); // IllegalAccessError + // } + // } + @Test + public void test_swapping() throws Exception { + String main = "Main"; + AndroidApp input = buildAndroidApp( + ADump.dump(), BDump.dump(), MainDump.dump()); + + Path mapPath = temp.newFile("test-mapping.txt").toPath(); + List<String> pgMap = ImmutableList.of( + "A -> X:", + " void x() -> y", + " void y() -> x", + "B -> Y:" + // Intentionally missing mappings for non-overridden members + ); + FileUtils.writeTextFile(mapPath, pgMap); + + R8Command.Builder builder = ToolHelper.prepareR8CommandBuilder(input, emptyConsumer(backend)); + builder + .addProguardConfiguration( + ImmutableList.of( + keepMainProguardConfiguration(main), + // Do not turn on -allowaccessmodification + "-applymapping " + mapPath, + "-dontobfuscate"), // to use the renamed names in test-mapping.txt + Origin.unknown()) + .addLibraryFiles(runtimeJar(backend)); + AndroidApp processedApp = + ToolHelper.runR8( + builder.build(), + options -> { + options.enableInlining = false; + options.enableVerticalClassMerging = false; + }); + + List<byte[]> classBytes = ImmutableList.of(ADump.dump(), BDump.dump(), MainDump.dump()); + ProcessResult outputBefore = runOnJavaRaw(main, classBytes, ImmutableList.of()); + assertNotEquals(0, outputBefore.exitCode); + String expectedErrorMessage = "IllegalAccessError"; + String expectedErrorSignature = "A.x()V"; + assertThat(outputBefore.stderr, containsString(expectedErrorMessage)); + assertThat(outputBefore.stderr, containsString(expectedErrorSignature)); + ProcessResult outputAfter = runOnVMRaw(processedApp, main, backend); + assertNotEquals(0, outputAfter.exitCode); + expectedErrorSignature = "X.y()V"; + if (backend == Backend.DEX) { + expectedErrorSignature = "void X.y()"; + if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(Version.V6_0_1)) { + expectedErrorMessage ="IncompatibleClassChangeError"; + } + if (ToolHelper.getDexVm().getVersion().isOlderThanOrEqual(Version.V4_4_4)) { + expectedErrorMessage ="illegal method access"; + expectedErrorSignature = "LX;.y ()V"; + } + } + assertThat(outputAfter.stderr, containsString(expectedErrorMessage)); + assertThat(outputAfter.stderr, containsString(expectedErrorSignature)); + + CodeInspector codeInspector = new CodeInspector(processedApp, mapPath); + ClassSubject base = codeInspector.clazz("A"); + assertThat(base, isPresent()); + assertThat(base, isRenamed()); + assertEquals("X", base.getFinalName()); + MethodSubject x = base.method("void", "x", ImmutableList.of()); + assertThat(x, isPresent()); + assertThat(x, isRenamed()); + assertEquals("y", x.getFinalName()); + + ClassSubject sub = codeInspector.clazz("B"); + assertThat(sub, isPresent()); + assertThat(sub, isRenamed()); + assertEquals("Y", sub.getFinalName()); + MethodSubject subX = sub.method("void", "x", ImmutableList.of()); + assertThat(subX, not(isPresent())); + } +}
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionTest.java new file mode 100644 index 0000000..61e51be --- /dev/null +++ b/src/test/java/com/android/tools/r8/naming/applymapping/MemberResolutionTest.java
@@ -0,0 +1,155 @@ +// 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 com.android.tools.r8.naming.applymapping; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import com.android.tools.r8.R8Command; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.origin.Origin; +import com.android.tools.r8.utils.AndroidApp; +import com.android.tools.r8.utils.FileUtils; +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.MethodSubject; +import com.google.common.collect.ImmutableList; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +// AbstractChecker -> X: +abstract class AbstractChecker { + // String tag -> p + private String tag = "PrivateInitialTag_AbstractChecker"; + + // check() -> x + private void check() { + System.out.println("AbstractChecker#check:" + tag); + } + + // foo() -> a + protected void foo() { + check(); + } +} + +// ConcreteChecker -> Y: +class ConcreteChecker extends AbstractChecker { + // This should not be conflict with AbstractChecker#tag due to the access control. + // String tag -> q + private String tag = "PrivateInitialTag_ConcreteChecker"; + + ConcreteChecker(String tag){ + this.tag = tag; + } + + // This should not be conflict with AbstractChecker#check due to the access control. + // check() -> y + private void check() { + System.out.println("ConcreteChecker#check:" + tag); + } + + // foo() -> a + @Override + protected void foo() { + super.foo(); + check(); + } +} + +class MemberResolutionTestMain { + public static void main(String[] args) { + ConcreteChecker c = new ConcreteChecker("NewTag"); + c.foo(); + } +} + +@RunWith(Parameterized.class) +public class MemberResolutionTest extends TestBase { + private final static List<Class> CLASSES = ImmutableList.of( + AbstractChecker.class, ConcreteChecker.class, MemberResolutionTestMain.class); + + private Backend backend; + + @Parameterized.Parameters(name = "Backend: {0}") + public static Collection<Backend> data() { + return Arrays.asList(Backend.values()); + } + + public MemberResolutionTest(Backend backend) { + this.backend = backend; + } + + @Test + public void testPrivateMethodsWithSameName() throws Exception { + String pkg = this.getClass().getPackage().getName(); + Path mapPath = temp.newFile("test-mapping.txt").toPath(); + List<String> pgMap = ImmutableList.of( + pkg + ".AbstractChecker -> " + pkg + ".X:", + " java.lang.String tag -> p", + " void check() -> x", + " void foo() -> a", + pkg + ".ConcreteChecker -> " + pkg + ".Y:", + " java.lang.String tag -> q", + " void check() -> y", + " void foo() -> a" + ); + FileUtils.writeTextFile(mapPath, pgMap); + + AndroidApp app = readClasses(CLASSES); + R8Command.Builder builder = ToolHelper.prepareR8CommandBuilder(app, emptyConsumer(backend)); + builder + .addProguardConfiguration( + ImmutableList.of( + keepMainProguardConfiguration(MemberResolutionTestMain.class), + // Do not turn on -allowaccessmodification + "-applymapping " + mapPath, + "-dontobfuscate"), // to use the renamed names in test-mapping.txt + Origin.unknown()) + .addLibraryFiles(runtimeJar(backend)); + AndroidApp processedApp = + ToolHelper.runR8( + builder.build(), + options -> { + options.enableInlining = false; + options.enableVerticalClassMerging = false; + }); + + String outputBefore = runOnJava(MemberResolutionTestMain.class); + String outputAfter = runOnVM(processedApp, MemberResolutionTestMain.class, backend); + assertEquals(outputBefore, outputAfter); + + CodeInspector codeInspector = new CodeInspector(processedApp, mapPath); + ClassSubject base = codeInspector.clazz(AbstractChecker.class); + assertThat(base, isPresent()); + FieldSubject p = base.field("java.lang.String", "tag"); + assertThat(p, isPresent()); + assertThat(p, isRenamed()); + assertEquals("p", p.getFinalName()); + MethodSubject x = base.method("void", "check", ImmutableList.of()); + assertThat(x, isPresent()); + assertThat(x, isRenamed()); + assertEquals("x", x.getFinalName()); + + ClassSubject sub = codeInspector.clazz(ConcreteChecker.class); + assertThat(sub, isPresent()); + FieldSubject q = sub.field("java.lang.String", "tag"); + assertThat(q, isPresent()); + assertThat(q, isRenamed()); + assertEquals("q", q.getFinalName()); + MethodSubject y = sub.method("void", "check", ImmutableList.of()); + assertThat(y, isPresent()); + assertThat(y, isRenamed()); + assertEquals("y", y.getFinalName()); + } +}
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/NoMappingDump.java b/src/test/java/com/android/tools/r8/naming/applymapping/NoMappingDump.java new file mode 100644 index 0000000..ae46c2a --- /dev/null +++ b/src/test/java/com/android/tools/r8/naming/applymapping/NoMappingDump.java
@@ -0,0 +1,197 @@ +// 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 com.android.tools.r8.naming.applymapping; + +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +// Generated by running tools/asmifier.py on the following code snippet: +// +// class HasMapping { +// HasMapping() { +// foo(); +// } +// +// void foo() { +// System.out.println("HasMapping#foo"); +// } +// } +class HasMappingDump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit(V1_8, ACC_SUPER, "HasMapping", null, "java/lang/Object", null); + + classWriter.visitSource("HasMapping.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(2, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(3, label1); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "HasMapping", "foo", "()V", false); + Label label2 = new Label(); + methodVisitor.visitLabel(label2); + methodVisitor.visitLineNumber(4, label2); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod(0, "foo", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(3, label0); + methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitLdcInsn("HasMapping#foo"); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(4, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +} + +// Generated by running tools/asmifier.py on the following code snippet: +// +// class NoMapping extends HasMapping { +// NoMapping() { +// super(); +// bar(); +// } +// +// private void bar() { +// System.out.println("NoMapping#foo"); +// } +// } +// +// then renamed bar() to foo() to introduce name clash. +class NoMappingDump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit(V1_8, ACC_SUPER, "NoMapping", null, "HasMapping", null); + + classWriter.visitSource("NoMapping.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(12, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "HasMapping", "<init>", "()V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(13, label1); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "NoMapping", "foo", "()V", false); + Label label2 = new Label(); + methodVisitor.visitLabel(label2); + methodVisitor.visitLineNumber(14, label2); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "foo", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(9, label0); + methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitLdcInsn("NoMapping#foo"); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(10, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +} + +// Generated by running tools/asmifier.py on the following code snippet: +// +// public class NoMappingMain { +// public static void main(String[] args) { +// new NoMapping(); +// } +// } +class NoMappingMainDump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit( + V1_8, ACC_PUBLIC | ACC_SUPER, "NoMappingMain", null, "java/lang/Object", null); + + classWriter.visitSource("NoMappingMain.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(19, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod( + ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(22, label0); + methodVisitor.visitTypeInsn(NEW, "NoMapping"); + methodVisitor.visitInsn(DUP); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "NoMapping", "<init>", "()V", false); + methodVisitor.visitInsn(POP); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(23, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +}
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/SwappingDump.java b/src/test/java/com/android/tools/r8/naming/applymapping/SwappingDump.java new file mode 100644 index 0000000..0dea699 --- /dev/null +++ b/src/test/java/com/android/tools/r8/naming/applymapping/SwappingDump.java
@@ -0,0 +1,191 @@ +// 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 com.android.tools.r8.naming.applymapping; + +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +// Generated by running tools/asmifier.py on the following code snippet: +// +// class A { +// A() { +// x(); +// y(); +// } +// +// private void x() { +// System.out.println("A#x"); +// } +// +// public void y() { +// System.out.println("A#y"); +// } +// } +class ADump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit(V1_8, ACC_SUPER, "A", null, "java/lang/Object", null); + + classWriter.visitSource("Test.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(2, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(3, label1); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "A", "x", "()V", false); + Label label2 = new Label(); + methodVisitor.visitLabel(label2); + methodVisitor.visitLineNumber(4, label2); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "A", "y", "()V", false); + Label label3 = new Label(); + methodVisitor.visitLabel(label3); + methodVisitor.visitLineNumber(5, label3); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod(ACC_PRIVATE, "x", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(7, label0); + methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitLdcInsn("A#x"); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(8, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "y", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(11, label0); + methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitLdcInsn("A#y"); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(12, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +} + +// Generated by running tools/asmifier.py on the following code snippet: +// +// class B extends A { +// } +class BDump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit(V1_8, ACC_SUPER, "B", null, "A", null); + + classWriter.visitSource("Test.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(15, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "A", "<init>", "()V", false); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +} + +// Generated by running tools/asmifier.py on the following code snippet: +// +// public class Main { +// public static void main(String[] args) { +// new B().y(); +// } +// } +// +// then replaced use of y() with x() to introduce IllegalAccessError. +class MainDump implements Opcodes { + + public static byte[] dump () throws Exception { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit(V1_8, ACC_PUBLIC | ACC_SUPER, "Main", null, "java/lang/Object", null); + + classWriter.visitSource("Test.java", null); + + { + methodVisitor = classWriter.visitMethod(0, "<init>", "()V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(18, label0); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = classWriter.visitMethod( + ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); + methodVisitor.visitCode(); + Label label0 = new Label(); + methodVisitor.visitLabel(label0); + methodVisitor.visitLineNumber(20, label0); + methodVisitor.visitTypeInsn(NEW, "B"); + methodVisitor.visitInsn(DUP); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "B", "<init>", "()V", false); + methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "B", "x", "()V", false); + Label label1 = new Label(); + methodVisitor.visitLabel(label1); + methodVisitor.visitLineNumber(21, label1); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 1); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +} +
diff --git a/tools/create_jctf_tests.py b/tools/create_jctf_tests.py index b7b449d..28dde99 100755 --- a/tools/create_jctf_tests.py +++ b/tools/create_jctf_tests.py
@@ -130,6 +130,7 @@ generate_test(class_name, 'd8', 'R8_AFTER_D8', relative_package) generate_test(class_name, 'r8', 'R8', relative_package) + generate_test(class_name, 'r8cf', 'R8CF', relative_package) if __name__ == '__main__':