Merge commit '54d26887d84af0b201dd86c02ef116552ee867dc' into dev-release
diff --git a/.gitignore b/.gitignore index 90f5857..018c71b 100644 --- a/.gitignore +++ b/.gitignore
@@ -12,10 +12,12 @@ *~ .#* .gradle/ +**/.gradle/ .gradle_user_home .idea/ android-data*/ build/ +**/build/ buildSrc/out/ src/*/out d8_r8/*/out @@ -269,6 +271,8 @@ third_party/rhino-android-1.1.1.tar.gz third_party/sample_libraries third_party/sample_libraries.tar.gz +third_party/smali +third_party/smali.tar.gz third_party/tachiyomi third_party/tachiyomi.tar.gz third_party/youtube/*
diff --git a/build.gradle b/build.gradle index a4752c4..332b74a 100644 --- a/build.gradle +++ b/build.gradle
@@ -7,7 +7,6 @@ import desugaredlibrary.CustomConversionAsmRewriterTask import net.ltgt.gradle.errorprone.CheckSeverity import org.gradle.internal.os.OperatingSystem -import smali.SmaliTask import tasks.DownloadDependency import tasks.GetJarsFromConfiguration @@ -372,6 +371,7 @@ "r8-releases/2.0.74", "r8-releases/3.2.54", "r8mappings", + "smali", "tachiyomi" ], // All dex-vms have a fixed OS of Linux, as they are only supported on Linux, and will be run in a Docker @@ -1632,53 +1632,6 @@ } } -task buildSmali { - def smaliDir = file("src/test/smali") - smaliDir.eachDirRecurse() { dir -> - def name = dir.getName(); - def relativeDir = smaliDir.toPath().relativize(dir.toPath()); - def smaliOutputDir = file("build/test/smali/" + relativeDir); - smaliOutputDir.mkdirs() - outputs.dir smaliOutputDir - def taskName = "smali_build_${relativeDir.toString().replace('/', '_').replace('\\', '_')}" - def smaliFiles = fileTree(dir: dir, include: '*.smali') - def javaFiles = fileTree(dir: dir, include: '*.java') - def destDir = smaliOutputDir; - def destFile = destDir.toPath().resolve("${name}.dex").toFile() - def intermediateFileName = "${name}-intermediate.dex"; - def intermediateFile = destDir.toPath().resolve(intermediateFileName).toFile() - if (javaFiles.empty) { - if (!smaliFiles.empty) { - dependsOn "${taskName}_smali" - task "${taskName}_smali"(type: SmaliTask) { - source = smaliFiles - destination = destFile - } - } - } else { - dependsOn "${taskName}_smali" - dependsOn "${taskName}_jar" - task "${taskName}_smali"(type: SmaliTask) { - source = smaliFiles - destination = destFile - } - task "${taskName}_java"(type: JavaCompile) { - source = javaFiles - destinationDir destDir - classpath = sourceSets.main.compileClasspath - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 - options.compilerArgs += ["-Xlint:-options"] - } - task "${taskName}_jar"(type: Jar, dependsOn: "${taskName}_java") { - archiveName = "Test.jar" - destinationDir = destDir - from fileTree(dir: destDir, include: 'Test.class') - } - } - } -} - tasks.withType(Test) { println("NOTE: Number of processors " + Runtime.runtime.availableProcessors()) def userDefinedCoresPerFork = System.getenv('R8_GRADLE_CORES_PER_FORK') @@ -2282,7 +2235,6 @@ dependsOn downloadDeps dependsOn buildExamples dependsOn buildKotlinR8TestResources - dependsOn buildSmali dependsOn buildPreNJdwpTestsJar dependsOn compileTestNGRunner dependsOn provideArtFrameworksDependencies
diff --git a/buildSrc/src/main/java/smali/SmaliTask.java b/buildSrc/src/main/java/smali/SmaliTask.java deleted file mode 100644 index d35102e..0000000 --- a/buildSrc/src/main/java/smali/SmaliTask.java +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright (c) 2019, 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 smali; - -import static java.util.stream.Collectors.toList; - -import com.android.tools.smali.smali.Smali; -import com.android.tools.smali.smali.SmaliOptions; -import java.io.File; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.List; -import javax.inject.Inject; -import org.gradle.api.DefaultTask; -import org.gradle.api.file.FileTree; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.provider.SetProperty; -import org.gradle.api.tasks.InputFiles; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.TaskAction; -import org.gradle.workers.WorkAction; -import org.gradle.workers.WorkParameters; -import org.gradle.workers.WorkerExecutor; - -public class SmaliTask extends DefaultTask { - - private final WorkerExecutor workerExecutor; - - private FileTree source; - private File destination; - - @Inject - public SmaliTask(WorkerExecutor workerExecutor) { - this.workerExecutor = workerExecutor; - } - - @InputFiles - public FileTree getSource() { - return source; - } - - public void setSource(FileTree source) { - this.source = source; - } - - @OutputFile - public File getDestination() { - return destination; - } - - public void setDestination(File destination) { - this.destination = destination; - } - - @TaskAction - void exec() { - workerExecutor - .noIsolation() - .submit( - RunSmali.class, - parameters -> { - parameters.getSources().set(source.getFiles()); - parameters.getDestination().set(destination); - }); - } - - public interface RunSmaliParameters extends WorkParameters { - - SetProperty<File> getSources(); - - RegularFileProperty getDestination(); - } - - public abstract static class RunSmali implements WorkAction<RunSmaliParameters> { - - @Override - public void execute() { - try { - RunSmaliParameters parameters = getParameters(); - List<String> fileNames = - parameters.getSources().get().stream().map(File::toString).collect(toList()); - SmaliOptions options = new SmaliOptions(); - options.outputDexFile = parameters.getDestination().getAsFile().get().getCanonicalPath(); - Smali.assemble(options, fileNames); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - } -}
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt index a1796c3..ab4a518 100644 --- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt +++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -2,23 +2,28 @@ // 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. +import java.io.File +import java.net.URI +import java.nio.file.Paths +import org.gradle.api.JavaVersion import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.JavaVersion import org.gradle.api.Task -import org.gradle.api.tasks.Exec -import java.io.File -import java.nio.file.Path -import java.nio.file.Paths -import java.net.URI +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.tasks.SourceSet +import org.gradle.jvm.tasks.Jar +import org.gradle.kotlin.dsl.register +import org.gradle.nativeplatform.platform.OperatingSystem +import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform class DependenciesPlugin: Plugin<Project> { override fun apply(target: Project) { val dependenciesPath = "file:" + - "${target.getRoot().resolve("third_party").resolve("dependencies").getAbsolutePath()}" + target.getRoot().resolve("third_party").resolve("dependencies").getAbsolutePath() val dependenciesNewPath = "file:" + - "${target.getRoot().resolve("third_party").resolve("dependencies_new").getAbsolutePath()}" + target.getRoot().resolve("third_party").resolve("dependencies_new").getAbsolutePath() val repositories = target.getRepositories() repositories.maven { name = "LOCAL_MAVEN_REPO"; url = URI(dependenciesPath) } repositories.maven { name = "LOCAL_MAVEN_REPO_NEW"; url = URI(dependenciesNewPath) } @@ -26,9 +31,39 @@ } enum class Jdk(val folder : String) { + JDK_8("jdk8"), + JDK_9("openjdk-9.0.4"), JDK_11("jdk-11"), JDK_17("jdk-17"), JDK_20("jdk-20"); + + fun isJdk8() : Boolean { + return this == JDK_8 + } + + fun getThirdPartyDependency() : ThirdPartyDependency { + val os: OperatingSystem = DefaultNativePlatform.getCurrentOperatingSystem() + val subFolder : String + val fileName : String + if (os.isLinux) { + subFolder = if(isJdk8()) "linux-x86" else "linux" + fileName = "java" + } else if (os.isMacOsX) { + subFolder = if(isJdk8()) "darwin-x86" else "osx" + fileName = "java" + } else { + assert(os.isWindows()) + if (isJdk8()) { + throw RuntimeException("No Jdk8 on Windows") + } + subFolder = "windows" + fileName = "java.bat" + } + return ThirdPartyDependency( + name, + Paths.get("third_party", "openjdk", folder, subFolder, "bin", fileName).toFile(), + Paths.get("third_party", "openjdk", folder, "$subFolder.tar.gz.sha1").toFile()) + } } fun Project.getRoot() : File { @@ -43,6 +78,71 @@ return "****** ${title} ******" } +fun Project.ensureThirdPartyDependencies(name : String, deps : List<ThirdPartyDependency>) : Task { + val outputFiles : MutableList<File> = mutableListOf() + val depsTasks = deps.map({ + tasks.register<DownloadDependencyTask>("download-third-party-${it.packageName}") { + setDependency( + it.packageName, + getRoot().resolve(it.sha1File), + getRoot().resolve(it.path).parentFile, + it.type) + outputFiles.add(it.path) + }}) + return tasks.register("ensure-third-party-$name") { + dependsOn(depsTasks) + outputs.files(outputFiles) + }.get() +} + +/** + * Builds a jar for each subfolder in an examples test source set. + * + * <p> As an example, src/test/examplesJava9 contains subfolders: backport, collectionof, ..., . + * These are compiled to individual jars and placed in <repo-root>/build/test/examplesJava9/ as: + * backport.jar, collectionof.jar, ..., . + * + * Calling this from a project will amend the task graph with the task named + * getExamplesJarsTaskName(examplesName) such that it can be referenced from the test runners. + */ +fun Project.buildJavaExamplesJars(examplesName : String) : Task { + val outputFiles : MutableList<File> = mutableListOf() + val jarTasks : MutableList<Task> = mutableListOf() + var testSourceSet = extensions + .getByType(JavaPluginExtension::class.java) + .sourceSets + // The TEST_SOURCE_SET_NAME is the source set defined by writing java { sourcesets.test { ... }} + .getByName(SourceSet.TEST_SOURCE_SET_NAME) + testSourceSet + .java + .sourceDirectories + .files + .forEach { srcDir -> + srcDir.listFiles(File::isDirectory)?.forEach { exampleDir -> + jarTasks.add(tasks.register<Jar>("jar-examples$examplesName-${exampleDir.name}") { + dependsOn("compileTestJava") + archiveFileName.set("${exampleDir.name}.jar") + destinationDirectory.set(getRoot().resolveAll("build", "test", "examples$examplesName")) + from(testSourceSet.output.classesDirs.files.map{ it.resolve(exampleDir.name) }) { + include("**/*.class") + } + }.get()) + } + } + return tasks.register(getExamplesJarsTaskName(examplesName)) { + dependsOn(jarTasks) + outputs.files(outputFiles) + }.get() +} + +fun Project.getExamplesJarsTaskName(name: String) : String { + return "build-example-jars-$name" +} + +fun Project.resolve(thirdPartyDependency: ThirdPartyDependency) : ConfigurableFileCollection { + return files(project.getRoot().resolve(thirdPartyDependency.path)) +} + /** * When using composite builds, referecing tasks in other projects do not give a Task but a * TaskReference. To get outputs from other tasks we need to have a proper task and gradle do not @@ -83,11 +183,12 @@ } fun Project.baseCompilerCommandLine( - jar : File, deps : File, compiler : String, args : List<String> = listOf()) : List<String> { + jar: File, deps: File, compiler: String, args: List<String> = listOf(), +) : List<String> { // Execute r8 commands against a stable r8 with dependencies. // TODO(b/139725780): See if we can remove or lower the heap size (-Xmx8g). return listOf( - "${getJavaPath(Jdk.JDK_17)}", + getJavaPath(Jdk.JDK_17), "-Xmx8g", "-ea", "-cp", @@ -97,11 +198,12 @@ } fun Project.baseCompilerCommandLine( - jar : File, compiler : String, args : List<String> = listOf()) : List<String> { + jar: File, compiler: String, args: List<String> = listOf(), +) : List<String> { // Execute r8 commands against a stable r8 with dependencies. // TODO(b/139725780): See if we can remove or lower the heap size (-Xmx8g). return listOf( - "${getJavaPath(Jdk.JDK_17)}", + getJavaPath(Jdk.JDK_17), "-Xmx8g", "-ea", "-cp", @@ -111,14 +213,14 @@ } fun Project.createR8LibCommandLine( - r8Compiler : File, - input : File, + r8Compiler: File, + input: File, output: File, - pgConf : List<File>, - excludingDepsVariant : Boolean, - lib : List<File> = listOf(), - classpath : List<File> = listOf(), - args : List<String> = listOf()) : List<String> { + pgConf: List<File>, + excludingDepsVariant: Boolean, + lib: List<File> = listOf(), + classpath: List<File> = listOf() +) : List<String> { val pgList = pgConf.flatMap({ listOf("--pg-conf", "$it") }) val libList = lib.flatMap({ listOf("--lib", "$it") }) val cpList = classpath.flatMap({ listOf("--classpath", "$it") }) @@ -142,15 +244,16 @@ object Versions { const val asmVersion = "9.5" + const val errorproneVersion = "2.18.0" const val fastUtilVersion = "7.2.1" const val gsonVersion = "2.7" const val guavaVersion = "31.1-jre" + const val javassist = "3.29.2-GA" const val junitVersion = "4.13-beta-2" const val kotlinVersion = "1.8.10" const val kotlinMetadataVersion = "0.6.2" + const val mockito = "2.10.0" const val smaliVersion = "3.0.3" - const val errorproneVersion = "2.18.0" - const val javassist = "3.29.2-GA" } object Deps { @@ -166,6 +269,108 @@ "org.jetbrains.kotlinx:kotlinx-metadata-jvm:${Versions.kotlinMetadataVersion}" } val kotlinStdLib by lazy { "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinVersion}" } val kotlinReflect by lazy { "org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinVersion}" } + val mockito by lazy { "org.mockito:mockito-core:${Versions.mockito}" } val smali by lazy { "com.android.tools.smali:smali:${Versions.smaliVersion}" } val errorprone by lazy { "com.google.errorprone:error_prone_core:${Versions.errorproneVersion}" } } + +object ThirdPartyDeps { + val apiDatabase = ThirdPartyDependency( + "apiDatabase", + Paths.get( + "third_party", + "api_database", + "api_database", + "resources", + "new_api_database.ser").toFile(), + Paths.get("third_party", "api_database", "api_database.tar.gz.sha1").toFile()) + val ddmLib = ThirdPartyDependency( + "ddmlib", + Paths.get("third_party", "ddmlib", "ddmlib.jar").toFile(), + Paths.get("third_party", "ddmlib.tar.gz.sha1").toFile()) + val jasmin = ThirdPartyDependency( + "jasmin", + Paths.get("third_party", "jasmin", "jasmin-2.4.jar").toFile(), + Paths.get("third_party", "jasmin.tar.gz.sha1").toFile()) + val jdwpTests = ThirdPartyDependency( + "jdwp-tests", + Paths.get("third_party", "jdwp-tests", "apache-harmony-jdwp-tests-host.jar").toFile(), + Paths.get("third_party", "jdwp-tests.tar.gz.sha1").toFile()) + val androidJars : List<ThirdPartyDependency> = getThirdPartyAndroidJars() + val java8Runtime = ThirdPartyDependency( + "openjdk-rt-1.8", + Paths.get("third_party", "openjdk", "openjdk-rt-1.8", "rt.jar").toFile(), + Paths.get("third_party", "openjdk", "openjdk-rt-1.8.tar.gz.sha1").toFile() + ) + val androidVMs : List<ThirdPartyDependency> = getThirdPartyAndroidVms() + val jdks : List<ThirdPartyDependency> = getJdks() +} + +fun getThirdPartyAndroidJars() : List<ThirdPartyDependency> { + return listOf( + "libcore_latest", + "lib-master", + "lib-v14", + "lib-v15", + "lib-v19", + "lib-v21", + "lib-v22", + "lib-v23", + "lib-v24", + "lib-v25", + "lib-v26", + "lib-v27", + "lib-v28", + "lib-v29", + "lib-v30", + "lib-v31", + "lib-v32", + "lib-v33", + "lib-v34" + ).map(::getThirdPartyAndroidJar) +} + +fun getThirdPartyAndroidJar(version : String) : ThirdPartyDependency { + return ThirdPartyDependency( + version, + Paths.get("third_party", "android_jar", version, "android.jar").toFile(), + Paths.get("third_party", "android_jar", "$version.tar.gz.sha1").toFile()) +} + +fun getThirdPartyAndroidVms() : List<ThirdPartyDependency> { + return listOf( + listOf("host", "art-master"), + listOf("host", "art-14.0.0-dp1"), + listOf("host", "art-13.0.0"), + listOf("host", "art-12.0.0-beta4"), + listOf("art-10.0.0"), + listOf("art-5.1.1"), + listOf("art-6.0.1"), + listOf("art-7.0.0"), + listOf("art-8.1.0"), + listOf("art-9.0.0"), + listOf("art"), + listOf("dalvik-4.0.4"), + listOf("dalvik")).map(::getThirdPartyAndroidVm) +} + +fun getThirdPartyAndroidVm(version : List<String>) : ThirdPartyDependency { + val output = Paths.get("tools", "linux", *version.toTypedArray(), "bin", "art").toFile() + return ThirdPartyDependency( + version.last(), + output, + Paths.get( + "tools", + "linux", + *version.slice(0..version.size - 2).toTypedArray(), + "${version.last()}.tar.gz.sha1").toFile()) +} + +fun getJdks() : List<ThirdPartyDependency> { + val os: OperatingSystem = DefaultNativePlatform.getCurrentOperatingSystem() + if (os.isLinux || os.isMacOsX) { + return Jdk.values().map{ it.getThirdPartyDependency()} + } else { + return Jdk.values().filter{ !it.isJdk8() }.map{ it.getThirdPartyDependency()} + } +} \ No newline at end of file
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt new file mode 100644 index 0000000..24185c6 --- /dev/null +++ b/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt
@@ -0,0 +1,143 @@ +// Copyright (c) 2023, 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. + +import java.io.BufferedReader +import java.io.File +import java.io.IOException +import java.io.InputStreamReader +import java.nio.charset.StandardCharsets +import java.util.Arrays +import java.util.stream.Collectors +import javax.inject.Inject +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.options.Option +import org.gradle.internal.os.OperatingSystem +import org.gradle.workers.WorkAction +import org.gradle.workers.WorkParameters +import org.gradle.workers.WorkerExecutor + +abstract class DownloadDependencyTask : DefaultTask() { + + private var dependencyType: DependencyType = DependencyType.GOOGLE_STORAGE + private var _outputDir: File? = null + private var _tarGzFile: File? = null + private var _sha1File: File? = null + + @OutputDirectory + fun getOutputDir(): File? { + return _outputDir + } + + @Inject + protected abstract fun getWorkerExecutor(): WorkerExecutor? + + @Option( + option = "dependency", + description = "Sets the dependency information for a cloud stored file") + fun setDependency( + dependencyName : String, sha1File: File, outputDir : File, dependencyType: DependencyType) { + _outputDir = outputDir + _sha1File = sha1File + _tarGzFile = sha1File.resolveSibling(sha1File.name.replace(".sha1", "")) + this.dependencyType = dependencyType + } + + @TaskAction + fun execute() { + val sha1File = _sha1File!! + val outputDir = _outputDir!! + val tarGzFile = _tarGzFile!! + if (!sha1File.exists()) { + throw RuntimeException("Missing sha1 file: $sha1File") + } + // First run will write the tar.gz file, causing the second run to still be out-of-date. + // Check if the modification time of the tar is newer than the sha in which case we are done. + // Also, check the contents of the out directory because gradle appears to create it for us... + if (outputDir.exists() + && outputDir.isDirectory + && outputDir.list().isNotEmpty() && tarGzFile.exists() + && sha1File.lastModified() <= tarGzFile.lastModified()) { + return + } + if (outputDir.exists() && outputDir.isDirectory) { + outputDir.delete() + } + getWorkerExecutor()!! + .noIsolation() + .submit(RunDownload::class.java) { + this.type.set(dependencyType) + this.sha1File.set(sha1File) + } + } + + + interface RunDownloadParameters : WorkParameters { + val type : Property<DependencyType> + val sha1File : RegularFileProperty + } + + abstract class RunDownload : WorkAction<RunDownloadParameters> { + override fun execute() { + try { + val parameters: RunDownloadParameters = parameters + val type: DependencyType = parameters.type.get() + val sha1File: File = parameters.sha1File.asFile.get() + if (type == DependencyType.GOOGLE_STORAGE) { + downloadFromGoogleStorage(sha1File) + } else if (type == DependencyType.X20) { + downloadFromX20(sha1File) + } else { + throw RuntimeException("Unexpected or missing dependency type: $type") + } + } catch (e: Exception) { + throw RuntimeException(e) + } + } + + @Throws(IOException::class, InterruptedException::class) + private fun downloadFromGoogleStorage(sha1File: File) { + val args = Arrays.asList("-n", "-b", "r8-deps", "-s", "-u", sha1File.toString()) + if (OperatingSystem.current().isWindows) { + val command: MutableList<String> = ArrayList() + command.add("download_from_google_storage.bat") + command.addAll(args) + runProcess(ProcessBuilder().command(command)) + } else { + runProcess( + ProcessBuilder() + .command("bash", + "-c", + "download_from_google_storage " + java.lang.String.join(" ", args))) + } + } + + @Throws(IOException::class, InterruptedException::class) + private fun downloadFromX20(sha1File: File) { + if (OperatingSystem.current().isWindows) { + throw RuntimeException("Downloading from x20 unsupported on windows") + } + runProcess( + ProcessBuilder() + .command("bash", "-c", "tools/download_from_x20.py $sha1File")) + } + + @Throws(IOException::class, InterruptedException::class) + private fun runProcess(builder: ProcessBuilder) { + val command = java.lang.String.join(" ", builder.command()) + val p = builder.start() + val exit = p.waitFor() + if (exit != 0) { + throw IOException("Process failed for $command\n" + + BufferedReader( + InputStreamReader(p.errorStream, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n"))) + } + } + } +} \ No newline at end of file
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/ThirdPartyDependency.kt b/d8_r8/commonBuildSrc/src/main/kotlin/ThirdPartyDependency.kt new file mode 100644 index 0000000..510892d --- /dev/null +++ b/d8_r8/commonBuildSrc/src/main/kotlin/ThirdPartyDependency.kt
@@ -0,0 +1,16 @@ +// Copyright (c) 2023, 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. + +import java.io.File + +enum class DependencyType { + GOOGLE_STORAGE, + X20 +} + +data class ThirdPartyDependency( + val packageName : String, + val path : File, + val sha1File : File, + val type: DependencyType = DependencyType.GOOGLE_STORAGE)
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts index 34a1c14..a04d4f1 100644 --- a/d8_r8/main/build.gradle.kts +++ b/d8_r8/main/build.gradle.kts
@@ -23,8 +23,8 @@ dependencies { implementation(":keepanno") compileOnly(Deps.asm) - compileOnly(Deps.asmUtil) compileOnly(Deps.asmCommons) + compileOnly(Deps.asmUtil) compileOnly(Deps.fastUtil) compileOnly(Deps.gson) compileOnly(Deps.guava) @@ -32,6 +32,10 @@ errorprone(Deps.errorprone) } +val thirdPartyResourceDependenciesTask = ensureThirdPartyDependencies( + "resourceDeps", + listOf(ThirdPartyDeps.apiDatabase)) + val keepAnnoJarTask = projectTask("keepanno", "jar") fun mainJarDependencies() : FileCollection { @@ -52,6 +56,10 @@ } } + withType<ProcessResources> { + dependsOn(thirdPartyResourceDependenciesTask) + } + val swissArmyKnife by registering(Jar::class) { from(sourceSets.main.get().output) manifest { @@ -64,7 +72,9 @@ val depsJar by registering(Jar::class) { dependsOn(keepAnnoJarTask) - println(header("R8 full dependencies")) + doFirst { + println(header("R8 full dependencies")) + } mainJarDependencies().forEach({ println(it) }) from(mainJarDependencies().map(::zipTree)) from(keepAnnoJarTask.outputs.files.map(::zipTree))
diff --git a/d8_r8/settings.gradle.kts b/d8_r8/settings.gradle.kts index 70bb38b..402137e 100644 --- a/d8_r8/settings.gradle.kts +++ b/d8_r8/settings.gradle.kts
@@ -29,7 +29,7 @@ ) println("Executing command: ${cmd.joinToString(" ")}") var process = ProcessBuilder().command(cmd).start() - process.waitFor(5, java.util.concurrent.TimeUnit.SECONDS) + process.waitFor() if (process.exitValue() != 0) { throw GradleException( "Bootstrapping dependencies_new download failed:\n"
diff --git a/d8_r8/test/settings.gradle.kts b/d8_r8/test/settings.gradle.kts index 401f476..ed1f4ea 100644 --- a/d8_r8/test/settings.gradle.kts +++ b/d8_r8/test/settings.gradle.kts
@@ -6,4 +6,13 @@ val root = rootProject.projectDir.parentFile includeBuild(root.resolve("main")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examples")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidN")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidP")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidO")) includeBuild(root.resolve("test_modules").resolve("tests_java_8")) +includeBuild(root.resolve("test_modules").resolve("tests_java_9")) +includeBuild(root.resolve("test_modules").resolve("tests_java_10")) +includeBuild(root.resolve("test_modules").resolve("tests_java_11")) +includeBuild(root.resolve("test_modules").resolve("tests_java_17")) +includeBuild(root.resolve("test_modules").resolve("tests_java_20"))
diff --git a/d8_r8/test_modules/tests_java_10/build.gradle.kts b/d8_r8/test_modules/tests_java_10/build.gradle.kts new file mode 100644 index 0000000..f24610d --- /dev/null +++ b/d8_r8/test_modules/tests_java_10/build.gradle.kts
@@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDir(root.resolveAll("src", "test", "examplesJava10")) + } + sourceCompatibility = JavaVersion.VERSION_1_10 + targetCompatibility = JavaVersion.VERSION_1_10 +} + +dependencies { } + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("Java10") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.executable = getCompilerPath(Jdk.JDK_11) + } +} +
diff --git a/d8_r8/test_modules/tests_java_10/gradle.properties b/d8_r8/test_modules/tests_java_10/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_10/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_10/settings.gradle.kts b/d8_r8/test_modules/tests_java_10/settings.gradle.kts new file mode 100644 index 0000000..247cb9c --- /dev/null +++ b/d8_r8/test_modules/tests_java_10/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_10"
diff --git a/d8_r8/test_modules/tests_java_11/build.gradle.kts b/d8_r8/test_modules/tests_java_11/build.gradle.kts new file mode 100644 index 0000000..1ff3ea8 --- /dev/null +++ b/d8_r8/test_modules/tests_java_11/build.gradle.kts
@@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDir(root.resolveAll("src", "test", "examplesJava11")) + } + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +dependencies { } + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("Java11") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.executable = getCompilerPath(Jdk.JDK_11) + } +} +
diff --git a/d8_r8/test_modules/tests_java_11/gradle.properties b/d8_r8/test_modules/tests_java_11/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_11/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_11/settings.gradle.kts b/d8_r8/test_modules/tests_java_11/settings.gradle.kts new file mode 100644 index 0000000..e737a8a --- /dev/null +++ b/d8_r8/test_modules/tests_java_11/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_11"
diff --git a/d8_r8/test_modules/tests_java_17/build.gradle.kts b/d8_r8/test_modules/tests_java_17/build.gradle.kts new file mode 100644 index 0000000..9e0f2b7 --- /dev/null +++ b/d8_r8/test_modules/tests_java_17/build.gradle.kts
@@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDir(root.resolveAll("src", "test", "examplesJava17")) + } + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +dependencies { } + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("Java17") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.executable = getCompilerPath(Jdk.JDK_17) + } +} +
diff --git a/d8_r8/test_modules/tests_java_17/gradle.properties b/d8_r8/test_modules/tests_java_17/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_17/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_17/settings.gradle.kts b/d8_r8/test_modules/tests_java_17/settings.gradle.kts new file mode 100644 index 0000000..aa2b7b1 --- /dev/null +++ b/d8_r8/test_modules/tests_java_17/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_17"
diff --git a/d8_r8/test_modules/tests_java_20/build.gradle.kts b/d8_r8/test_modules/tests_java_20/build.gradle.kts new file mode 100644 index 0000000..85cd393 --- /dev/null +++ b/d8_r8/test_modules/tests_java_20/build.gradle.kts
@@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDir(root.resolveAll("src", "test", "examplesJava20")) + } + sourceCompatibility = JavaVersion.VERSION_20 + targetCompatibility = JavaVersion.VERSION_20 +} + +dependencies { } + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("Java20") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.executable = getCompilerPath(Jdk.JDK_20) + } +} +
diff --git a/d8_r8/test_modules/tests_java_20/gradle.properties b/d8_r8/test_modules/tests_java_20/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_20/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_20/settings.gradle.kts b/d8_r8/test_modules/tests_java_20/settings.gradle.kts new file mode 100644 index 0000000..eaac41f --- /dev/null +++ b/d8_r8/test_modules/tests_java_20/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_20"
diff --git a/d8_r8/test_modules/tests_java_8/build.gradle.kts b/d8_r8/test_modules/tests_java_8/build.gradle.kts index 55ee7a8..3493286 100644 --- a/d8_r8/test_modules/tests_java_8/build.gradle.kts +++ b/d8_r8/test_modules/tests_java_8/build.gradle.kts
@@ -17,8 +17,8 @@ sourceSets.test.configure { java.srcDir(root.resolveAll("src", "test", "java")) } - // We cannot use languageVersion.set(JavaLanguageVersion.of(8)) because gradle cannot figure - // out that the jdk is 1_8 and will try to download it. + // We are using a new JDK to compile to an older language version, which is not directly + // compatible with java toolchains. sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } @@ -29,6 +29,8 @@ implementation(projectTask("keepanno", "jar").outputs.files) implementation(projectTask("main", "jar").outputs.files) implementation(Deps.asm) + implementation(Deps.asmCommons) + implementation(Deps.asmUtil) implementation(Deps.gson) implementation(Deps.guava) implementation(Deps.javassist) @@ -36,16 +38,39 @@ implementation(Deps.kotlinStdLib) implementation(Deps.kotlinReflect) implementation(Deps.kotlinMetadata) - implementation(files(root.resolveAll("third_party", "ddmlib", "ddmlib.jar"))) - implementation( - files( - root.resolveAll("third_party", "jdwp-tests", "apache-harmony-jdwp-tests-host.jar"))) - implementation(files(root.resolveAll("third_party", "jasmin", "jasmin-2.4.jar"))) + implementation(resolve(ThirdPartyDeps.ddmLib)) + implementation(resolve(ThirdPartyDeps.jasmin)) + implementation(resolve(ThirdPartyDeps.jdwpTests)) implementation(Deps.fastUtil) implementation(Deps.smali) - implementation(Deps.asmUtil) } +val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies( + "compileDeps", + listOf( + ThirdPartyDeps.apiDatabase, + ThirdPartyDeps.ddmLib, + ThirdPartyDeps.jasmin, + ThirdPartyDeps.jdwpTests)) + +val thirdPartyRuntimeDependenciesTask = ensureThirdPartyDependencies( + "runtimeDeps", + listOf(ThirdPartyDeps.java8Runtime) + + ThirdPartyDeps.androidJars + + ThirdPartyDeps.androidVMs + + ThirdPartyDeps.jdks) + +val sourceSetDependenciesTasks = arrayOf( + projectTask("tests_java_examples", getExamplesJarsTaskName("")), + projectTask("tests_java_examplesAndroidN", getExamplesJarsTaskName("AndroidN")), + projectTask("tests_java_examplesAndroidO", getExamplesJarsTaskName("AndroidO")), + projectTask("tests_java_examplesAndroidP", getExamplesJarsTaskName("AndroidP")), + projectTask("tests_java_9", getExamplesJarsTaskName("Java9")), + projectTask("tests_java_10", getExamplesJarsTaskName("Java10")), + projectTask("tests_java_11", getExamplesJarsTaskName("Java11")), + projectTask("tests_java_17", getExamplesJarsTaskName("Java17")), + projectTask("tests_java_20", getExamplesJarsTaskName("Java20"))) + fun testDependencies() : FileCollection { return sourceSets .test @@ -62,6 +87,7 @@ withType<JavaCompile> { dependsOn(gradle.includedBuild("keepanno").task(":jar")) dependsOn(gradle.includedBuild("main").task(":jar")) + dependsOn(thirdPartyCompileDependenciesTask) options.setFork(true) options.forkOptions.memoryMaximumSize = "3g" options.forkOptions.jvmArgs = listOf( @@ -73,20 +99,45 @@ withType<KotlinCompile> { dependsOn(gradle.includedBuild("keepanno").task(":jar")) dependsOn(gradle.includedBuild("main").task(":jar")) + dependsOn(thirdPartyCompileDependenciesTask) kotlinOptions { - // We cannot use languageVersion.set(JavaLanguageVersion.of(8)) because gradle cannot figure - // out that the jdk is 1_8 and will try to download it. + // We are using a new JDK to compile to an older language version, which is not directly + // compatible with java toolchains. jvmTarget = "1.8" } } + withType<Test> { + environment.put("USE_NEW_GRADLE_SETUP", "true") + dependsOn(thirdPartyRuntimeDependenciesTask) + dependsOn(*sourceSetDependenciesTasks) + println("NOTE: Number of processors " + Runtime.getRuntime().availableProcessors()) + val userDefinedCoresPerFork = System.getenv("R8_GRADLE_CORES_PER_FORK") + val processors = Runtime.getRuntime().availableProcessors() + // See https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html. + if (!userDefinedCoresPerFork.isNullOrEmpty()) { + maxParallelForks = processors / userDefinedCoresPerFork.toInt() + } else { + // On normal work machines this seems to give the best test execution time (without freezing) + maxParallelForks = processors / 3 + // On low cpu count machines (bots) we under subscribe, so increase the count. + if (processors == 8) { + maxParallelForks = 3 + } + } + println("NOTE: Max parallel forks " + maxParallelForks) + } + val testJar by registering(Jar::class) { from(sourceSets.test.get().output) } val depsJar by registering(Jar::class) { dependsOn(gradle.includedBuild("keepanno").task(":jar")) - println(header("Test Java 8 dependencies")) + dependsOn(thirdPartyCompileDependenciesTask) + doFirst { + println(header("Test Java 8 dependencies")) + } testDependencies().forEach({ println(it) }) from(testDependencies().map(::zipTree)) duplicatesStrategy = DuplicatesStrategy.EXCLUDE
diff --git a/d8_r8/test_modules/tests_java_8/settings.gradle.kts b/d8_r8/test_modules/tests_java_8/settings.gradle.kts index da320a7..73f5d73 100644 --- a/d8_r8/test_modules/tests_java_8/settings.gradle.kts +++ b/d8_r8/test_modules/tests_java_8/settings.gradle.kts
@@ -10,3 +10,14 @@ // We need to include src/main as a composite-build otherwise our test-modules // will compete with the test to compile the source files. includeBuild(root.resolve("main")) + +includeBuild(root.resolve("test_modules").resolve("tests_java_examples")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidN")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidO")) +includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidP")) +includeBuild(root.resolve("test_modules").resolve("tests_java_9")) +includeBuild(root.resolve("test_modules").resolve("tests_java_10")) +includeBuild(root.resolve("test_modules").resolve("tests_java_11")) +includeBuild(root.resolve("test_modules").resolve("tests_java_17")) +includeBuild(root.resolve("test_modules").resolve("tests_java_20")) +
diff --git a/d8_r8/test_modules/tests_java_9/build.gradle.kts b/d8_r8/test_modules/tests_java_9/build.gradle.kts new file mode 100644 index 0000000..ac5923f --- /dev/null +++ b/d8_r8/test_modules/tests_java_9/build.gradle.kts
@@ -0,0 +1,36 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDir(root.resolveAll("src", "test", "examplesJava9")) + } + sourceCompatibility = JavaVersion.VERSION_1_9 + targetCompatibility = JavaVersion.VERSION_1_9 +} + +dependencies { } + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("Java9") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.executable = getCompilerPath(Jdk.JDK_9) + } +} +
diff --git a/d8_r8/test_modules/tests_java_9/gradle.properties b/d8_r8/test_modules/tests_java_9/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_9/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_9/settings.gradle.kts b/d8_r8/test_modules/tests_java_9/settings.gradle.kts new file mode 100644 index 0000000..b8a5260 --- /dev/null +++ b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_9"
diff --git a/d8_r8/test_modules/tests_java_examples/build.gradle.kts b/d8_r8/test_modules/tests_java_examples/build.gradle.kts new file mode 100644 index 0000000..05798be --- /dev/null +++ b/d8_r8/test_modules/tests_java_examples/build.gradle.kts
@@ -0,0 +1,41 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDirs.clear() + java.srcDir(root.resolveAll("src", "test", "examples")) + } + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + testCompileOnly(Deps.mockito) +} + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.jvmArgs = listOf( + "-Xss256m", + // Set the bootclass path so compilation is consistent with 1.8 target compatibility. + "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar") + } +}
diff --git a/d8_r8/test_modules/tests_java_examples/gradle.properties b/d8_r8/test_modules/tests_java_examples/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examples/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examples/settings.gradle.kts b/d8_r8/test_modules/tests_java_examples/settings.gradle.kts new file mode 100644 index 0000000..89c7a6f --- /dev/null +++ b/d8_r8/test_modules/tests_java_examples/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_examples"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts new file mode 100644 index 0000000..8cfe7d2 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts
@@ -0,0 +1,41 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDirs.clear() + java.srcDir(root.resolveAll("src", "test", "examplesAndroidN")) + } + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + testCompileOnly(Deps.asm) +} + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("AndroidN") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.jvmArgs = listOf( + "-Xss256m", + // Set the bootclass path so compilation is consistent with 1.8 target compatibility. + "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar") + } +}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts new file mode 100644 index 0000000..d0f1704 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_examplesAndroidN"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts new file mode 100644 index 0000000..44ed59d --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts
@@ -0,0 +1,41 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDirs.clear() + java.srcDir(root.resolveAll("src", "test", "examplesAndroidO")) + } + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + testCompileOnly(Deps.asm) +} + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("AndroidO") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.jvmArgs = listOf( + "-Xss256m", + // Set the bootclass path so compilation is consistent with 1.8 target compatibility. + "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar") + } +}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts new file mode 100644 index 0000000..0faef5f --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_examplesAndroidO"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts new file mode 100644 index 0000000..7e58f3b --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts
@@ -0,0 +1,41 @@ +// Copyright (c) 2023, 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. + +import org.gradle.api.JavaVersion +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + `kotlin-dsl` + `java-library` + id("dependencies-plugin") +} + +val root = getRoot() + +java { + sourceSets.test.configure { + java.srcDirs.clear() + java.srcDir(root.resolveAll("src", "test", "examplesAndroidP")) + } + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +dependencies { + testCompileOnly(Deps.asm) +} + +// We just need to register the examples jars for it to be referenced by other modules. +val buildExampleJars = buildJavaExamplesJars("AndroidP") + +tasks { + withType<JavaCompile> { + options.setFork(true) + options.forkOptions.memoryMaximumSize = "3g" + options.forkOptions.jvmArgs = listOf( + "-Xss256m", + // Set the bootclass path so compilation is consistent with 1.8 target compatibility. + "-Xbootclasspath/a:third_party/openjdk/openjdk-rt-1.8/rt.jar") + } +}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties new file mode 100644 index 0000000..1de43f9 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties
@@ -0,0 +1,17 @@ +# Copyright (c) 2023, 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. + +org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 +kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true +systemProp.file.encoding=UTF-8 + +# Enable new incremental compilation +kotlin.incremental.useClasspathSnapshot=true + +org.gradle.parallel=true +org.gradle.caching=true + +# Do not download any jdks or detect them. We provide them. +org.gradle.java.installations.auto-detect=false +org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts new file mode 100644 index 0000000..6add507 --- /dev/null +++ b/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts
@@ -0,0 +1,5 @@ +// Copyright (c) 2023, 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. + +rootProject.name = "tests_java_examplesAndroidP"
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckOptimizedOut.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckOptimizedOut.java new file mode 100644 index 0000000..5c11f44 --- /dev/null +++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckOptimizedOut.java
@@ -0,0 +1,29 @@ +// Copyright (c) 2023, 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.keepanno.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark that an item must be optimized out of the residual program. + * + * <p>An item is optimized out if its declaration is no longer present in the residual program. This + * can happen due to many distinct optimizations. For example, it may be dead code and removed by + * the usual shrinking. The item's declaration may also be removed if it could be inlined at all + * usages, in which case the output may still contain a value if it was a field, or instructions if + * it was a method. + * + * <p>CAUTION: Because of the dependency on shrinker internal optimizations and details such as + * inlining vs merging, the use of this annotation is somewhat unreliable and should be used with + * caution. In most cases it is more appropriate to use {@link CheckRemoved}. + */ +@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.CLASS) +public @interface CheckOptimizedOut { + + String description() default ""; +}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckRemoved.java b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckRemoved.java new file mode 100644 index 0000000..546c08b --- /dev/null +++ b/src/keepanno/java/com/android/tools/r8/keepanno/annotations/CheckRemoved.java
@@ -0,0 +1,25 @@ +// Copyright (c) 2023, 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.keepanno.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Mark that an item must be fully removed from the residual program. + * + * <p>Being removed from the program means that the item declaration is not present at all in the + * residual program. For example, inlined functions are not considered removed. If content of the + * item is allowed to be in the residual, use {@link CheckOptimizedOut}. + * + * <p>A class is removed if all of its members are removed and no references to the class remain. + */ +@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR}) +@Retention(RetentionPolicy.CLASS) +public @interface CheckRemoved { + + String description() default ""; +}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java index 7c24ff0..c988dc3 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
@@ -19,9 +19,12 @@ import com.android.tools.r8.keepanno.ast.AnnotationConstants.UsedByReflection; import com.android.tools.r8.keepanno.ast.AnnotationConstants.UsesReflection; import com.android.tools.r8.keepanno.ast.KeepBindings; +import com.android.tools.r8.keepanno.ast.KeepCheck; +import com.android.tools.r8.keepanno.ast.KeepCheck.KeepCheckKind; import com.android.tools.r8.keepanno.ast.KeepClassReference; import com.android.tools.r8.keepanno.ast.KeepCondition; import com.android.tools.r8.keepanno.ast.KeepConsequences; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.ast.KeepEdge; import com.android.tools.r8.keepanno.ast.KeepEdgeException; import com.android.tools.r8.keepanno.ast.KeepEdgeMetaInfo; @@ -67,18 +70,18 @@ public static int ASM_VERSION = ASM9; - public static Set<KeepEdge> readKeepEdges(byte[] classFileBytes) { + public static Set<KeepDeclaration> readKeepEdges(byte[] classFileBytes) { ClassReader reader = new ClassReader(classFileBytes); - Set<KeepEdge> edges = new HashSet<>(); - reader.accept(new KeepEdgeClassVisitor(edges::add), ClassReader.SKIP_CODE); - return edges; + Set<KeepDeclaration> declarations = new HashSet<>(); + reader.accept(new KeepEdgeClassVisitor(declarations::add), ClassReader.SKIP_CODE); + return declarations; } private static class KeepEdgeClassVisitor extends ClassVisitor { - private final Parent<KeepEdge> parent; + private final Parent<KeepDeclaration> parent; private String className; - KeepEdgeClassVisitor(Parent<KeepEdge> parent) { + KeepEdgeClassVisitor(Parent<KeepDeclaration> parent) { super(ASM_VERSION); this.parent = parent; } @@ -106,21 +109,30 @@ return null; } if (descriptor.equals(Edge.DESCRIPTOR)) { - return new KeepEdgeVisitor(parent, this::setContext); + return new KeepEdgeVisitor(parent::accept, this::setContext); } if (descriptor.equals(AnnotationConstants.UsesReflection.DESCRIPTOR)) { KeepItemPattern classItem = KeepItemPattern.builder() .setClassPattern(KeepQualifiedClassNamePattern.exact(className)) .build(); - return new UsesReflectionVisitor(parent, this::setContext, classItem); + return new UsesReflectionVisitor(parent::accept, this::setContext, classItem); } if (descriptor.equals(AnnotationConstants.ForApi.DESCRIPTOR)) { - return new ForApiClassVisitor(parent, this::setContext, className); + return new ForApiClassVisitor(parent::accept, this::setContext, className); } if (descriptor.equals(AnnotationConstants.UsedByReflection.DESCRIPTOR) || descriptor.equals(AnnotationConstants.UsedByNative.DESCRIPTOR)) { - return new UsedByReflectionClassVisitor(descriptor, parent, this::setContext, className); + return new UsedByReflectionClassVisitor( + descriptor, parent::accept, this::setContext, className); + } + if (descriptor.equals(AnnotationConstants.CheckRemoved.DESCRIPTOR)) { + return new CheckRemovedClassVisitor( + descriptor, parent::accept, this::setContext, className, KeepCheckKind.REMOVED); + } + if (descriptor.equals(AnnotationConstants.CheckOptimizedOut.DESCRIPTOR)) { + return new CheckRemovedClassVisitor( + descriptor, parent::accept, this::setContext, className, KeepCheckKind.OPTIMIZED_OUT); } return null; } @@ -132,24 +144,27 @@ @Override public MethodVisitor visitMethod( int access, String name, String descriptor, String signature, String[] exceptions) { - return new KeepEdgeMethodVisitor(parent, className, name, descriptor); + return new KeepEdgeMethodVisitor(parent::accept, className, name, descriptor); } @Override public FieldVisitor visitField( int access, String name, String descriptor, String signature, Object value) { - return new KeepEdgeFieldVisitor(parent, className, name, descriptor); + return new KeepEdgeFieldVisitor(parent::accept, className, name, descriptor); } } private static class KeepEdgeMethodVisitor extends MethodVisitor { - private final Parent<KeepEdge> parent; + private final Parent<KeepDeclaration> parent; private final String className; private final String methodName; private final String methodDescriptor; KeepEdgeMethodVisitor( - Parent<KeepEdge> parent, String className, String methodName, String methodDescriptor) { + Parent<KeepDeclaration> parent, + String className, + String methodName, + String methodDescriptor) { super(ASM_VERSION); this.parent = parent; this.className = className; @@ -187,18 +202,34 @@ return null; } if (descriptor.equals(Edge.DESCRIPTOR)) { - return new KeepEdgeVisitor(parent, this::setContext); + return new KeepEdgeVisitor(parent::accept, this::setContext); } if (descriptor.equals(AnnotationConstants.UsesReflection.DESCRIPTOR)) { - return new UsesReflectionVisitor(parent, this::setContext, createItemContext()); + return new UsesReflectionVisitor(parent::accept, this::setContext, createItemContext()); } if (descriptor.equals(AnnotationConstants.ForApi.DESCRIPTOR)) { - return new ForApiMemberVisitor(parent, this::setContext, createItemContext()); + return new ForApiMemberVisitor(parent::accept, this::setContext, createItemContext()); } if (descriptor.equals(AnnotationConstants.UsedByReflection.DESCRIPTOR) || descriptor.equals(AnnotationConstants.UsedByNative.DESCRIPTOR)) { return new UsedByReflectionMemberVisitor( - descriptor, parent, this::setContext, createItemContext()); + descriptor, parent::accept, this::setContext, createItemContext()); + } + if (descriptor.equals(AnnotationConstants.CheckRemoved.DESCRIPTOR)) { + return new CheckRemovedMemberVisitor( + descriptor, + parent::accept, + this::setContext, + createItemContext(), + KeepCheckKind.REMOVED); + } + if (descriptor.equals(AnnotationConstants.CheckOptimizedOut.DESCRIPTOR)) { + return new CheckRemovedMemberVisitor( + descriptor, + parent::accept, + this::setContext, + createItemContext(), + KeepCheckKind.OPTIMIZED_OUT); } return null; } @@ -830,6 +861,113 @@ } } + /** Parsing of @CheckRemoved and @CheckOptimizedOut on a class context. */ + private static class CheckRemovedClassVisitor extends AnnotationVisitorBase { + + private final String annotationDescriptor; + private final Parent<KeepCheck> parent; + private final KeepEdgeMetaInfo.Builder metaInfoBuilder = KeepEdgeMetaInfo.builder(); + private final String className; + private final KeepCheckKind kind; + + public CheckRemovedClassVisitor( + String annotationDescriptor, + Parent<KeepCheck> parent, + Consumer<KeepEdgeMetaInfo.Builder> addContext, + String className, + KeepCheckKind kind) { + this.annotationDescriptor = annotationDescriptor; + this.parent = parent; + this.className = className; + this.kind = kind; + addContext.accept(metaInfoBuilder); + } + + @Override + public String getAnnotationName() { + int sep = annotationDescriptor.lastIndexOf('/'); + return annotationDescriptor.substring(sep + 1, annotationDescriptor.length() - 1); + } + + @Override + public void visit(String name, Object value) { + if (name.equals(Edge.description) && value instanceof String) { + metaInfoBuilder.setDescription((String) value); + return; + } + super.visit(name, value); + } + + @Override + public void visitEnd() { + CheckRemovedClassVisitor superVisitor = this; + KeepItemVisitorBase itemVisitor = + new KeepItemVisitorBase() { + @Override + public String getAnnotationName() { + return superVisitor.getAnnotationName(); + } + }; + itemVisitor.visit(Item.className, className); + itemVisitor.visitEnd(); + parent.accept( + KeepCheck.builder() + .setMetaInfo(metaInfoBuilder.build()) + .setKind(kind) + .setItemPattern(itemVisitor.getItemReference().asItemPattern()) + .build()); + } + } + + /** Parsing of @CheckRemoved and @CheckOptimizedOut on a class context. */ + private static class CheckRemovedMemberVisitor extends AnnotationVisitorBase { + + private final String annotationDescriptor; + private final Parent<KeepDeclaration> parent; + private final KeepItemPattern context; + private final KeepEdgeMetaInfo.Builder metaInfoBuilder = KeepEdgeMetaInfo.builder(); + private final KeepCheckKind kind; + + CheckRemovedMemberVisitor( + String annotationDescriptor, + Parent<KeepDeclaration> parent, + Consumer<KeepEdgeMetaInfo.Builder> addContext, + KeepItemPattern context, + KeepCheckKind kind) { + this.annotationDescriptor = annotationDescriptor; + this.parent = parent; + this.context = context; + this.kind = kind; + addContext.accept(metaInfoBuilder); + } + + @Override + public String getAnnotationName() { + int sep = annotationDescriptor.lastIndexOf('/'); + return annotationDescriptor.substring(sep + 1, annotationDescriptor.length() - 1); + } + + @Override + public void visit(String name, Object value) { + if (name.equals(Edge.description) && value instanceof String) { + metaInfoBuilder.setDescription((String) value); + return; + } + super.visit(name, value); + } + + @Override + public void visitEnd() { + super.visitEnd(); + parent.accept( + KeepCheck.builder() + .setMetaInfo(metaInfoBuilder.build()) + .setKind(kind) + .setItemPattern(context) + .build()); + } + } + abstract static class Declaration<T> { abstract String kind();
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java index 876d04d..a8c7383 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/AnnotationConstants.java
@@ -87,6 +87,20 @@ // Content is the same as UsedByReflection. } + public static final class CheckRemoved { + public static final Class<com.android.tools.r8.keepanno.annotations.CheckRemoved> CLASS = + com.android.tools.r8.keepanno.annotations.CheckRemoved.class; + public static final String DESCRIPTOR = getDescriptor(CLASS); + public static final String description = "description"; + } + + public static final class CheckOptimizedOut { + public static final Class<com.android.tools.r8.keepanno.annotations.CheckOptimizedOut> CLASS = + com.android.tools.r8.keepanno.annotations.CheckOptimizedOut.class; + public static final String DESCRIPTOR = getDescriptor(CLASS); + public static final String description = "description"; + } + // Implicit hidden item which is "super type" of Condition and Target. public static final class Item { public static final String classFromBinding = "classFromBinding";
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java new file mode 100644 index 0000000..2ea942e --- /dev/null +++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepCheck.java
@@ -0,0 +1,72 @@ +// Copyright (c) 2023, 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.keepanno.ast; + +public class KeepCheck extends KeepDeclaration { + + public enum KeepCheckKind { + REMOVED, + OPTIMIZED_OUT + } + + public static class Builder { + + private KeepEdgeMetaInfo metaInfo = KeepEdgeMetaInfo.none(); + private KeepCheckKind kind = KeepCheckKind.REMOVED; + private KeepItemPattern itemPattern; + + public Builder setMetaInfo(KeepEdgeMetaInfo metaInfo) { + this.metaInfo = metaInfo; + return this; + } + + public Builder setKind(KeepCheckKind kind) { + this.kind = kind; + return this; + } + + public Builder setItemPattern(KeepItemPattern itemPattern) { + this.itemPattern = itemPattern; + return this; + } + + public KeepCheck build() { + if (itemPattern == null) { + throw new KeepEdgeException("KeepCheck must have an item pattern."); + } + return new KeepCheck(metaInfo, kind, itemPattern); + } + } + + public static Builder builder() { + return new Builder(); + } + + private final KeepEdgeMetaInfo metaInfo; + private final KeepCheckKind kind; + private final KeepItemPattern itemPattern; + + private KeepCheck(KeepEdgeMetaInfo metaInfo, KeepCheckKind kind, KeepItemPattern itemPattern) { + this.metaInfo = metaInfo; + this.kind = kind; + this.itemPattern = itemPattern; + } + + @Override + public KeepCheck asKeepCheck() { + return this; + } + + public KeepEdgeMetaInfo getMetaInfo() { + return metaInfo; + } + + public KeepCheckKind getKind() { + return kind; + } + + public KeepItemPattern getItemPattern() { + return itemPattern; + } +}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java new file mode 100644 index 0000000..62cb663 --- /dev/null +++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
@@ -0,0 +1,24 @@ +// Copyright (c) 2023, 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.keepanno.ast; + +/** Base class for the declarations represented in the keep annoations library. */ +public abstract class KeepDeclaration { + + public final boolean isKeepEdge() { + return asKeepEdge() != null; + } + + public KeepEdge asKeepEdge() { + return null; + } + + public final boolean isKeepCheck() { + return asKeepCheck() != null; + } + + public KeepCheck asKeepCheck() { + return null; + } +}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java index dd63480..656f40e 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
@@ -85,7 +85,7 @@ * ::= public | protected | package-private | private | static | final | synthetic * </pre> */ -public final class KeepEdge { +public final class KeepEdge extends KeepDeclaration { public static class Builder { private KeepEdgeMetaInfo metaInfo = KeepEdgeMetaInfo.none(); @@ -147,6 +147,11 @@ this.consequences = consequences; } + @Override + public KeepEdge asKeepEdge() { + return this; + } + public KeepEdgeMetaInfo getMetaInfo() { return metaInfo; }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeNormalizer.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeNormalizer.java index 1664218..87ed1ce 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeNormalizer.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepEdgeNormalizer.java
@@ -148,7 +148,7 @@ return bindingReference; } - private KeepItemPattern getClassItemPattern(KeepItemPattern fromPattern) { + public static KeepItemPattern getClassItemPattern(KeepItemPattern fromPattern) { return KeepItemPattern.builder() .setClassReference(fromPattern.getClassReference()) .setExtendsPattern(fromPattern.getExtendsPattern())
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java index 7d70e08..efb5a7f 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
@@ -4,7 +4,10 @@ package com.android.tools.r8.keepanno.keeprules; import com.android.tools.r8.keepanno.ast.KeepBindings; +import com.android.tools.r8.keepanno.ast.KeepCheck; +import com.android.tools.r8.keepanno.ast.KeepCheck.KeepCheckKind; import com.android.tools.r8.keepanno.ast.KeepCondition; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.ast.KeepEdge; import com.android.tools.r8.keepanno.ast.KeepEdgeException; import com.android.tools.r8.keepanno.ast.KeepEdgeMetaInfo; @@ -16,6 +19,7 @@ import com.android.tools.r8.keepanno.ast.KeepMethodAccessPattern; import com.android.tools.r8.keepanno.ast.KeepMethodPattern; import com.android.tools.r8.keepanno.ast.KeepOptions; +import com.android.tools.r8.keepanno.ast.KeepOptions.KeepOption; import com.android.tools.r8.keepanno.ast.KeepQualifiedClassNamePattern; import com.android.tools.r8.keepanno.ast.KeepTarget; import com.android.tools.r8.keepanno.keeprules.PgRule.PgConditionalRule; @@ -43,8 +47,8 @@ this.ruleConsumer = ruleConsumer; } - public void extract(KeepEdge edge) { - Collection<PgRule> rules = split(edge); + public void extract(KeepDeclaration declaration) { + Collection<PgRule> rules = split(declaration); StringBuilder builder = new StringBuilder(); for (PgRule rule : rules) { rule.printRule(builder); @@ -53,8 +57,74 @@ ruleConsumer.accept(builder.toString()); } - private static Collection<PgRule> split(KeepEdge edge) { - return doSplit(KeepEdgeNormalizer.normalize(edge)); + private static Collection<PgRule> split(KeepDeclaration declaration) { + if (declaration.isKeepCheck()) { + return generateCheckRules(declaration.asKeepCheck()); + } + return doSplit(KeepEdgeNormalizer.normalize(declaration.asKeepEdge())); + } + + private static Collection<PgRule> generateCheckRules(KeepCheck check) { + KeepItemPattern itemPattern = check.getItemPattern(); + boolean isRemovedPattern = check.getKind() == KeepCheckKind.REMOVED; + List<PgRule> rules = new ArrayList<>(isRemovedPattern ? 2 : 1); + Holder holder; + Map<String, KeepMemberPattern> memberPatterns; + List<String> targetMembers; + if (itemPattern.isClassItemPattern()) { + KeepBindings bindings = + KeepBindings.builder().addBinding("CLASS", check.getItemPattern()).build(); + holder = Holder.create("CLASS", bindings); + memberPatterns = Collections.emptyMap(); + targetMembers = Collections.emptyList(); + } else { + KeepBindings bindings = + KeepBindings.builder() + .addBinding("CLASS", KeepEdgeNormalizer.getClassItemPattern(check.getItemPattern())) + .build(); + holder = Holder.create("CLASS", bindings); + KeepMemberPattern memberPattern = itemPattern.getMemberPattern(); + memberPatterns = Collections.singletonMap("MEMBER", memberPattern); + targetMembers = Collections.singletonList("MEMBER"); + } + // Add a -checkdiscard rule for the class or members. + rules.add( + new PgUnconditionalRule( + check.getMetaInfo(), + holder, + KeepOptions.keepAll(), + memberPatterns, + targetMembers, + TargetKeepKind.CHECK_DISCARD)); + // If the check declaration is to ensure full removal we generate a soft-pin rule to disallow + // moving/inlining the items. + if (isRemovedPattern) { + KeepOptions allowShrinking = KeepOptions.allow(KeepOption.SHRINKING); + if (itemPattern.isClassItemPattern()) { + // A check removal on a class means that the entire class is removed, thus soft-pin the + // class and *all* of its members. + rules.add( + new PgUnconditionalRule( + check.getMetaInfo(), + holder, + allowShrinking, + Collections.singletonMap("MEMBERS", KeepMemberPattern.allMembers()), + Collections.singletonList("MEMBERS"), + TargetKeepKind.CLASS_OR_MEMBERS)); + } else { + // A check removal on members just soft-pins the members. + rules.add( + new PgDependentMembersRule( + check.getMetaInfo(), + holder, + allowShrinking, + memberPatterns, + Collections.emptyList(), + targetMembers, + TargetKeepKind.JUST_MEMBERS)); + } + } + return rules; } /**
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java index 412a91e..e0ad65e 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/PgRule.java
@@ -24,7 +24,8 @@ public enum TargetKeepKind { JUST_MEMBERS(RulePrintingUtils.KEEP_CLASS_MEMBERS), CLASS_OR_MEMBERS(RulePrintingUtils.KEEP), - CLASS_AND_MEMBERS(RulePrintingUtils.KEEP_CLASSES_WITH_MEMBERS); + CLASS_AND_MEMBERS(RulePrintingUtils.KEEP_CLASSES_WITH_MEMBERS), + CHECK_DISCARD(RulePrintingUtils.CHECK_DISCARD); private final String ruleKind; @@ -35,12 +36,19 @@ String getKeepRuleKind() { return ruleKind; } + + boolean isKeepKind() { + return this != CHECK_DISCARD; + } } - private static void printNonEmptyMembersPatternAsDefaultInitWorkaround(StringBuilder builder) { - // If no members is given, compat R8 and legacy full mode will implicitly keep <init>(). - // Add a keep of finalize which is a library method that would be kept in any case. - builder.append(" { void finalize(); }"); + private static void printNonEmptyMembersPatternAsDefaultInitWorkaround( + StringBuilder builder, TargetKeepKind kind) { + if (kind.isKeepKind()) { + // If no members is given, compat R8 and legacy full mode will implicitly keep <init>(). + // Add a keep of finalize which is a library method that would be kept in any case. + builder.append(" { void finalize(); }"); + } } private final KeepEdgeMetaInfo metaInfo; @@ -178,7 +186,7 @@ void printTargetHolder(StringBuilder builder) { printClassHeader(builder, holderPattern, classReferencePrinter(holderNamePattern)); if (getTargetMembers().isEmpty()) { - printNonEmptyMembersPatternAsDefaultInitWorkaround(builder); + printNonEmptyMembersPatternAsDefaultInitWorkaround(builder, targetKeepKind); } } @@ -251,7 +259,7 @@ void printTargetHolder(StringBuilder builder) { printClassHeader(builder, classTarget, this::printClassName); if (getTargetMembers().isEmpty()) { - PgRule.printNonEmptyMembersPatternAsDefaultInitWorkaround(builder); + PgRule.printNonEmptyMembersPatternAsDefaultInitWorkaround(builder, keepKind); } } @@ -388,7 +396,7 @@ } }); if (getTargetMembers().isEmpty()) { - PgRule.printNonEmptyMembersPatternAsDefaultInitWorkaround(builder); + PgRule.printNonEmptyMembersPatternAsDefaultInitWorkaround(builder, keepKind); } }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java index bf8136e..604fe5b 100644 --- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java +++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/RulePrintingUtils.java
@@ -37,6 +37,7 @@ public static final String KEEP = "-keep"; public static final String KEEP_CLASS_MEMBERS = "-keepclassmembers"; public static final String KEEP_CLASSES_WITH_MEMBERS = "-keepclasseswithmembers"; + public static final String CHECK_DISCARD = "-checkdiscard"; public static void printHeader(StringBuilder builder, KeepEdgeMetaInfo metaInfo) { if (metaInfo.hasContext()) {
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java index 82bd51b..86b5b5f 100644 --- a/src/main/java/com/android/tools/r8/R8.java +++ b/src/main/java/com/android/tools/r8/R8.java
@@ -38,6 +38,8 @@ import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger; import com.android.tools.r8.inspector.internal.InspectorImpl; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; +import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.PrimaryR8IRConverter; import com.android.tools.r8.ir.desugar.BackportedMethodRewriter; import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringCollection; @@ -461,6 +463,10 @@ AccessModifier.run(appViewWithLiveness, executorService, timing); + new RedundantBridgeRemover(appViewWithLiveness) + .setMustRetargetInvokesToTargetMethod() + .run(executorService, timing); + boolean isKotlinLibraryCompilationWithInlinePassThrough = options.enableCfByteCodePassThrough && appView.hasCfByteCodePassThroughMethods(); @@ -563,10 +569,12 @@ enqueuer.traceApplication(appView.rootSet(), executorService, timing); appView.setAppInfo(enqueuerResult.getAppInfo()); // Rerunning the enqueuer should not give rise to any method rewritings. + MutableMethodConversionOptions conversionOptions = + MethodConversionOptions.forPostLirPhase(appView); appView.withGeneratedMessageLiteBuilderShrinker( shrinker -> shrinker.rewriteDeadBuilderReferencesFromDynamicMethods( - appViewWithLiveness, executorService, timing)); + conversionOptions, appViewWithLiveness, executorService, timing)); if (options.isShrinking()) { // Mark dead proto extensions fields as neither being read nor written. This step must @@ -679,7 +687,7 @@ // This can only be done if we have AppInfoWithLiveness. if (appView.appInfo().hasLiveness()) { new RedundantBridgeRemover(appView.withLiveness()) - .run(memberRebindingIdentityLens, executorService, timing); + .run(executorService, timing, memberRebindingIdentityLens); } else { // If we don't have AppInfoWithLiveness here, it must be because we are not shrinking. When // we are not shrinking, we can't move visibility bridges. In principle, though, it would be @@ -1038,10 +1046,12 @@ shrinker -> shrinker.setDeadProtoTypes(appViewWithLiveness.appInfo().getDeadProtoTypes())); } + MutableMethodConversionOptions conversionOptions = + MethodConversionOptions.forPreLirPhase(appView); appView.withGeneratedMessageLiteBuilderShrinker( shrinker -> shrinker.rewriteDeadBuilderReferencesFromDynamicMethods( - appViewWithLiveness, executorService, timing)); + conversionOptions, appViewWithLiveness, executorService, timing)); timing.end(); return appViewWithLiveness; }
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java index 4e89913..4b8b6e3 100644 --- a/src/main/java/com/android/tools/r8/R8Command.java +++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -17,7 +17,7 @@ import com.android.tools.r8.inspector.internal.InspectorImpl; import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification; import com.android.tools.r8.keepanno.asm.KeepEdgeReader; -import com.android.tools.r8.keepanno.ast.KeepEdge; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor; import com.android.tools.r8.naming.MapConsumer; import com.android.tools.r8.naming.ProguardMapStringConsumer; @@ -765,7 +765,7 @@ for (ProgramResourceProvider provider : getAppBuilder().getProgramResourceProviders()) { for (ProgramResource resource : provider.getProgramResources()) { if (resource.getKind() == Kind.CF) { - Set<KeepEdge> edges = KeepEdgeReader.readKeepEdges(resource.getBytes()); + Set<KeepDeclaration> declarations = KeepEdgeReader.readKeepEdges(resource.getBytes()); KeepRuleExtractor extractor = new KeepRuleExtractor( rule -> { @@ -774,7 +774,7 @@ Collections.singletonList(rule), null, resource.getOrigin()); parser.parse(source); }); - edges.forEach(extractor::extract); + declarations.forEach(extractor::extract); } } }
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java index 3d5f387..930cdda 100644 --- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java +++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -932,11 +932,6 @@ if (!mapping.hasJumboStrings()) { return; } - // If the globally highest sorting string is not a jumbo string this is also a no-op. - if (application.highestSortingString != null - && application.highestSortingString.compareTo(mapping.getFirstJumboString()) < 0) { - return; - } } for (DexProgramClass clazz : classes) { clazz.forEachProgramMethodMatching(
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java index 13f6812..dede86b 100644 --- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java +++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -146,7 +146,7 @@ newDebugInfo); // As we have rewritten the code, we now know that its highest string index that is not // a jumbo-string is firstJumboString (actually the previous string, but we do not have that). - newCode.highestSortingString = firstJumboString; + newCode.setHighestSortingStringForJumboProcessedCode(firstJumboString); return newCode; }
diff --git a/src/main/java/com/android/tools/r8/errors/CheckDiscardDiagnostic.java b/src/main/java/com/android/tools/r8/errors/CheckDiscardDiagnostic.java index 5a9ebb3..9e64b69 100644 --- a/src/main/java/com/android/tools/r8/errors/CheckDiscardDiagnostic.java +++ b/src/main/java/com/android/tools/r8/errors/CheckDiscardDiagnostic.java
@@ -49,6 +49,10 @@ this.messages = messages; } + public int getNumberOfFailures() { + return messages.size(); + } + /** The origin of a -checkdiscarded failure is not unique. (The whole app is to blame.) */ @Override public Origin getOrigin() {
diff --git a/src/main/java/com/android/tools/r8/graph/AccessFlags.java b/src/main/java/com/android/tools/r8/graph/AccessFlags.java index 54fecaa..fe6e49c 100644 --- a/src/main/java/com/android/tools/r8/graph/AccessFlags.java +++ b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
@@ -146,6 +146,10 @@ return !isPublic() && !isPrivate(); } + public boolean isPackagePrivateOrPublic() { + return !isPrivate() && !isProtected(); + } + public boolean isPublic() { return isSet(Constants.ACC_PUBLIC); }
diff --git a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java index 90faadc..3fc29d6 100644 --- a/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java +++ b/src/main/java/com/android/tools/r8/graph/AssemblyWriter.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.contexts.CompilationContext; import com.android.tools.r8.graph.GenericSignature.ClassSignature; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore; @@ -190,7 +191,8 @@ method, OptimizationFeedbackIgnore.getInstance(), methodProcessor, - methodProcessingContext)); + methodProcessingContext, + MethodConversionOptions.forD8(converter.appView))); } private void writeAnnotations(
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java index b7feac3..e2a42f7 100644 --- a/src/main/java/com/android/tools/r8/graph/CfCode.java +++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -36,8 +36,8 @@ import com.android.tools.r8.ir.conversion.CfSourceCode; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; @@ -578,7 +578,7 @@ callerPosition, origin, protoChanges, - new ThrowingMethodConversionOptions(appView.options())); + MethodConversionOptions.nonConverting()); } private void verifyFramesOrRemove(ProgramMethod method, AppView<?> appView, GraphLens codeLens) {
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java index 193e758..3f04412 100644 --- a/src/main/java/com/android/tools/r8/graph/Code.java +++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -14,6 +14,7 @@ import com.android.tools.r8.ir.code.NumberGenerator; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.code.Position.PositionBuilder; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.lightir.LirCode; import com.android.tools.r8.origin.Origin; @@ -24,7 +25,7 @@ public abstract class Code extends CachedHashValueDexItem { public final IRCode buildIR(ProgramMethod method, AppView<?> appView, Origin origin) { - return buildIR(method, appView, origin, new MutableMethodConversionOptions(appView.options())); + return buildIR(method, appView, origin, MethodConversionOptions.forLirPhase(appView)); } public abstract IRCode buildIR(
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java index 31b2efe..4adaae6 100644 --- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java +++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -26,8 +26,8 @@ import com.android.tools.r8.ir.code.ValueType; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions; import com.android.tools.r8.ir.conversion.SyntheticStraightLineSourceCode; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; @@ -166,7 +166,7 @@ new DefaultInstanceInitializerSourceCode(originalMethod, callerPosition); return IRBuilder.createForInlining( method, appView, codeLens, source, origin, valueNumberGenerator, protoChanges) - .build(context, new ThrowingMethodConversionOptions(appView.options())); + .build(context, MethodConversionOptions.nonConverting()); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java index 311a287..da73661 100644 --- a/src/main/java/com/android/tools/r8/graph/DexApplication.java +++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -33,23 +33,18 @@ public final DexItemFactory dexItemFactory; private final DexApplicationReadFlags flags; - // Information on the lexicographically largest string referenced from code. - public final DexString highestSortingString; - /** Constructor should only be invoked by the DexApplication.Builder. */ DexApplication( ClassNameMapper proguardMap, DexApplicationReadFlags flags, ImmutableList<DataResourceProvider> dataResourceProviders, InternalOptions options, - DexString highestSortingString, Timing timing) { this.proguardMap = proguardMap; this.flags = flags; this.dataResourceProviders = dataResourceProviders; this.options = options; this.dexItemFactory = options.itemFactory; - this.highestSortingString = highestSortingString; this.timing = timing; } @@ -168,7 +163,6 @@ final Timing timing; DexApplicationReadFlags flags; - DexString highestSortingString; private final Collection<DexProgramClass> synthesizedClasses; public Builder(InternalOptions options, Timing timing) { @@ -186,7 +180,6 @@ dataResourceProviders.addAll(application.dataResourceProviders); proguardMap = application.getProguardMap(); timing = application.timing; - highestSortingString = application.highestSortingString; options = application.options; dexItemFactory = application.dexItemFactory; synthesizedClasses = new ArrayList<>(); @@ -246,11 +239,6 @@ return self(); } - public synchronized T setHighestSortingString(DexString value) { - highestSortingString = value; - return self(); - } - public synchronized T addProgramClass(DexProgramClass clazz) { programClasses.add(clazz); return self();
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java index 325eb79..763c1b9 100644 --- a/src/main/java/com/android/tools/r8/graph/DexCode.java +++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -36,8 +36,8 @@ import com.android.tools.r8.ir.conversion.DexSourceCode; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.ArrayUtils; import com.android.tools.r8.utils.DexDebugUtils.PositionInfo; @@ -76,7 +76,7 @@ public final TryHandler[] handlers; public final DexInstruction[] instructions; - public DexString highestSortingString; + private DexString highestSortingString; private DexDebugInfo debugInfo; private DexDebugInfoForWriting debugInfoForWriting; @@ -210,6 +210,13 @@ return DexCode::specify; } + public void setHighestSortingStringForJumboProcessedCode(DexString nonJumboString) { + // The call of this method marks this code object as properly jumbo-string processed. + // In principle, it should be possible to mark as such and assert that we do not reattempt + // processing in rewriteCodeWithJumboStrings. + highestSortingString = nonJumboString; + } + @Override public DexWritableCode rewriteCodeWithJumboStrings( ProgramMethod method, ObjectToOffsetMapping mapping, AppView<?> appView, boolean force) { @@ -554,7 +561,7 @@ appView.dexItemFactory()); return IRBuilder.createForInlining( method, appView, codeLens, source, origin, valueNumberGenerator, protoChanges) - .build(context, new ThrowingMethodConversionOptions(appView.options())); + .build(context, MethodConversionOptions.nonConverting()); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java index 67082ae..5452bf2 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -465,7 +465,6 @@ public boolean willBeInlinedIntoInstanceInitializer(DexItemFactory dexItemFactory) { checkIfObsolete(); if (getName().startsWith(dexItemFactory.temporaryConstructorMethodPrefix)) { - assert isPrivate(); assert !isStatic(); return true; }
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java index 08dad18..b6591b9 100644 --- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java +++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -49,9 +49,8 @@ ImmutableCollection<DexClasspathClass> classpathClasses, ImmutableList<DataResourceProvider> dataResourceProviders, InternalOptions options, - DexString highestSortingString, Timing timing) { - super(proguardMap, flags, dataResourceProviders, options, highestSortingString, timing); + super(proguardMap, flags, dataResourceProviders, options, timing); this.programOrClasspathClasses = programOrClasspathClasses; this.libraryClasses = libraryClasses; this.programClasses = programClasses; @@ -324,7 +323,6 @@ newClasspathClasses, ImmutableList.copyOf(dataResourceProviders), options, - highestSortingString, timing); }
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java b/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java index cff0d21..b5fc8e9 100644 --- a/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java +++ b/src/main/java/com/android/tools/r8/graph/GenericSignaturePrinter.java
@@ -200,11 +200,13 @@ } else { DexType enclosingType = classTypeSignature.enclosingTypeSignature.type; String outerDescriptor = namingLens.lookupDescriptor(enclosingType).toString(); - String innerClassName = DescriptorUtils.getInnerClassName(outerDescriptor, renamedString); + String innerClassName = + DescriptorUtils.getInnerClassNameFromDescriptor(outerDescriptor, renamedString); if (innerClassName == null && isTypeMissing.test(classTypeSignature.type)) { assert renamedString.equals(classTypeSignature.type.toDescriptorString()); innerClassName = - DescriptorUtils.getInnerClassName(enclosingType.toDescriptorString(), renamedString); + DescriptorUtils.getInnerClassNameFromDescriptor( + enclosingType.toDescriptorString(), renamedString); } if (innerClassName == null) { // We can no longer encode the inner name in the generic signature.
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java index 96d4bfa..b5b28fd 100644 --- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java +++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -40,9 +40,8 @@ ClasspathClassCollection classpathClasses, LibraryClassCollection libraryClasses, InternalOptions options, - DexString highestSortingString, Timing timing) { - super(proguardMap, flags, dataResourceProviders, options, highestSortingString, timing); + super(proguardMap, flags, dataResourceProviders, options, timing); this.programClasses = programClasses; this.classpathClasses = classpathClasses; this.libraryClasses = libraryClasses; @@ -329,7 +328,6 @@ classpathClasses, libraryClasses, options, - highestSortingString, timing); } }
diff --git a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java index e3b45a8..99cd8d2 100644 --- a/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java +++ b/src/main/java/com/android/tools/r8/graph/MethodAccessInfoCollection.java
@@ -63,13 +63,16 @@ fullyDestroyed = true; } - public void destroyNonDirectInvokes() { + public void destroyNonDirectNonSuperInvokes() { interfaceInvokes = ThrowingMap.get(); staticInvokes = ThrowingMap.get(); - superInvokes = ThrowingMap.get(); virtualInvokes = ThrowingMap.get(); } + public void destroySuperInvokes() { + superInvokes = ThrowingMap.get(); + } + public Modifier modifier() { return new Modifier( directInvokes, interfaceInvokes, staticInvokes, superInvokes, virtualInvokes); @@ -100,6 +103,10 @@ superInvokes.forEach(consumer); } + public boolean hasSuperInvoke(DexMethod method) { + return !superInvokes.getOrDefault(method, ProgramMethodSet.empty()).isEmpty(); + } + public void forEachSuperInvokeContext(DexMethod method, Consumer<ProgramMethod> consumer) { superInvokes.getOrDefault(method, ProgramMethodSet.empty()).forEach(consumer); } @@ -119,14 +126,17 @@ if (fullyDestroyed) { result = this; } else if (isThrowingMap(interfaceInvokes)) { - assert !isThrowingMap(directInvokes); assert isThrowingMap(staticInvokes); - assert isThrowingMap(superInvokes); assert isThrowingMap(virtualInvokes); + assert !isThrowingMap(directInvokes); MethodAccessInfoCollection.Builder<?> builder = identityBuilder(); rewriteInvokesWithLens(builder, directInvokes, definitions, lens, InvokeType.DIRECT); + rewriteInvokesWithLens(builder, superInvokes, definitions, lens, InvokeType.DIRECT); result = builder.build(); - result.destroyNonDirectInvokes(); + result.destroyNonDirectNonSuperInvokes(); + if (isThrowingMap(superInvokes)) { + result.destroySuperInvokes(); + } } else { MethodAccessInfoCollection.Builder<?> builder = identityBuilder(); rewriteInvokesWithLens(builder, directInvokes, definitions, lens, InvokeType.DIRECT); @@ -146,17 +156,19 @@ DexDefinitionSupplier definitions, GraphLens lens, InvokeType type) { - invokes.forEach( - (reference, contexts) -> { - ProgramMethodSet newContexts = contexts.rewrittenWithLens(definitions, lens); - for (ProgramMethod newContext : newContexts) { - MethodLookupResult methodLookupResult = - lens.lookupMethod(reference, newContext.getReference(), type); - DexMethod newReference = methodLookupResult.getReference(); - InvokeType newType = methodLookupResult.getType(); - builder.registerInvokeInContext(newReference, newContext, newType); - } - }); + if (!isThrowingMap(invokes)) { + invokes.forEach( + (reference, contexts) -> { + ProgramMethodSet newContexts = contexts.rewrittenWithLens(definitions, lens); + for (ProgramMethod newContext : newContexts) { + MethodLookupResult methodLookupResult = + lens.lookupMethod(reference, newContext.getReference(), type); + DexMethod newReference = methodLookupResult.getReference(); + InvokeType newType = methodLookupResult.getType(); + builder.registerInvokeInContext(newReference, newContext, newType); + } + }); + } } public MethodAccessInfoCollection withoutPrunedItems(PrunedItems prunedItems) {
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java index ff6d789..32ba2c2 100644 --- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java +++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.ir.code.NumberGenerator; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessor; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; @@ -29,7 +30,7 @@ } public IRCode buildIR(AppView<?> appView) { - return buildIR(appView, new MutableMethodConversionOptions(appView.options())); + return buildIR(appView, MethodConversionOptions.forLirPhase(appView)); } public IRCode buildIR(AppView<?> appView, MutableMethodConversionOptions conversionOptions) {
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java index 90c6d8d..735be28 100644 --- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java +++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -20,8 +20,8 @@ import com.android.tools.r8.ir.code.Position.SyntheticPosition; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions; import com.android.tools.r8.ir.conversion.SyntheticStraightLineSourceCode; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; @@ -77,7 +77,7 @@ ThrowNullSourceCode source = new ThrowNullSourceCode(method, callerPosition); return IRBuilder.createForInlining( method, appView, codeLens, source, origin, valueNumberGenerator, protoChanges) - .build(context, new ThrowingMethodConversionOptions(appView.options())); + .build(context, MethodConversionOptions.nonConverting()); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java index 02078ee..1d9e498 100644 --- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java +++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -254,6 +254,9 @@ || arg.isDexValueDouble() || arg.isDexValueString(); } + if (continuation.shouldBreak()) { + break; + } } }
diff --git a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java index bf5e3de..a84af1a 100644 --- a/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java +++ b/src/main/java/com/android/tools/r8/graph/fixup/TreeFixerBase.java
@@ -233,8 +233,8 @@ && outerClassType != null && innerClassAttribute.getInnerName() != null) { String innerClassName = - DescriptorUtils.getInnerClassName( - newOuterClassType.toDescriptorString(), newInnerClassType.toDescriptorString()); + DescriptorUtils.getInnerClassNameFromSimpleName( + newOuterClassType.getSimpleName(), newInnerClassType.getSimpleName()); if (innerClassName != null) { newInnerName = dexItemFactory.createString(innerClassName); } else {
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java index 9f2e2ad..59efae5 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -17,6 +17,8 @@ import com.android.tools.r8.graph.lens.MethodLookupResult; import com.android.tools.r8.horizontalclassmerging.code.SyntheticInitializerConverter; import com.android.tools.r8.ir.code.InvokeType; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; +import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.profile.art.ArtProfileCompletenessChecker; import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions; import com.android.tools.r8.shaking.AppInfoWithLiveness; @@ -88,7 +90,7 @@ timing.begin("HorizontalClassMerger (" + mode.toString() + ")"); IRCodeProvider codeProvider = appView.hasClassHierarchy() - ? IRCodeProvider.create(appView.withClassHierarchy()) + ? IRCodeProvider.create(appView.withClassHierarchy(), this::getConversionOptions) : IRCodeProvider.createThrowing(); run(runtimeTypeCheckInfo, codeProvider, executorService, timing); @@ -104,6 +106,12 @@ } } + private MutableMethodConversionOptions getConversionOptions() { + return mode == Mode.INITIAL + ? MethodConversionOptions.forPreLirPhase(appView) + : MethodConversionOptions.forPostLirPhase(appView); + } + private void run( RuntimeTypeCheckInfo runtimeTypeCheckInfo, IRCodeProvider codeProvider,
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java index ab14412..6a35c88 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IRCodeProvider.java
@@ -10,7 +10,9 @@ import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.lens.GraphLens; import com.android.tools.r8.ir.code.IRCode; +import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; +import java.util.function.Supplier; public interface IRCodeProvider { @@ -18,8 +20,10 @@ void setGraphLens(GraphLens graphLens); - static IRCodeProvider create(AppView<? extends AppInfoWithClassHierarchy> appView) { - return new IRCodeProviderImpl(appView); + static IRCodeProvider create( + AppView<? extends AppInfoWithClassHierarchy> appView, + Supplier<MutableMethodConversionOptions> getConversionOptions) { + return new IRCodeProviderImpl(appView, getConversionOptions); } static IRCodeProvider createThrowing() { @@ -37,8 +41,11 @@ class IRCodeProviderImpl implements IRCodeProvider { private final AppView<AppInfo> appViewForConversion; + private Supplier<MutableMethodConversionOptions> getConversionOptions; - private IRCodeProviderImpl(AppView<? extends AppInfoWithClassHierarchy> appView) { + private IRCodeProviderImpl( + AppView<? extends AppInfoWithClassHierarchy> appView, + Supplier<MutableMethodConversionOptions> getConversionOptions) { // At this point the code rewritings described by repackaging and synthetic finalization have // not been applied to the code objects. These code rewritings will be applied in the // application writer. We therefore simulate that we are in D8, to allow building IR for each @@ -51,6 +58,7 @@ appViewForConversion.setGraphLens(appView.graphLens()); appViewForConversion.setCodeLens(appView.codeLens()); this.appViewForConversion = appViewForConversion; + this.getConversionOptions = getConversionOptions; } @Override @@ -58,7 +66,7 @@ return method .getDefinition() .getCode() - .buildIR(method, appViewForConversion, method.getOrigin()); + .buildIR(method, appViewForConversion, method.getOrigin(), getConversionOptions.get()); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java index a78dc55..613d763 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.code.Instruction; import com.android.tools.r8.ir.code.StaticPut; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore; @@ -178,7 +179,8 @@ method, OptimizationFeedbackIgnore.getInstance(), methodProcessor, - methodProcessingContext), + methodProcessingContext, + MethodConversionOptions.forPostLirPhase(appView)), executorService); timing.end(); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java index 51de538..9ecd2a9 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteBuilderShrinker.java
@@ -33,6 +33,7 @@ import com.android.tools.r8.ir.code.StaticGet; import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessor; import com.android.tools.r8.ir.conversion.callgraph.Node; import com.android.tools.r8.ir.optimize.Inliner; @@ -42,6 +43,7 @@ import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple; import com.android.tools.r8.ir.optimize.inliner.FixedInliningReasonStrategy; import com.android.tools.r8.shaking.AppInfoWithLiveness; +import com.android.tools.r8.shaking.DependentMinimumKeepInfoCollection; import com.android.tools.r8.shaking.Enqueuer; import com.android.tools.r8.shaking.EnqueuerWorklist; import com.android.tools.r8.utils.Box; @@ -202,7 +204,10 @@ * references. */ public void rewriteDeadBuilderReferencesFromDynamicMethods( - AppView<AppInfoWithLiveness> appView, ExecutorService executorService, Timing timing) + MutableMethodConversionOptions conversionOptions, + AppView<AppInfoWithLiveness> appView, + ExecutorService executorService, + Timing timing) throws ExecutionException { if (builders.isEmpty()) { return; @@ -215,7 +220,7 @@ (builder, dynamicMethod) -> { if (!appInfo.isLiveProgramClass(builder)) { rewriteDeadBuilderReferencesFromDynamicMethod( - appView, builder, dynamicMethod, converter); + appView, builder, dynamicMethod, converter, conversionOptions); } }, executorService); @@ -227,8 +232,9 @@ AppView<AppInfoWithLiveness> appView, DexProgramClass builder, ProgramMethod dynamicMethod, - IRConverter converter) { - IRCode code = dynamicMethod.buildIR(appView); + IRConverter converter, + MutableMethodConversionOptions conversionOptions) { + IRCode code = dynamicMethod.buildIR(appView, conversionOptions); InstructionListIterator instructionIterator = code.instructionListIterator(); assert builder.superType == references.generatedMessageLiteBuilderType @@ -314,6 +320,14 @@ .extend(subtypingInfo); } + public void extendRootSet(DependentMinimumKeepInfoCollection dependentMinimumKeepInfo) { + dependentMinimumKeepInfo + .getOrCreateUnconditionalMinimumKeepInfoFor( + references.generatedMessageLiteBuilderMethods.constructorMethod) + .asMethodJoiner() + .disallowInlining(); + } + public void preprocessCallGraphBeforeCycleElimination(Map<DexMethod, Node> nodes) { Node node = nodes.get(references.generatedMessageLiteBuilderMethods.constructorMethod); if (node != null) { @@ -332,7 +346,6 @@ public void inlineCallsToDynamicMethod( ProgramMethod method, IRCode code, - EnumValueOptimizer enumValueOptimizer, OptimizationFeedback feedback, MethodProcessor methodProcessor, Inliner inliner) { @@ -345,9 +358,7 @@ // Run the enum optimization to optimize all Enum.ordinal() invocations. This is required to // get rid of the enum switch in dynamicMethod(). - if (enumValueOptimizer != null) { - enumValueOptimizer.run(code, Timing.empty()); - } + new EnumValueOptimizer(appView).run(code, Timing.empty()); } /**
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java index 809f0ad..608c06f 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -41,6 +41,7 @@ import com.android.tools.r8.ir.code.NewInstance; import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore; @@ -258,7 +259,8 @@ method, OptimizationFeedbackIgnore.getInstance(), methodProcessor, - methodProcessingContext), + methodProcessingContext, + MethodConversionOptions.forPostLirPhase(appView)), executorService); timing.end(); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java index 61747c0..8e43229 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
@@ -35,6 +35,7 @@ import com.android.tools.r8.ir.code.StaticGet; import com.android.tools.r8.ir.code.StaticPut; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.optimize.info.FieldOptimizationInfo; import com.android.tools.r8.shaking.Enqueuer; import com.android.tools.r8.shaking.EnqueuerWorklist; @@ -167,7 +168,7 @@ DexType holder = dynamicMethod.getHolderType(); assert !protos.containsKey(holder); - IRCode code = dynamicMethod.buildIR(appView); + IRCode code = dynamicMethod.buildIR(appView, MethodConversionOptions.nonConverting()); InvokeMethod newMessageInfoInvoke = GeneratedMessageLiteShrinker.getNewMessageInfoInvoke(code, references); ProtoMessageInfo protoMessageInfo = @@ -231,7 +232,7 @@ return; } - IRCode code = clinit.buildIR(appView); + IRCode code = clinit.buildIR(appView, MethodConversionOptions.nonConverting()); Map<DexEncodedField, StaticPut> uniqueStaticPuts = IRCodeUtils.findUniqueStaticPuts(appView, code, extensionFields); for (DexEncodedField extensionField : extensionFields) { @@ -256,7 +257,8 @@ private Map<DexProgramClass, Set<DexEncodedField>> collectExtensionFields() { Map<DexProgramClass, Set<DexEncodedField>> extensionFieldsByClass = new IdentityHashMap<>(); for (ProgramMethod findLiteExtensionByNumberMethod : findLiteExtensionByNumberMethods) { - IRCode code = findLiteExtensionByNumberMethod.buildIR(appView); + IRCode code = + findLiteExtensionByNumberMethod.buildIR(appView, MethodConversionOptions.nonConverting()); Set<Phi> seenPhis = Sets.newIdentityHashSet(); for (BasicBlock block : code.blocks(BasicBlock::isReturnBlock)) { Value returnValue = block.exit().asReturn().returnValue();
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java index ae9434b..73836d1 100644 --- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java +++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -87,7 +87,7 @@ InternalOptions options = appView.options(); if (options.debug || code.context().getOrComputeReachabilitySensitive(appView) - || code.getConversionOptions().isGeneratingClassFiles()) { + || !code.getConversionOptions().isGeneratingDex()) { return DeadInstructionResult.notDead(); } return DeadInstructionResult.deadIfOutValueIsDead();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java index 6c7a613..4e778ae 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/D8MethodProcessor.java
@@ -128,7 +128,8 @@ method, OptimizationFeedbackIgnore.getInstance(), this, - processorContext.createMethodProcessingContext(method)), + processorContext.createMethodProcessingContext(method), + MethodConversionOptions.forD8(converter.appView)), executorService)); }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java index 7e0cf3a..5b22d0e 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -29,6 +29,7 @@ import com.android.tools.r8.ir.code.InstructionIterator; import com.android.tools.r8.ir.code.NumberGenerator; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.passes.ArrayConstructionSimplifier; import com.android.tools.r8.ir.conversion.passes.BinopRewriter; import com.android.tools.r8.ir.conversion.passes.BranchSimplifier; @@ -38,6 +39,7 @@ import com.android.tools.r8.ir.conversion.passes.MoveResultRewriter; import com.android.tools.r8.ir.conversion.passes.NaturalIntLoopRemover; import com.android.tools.r8.ir.conversion.passes.ParentConstructorHoistingCodeRewriter; +import com.android.tools.r8.ir.conversion.passes.RedundantConstNumberRemover; import com.android.tools.r8.ir.conversion.passes.SplitBranch; import com.android.tools.r8.ir.conversion.passes.ThrowCatchOptimizer; import com.android.tools.r8.ir.conversion.passes.TrivialCheckCastAndInstanceOfRemover; @@ -124,8 +126,6 @@ private final ClassInliner classInliner; protected final InternalOptions options; public final CodeRewriter codeRewriter; - public final CommonSubexpressionElimination commonSubexpressionElimination; - private final SplitBranch splitBranch; public AssertionErrorTwoArgsConstructorRewriter assertionErrorTwoArgsConstructorRewriter; public final MemberValuePropagation<?> memberValuePropagation; private final LensCodeRewriter lensCodeRewriter; @@ -136,8 +136,6 @@ private final StringSwitchRemover stringSwitchRemover; private final TypeChecker typeChecker; protected ServiceLoaderRewriter serviceLoaderRewriter; - private final EnumValueOptimizer enumValueOptimizer; - private final BinopRewriter binopRewriter; protected final EnumUnboxer enumUnboxer; protected InstanceInitializerOutliner instanceInitializerOutliner; protected final RemoveVerificationErrorForUnknownReturnedValues @@ -176,8 +174,6 @@ this.appView = appView; this.options = appView.options(); this.codeRewriter = new CodeRewriter(appView); - this.commonSubexpressionElimination = new CommonSubexpressionElimination(appView); - this.splitBranch = new SplitBranch(appView); this.assertionErrorTwoArgsConstructorRewriter = appView.options().desugarState.isOn() ? new AssertionErrorTwoArgsConstructorRewriter(appView) @@ -227,8 +223,6 @@ this.stringSwitchRemover = null; this.serviceLoaderRewriter = null; this.methodOptimizationInfoCollector = null; - this.enumValueOptimizer = null; - this.binopRewriter = null; this.enumUnboxer = EnumUnboxer.empty(); this.assumeInserter = null; this.instanceInitializerOutliner = null; @@ -289,12 +283,6 @@ options.enableServiceLoaderRewriting ? new ServiceLoaderRewriter(appViewWithLiveness, appView.apiLevelCompute()) : null; - this.enumValueOptimizer = - options.enableEnumValueOptimization ? new EnumValueOptimizer(appViewWithLiveness) : null; - this.binopRewriter = - options.testing.enableBinopOptimization && !options.debug - ? new BinopRewriter(appView) - : null; } else { AppView<AppInfo> appViewWithoutClassHierarchy = appView.withoutClassHierarchy(); this.assumeInserter = null; @@ -314,8 +302,6 @@ this.typeChecker = null; this.serviceLoaderRewriter = null; this.methodOptimizationInfoCollector = null; - this.enumValueOptimizer = null; - this.binopRewriter = null; this.enumUnboxer = EnumUnboxer.empty(); } this.stringSwitchRemover = @@ -413,15 +399,18 @@ public void optimizeSynthesizedMethods( List<ProgramMethod> programMethods, MethodProcessorEventConsumer eventConsumer, + MutableMethodConversionOptions conversionOptions, ExecutorService executorService) throws ExecutionException { // Process the generated class, but don't apply any outlining. ProgramMethodSet methods = ProgramMethodSet.create(programMethods::forEach); - processMethodsConcurrently(methods, eventConsumer, executorService); + processMethodsConcurrently(methods, eventConsumer, conversionOptions, executorService); } public void optimizeSynthesizedMethod( - ProgramMethod synthesizedMethod, MethodProcessorEventConsumer eventConsumer) { + ProgramMethod synthesizedMethod, + MethodProcessorEventConsumer eventConsumer, + MutableMethodConversionOptions conversionOptions) { if (!synthesizedMethod.getDefinition().isProcessed()) { // Process the generated method, but don't apply any outlining. OneTimeMethodProcessor methodProcessor = @@ -429,25 +418,31 @@ methodProcessor.forEachWaveWithExtension( (method, methodProcessingContext) -> processDesugaredMethod( - method, delayedOptimizationFeedback, methodProcessor, methodProcessingContext)); + method, + delayedOptimizationFeedback, + methodProcessor, + methodProcessingContext, + conversionOptions)); } } public void processClassesConcurrently( Collection<DexProgramClass> classes, MethodProcessorEventConsumer eventConsumer, + MutableMethodConversionOptions conversionOptions, ExecutorService executorService) throws ExecutionException { ProgramMethodSet wave = ProgramMethodSet.create(); for (DexProgramClass clazz : classes) { clazz.forEachProgramMethod(wave::add); } - processMethodsConcurrently(wave, eventConsumer, executorService); + processMethodsConcurrently(wave, eventConsumer, conversionOptions, executorService); } public void processMethodsConcurrently( ProgramMethodSet wave, MethodProcessorEventConsumer eventConsumer, + MutableMethodConversionOptions conversionOptions, ExecutorService executorService) throws ExecutionException { if (!wave.isEmpty()) { @@ -456,7 +451,11 @@ methodProcessor.forEachWaveWithExtension( (method, methodProcessingContext) -> processDesugaredMethod( - method, delayedOptimizationFeedback, methodProcessor, methodProcessingContext), + method, + delayedOptimizationFeedback, + methodProcessor, + methodProcessingContext, + conversionOptions), executorService); } } @@ -466,12 +465,14 @@ ProgramMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor, - MethodProcessingContext methodProcessingContext) { + MethodProcessingContext methodProcessingContext, + MutableMethodConversionOptions conversionOptions) { DexEncodedMethod definition = method.getDefinition(); Code code = definition.getCode(); boolean matchesMethodFilter = options.methodMatchesFilter(definition); if (code != null && matchesMethodFilter) { - return rewriteDesugaredCode(method, feedback, methodProcessor, methodProcessingContext); + return rewriteDesugaredCode( + method, feedback, methodProcessor, methodProcessingContext, conversionOptions); } else { // Mark abstract methods as processed as well. definition.markProcessed(ConstraintWithTarget.NEVER); @@ -491,20 +492,22 @@ ProgramMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor, - MethodProcessingContext methodProcessingContext) { + MethodProcessingContext methodProcessingContext, + MutableMethodConversionOptions conversionOptions) { return ExceptionUtils.withOriginAndPositionAttachmentHandler( method.getOrigin(), new MethodPosition(method.getReference().asMethodReference()), () -> rewriteDesugaredCodeInternal( - method, feedback, methodProcessor, methodProcessingContext)); + method, feedback, methodProcessor, methodProcessingContext, conversionOptions)); } protected Timing rewriteDesugaredCodeInternal( ProgramMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor, - MethodProcessingContext methodProcessingContext) { + MethodProcessingContext methodProcessingContext, + MutableMethodConversionOptions conversionOptions) { if (options.verbose) { options.reporter.info( new StringDiagnostic("Processing: " + method.toSourceString())); @@ -518,7 +521,7 @@ return Timing.empty(); } - IRCode code = method.buildIR(appView); + IRCode code = method.buildIR(appView, conversionOptions); if (code == null) { feedback.markProcessed(method.getDefinition(), ConstraintWithTarget.NEVER); return Timing.empty(); @@ -644,13 +647,10 @@ previous = printMethod(code, "IR after member-value propagation (SSA)", previous); } - if (enumValueOptimizer != null) { - assert appView.enableWholeProgramOptimizations(); - timing.begin("Remove switch maps"); - enumValueOptimizer.removeSwitchMaps(code); - timing.end(); - previous = printMethod(code, "IR after enum-value optimization (SSA)", previous); - } + timing.begin("Remove switch maps"); + new EnumValueOptimizer(appView).removeSwitchMaps(code); + timing.end(); + previous = printMethod(code, "IR after enum-switch optimization (SSA)", previous); if (instanceInitializerOutliner != null) { instanceInitializerOutliner.rewriteInstanceInitializers( @@ -740,63 +740,35 @@ assert code.verifyTypes(appView); - new TrivialCheckCastAndInstanceOfRemover(appView) - .run(code, methodProcessor, methodProcessingContext, timing); - - if (enumValueOptimizer != null) { - assert appView.enableWholeProgramOptimizations(); - enumValueOptimizer.run(code, timing); - } - - new KnownArrayLengthRewriter(appView).run(code, timing); - new NaturalIntLoopRemover(appView).run(code, timing); if (assertionErrorTwoArgsConstructorRewriter != null) { timing.begin("Rewrite AssertionError"); assertionErrorTwoArgsConstructorRewriter.rewrite( code, methodProcessor, methodProcessingContext); timing.end(); } - commonSubexpressionElimination.run(code, timing); + + new TrivialCheckCastAndInstanceOfRemover(appView) + .run(code, methodProcessor, methodProcessingContext, timing); + new EnumValueOptimizer(appView).run(code, timing); + new KnownArrayLengthRewriter(appView).run(code, timing); + new NaturalIntLoopRemover(appView).run(code, timing); + new CommonSubexpressionElimination(appView).run(code, timing); new ArrayConstructionSimplifier(appView).run(code, timing); new MoveResultRewriter(appView).run(code, timing); - if (options.enableStringConcatenationOptimization && !isDebugMode) { - new StringBuilderAppendOptimizer(appView).run(code, timing); - } + new StringBuilderAppendOptimizer(appView).run(code, timing); new SparseConditionalConstantPropagation(appView, code).run(code, timing); - timing.begin("Rewrite always throwing instructions"); - new ThrowCatchOptimizer(appView).optimizeAlwaysThrowingInstructions(code); - timing.end(); - timing.begin("Simplify control flow"); - if (new BranchSimplifier(appView).simplifyBranches(code)) { + new ThrowCatchOptimizer(appView).run(code, timing); + if (new BranchSimplifier(appView) + .run(code, timing) + .asControlFlowSimplificationResult() + .anyAffectedValues()) { new TrivialCheckCastAndInstanceOfRemover(appView) .run(code, methodProcessor, methodProcessingContext, timing); } - timing.end(); - splitBranch.run(code, timing); - if (options.enableRedundantConstNumberOptimization) { - timing.begin("Remove const numbers"); - codeRewriter.redundantConstNumberRemoval(code); - timing.end(); - } - if (RedundantFieldLoadAndStoreElimination.shouldRun(appView, code)) { - timing.begin("Remove field loads"); - new RedundantFieldLoadAndStoreElimination(appView, code).run(); - timing.end(); - } - if (binopRewriter != null) { - binopRewriter.run(code, timing); - } - - if (options.testing.invertConditionals) { - invertConditionalsForTesting(code); - } - - if (!isDebugMode) { - timing.begin("Rewrite throw NPE"); - new ThrowCatchOptimizer(appView).rewriteThrowNullPointerException(code); - timing.end(); - previous = printMethod(code, "IR after rewrite throw null (SSA)", previous); - } + new SplitBranch(appView).run(code, timing); + new RedundantConstNumberRemover(appView).run(code, timing); + new RedundantFieldLoadAndStoreElimination(appView, code).run(code, timing); + new BinopRewriter(appView).run(code, timing); timing.begin("Optimize class initializers"); ClassInitializerDefaultsResult classInitializerDefaultsResult = @@ -810,6 +782,10 @@ deadCodeRemover.run(code, timing); assert code.isConsistentSSA(appView); + if (options.testing.invertConditionals) { + invertConditionalsForTesting(code); + } + previous = printMethod(code, "IR after dead code removal (SSA)", previous); assert code.verifyTypes(appView); @@ -824,7 +800,6 @@ classInliner.processMethodCode( appView.withLiveness(), stringOptimizer, - enumValueOptimizer, code.context(), code, feedback, @@ -937,7 +912,6 @@ // Assert that we do not have unremoved non-sense code in the output, e.g., v <- non-null NULL. assert code.verifyNoNullabilityBottomTypes(); - assert code.verifyTypes(appView); previous = @@ -1068,16 +1042,17 @@ if (options.testing.roundtripThroughLir) { code = roundtripThroughLir(code, feedback, bytecodeMetadataProvider, timing); } - if (options.testing.canUseLir(appView)) { + MethodConversionOptions conversionOptions = code.getConversionOptions(); + if (conversionOptions.isGeneratingLir()) { timing.begin("IR->LIR"); finalizeToLir(code, feedback, bytecodeMetadataProvider, timing); timing.end(); - } else if (options.isGeneratingClassFiles()) { + } else if (conversionOptions.isGeneratingClassFiles()) { timing.begin("IR->CF"); finalizeToCf(code, feedback, bytecodeMetadataProvider, timing); timing.end(); } else { - assert options.isGeneratingDex(); + assert conversionOptions.isGeneratingDex(); timing.begin("IR->DEX"); finalizeToDex(code, feedback, bytecodeMetadataProvider, timing); timing.end(); @@ -1130,7 +1105,8 @@ appView, null, RewrittenPrototypeDescription.none(), - appView.graphLens().getOriginalMethodSignature(code.context().getReference())); + appView.graphLens().getOriginalMethodSignature(code.context().getReference()), + (MutableMethodConversionOptions) code.getConversionOptions()); timing.end(); return irCode; } @@ -1177,7 +1153,6 @@ .finalizeCode(code, bytecodeMetadataProvider, timing), appView); markProcessed(code, feedback); - updateHighestSortingStrings(definition); } public void markProcessed(IRCode code, OptimizationFeedback feedback) { @@ -1205,18 +1180,6 @@ return true; } - protected synchronized void updateHighestSortingStrings(DexEncodedMethod method) { - Code code = method.getCode(); - assert code.isDexWritableCode(); - DexString highestSortingReferencedString = code.asDexWritableCode().getHighestSortingString(); - if (highestSortingReferencedString != null) { - if (highestSortingString == null - || highestSortingReferencedString.compareTo(highestSortingString) > 0) { - highestSortingString = highestSortingReferencedString; - } - } - } - public void printPhase(String phase) { if (!options.extensiveLoggingFilter.isEmpty()) { System.out.println("Entering phase: " + phase); @@ -1289,32 +1252,4 @@ inliner.onMethodCodePruned(method); } } - - public void finalizeLirMethodToOutputFormat(ProgramMethod method) { - Code code = method.getDefinition().getCode(); - if (!(code instanceof LirCode)) { - return; - } - Timing onThreadTiming = Timing.empty(); - IRCode irCode = method.buildIR(appView); - // Processing is done and no further uses of the meta-data should arise. - BytecodeMetadataProvider bytecodeMetadataProvider = BytecodeMetadataProvider.empty(); - // During processing optimization info may cause previously live code to become dead. - // E.g., we may now have knowledge that an invoke does not have side effects. - // Thus, we re-run the dead-code remover now as it is assumed complete by CF/DEX finalization. - deadCodeRemover.run(irCode, onThreadTiming); - if (options.isGeneratingClassFiles()) { - method.setCode( - new IRToCfFinalizer(appView, deadCodeRemover) - .finalizeCode(irCode, bytecodeMetadataProvider, onThreadTiming), - appView); - } else { - assert options.isGeneratingDex(); - method.setCode( - new IRToDexFinalizer(appView, deadCodeRemover) - .finalizeCode(irCode, bytecodeMetadataProvider, onThreadTiming), - appView); - updateHighestSortingStrings(method.getDefinition()); - } - } }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java index 8c161b8..535c9e7 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
@@ -37,17 +37,20 @@ D8NestBasedAccessDesugaring.checkAndFailOnIncompleteNests(appView); } DexEncodedMethod method = code.method(); + workaroundBugs(code, timing); code.traceBlocks(); - workaroundBugs(code); // Perform register allocation. RegisterAllocator registerAllocator = performRegisterAllocation(code, method, timing); return new DexBuilder(code, bytecodeMetadataProvider, registerAllocator, options).build(); } - private void workaroundBugs(IRCode code) { + private void workaroundBugs(IRCode code, Timing timing) { RuntimeWorkaroundCodeRewriter.workaroundNumberConversionRegisterAllocationBug(code, options); // Workaround massive dex2oat memory use for self-recursive methods. RuntimeWorkaroundCodeRewriter.workaroundDex2OatInliningIssue(appView, code); + if (RuntimeWorkaroundCodeRewriter.workaroundInstanceOfTypeWeakeningInVerifier(appView, code)) { + deadCodeRemover.run(code, timing); + } // Workaround MAX_INT switch issue. RuntimeWorkaroundCodeRewriter.workaroundSwitchMaxIntBug(code, appView); RuntimeWorkaroundCodeRewriter.workaroundDex2OatLinkedListBug(code, options);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java index adf0102..69c916e 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java
@@ -5,15 +5,67 @@ package com.android.tools.r8.ir.conversion; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.utils.InternalOptions; public abstract class MethodConversionOptions { + public static MutableMethodConversionOptions forPreLirPhase(AppView<?> appView) { + if (!appView.enableWholeProgramOptimizations()) { + return forD8(appView); + } + assert appView.testing().isPreLirPhase(); + return new MutableMethodConversionOptions(Target.CF, appView.options()); + } + + public static MutableMethodConversionOptions forPostLirPhase(AppView<?> appView) { + if (!appView.enableWholeProgramOptimizations()) { + return forD8(appView); + } + assert appView.testing().isPostLirPhase(); + Target target = appView.options().isGeneratingClassFiles() ? Target.CF : Target.DEX; + return new MutableMethodConversionOptions(target, appView.options()); + } + + public static MutableMethodConversionOptions forLirPhase(AppView<?> appView) { + if (!appView.enableWholeProgramOptimizations()) { + return forD8(appView); + } + assert appView.testing().isSupportedLirPhase(); + return new MutableMethodConversionOptions(determineTarget(appView), appView.options()); + } + + public static MutableMethodConversionOptions forD8(AppView<?> appView) { + assert !appView.enableWholeProgramOptimizations(); + return new MutableMethodConversionOptions(determineTarget(appView), appView.options()); + } + + public static MutableMethodConversionOptions nonConverting() { + return new ThrowingMethodConversionOptions(); + } + + private enum Target { + CF, + DEX, + LIR + } + + private static Target determineTarget(AppView<?> appView) { + if (appView.testing().canUseLir(appView)) { + return Target.LIR; + } + if (appView.options().isGeneratingClassFiles()) { + return Target.CF; + } + assert appView.options().isGeneratingDex(); + return Target.DEX; + } + + public abstract boolean isGeneratingLir(); + public abstract boolean isGeneratingClassFiles(); - public final boolean isGeneratingDex() { - return !isGeneratingClassFiles(); - } + public abstract boolean isGeneratingDex(); public abstract boolean isPeepholeOptimizationsEnabled(); @@ -21,13 +73,17 @@ public static class MutableMethodConversionOptions extends MethodConversionOptions { + private Target target; private boolean enablePeepholeOptimizations = true; private boolean enableStringSwitchConversion; - private boolean isGeneratingClassFiles; - public MutableMethodConversionOptions(InternalOptions options) { - this.enableStringSwitchConversion = options.isStringSwitchConversionEnabled(); - this.isGeneratingClassFiles = options.isGeneratingClassFiles(); + private MutableMethodConversionOptions(Target target, boolean enableStringSwitchConversion) { + this.target = target; + this.enableStringSwitchConversion = enableStringSwitchConversion; + } + + private MutableMethodConversionOptions(Target target, InternalOptions options) { + this(target, options.isStringSwitchConversionEnabled()); } public void disablePeepholeOptimizations(MethodProcessor methodProcessor) { @@ -40,15 +96,19 @@ return this; } - public MutableMethodConversionOptions setIsGeneratingClassFiles( - boolean isGeneratingClassFiles) { - this.isGeneratingClassFiles = isGeneratingClassFiles; - return this; + @Override + public boolean isGeneratingLir() { + return target == Target.LIR; } @Override public boolean isGeneratingClassFiles() { - return isGeneratingClassFiles; + return target == Target.CF; + } + + @Override + public boolean isGeneratingDex() { + return target == Target.DEX; } @Override @@ -64,8 +124,13 @@ public static class ThrowingMethodConversionOptions extends MutableMethodConversionOptions { - public ThrowingMethodConversionOptions(InternalOptions options) { - super(options); + private ThrowingMethodConversionOptions() { + super(null, true); + } + + @Override + public boolean isGeneratingLir() { + throw new Unreachable(); } @Override @@ -74,6 +139,11 @@ } @Override + public boolean isGeneratingDex() { + throw new Unreachable(); + } + + @Override public boolean isPeepholeOptimizationsEnabled() { throw new Unreachable(); }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java index bcbbe63..c5c3e73 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
@@ -85,7 +85,7 @@ application = commitPendingSyntheticItems(appView, application); // Build a new application with jumbo string info, - Builder<?> builder = application.builder().setHighestSortingString(highestSortingString); + Builder<?> builder = application.builder(); if (appView.options().isDesugaredLibraryCompilation()) { new EmulatedInterfaceApplicationRewriter(appView).rewriteApplication(builder); @@ -169,9 +169,6 @@ } else { assert definition.getCode().isDexCode(); } - if (!options.isGeneratingClassFiles()) { - updateHighestSortingStrings(definition); - } } private void checkPrefixMerging(ProgramMethod method) { @@ -380,7 +377,12 @@ MethodProcessor methodProcessor, MethodProcessingContext methodProcessingContext) { boolean didDesugar = desugar(method, desugaringEventConsumer, methodProcessingContext); - return rewriteDesugaredCodeInternal(method, feedback, methodProcessor, methodProcessingContext); + return rewriteDesugaredCodeInternal( + method, + feedback, + methodProcessor, + methodProcessingContext, + MethodConversionOptions.forD8(appView)); } private boolean desugar(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java index 9df87ae..729a2e5 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -6,14 +6,18 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexApplication; -import com.android.tools.r8.graph.DexApplication.Builder; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.PrunedItems; +import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadataProvider; import com.android.tools.r8.graph.lens.GraphLens; import com.android.tools.r8.ir.analysis.fieldaccess.TrivialFieldAccessReprocessor; +import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed; +import com.android.tools.r8.lightir.LirCode; import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagator; import com.android.tools.r8.shaking.AppInfoWithLiveness; import com.android.tools.r8.utils.ThreadUtils; @@ -51,6 +55,7 @@ private DexApplication internalOptimize( AppView<AppInfoWithLiveness> appView, ExecutorService executorService) throws ExecutionException { + appView.testing().enterLirSupportedPhase(); // Desugaring happens in the enqueuer. assert instructionDesugaring.isEmpty(); @@ -93,7 +98,11 @@ primaryMethodProcessor.forEachMethod( (method, methodProcessingContext) -> processDesugaredMethod( - method, feedback, primaryMethodProcessor, methodProcessingContext), + method, + feedback, + primaryMethodProcessor, + methodProcessingContext, + MethodConversionOptions.forLirPhase(appView)), this::waveStart, this::waveDone, timing, @@ -168,7 +177,11 @@ postMethodProcessor.forEachMethod( (method, methodProcessingContext) -> processDesugaredMethod( - method, feedback, postMethodProcessor, methodProcessingContext), + method, + feedback, + postMethodProcessor, + methodProcessingContext, + MethodConversionOptions.forLirPhase(appView)), feedback, executorService, timing); @@ -191,10 +204,6 @@ // synthetics.) commitPendingSyntheticItems(appView); - // Build a new application with jumbo string info. - Builder<?> builder = appView.appInfo().app().builder(); - builder.setHighestSortingString(highestSortingString); - // Update optimization info for all synthesized methods at once. feedback.updateVisibleOptimizationInfo(); @@ -209,11 +218,12 @@ // Assure that no more optimization feedback left after post processing. assert feedback.noUpdatesLeft(); finalizeLirToOutputFormat(timing, executorService); - return builder.build(); + return appView.appInfo().app(); } private void finalizeLirToOutputFormat(Timing timing, ExecutorService executorService) throws ExecutionException { + appView.testing().exitLirSupportedPhase(); if (!options.testing.canUseLir(appView)) { return; } @@ -230,6 +240,34 @@ timing.end(); } + void finalizeLirMethodToOutputFormat(ProgramMethod method) { + Code code = method.getDefinition().getCode(); + if (!(code instanceof LirCode)) { + return; + } + Timing onThreadTiming = Timing.empty(); + IRCode irCode = method.buildIR(appView, MethodConversionOptions.forPostLirPhase(appView)); + // Processing is done and no further uses of the meta-data should arise. + BytecodeMetadataProvider bytecodeMetadataProvider = BytecodeMetadataProvider.empty(); + // During processing optimization info may cause previously live code to become dead. + // E.g., we may now have knowledge that an invoke does not have side effects. + // Thus, we re-run the dead-code remover now as it is assumed complete by CF/DEX finalization. + deadCodeRemover.run(irCode, onThreadTiming); + MethodConversionOptions conversionOptions = irCode.getConversionOptions(); + if (conversionOptions.isGeneratingClassFiles()) { + method.setCode( + new IRToCfFinalizer(appView, deadCodeRemover) + .finalizeCode(irCode, bytecodeMetadataProvider, onThreadTiming), + appView); + } else { + assert conversionOptions.isGeneratingDex(); + method.setCode( + new IRToDexFinalizer(appView, deadCodeRemover) + .finalizeCode(irCode, bytecodeMetadataProvider, onThreadTiming), + appView); + } + } + private void clearDexMethodCompilationState() { appView.appInfo().classes().forEach(this::clearDexMethodCompilationState); }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java index f684ff5..70c64f1 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/BinopRewriter.java
@@ -245,7 +245,9 @@ @Override protected boolean shouldRewriteCode(IRCode code) { - return true; + return options.testing.enableBinopOptimization + && !isDebugMode(code.context()) + && code.metadata().mayHaveArithmeticOrLogicalBinop(); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java index 28ddb01..a239404 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/BranchSimplifier.java
@@ -4,6 +4,10 @@ package com.android.tools.r8.ir.conversion.passes; +import static com.android.tools.r8.ir.conversion.passes.BranchSimplifier.ControlFlowSimplificationResult.NO_CHANGE; +import static com.android.tools.r8.ir.conversion.passes.BranchSimplifier.ControlFlowSimplificationResult.create; + +import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedField; @@ -35,10 +39,10 @@ import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.code.ValueType; import com.android.tools.r8.ir.code.Xor; +import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult; import com.android.tools.r8.ir.optimize.controlflow.SwitchCaseAnalyzer; import com.android.tools.r8.shaking.AppInfoWithLiveness; import com.android.tools.r8.utils.BooleanUtils; -import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.InternalOutputMode; import com.android.tools.r8.utils.LongInterval; import com.google.common.collect.ImmutableList; @@ -59,20 +63,32 @@ import java.util.PriorityQueue; import java.util.Set; -public class BranchSimplifier { - - private final AppView<?> appView; - private final InternalOptions options; +public class BranchSimplifier extends CodeRewriterPass<AppInfo> { public BranchSimplifier(AppView<?> appView) { - this.appView = appView; - this.options = appView.options(); + super(appView); } - public boolean simplifyBranches(IRCode code) { - boolean anyAffectedValues = rewriteSwitch(code); - anyAffectedValues |= simplifyIf(code).anyAffectedValues(); - return anyAffectedValues; + @Override + protected String getTimingId() { + return "BranchSimplifier"; + } + + @Override + protected boolean shouldRewriteCode(IRCode code) { + return true; + } + + @Override + protected CodeRewriterResult noChange() { + return NO_CHANGE; + } + + @Override + protected CodeRewriterResult rewriteCode(IRCode code) { + ControlFlowSimplificationResult switchResult = rewriteSwitch(code); + ControlFlowSimplificationResult ifResult = simplifyIf(code); + return switchResult.combine(ifResult); } public ControlFlowSimplificationResult simplifyIf(IRCode code) { @@ -126,10 +142,26 @@ } code.removeRedundantBlocks(); assert code.isConsistentSSA(appView); - return new ControlFlowSimplificationResult(!affectedValues.isEmpty(), simplified); + return create(!affectedValues.isEmpty(), simplified); } - public static class ControlFlowSimplificationResult { + public static class ControlFlowSimplificationResult implements CodeRewriterResult { + + static ControlFlowSimplificationResult create( + boolean anyAffectedValues, boolean anySimplifications) { + if (anyAffectedValues) { + assert anySimplifications; + return ALL_CHANGED; + } + return anySimplifications ? ONLY_SIMPLIFICATIONS : NO_CHANGE; + } + + static final ControlFlowSimplificationResult ALL_CHANGED = + new ControlFlowSimplificationResult(true, true); + static final ControlFlowSimplificationResult ONLY_SIMPLIFICATIONS = + new ControlFlowSimplificationResult(false, true); + static final ControlFlowSimplificationResult NO_CHANGE = + new ControlFlowSimplificationResult(false, false); private final boolean anyAffectedValues; private final boolean anySimplifications; @@ -140,6 +172,11 @@ this.anySimplifications = anySimplifications; } + @Override + public ControlFlowSimplificationResult asControlFlowSimplificationResult() { + return this; + } + public boolean anyAffectedValues() { return anyAffectedValues; } @@ -147,6 +184,18 @@ public boolean anySimplifications() { return anySimplifications; } + + @Override + public boolean hasChanged() { + assert !anyAffectedValues || anySimplifications; + return anySimplifications(); + } + + public ControlFlowSimplificationResult combine(ControlFlowSimplificationResult ifResult) { + return create( + anyAffectedValues || ifResult.anyAffectedValues, + anySimplifications || ifResult.anySimplifications); + } } private boolean simplifyIfZeroTest(IRCode code, BasicBlock block, If theIf) { @@ -567,22 +616,25 @@ return true; } - private boolean rewriteSwitch(IRCode code) { + private ControlFlowSimplificationResult rewriteSwitch(IRCode code) { return rewriteSwitch(code, SwitchCaseAnalyzer.getInstance()); } - private boolean rewriteSwitch(IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) { + private ControlFlowSimplificationResult rewriteSwitch( + IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) { if (!options.isSwitchRewritingEnabled()) { - return false; + return NO_CHANGE; } if (!code.metadata().mayHaveSwitch()) { - return false; + return NO_CHANGE; } return rewriteSwitchFull(code, switchCaseAnalyzer); } - private boolean rewriteSwitchFull(IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) { + private ControlFlowSimplificationResult rewriteSwitchFull( + IRCode code, SwitchCaseAnalyzer switchCaseAnalyzer) { boolean needToRemoveUnreachableBlocks = false; + boolean anySimplifications = false; ListIterator<BasicBlock> blocksIterator = code.listIterator(); while (blocksIterator.hasNext()) { BasicBlock block = blocksIterator.next(); @@ -594,6 +646,7 @@ if (options.testing.enableDeadSwitchCaseElimination) { SwitchCaseEliminator eliminator = removeUnnecessarySwitchCases(code, theSwitch, iterator, switchCaseAnalyzer); + anySimplifications |= eliminator.canBeOptimized(); if (eliminator.mayHaveIntroducedUnreachableBlocks()) { needToRemoveUnreachableBlocks = true; } @@ -608,7 +661,8 @@ theSwitch = instruction.asSwitch(); } if (theSwitch.isIntSwitch()) { - rewriteIntSwitch(code, blocksIterator, block, iterator, theSwitch.asIntSwitch()); + anySimplifications |= + rewriteIntSwitch(code, blocksIterator, block, iterator, theSwitch.asIntSwitch()); } } } @@ -621,12 +675,13 @@ Set<Value> affectedValues = needToRemoveUnreachableBlocks ? code.removeUnreachableBlocks() : ImmutableSet.of(); - if (!affectedValues.isEmpty()) { + boolean anyAffectedValues = !affectedValues.isEmpty(); + if (anyAffectedValues) { new TypeAnalysis(appView).narrowing(affectedValues); } code.removeRedundantBlocks(); assert code.isConsistentSSA(appView); - return !affectedValues.isEmpty(); + return create(anyAffectedValues, anySimplifications); } public void rewriteSingleKeySwitchToIf( @@ -652,19 +707,19 @@ iterator.replaceCurrentInstruction(replacement); } - private void rewriteIntSwitch( + private boolean rewriteIntSwitch( IRCode code, ListIterator<BasicBlock> blockIterator, BasicBlock block, InstructionListIterator iterator, IntSwitch theSwitch) { if (disableSwitchToIfRewritingForClassIdComparisons(theSwitch)) { - return; + return false; } if (theSwitch.numberOfKeys() == 1) { rewriteSingleKeySwitchToIf(code, block, iterator, theSwitch); - return; + return true; } // If there are more than 1 key, we use the following algorithm to find keys to combine. @@ -753,7 +808,9 @@ if (newSwitchesSize + outliersAsIfSize + codeUnitMargin() < currentSize) { convertSwitchToSwitchAndIfs( code, blockIterator, block, iterator, theSwitch, newSwitchSequences, outliers); + return true; } + return false; } // TODO(b/181732463): We currently disable switch-to-if rewritings for switches on $r8$classId
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPass.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPass.java index aba955c..5f1705f 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPass.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/CodeRewriterPass.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexItemFactory; +import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.ir.conversion.MethodProcessor; import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult; @@ -58,6 +59,10 @@ return CodeRewriterResult.NO_CHANGE; } + protected boolean isDebugMode(ProgramMethod context) { + return options.debug || context.getOrComputeReachabilitySensitive(appView); + } + protected abstract String getTimingId(); protected CodeRewriterResult rewriteCode(IRCode code) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/KnownArrayLengthRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/KnownArrayLengthRewriter.java index 291f8b9..05c3702 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/KnownArrayLengthRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/KnownArrayLengthRewriter.java
@@ -34,6 +34,7 @@ @Override protected CodeRewriterResult rewriteCode(IRCode code) { + boolean hasChanged = false; InstructionListIterator iterator = code.instructionListIterator(); while (iterator.hasNext()) { Instruction current = iterator.next(); @@ -63,22 +64,27 @@ Value size = arrayDefinition.asNewArrayEmpty().size(); arrayLength.outValue().replaceUsers(size); iterator.removeOrReplaceByDebugLocalRead(); + hasChanged = true; } else if (arrayDefinition.isNewArrayFilledData()) { long size = arrayDefinition.asNewArrayFilledData().size; if (size > Integer.MAX_VALUE) { continue; } iterator.replaceCurrentInstructionWithConstInt(code, (int) size); + hasChanged = true; } else if (abstractValue.hasKnownArrayLength()) { iterator.replaceCurrentInstructionWithConstInt(code, abstractValue.getKnownArrayLength()); + hasChanged = true; } else { continue; } phiUsers.forEach(Phi::removeTrivialPhi); } - code.removeRedundantBlocks(); + if (hasChanged) { + code.removeRedundantBlocks(); + } assert code.isConsistentSSA(appView); - return CodeRewriterResult.NONE; + return CodeRewriterResult.hasChanged(hasChanged); } }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java index 2238b82..96b52dc 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/NaturalIntLoopRemover.java
@@ -58,7 +58,8 @@ @Override protected boolean shouldRewriteCode(IRCode code) { - return appView.options().enableLoopUnrolling; + // This is relevant only if a loop may be present, which implies at least 4 blocks. + return appView.options().enableLoopUnrolling && code.getBlocks().size() >= 4; } private boolean isComparisonBlock(BasicBlock comparisonBlockCandidate) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/RedundantConstNumberRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/RedundantConstNumberRemover.java new file mode 100644 index 0000000..70402cc --- /dev/null +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/RedundantConstNumberRemover.java
@@ -0,0 +1,278 @@ +// Copyright (c) 2023, 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.ir.conversion.passes; + +import com.android.tools.r8.graph.AppInfo; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.ir.code.BasicBlock; +import com.android.tools.r8.ir.code.ConstNumber; +import com.android.tools.r8.ir.code.DominatorTree; +import com.android.tools.r8.ir.code.IRCode; +import com.android.tools.r8.ir.code.If; +import com.android.tools.r8.ir.code.IfType; +import com.android.tools.r8.ir.code.Instruction; +import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult; +import com.android.tools.r8.utils.LazyBox; +import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; +import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; + +/** + * This optimization exploits that we can sometimes learn the constant value of an SSA value that + * flows into an if-eq of if-neq instruction. + * + * <p>Consider the following example: + * + * <pre> + * 1. if (obj != null) { + * 2. return doStuff(); + * 3. } + * 4. return null; + * </pre> + * + * <p>Since we know that `obj` is null in all blocks that are dominated by the false-target of the + * if-instruction in line 1, we can safely replace the null-constant in line 4 by `obj`, and thereby + * save a const-number instruction. + */ +public class RedundantConstNumberRemover extends CodeRewriterPass<AppInfo> { + + public RedundantConstNumberRemover(AppView<?> appView) { + super(appView); + } + + @Override + protected String getTimingId() { + return "RedundantConstNumberRemover"; + } + + @Override + protected boolean shouldRewriteCode(IRCode code) { + return options.enableRedundantConstNumberOptimization && code.metadata().mayHaveConstNumber(); + } + + @Override + protected CodeRewriterResult rewriteCode(IRCode code) { + redundantConstNumberRemoval(code); + return CodeRewriterResult.NONE; + } + + public void redundantConstNumberRemoval(IRCode code) { + if (appView.options().canHaveDalvikIntUsedAsNonIntPrimitiveTypeBug() + && !appView.options().testing.forceRedundantConstNumberRemoval) { + // See also b/124152497. + return; + } + + LazyBox<Long2ReferenceMap<List<ConstNumber>>> constantsByValue = + new LazyBox<>(() -> getConstantsByValue(code)); + LazyBox<DominatorTree> dominatorTree = new LazyBox<>(() -> new DominatorTree(code)); + + boolean changed = false; + for (BasicBlock block : code.blocks) { + Instruction lastInstruction = block.getInstructions().getLast(); + if (!lastInstruction.isIf()) { + continue; + } + + If ifInstruction = lastInstruction.asIf(); + IfType type = ifInstruction.getType(); + + Value lhs = ifInstruction.inValues().get(0); + Value rhs = !ifInstruction.isZeroTest() ? ifInstruction.inValues().get(1) : null; + + if (!ifInstruction.isZeroTest() && !lhs.isConstNumber() && !rhs.isConstNumber()) { + // We can only conclude anything from an if-instruction if it is a zero-test or if one of + // the two operands is a constant. + continue; + } + + // If the type is neither EQ nor NE, we cannot conclude anything about any of the in-values + // of the if-instruction from the outcome of the if-instruction. + if (type != IfType.EQ && type != IfType.NE) { + continue; + } + + BasicBlock trueTarget, falseTarget; + if (type == IfType.EQ) { + trueTarget = ifInstruction.getTrueTarget(); + falseTarget = ifInstruction.fallthroughBlock(); + } else { + falseTarget = ifInstruction.getTrueTarget(); + trueTarget = ifInstruction.fallthroughBlock(); + } + + if (ifInstruction.isZeroTest()) { + changed |= + replaceDominatedConstNumbers(0, lhs, trueTarget, constantsByValue, code, dominatorTree); + if (lhs.knownToBeBoolean()) { + changed |= + replaceDominatedConstNumbers( + 1, lhs, falseTarget, constantsByValue, code, dominatorTree); + } + } else { + assert rhs != null; + if (lhs.isConstNumber()) { + ConstNumber lhsAsNumber = lhs.getConstInstruction().asConstNumber(); + changed |= + replaceDominatedConstNumbers( + lhsAsNumber.getRawValue(), + rhs, + trueTarget, + constantsByValue, + code, + dominatorTree); + if (lhs.knownToBeBoolean() && rhs.knownToBeBoolean()) { + changed |= + replaceDominatedConstNumbers( + negateBoolean(lhsAsNumber), + rhs, + falseTarget, + constantsByValue, + code, + dominatorTree); + } + } else { + assert rhs.isConstNumber(); + ConstNumber rhsAsNumber = rhs.getConstInstruction().asConstNumber(); + changed |= + replaceDominatedConstNumbers( + rhsAsNumber.getRawValue(), + lhs, + trueTarget, + constantsByValue, + code, + dominatorTree); + if (lhs.knownToBeBoolean() && rhs.knownToBeBoolean()) { + changed |= + replaceDominatedConstNumbers( + negateBoolean(rhsAsNumber), + lhs, + falseTarget, + constantsByValue, + code, + dominatorTree); + } + } + } + + if (constantsByValue.computeIfAbsent().isEmpty()) { + break; + } + } + + if (changed) { + code.removeAllDeadAndTrivialPhis(); + } + assert code.isConsistentSSA(appView); + } + + private static Long2ReferenceMap<List<ConstNumber>> getConstantsByValue(IRCode code) { + // A map from the raw value of constants in `code` to the const number instructions that define + // the given raw value (irrespective of the type of the raw value). + Long2ReferenceMap<List<ConstNumber>> constantsByValue = new Long2ReferenceOpenHashMap<>(); + + // Initialize `constantsByValue`. + for (Instruction instruction : code.instructions()) { + if (instruction.isConstNumber()) { + ConstNumber constNumber = instruction.asConstNumber(); + if (constNumber.outValue().hasLocalInfo()) { + // Not necessarily constant, because it could be changed in the debugger. + continue; + } + long rawValue = constNumber.getRawValue(); + if (constantsByValue.containsKey(rawValue)) { + constantsByValue.get(rawValue).add(constNumber); + } else { + List<ConstNumber> list = new ArrayList<>(); + list.add(constNumber); + constantsByValue.put(rawValue, list); + } + } + } + return constantsByValue; + } + + private static int negateBoolean(ConstNumber number) { + assert number.outValue().knownToBeBoolean(); + return number.getRawValue() == 0 ? 1 : 0; + } + + private boolean replaceDominatedConstNumbers( + long withValue, + Value newValue, + BasicBlock dominator, + LazyBox<Long2ReferenceMap<List<ConstNumber>>> constantsByValueSupplier, + IRCode code, + LazyBox<DominatorTree> dominatorTree) { + if (newValue.hasLocalInfo()) { + // We cannot replace a constant with a value that has local info, because that could change + // debugging behavior. + return false; + } + + Long2ReferenceMap<List<ConstNumber>> constantsByValue = + constantsByValueSupplier.computeIfAbsent(); + List<ConstNumber> constantsWithValue = constantsByValue.get(withValue); + if (constantsWithValue == null || constantsWithValue.isEmpty()) { + return false; + } + + boolean changed = false; + + ListIterator<ConstNumber> constantWithValueIterator = constantsWithValue.listIterator(); + while (constantWithValueIterator.hasNext()) { + ConstNumber constNumber = constantWithValueIterator.next(); + Value value = constNumber.outValue(); + assert !value.hasLocalInfo(); + assert constNumber.getRawValue() == withValue; + + BasicBlock block = constNumber.getBlock(); + + // If the following condition does not hold, then the if-instruction does not dominate the + // block containing the constant, although the true or false target does. + if (block == dominator && block.getPredecessors().size() != 1) { + // This should generally not happen, but it is possible to write bytecode where it does. + assert false; + continue; + } + + if (value.knownToBeBoolean() && !newValue.knownToBeBoolean()) { + // We cannot replace a boolean by a none-boolean since that can lead to verification + // errors. For example, the following code fails with "register v1 has type Imprecise + // Constant: 127 but expected Boolean return-1nr". + // + // public boolean convertIntToBoolean(int v1) { + // const/4 v0, 0x1 + // if-eq v1, v0, :eq_true + // const/4 v1, 0x0 + // :eq_true + // return v1 + // } + continue; + } + + if (dominatorTree.computeIfAbsent().dominatedBy(block, dominator)) { + if (newValue.getType().lessThanOrEqual(value.getType(), appView)) { + value.replaceUsers(newValue); + block.listIterator(code, constNumber).removeOrReplaceByDebugLocalRead(); + constantWithValueIterator.remove(); + changed = true; + } else if (value.getType().isNullType()) { + // TODO(b/120257211): Need a mechanism to determine if `newValue` can be used at all of + // the use sites of `value` without introducing a type error. + } + } + } + + if (constantsWithValue.isEmpty()) { + constantsByValue.remove(withValue); + } + + return changed; + } +}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java index e4bac3e..2defd76 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/SplitBranch.java
@@ -40,7 +40,8 @@ @Override protected boolean shouldRewriteCode(IRCode code) { - return true; + // This is relevant only if there is a diamond followed by an if which is a minimum of 6 blocks. + return code.getBlocks().size() >= 6; } /**
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/SwitchCaseEliminator.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/SwitchCaseEliminator.java index cbda630..4a1a1d4 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/SwitchCaseEliminator.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/SwitchCaseEliminator.java
@@ -45,7 +45,7 @@ && switchCasesToBeRemoved.size() == theSwitch.numberOfKeys(); } - private boolean canBeOptimized() { + boolean canBeOptimized() { assert switchCasesToBeRemoved == null || !switchCasesToBeRemoved.isEmpty(); return switchCasesToBeRemoved != null || hasAlwaysHitCase() || !isFallthroughLive(); } @@ -96,7 +96,7 @@ liveFallthrough = false; } - boolean optimize() { + void optimize() { if (canBeOptimized()) { int originalNumberOfSuccessors = block.getSuccessors().size(); IntList removedSuccessorIndices = unlinkDeadSuccessors(); @@ -107,9 +107,7 @@ // Replace switch by a new switch where the dead switch cases have been removed. replaceSwitchByOptimizedSwitch(originalNumberOfSuccessors, removedSuccessorIndices); } - return true; } - return false; } private IntList unlinkDeadSuccessors() {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java index f34a6bd..fd79613 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/ThrowCatchOptimizer.java
@@ -5,10 +5,10 @@ package com.android.tools.r8.ir.conversion.passes; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; -import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeAnalysis; @@ -32,6 +32,7 @@ import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.code.Throw; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult; import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; @@ -40,18 +41,34 @@ import java.util.ListIterator; import java.util.Set; -public class ThrowCatchOptimizer { - - private final AppView<?> appView; - private final DexItemFactory dexItemFactory; +public class ThrowCatchOptimizer extends CodeRewriterPass<AppInfo> { public ThrowCatchOptimizer(AppView<?> appView) { - this.appView = appView; - this.dexItemFactory = appView.dexItemFactory(); + super(appView); + } + + @Override + protected String getTimingId() { + return "ThrowCatchOptimizer"; + } + + @Override + protected boolean shouldRewriteCode(IRCode code) { + return true; + } + + @Override + protected CodeRewriterResult rewriteCode(IRCode code) { + optimizeAlwaysThrowingInstructions(code); + if (!isDebugMode(code.context())) { + rewriteThrowNullPointerException(code); + } + return CodeRewriterResult.NONE; } // Rewrite 'throw new NullPointerException()' to 'throw null'. - public void rewriteThrowNullPointerException(IRCode code) { + private void rewriteThrowNullPointerException(IRCode code) { + boolean hasChanged = false; boolean shouldRemoveUnreachableBlocks = false; for (BasicBlock block : code.blocks) { InstructionListIterator it = block.listIterator(code); @@ -64,7 +81,7 @@ if (appView .dexItemFactory() .objectsMethods - .isRequireNonNullMethod(code.method().getReference())) { + .isRequireNonNullMethod(code.context().getReference())) { continue; } @@ -126,6 +143,7 @@ valueIsNullTarget, throwInstruction.getPosition()); shouldRemoveUnreachableBlocks = true; + hasChanged = true; } // Check for 'new-instance NullPointerException' with 2 users, not declaring a local and @@ -172,6 +190,7 @@ // Replace them with 'const 0' and 'throw'. it.add(nullPointer); it.add(throwInstruction); + hasChanged = true; } } } @@ -186,13 +205,16 @@ new TypeAnalysis(appView).narrowing(affectedValues); } } + if (hasChanged) { + code.removeRedundantBlocks(); + } assert code.isConsistentSSA(appView); } // Find all instructions that always throw, split the block after each such instruction and follow // it with a block throwing a null value (which should result in NPE). Note that this throw is not // expected to be ever reached, but is intended to satisfy verifier. - public void optimizeAlwaysThrowingInstructions(IRCode code) { + private void optimizeAlwaysThrowingInstructions(IRCode code) { Set<Value> affectedValues = Sets.newIdentityHashSet(); Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet(); ListIterator<BasicBlock> blockIterator = code.listIterator();
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java index 77104d5..a2654cf 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/TrivialCheckCastAndInstanceOfRemover.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext; import com.android.tools.r8.graph.AccessControl; -import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexProgramClass; @@ -36,7 +35,7 @@ import com.google.common.collect.Sets; import java.util.Set; -public class TrivialCheckCastAndInstanceOfRemover extends CodeRewriterPass<AppInfo> { +public class TrivialCheckCastAndInstanceOfRemover extends CodeRewriterPass<AppInfoWithLiveness> { public TrivialCheckCastAndInstanceOfRemover(AppView<?> appView) { super(appView); @@ -61,6 +60,7 @@ MethodProcessingContext methodProcessingContext) { assert appView.appInfo().hasLiveness(); AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness(); + boolean hasChanged = false; // If we can remove a CheckCast it is due to us having at least as much information about the // type as the CheckCast gives. We then need to propagate that information to the users of @@ -99,6 +99,7 @@ methodProcessingContext); if (removeResult != RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS) { assert removeResult == RemoveCheckCastInstructionIfTrivialResult.REMOVED_CAST_DO_NARROW; + hasChanged = true; needToRemoveTrivialPhis |= hasPhiUsers; typeAnalysis.narrowing(affectedValues); affectedValues.clear(); @@ -107,6 +108,7 @@ boolean hasPhiUsers = current.outValue().hasPhiUsers(); if (removeInstanceOfInstructionIfTrivial( appViewWithLiveness, current.asInstanceOf(), it, code)) { + hasChanged = true; needToRemoveTrivialPhis |= hasPhiUsers; } } @@ -123,9 +125,11 @@ typeAnalysis.narrowing(affectedValues); } } - code.removeRedundantBlocks(); + if (hasChanged) { + code.removeRedundantBlocks(); + } assert code.isConsistentSSA(appView); - return CodeRewriterResult.NONE; + return CodeRewriterResult.hasChanged(hasChanged); } enum RemoveCheckCastInstructionIfTrivialResult {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/result/CodeRewriterResult.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/result/CodeRewriterResult.java index 68d5c0d..1af288a 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/passes/result/CodeRewriterResult.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/result/CodeRewriterResult.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.ir.conversion.passes.result; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.ir.conversion.passes.BranchSimplifier.ControlFlowSimplificationResult; public interface CodeRewriterResult { @@ -37,4 +38,8 @@ } boolean hasChanged(); + + default ControlFlowSimplificationResult asControlFlowSimplificationResult() { + throw new Unreachable("Not a control flow simplification result."); + } }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java index 8ac1b02..3fbcfee 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/CovariantReturnTypeAnnotationTransformer.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder; import com.google.common.base.Predicates; @@ -198,7 +199,10 @@ .build(); // Optimize to generate DexCode instead of CfCode. ProgramMethod programMethod = new ProgramMethod(methodHolder, newVirtualMethod); - converter.optimizeSynthesizedMethod(programMethod, methodProcessorEventConsumer); + converter.optimizeSynthesizedMethod( + programMethod, + methodProcessorEventConsumer, + MethodConversionOptions.forD8(converter.appView)); eventConsumer.acceptCovariantReturnTypeBridgeMethod(programMethod, method); return newVirtualMethod; }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java index 6646ce0..bd8b0fc 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
@@ -21,6 +21,7 @@ import com.android.tools.r8.ir.code.RecordFieldValues; import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore; import com.android.tools.r8.shaking.AppInfoWithLiveness; import com.android.tools.r8.utils.Timing; @@ -67,7 +68,11 @@ programMethod .getDefinition() .getCode() - .buildIR(programMethod, appView, programMethod.getOrigin()); + .buildIR( + programMethod, + appView, + programMethod.getOrigin(), + MethodConversionOptions.forPostLirPhase(appView)); boolean done = false; ListIterator<BasicBlock> blockIterator = irCode.listIterator(); while (blockIterator.hasNext()) { @@ -85,7 +90,6 @@ assert done; irConverter.removeDeadCodeAndFinalizeIR( irCode, OptimizationFeedbackIgnore.getInstance(), Timing.empty()); - irConverter.finalizeLirMethodToOutputFormat(programMethod); } public void rewriteRecordFieldArray(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java index e696879..19f053f 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -21,11 +21,9 @@ import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.Assume; import com.android.tools.r8.ir.code.BasicBlock; -import com.android.tools.r8.ir.code.ConstNumber; import com.android.tools.r8.ir.code.ConstString; import com.android.tools.r8.ir.code.DebugLocalWrite; import com.android.tools.r8.ir.code.DebugLocalsChange; -import com.android.tools.r8.ir.code.DominatorTree; import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.ir.code.If; import com.android.tools.r8.ir.code.IfType; @@ -40,7 +38,6 @@ import com.android.tools.r8.ir.code.StaticGet; import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator; -import com.android.tools.r8.utils.LazyBox; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import com.google.common.collect.Streams; @@ -51,11 +48,7 @@ import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; -import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; -import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; -import java.util.ArrayList; import java.util.List; -import java.util.ListIterator; import java.util.Set; public class CodeRewriter { @@ -210,242 +203,6 @@ } /** - * This optimization exploits that we can sometimes learn the constant value of an SSA value that - * flows into an if-eq of if-neq instruction. - * - * <p>Consider the following example: - * - * <pre> - * 1. if (obj != null) { - * 2. return doStuff(); - * 3. } - * 4. return null; - * </pre> - * - * <p>Since we know that `obj` is null in all blocks that are dominated by the false-target of the - * if-instruction in line 1, we can safely replace the null-constant in line 4 by `obj`, and - * thereby save a const-number instruction. - */ - public void redundantConstNumberRemoval(IRCode code) { - if (appView.options().canHaveDalvikIntUsedAsNonIntPrimitiveTypeBug() - && !appView.options().testing.forceRedundantConstNumberRemoval) { - // See also b/124152497. - return; - } - - if (!code.metadata().mayHaveConstNumber()) { - return; - } - - LazyBox<Long2ReferenceMap<List<ConstNumber>>> constantsByValue = - new LazyBox<>(() -> getConstantsByValue(code)); - LazyBox<DominatorTree> dominatorTree = new LazyBox<>(() -> new DominatorTree(code)); - - boolean changed = false; - for (BasicBlock block : code.blocks) { - Instruction lastInstruction = block.getInstructions().getLast(); - if (!lastInstruction.isIf()) { - continue; - } - - If ifInstruction = lastInstruction.asIf(); - IfType type = ifInstruction.getType(); - - Value lhs = ifInstruction.inValues().get(0); - Value rhs = !ifInstruction.isZeroTest() ? ifInstruction.inValues().get(1) : null; - - if (!ifInstruction.isZeroTest() && !lhs.isConstNumber() && !rhs.isConstNumber()) { - // We can only conclude anything from an if-instruction if it is a zero-test or if one of - // the two operands is a constant. - continue; - } - - // If the type is neither EQ nor NE, we cannot conclude anything about any of the in-values - // of the if-instruction from the outcome of the if-instruction. - if (type != IfType.EQ && type != IfType.NE) { - continue; - } - - BasicBlock trueTarget, falseTarget; - if (type == IfType.EQ) { - trueTarget = ifInstruction.getTrueTarget(); - falseTarget = ifInstruction.fallthroughBlock(); - } else { - falseTarget = ifInstruction.getTrueTarget(); - trueTarget = ifInstruction.fallthroughBlock(); - } - - if (ifInstruction.isZeroTest()) { - changed |= - replaceDominatedConstNumbers(0, lhs, trueTarget, constantsByValue, code, dominatorTree); - if (lhs.knownToBeBoolean()) { - changed |= - replaceDominatedConstNumbers( - 1, lhs, falseTarget, constantsByValue, code, dominatorTree); - } - } else { - assert rhs != null; - if (lhs.isConstNumber()) { - ConstNumber lhsAsNumber = lhs.getConstInstruction().asConstNumber(); - changed |= - replaceDominatedConstNumbers( - lhsAsNumber.getRawValue(), - rhs, - trueTarget, - constantsByValue, - code, - dominatorTree); - if (lhs.knownToBeBoolean() && rhs.knownToBeBoolean()) { - changed |= - replaceDominatedConstNumbers( - negateBoolean(lhsAsNumber), - rhs, - falseTarget, - constantsByValue, - code, - dominatorTree); - } - } else { - assert rhs.isConstNumber(); - ConstNumber rhsAsNumber = rhs.getConstInstruction().asConstNumber(); - changed |= - replaceDominatedConstNumbers( - rhsAsNumber.getRawValue(), - lhs, - trueTarget, - constantsByValue, - code, - dominatorTree); - if (lhs.knownToBeBoolean() && rhs.knownToBeBoolean()) { - changed |= - replaceDominatedConstNumbers( - negateBoolean(rhsAsNumber), - lhs, - falseTarget, - constantsByValue, - code, - dominatorTree); - } - } - } - - if (constantsByValue.computeIfAbsent().isEmpty()) { - break; - } - } - - if (changed) { - code.removeAllDeadAndTrivialPhis(); - } - assert code.isConsistentSSA(appView); - } - - private static Long2ReferenceMap<List<ConstNumber>> getConstantsByValue(IRCode code) { - // A map from the raw value of constants in `code` to the const number instructions that define - // the given raw value (irrespective of the type of the raw value). - Long2ReferenceMap<List<ConstNumber>> constantsByValue = new Long2ReferenceOpenHashMap<>(); - - // Initialize `constantsByValue`. - for (Instruction instruction : code.instructions()) { - if (instruction.isConstNumber()) { - ConstNumber constNumber = instruction.asConstNumber(); - if (constNumber.outValue().hasLocalInfo()) { - // Not necessarily constant, because it could be changed in the debugger. - continue; - } - long rawValue = constNumber.getRawValue(); - if (constantsByValue.containsKey(rawValue)) { - constantsByValue.get(rawValue).add(constNumber); - } else { - List<ConstNumber> list = new ArrayList<>(); - list.add(constNumber); - constantsByValue.put(rawValue, list); - } - } - } - return constantsByValue; - } - - private static int negateBoolean(ConstNumber number) { - assert number.outValue().knownToBeBoolean(); - return number.getRawValue() == 0 ? 1 : 0; - } - - private boolean replaceDominatedConstNumbers( - long withValue, - Value newValue, - BasicBlock dominator, - LazyBox<Long2ReferenceMap<List<ConstNumber>>> constantsByValueSupplier, - IRCode code, - LazyBox<DominatorTree> dominatorTree) { - if (newValue.hasLocalInfo()) { - // We cannot replace a constant with a value that has local info, because that could change - // debugging behavior. - return false; - } - - Long2ReferenceMap<List<ConstNumber>> constantsByValue = - constantsByValueSupplier.computeIfAbsent(); - List<ConstNumber> constantsWithValue = constantsByValue.get(withValue); - if (constantsWithValue == null || constantsWithValue.isEmpty()) { - return false; - } - - boolean changed = false; - - ListIterator<ConstNumber> constantWithValueIterator = constantsWithValue.listIterator(); - while (constantWithValueIterator.hasNext()) { - ConstNumber constNumber = constantWithValueIterator.next(); - Value value = constNumber.outValue(); - assert !value.hasLocalInfo(); - assert constNumber.getRawValue() == withValue; - - BasicBlock block = constNumber.getBlock(); - - // If the following condition does not hold, then the if-instruction does not dominate the - // block containing the constant, although the true or false target does. - if (block == dominator && block.getPredecessors().size() != 1) { - // This should generally not happen, but it is possible to write bytecode where it does. - assert false; - continue; - } - - if (value.knownToBeBoolean() && !newValue.knownToBeBoolean()) { - // We cannot replace a boolean by a none-boolean since that can lead to verification - // errors. For example, the following code fails with "register v1 has type Imprecise - // Constant: 127 but expected Boolean return-1nr". - // - // public boolean convertIntToBoolean(int v1) { - // const/4 v0, 0x1 - // if-eq v1, v0, :eq_true - // const/4 v1, 0x0 - // :eq_true - // return v1 - // } - continue; - } - - if (dominatorTree.computeIfAbsent().dominatedBy(block, dominator)) { - if (newValue.getType().lessThanOrEqual(value.getType(), appView)) { - value.replaceUsers(newValue); - block.listIterator(code, constNumber).removeOrReplaceByDebugLocalRead(); - constantWithValueIterator.remove(); - changed = true; - } else if (value.getType().isNullType()) { - // TODO(b/120257211): Need a mechanism to determine if `newValue` can be used at all of - // the use sites of `value` without introducing a type error. - } - } - } - - if (constantsWithValue.isEmpty()) { - constantsByValue.remove(withValue); - } - - return changed; - } - - /** * Remove moves that are not actually used by instructions in exiting paths. These moves can arise * due to debug local info needing a particular value and the live-interval for it then moves it * back into the properly assigned register. If the register is only used for debug purposes, it
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java index e9b180c..b41131a 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
@@ -60,11 +60,15 @@ removeDeadInstructions(worklist, code, block, valueIsDeadAnalysis); removeDeadPhis(worklist, block, valueIsDeadAnalysis); } - } while (branchSimplifier.simplifyIf(code).anySimplifications() + } while (branchSimplifier + .simplifyIf(code) + .asControlFlowSimplificationResult() + .anySimplifications() || removeUnneededCatchHandlers(code)); code.removeRedundantBlocks(); assert code.isConsistentSSA(appView); + assert verifyNoDeadCode(code); timing.end(); } @@ -140,6 +144,7 @@ CheckCast checkCast = current.asCheckCast(); if (!checkCast.isRefiningStaticType(appView.options()) && checkCast.outValue().getLocalInfo() == checkCast.object().getLocalInfo()) { + updateWorklistWithNonDebugUses(worklist, checkCast); checkCast.outValue().replaceUsers(checkCast.object()); checkCast.object().uniquePhiUsers().forEach(Phi::removeTrivialPhi); } @@ -196,6 +201,16 @@ } } + private static void updateWorklistWithNonDebugUses( + Queue<BasicBlock> worklist, CheckCast checkCast) { + for (Instruction user : checkCast.outValue().uniqueUsers()) { + worklist.add(user.getBlock()); + } + for (Phi user : checkCast.outValue().uniquePhiUsers()) { + worklist.add(user.getBlock()); + } + } + private boolean removeUnneededCatchHandlers(IRCode code) { boolean mayHaveIntroducedUnreachableBlocks = false; for (BasicBlock block : code.blocks) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java index 1ea3e94..5b45fd5 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
@@ -8,6 +8,7 @@ import static com.android.tools.r8.utils.PredicateUtils.not; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndField; import com.android.tools.r8.graph.DexClassAndMethod; @@ -41,6 +42,8 @@ import com.android.tools.r8.ir.code.StaticGet; import com.android.tools.r8.ir.code.StaticPut; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.passes.CodeRewriterPass; +import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult; import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection; import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo; import com.android.tools.r8.shaking.AppInfoWithLiveness; @@ -63,12 +66,11 @@ * <p>Simple algorithm that goes through all blocks in one pass in topological order and propagates * active field sets across control-flow edges where the target has only one predecessor. */ -public class RedundantFieldLoadAndStoreElimination { +public class RedundantFieldLoadAndStoreElimination extends CodeRewriterPass<AppInfo> { private static final int MAX_CAPACITY = 10000; private static final int MIN_CAPACITY_PER_BLOCK = 50; - private final AppView<?> appView; private final ProgramMethod method; private final IRCode code; private final int maxCapacityPerBlock; @@ -87,20 +89,32 @@ private final Map<BasicBlock, Set<Instruction>> instructionsToRemove = new IdentityHashMap<>(); public RedundantFieldLoadAndStoreElimination(AppView<?> appView, IRCode code) { - this.appView = appView; + super(appView); this.method = code.context(); this.code = code; this.maxCapacityPerBlock = Math.max(MIN_CAPACITY_PER_BLOCK, MAX_CAPACITY / code.blocks.size()); this.release = !appView.options().debug; } - public static boolean shouldRun(AppView<?> appView, IRCode code) { + @Override + protected String getTimingId() { + return "RedundantFieldLoadAndStoreElimination"; + } + + @Override + protected boolean shouldRewriteCode(IRCode code) { return appView.options().enableRedundantFieldLoadElimination && (code.metadata().mayHaveArrayGet() || code.metadata().mayHaveFieldInstruction() || code.metadata().mayHaveInitClass()); } + @Override + protected CodeRewriterResult rewriteCode(IRCode code) { + run(); + return CodeRewriterResult.NONE; + } + private interface FieldValue { default ExistingValue asExistingValue() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java index 02e3b25..9ae8565 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/RuntimeWorkaroundCodeRewriter.java
@@ -16,6 +16,7 @@ import com.android.tools.r8.ir.code.AlwaysMaterializingUser; import com.android.tools.r8.ir.code.BasicBlock; import com.android.tools.r8.ir.code.IRCode; +import com.android.tools.r8.ir.code.InstanceOf; import com.android.tools.r8.ir.code.Instruction; import com.android.tools.r8.ir.code.InstructionListIterator; import com.android.tools.r8.ir.code.IntSwitch; @@ -70,6 +71,23 @@ } } + public static boolean workaroundInstanceOfTypeWeakeningInVerifier( + AppView<?> appView, IRCode code) { + boolean didReplaceInstructions = false; + for (BasicBlock block : code.getBlocks()) { + InstructionListIterator instructionIterator = block.listIterator(code); + while (instructionIterator.hasNext()) { + InstanceOf instanceOf = instructionIterator.nextUntil(Instruction::isInstanceOf); + if (instanceOf != null && instanceOf.value().getType().isNullType()) { + instructionIterator.replaceCurrentInstructionWithConstFalse(code); + didReplaceInstructions = true; + } + } + } + assert code.isConsistentSSA(appView); + return didReplaceInstructions; + } + public static void workaroundSwitchMaxIntBug(IRCode code, AppView<?> appView) { if (appView.options().canHaveSwitchMaxIntBug() && code.metadata().mayHaveSwitch()) { // Always rewrite for workaround switch bug.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java index a40fca9..cdb30da 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/SwitchMapCollector.java
@@ -15,6 +15,7 @@ import com.android.tools.r8.ir.code.Instruction; import com.android.tools.r8.ir.code.InvokeVirtual; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.shaking.AppInfoWithLiveness; import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap; import it.unimi.dsi.fastutil.ints.Int2ReferenceMap; @@ -94,7 +95,10 @@ List<DexEncodedField> switchMapFields = clazz.staticFields().stream() .filter(this::maybeIsSwitchMap).collect(Collectors.toList()); if (!switchMapFields.isEmpty()) { - IRCode initializer = clazz.getProgramClassInitializer().buildIR(appView); + IRCode initializer = + clazz + .getProgramClassInitializer() + .buildIR(appView, MethodConversionOptions.nonConverting()); switchMapFields.forEach(field -> extractSwitchMap(field, initializer)); } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java index d3d2a08..19b2d81 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInliner.java
@@ -25,7 +25,6 @@ import com.android.tools.r8.ir.optimize.Inliner; import com.android.tools.r8.ir.optimize.InliningOracle; import com.android.tools.r8.ir.optimize.classinliner.InlineCandidateProcessor.IllegalClassInlinerStateException; -import com.android.tools.r8.ir.optimize.enums.EnumValueOptimizer; import com.android.tools.r8.ir.optimize.info.OptimizationFeedback; import com.android.tools.r8.ir.optimize.inliner.InliningIRProvider; import com.android.tools.r8.ir.optimize.string.StringOptimizer; @@ -129,7 +128,6 @@ public final void processMethodCode( AppView<AppInfoWithLiveness> appView, StringOptimizer stringOptimizer, - EnumValueOptimizer enumValueOptimizer, ProgramMethod method, IRCode code, OptimizationFeedback feedback, @@ -242,7 +240,7 @@ appView.withGeneratedMessageLiteBuilderShrinker( shrinker -> shrinker.inlineCallsToDynamicMethod( - method, code, enumValueOptimizer, feedback, methodProcessor, inliner)); + method, code, feedback, methodProcessor, inliner)); } if (anyInlinedMethods) { @@ -252,7 +250,7 @@ new TrivialCheckCastAndInstanceOfRemover(appView) .run(code, methodProcessor, methodProcessingContext, Timing.empty()); // If a method was inlined we may be able to prune additional branches. - new BranchSimplifier(appView).simplifyBranches(code); + new BranchSimplifier(appView).run(code, Timing.empty()); // If a method was inlined we may see more trivial computation/conversion of String. boolean isDebugMode = appView.options().debug || method.getOrComputeReachabilitySensitive(appView);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java index 115ab23..7f34299 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -319,9 +319,12 @@ enumUnboxingCandidatesInfo.addMethodDependency(eligibleEnum, code.context()); } } - if (methodsDependingOnLibraryModelisation.contains(code.context(), appView.graphLens())) { - code.mutateConversionOptions( - conversionOptions -> conversionOptions.disablePeepholeOptimizations(methodProcessor)); + // TODO(b/225838009): Remove this when always using LIR. + if (!appView.testing().canUseLir(appView)) { + if (methodsDependingOnLibraryModelisation.contains(code.context(), appView.graphLens())) { + code.mutateConversionOptions( + conversionOptions -> conversionOptions.disablePeepholeOptimizations(methodProcessor)); + } } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java index fa88164..867c2dc 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingRewriter.java
@@ -387,11 +387,15 @@ Value rewrittenOutValue = code.createValue( TypeElement.fromDexType(fieldMethod.getReturnType(), maybeNull(), appView)); + Value in = instanceGet.object(); + if (in.getType().isNullType()) { + iterator.previous(); + in = iterator.insertConstIntInstruction(code, options, 0); + iterator.next(); + } InvokeStatic invoke = new InvokeStatic( - fieldMethod.getReference(), - rewrittenOutValue, - ImmutableList.of(instanceGet.object())); + fieldMethod.getReference(), rewrittenOutValue, ImmutableList.of(in)); iterator.replaceCurrentInstruction(invoke); if (unboxedEnumsData.isUnboxedEnum(instanceGet.getField().type)) { convertedEnums.put(invoke, instanceGet.getField().type); @@ -529,6 +533,8 @@ if (invokedMethod == factory.javaLangSystemMembers.arraycopy) { // Intentionally empty. } else if (invokedMethod == factory.javaLangSystemMembers.identityHashCode) { + // Note that System.identityHashCode(null) == 0, so it works even if the input is null + // and not rewritten. assert invoke.arguments().size() == 1; Value argument = invoke.getFirstArgument(); DexType enumType = getEnumClassTypeOrNull(argument, convertedEnums);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java index eaa1d40..a0d4d36 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -50,6 +50,7 @@ import com.android.tools.r8.ir.conversion.ExtraParameter; import com.android.tools.r8.ir.conversion.ExtraUnusedNullParameter; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor; import com.android.tools.r8.ir.optimize.enums.EnumDataMap.EnumData; @@ -283,7 +284,11 @@ methodProcessor.forEachWaveWithExtension( (method, methodProcessingContext) -> converter.processDesugaredMethod( - method, OptimizationFeedback.getSimple(), methodProcessor, methodProcessingContext), + method, + OptimizationFeedback.getSimple(), + methodProcessor, + methodProcessingContext, + MethodConversionOptions.forLirPhase(appView)), executorService); return checkNotNullToCheckNotZeroMapping;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java index fc83f40..fe3de2f 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingUtilityClasses.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.OneTimeMethodProcessor; import com.android.tools.r8.ir.optimize.enums.EnumDataMap.EnumData; @@ -111,7 +112,8 @@ method, OptimizationFeedbackSimple.getInstance(), methodProcessor, - methodProcessingContext), + methodProcessingContext, + MethodConversionOptions.forLirPhase(appView)), executorService); return utilityClasses; }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java index 46ed560..c88b48d 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumValueOptimizer.java
@@ -25,7 +25,6 @@ import com.android.tools.r8.ir.code.ConstNumber; import com.android.tools.r8.ir.code.ConstString; import com.android.tools.r8.ir.code.IRCode; -import com.android.tools.r8.ir.code.IRMetadata; import com.android.tools.r8.ir.code.Instruction; import com.android.tools.r8.ir.code.InstructionListIterator; import com.android.tools.r8.ir.code.IntSwitch; @@ -51,7 +50,7 @@ public class EnumValueOptimizer extends CodeRewriterPass<AppInfoWithLiveness> { - public EnumValueOptimizer(AppView<AppInfoWithLiveness> appView) { + public EnumValueOptimizer(AppView<?> appView) { super(appView); } @@ -62,22 +61,8 @@ @Override protected CodeRewriterResult rewriteCode(IRCode code) { - rewriteConstantEnumMethodCalls(code); - return CodeRewriterResult.NONE; - } - - @Override - protected boolean shouldRewriteCode(IRCode code) { - return code.metadata().mayHaveInvokeMethodWithReceiver(); - } - - @SuppressWarnings("ConstantConditions") - private void rewriteConstantEnumMethodCalls(IRCode code) { - IRMetadata metadata = code.metadata(); - if (!metadata.mayHaveInvokeMethodWithReceiver()) { - return; - } - + assert appView.enableWholeProgramOptimizations(); + boolean hasChanged = false; Set<Value> affectedValues = Sets.newIdentityHashSet(); InstructionListIterator iterator = code.instructionListIterator(); while (iterator.hasNext()) { @@ -128,6 +113,7 @@ && !isToStringInvoke) { assert isNameInvoke || isOrdinalInvoke; iterator.removeOrReplaceByDebugLocalRead(); + hasChanged = true; } continue; } @@ -138,6 +124,7 @@ getOrdinalValue(code, abstractValue, methodWithReceiver.getReceiver().isNeverNull()); if (ordinalValue != null) { iterator.replaceCurrentInstruction(new ConstNumber(outValue, ordinalValue.getValue())); + hasChanged = true; } continue; } @@ -149,10 +136,8 @@ } if (isNameInvoke) { - Value newValue = - code.createValue(TypeElement.stringClassType(appView, definitelyNotNull())); - iterator.replaceCurrentInstruction(new ConstString(newValue, nameValue.getDexString())); - newValue.addAffectedValuesTo(affectedValues); + replaceByName(code, affectedValues, iterator, nameValue); + hasChanged = true; continue; } @@ -182,16 +167,33 @@ continue; } - Value newValue = - code.createValue(TypeElement.stringClassType(appView, definitelyNotNull())); - iterator.replaceCurrentInstruction(new ConstString(newValue, nameValue.getDexString())); - newValue.addAffectedValuesTo(affectedValues); + replaceByName(code, affectedValues, iterator, nameValue); + hasChanged = true; } } if (!affectedValues.isEmpty()) { new TypeAnalysis(appView).narrowing(affectedValues); } assert code.isConsistentSSA(appView); + return CodeRewriterResult.hasChanged(hasChanged); + } + + private void replaceByName( + IRCode code, + Set<Value> affectedValues, + InstructionListIterator iterator, + SingleStringValue nameValue) { + Value newValue = code.createValue(TypeElement.stringClassType(appView, definitelyNotNull())); + iterator.replaceCurrentInstruction(new ConstString(newValue, nameValue.getDexString())); + newValue.addAffectedValuesTo(affectedValues); + } + + @Override + protected boolean shouldRewriteCode(IRCode code) { + if (!options.enableEnumValueOptimization || !appView.hasLiveness()) { + return false; + } + return code.metadata().mayHaveInvokeMethodWithReceiver(); } /** @@ -215,6 +217,10 @@ * </blockquote> */ public void removeSwitchMaps(IRCode code) { + if (!options.enableEnumValueOptimization || !appView.hasLiveness()) { + return; + } + assert appView.enableWholeProgramOptimizations(); Set<Value> affectedValues = Sets.newIdentityHashSet(); boolean mayHaveIntroducedUnreachableBlocks = false; for (BasicBlock block : code.blocks) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java index 1cedcc3..45f03bc 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/outliner/OutlinerImpl.java
@@ -59,6 +59,7 @@ import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.IRConverter; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.SourceCode; @@ -1360,7 +1361,10 @@ MethodProcessorEventConsumer methodProcessorEventConsumer = MethodProcessorEventConsumer.empty(); converter.optimizeSynthesizedMethods( - outlineMethods, methodProcessorEventConsumer, executorService); + outlineMethods, + methodProcessorEventConsumer, + MethodConversionOptions.forLirPhase(appView), + executorService); feedback.updateVisibleOptimizationInfo(); forEachSelectedOutliningMethod( converter,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java index 2ff8ec9..5ed16f7 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringBuilderAppendOptimizer.java
@@ -95,8 +95,10 @@ @Override protected boolean shouldRewriteCode(IRCode code) { - return code.metadata().mayHaveNewInstance() - || code.metadata().mayHaveInvokeMethodWithReceiver(); + return options.enableStringConcatenationOptimization + && !isDebugMode(code.context()) + && (code.metadata().mayHaveNewInstance() + || code.metadata().mayHaveInvokeMethodWithReceiver()); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java index 2200050..f726dda 100644 --- a/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java +++ b/src/main/java/com/android/tools/r8/ir/synthetic/AbstractSynthesizedCode.java
@@ -18,8 +18,8 @@ import com.android.tools.r8.ir.code.NumberGenerator; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.conversion.IRBuilder; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.ThrowingMethodConversionOptions; import com.android.tools.r8.ir.conversion.SourceCode; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.RetracerForCodePrinting; @@ -68,7 +68,7 @@ origin, valueNumberGenerator, protoChanges) - .build(context, new ThrowingMethodConversionOptions(appView.options())); + .build(context, MethodConversionOptions.nonConverting()); } @Override
diff --git a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java index f455dda..079b862 100644 --- a/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java +++ b/src/main/java/com/android/tools/r8/lightir/Lir2IRConverter.java
@@ -128,7 +128,8 @@ AppView<?> appView, Position callerPosition, RewrittenPrototypeDescription protoChanges, - DexMethod originalMethod) { + DexMethod originalMethod, + MutableMethodConversionOptions conversionOptions) { Parser<EV> parser = new Parser<>( lirCode, @@ -141,7 +142,7 @@ parser.parseArguments(method); parser.ensureDebugInfo(); lirCode.forEach(view -> view.accept(parser)); - IRCode irCode = parser.getIRCode(method); + IRCode irCode = parser.getIRCode(method, conversionOptions); // Some instructions have bottom types (e.g., phis). Compute their actual types by widening. new TypeAnalysis(appView).widening(irCode); return irCode; @@ -338,7 +339,8 @@ // TODO(b/270398965): Replace LinkedList. @SuppressWarnings("JdkObsolete") - public IRCode getIRCode(ProgramMethod method) { + public IRCode getIRCode( + ProgramMethod method, MutableMethodConversionOptions conversionOptions) { LinkedList<BasicBlock> blockList = new LinkedList<>(); IntList blockIndices = new IntArrayList(blocks.keySet()); blockIndices.sort(Integer::compare); @@ -364,7 +366,7 @@ basicBlockNumberGenerator, code.getMetadataForIR(), method.getOrigin(), - new MutableMethodConversionOptions(appView.options())); + conversionOptions); } public BasicBlock getBasicBlock(int instructionIndex) {
diff --git a/src/main/java/com/android/tools/r8/lightir/LirCode.java b/src/main/java/com/android/tools/r8/lightir/LirCode.java index d1a7149..0fccf4e 100644 --- a/src/main/java/com/android/tools/r8/lightir/LirCode.java +++ b/src/main/java/com/android/tools/r8/lightir/LirCode.java
@@ -28,6 +28,7 @@ import com.android.tools.r8.ir.code.NumberGenerator; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.code.Position.SourcePosition; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.InternalOptions; @@ -282,7 +283,8 @@ MutableMethodConversionOptions conversionOptions) { RewrittenPrototypeDescription protoChanges = appView.graphLens().lookupPrototypeChangesForMethodDefinition(method.getReference()); - return internalBuildIR(method, appView, new NumberGenerator(), null, protoChanges); + return internalBuildIR( + method, appView, new NumberGenerator(), null, protoChanges, conversionOptions); } @Override @@ -298,7 +300,13 @@ assert valueNumberGenerator != null; assert callerPosition != null; assert protoChanges != null; - return internalBuildIR(method, appView, valueNumberGenerator, callerPosition, protoChanges); + return internalBuildIR( + method, + appView, + valueNumberGenerator, + callerPosition, + protoChanges, + MethodConversionOptions.nonConverting()); } private IRCode internalBuildIR( @@ -306,7 +314,8 @@ AppView<?> appView, NumberGenerator valueNumberGenerator, Position callerPosition, - RewrittenPrototypeDescription protoChanges) { + RewrittenPrototypeDescription protoChanges, + MutableMethodConversionOptions conversionOptions) { LirCode<Integer> typedLir = asLirCode(); return Lir2IRConverter.translate( method, @@ -315,7 +324,8 @@ appView, callerPosition, protoChanges, - appView.graphLens().getOriginalMethodSignature(method.getReference())); + appView.graphLens().getOriginalMethodSignature(method.getReference()), + conversionOptions); } @Override
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java index d0d89a8..04e7817 100644 --- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java +++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -588,7 +588,6 @@ List<MappedRangesOfName> mappedRangesOfNames = entry.getValue().partitionOnMethodSignature(); for (MappedRangesOfName rangesOfName : mappedRangesOfNames) { - MemberNaming memberNaming = rangesOfName.getMemberNaming(mapper); List<MappedRange> newRangesToCompose = rangesOfName.getMappedRanges(); RangeBuilder minified = new RangeBuilder(); // The new minified ranges may have ranges that range over positions that has additional @@ -654,13 +653,10 @@ } } composedRanges = - fixupOutlineInformation( - computedOutlineInformation, - newRangesToCompose, - composedRanges, - memberNaming.getOriginalSignature().asMethodSignature()); + fixupOutlines(computedOutlineInformation, newRangesToCompose, composedRanges); MethodSignature residualSignature = - memberNaming + rangesOfName + .getMemberNaming(mapper) .computeResidualSignature(type -> inverseClassMapping.getOrDefault(type, type)) .asMethodSignature(); if (ListUtils.last(composedRanges).minifiedRange != null) { @@ -677,16 +673,14 @@ } } - private List<MappedRange> fixupOutlineInformation( + private List<MappedRange> fixupOutlines( ComputedOutlineInformation computedOutlineInformation, List<MappedRange> newRangesToBeComposed, - List<MappedRange> composedRanges, - MethodSignature originalSignature) + List<MappedRange> composedRanges) throws MappingComposeException { composedRanges = fixupInlinedOutlines(computedOutlineInformation, composedRanges); fixupOutlineInformation(computedOutlineInformation, newRangesToBeComposed, composedRanges); - fixupOutlineCallsiteInformation( - computedOutlineInformation, originalSignature, composedRanges); + fixupOutlineCallsiteInformation(computedOutlineInformation, composedRanges); return composedRanges; } @@ -846,10 +840,12 @@ private void fixupOutlineCallsiteInformation( ComputedOutlineInformation computedOutlineInformation, - MethodSignature originalSignature, List<MappedRange> composedRanges) throws MappingComposeException { - if (computedOutlineInformation.outlineCallsiteMappingInformationToPatchUp.isEmpty()) { + Map<OutlineCallsiteMappingInformation, List<ComputedMappedRangeForOutline>> + outlineCallsitesToPatchUp = + computedOutlineInformation.outlineCallsiteMappingInformationToPatchUp; + if (outlineCallsitesToPatchUp.isEmpty()) { return; } MappedRange lastComposedRange = ListUtils.last(composedRanges); @@ -857,42 +853,45 @@ // program. We therefore have to find the original positions and copy all inline frames // and amend the outermost frame with the residual signature and the next free position. List<OutlineCallsiteMappingInformation> outlineCallSites = - new ArrayList<>( - computedOutlineInformation.outlineCallsiteMappingInformationToPatchUp.keySet()); - outlineCallSites.sort(Comparator.comparing(mapping -> mapping.getOutline().toString())); + ListUtils.sort( + outlineCallsitesToPatchUp.keySet(), + Comparator.comparing(mapping -> mapping.getOutline().toString())); IntBox firstAvailableRange = new IntBox(lastComposedRange.minifiedRange.to + 1); for (OutlineCallsiteMappingInformation outlineCallSite : outlineCallSites) { - Int2IntSortedMap newPositionMap = - new Int2IntLinkedOpenHashMap(outlineCallSite.getPositions().size()); - visitOutlineMappedPositions( - outlineCallSite, - originalSignature, - positionInfo -> { - int newIndex = firstAvailableRange.getAndIncrement(); - Range newMinifiedRange = new Range(newIndex, newIndex); - MappedRange outerMostOutlineCallsiteFrame = - ListUtils.last(positionInfo.mappedRanges()); - for (MappedRange inlineMappedRangeInOutlinePosition : positionInfo.mappedRanges()) { - if (inlineMappedRangeInOutlinePosition != outerMostOutlineCallsiteFrame) { - composedRanges.add( - inlineMappedRangeInOutlinePosition.withMinifiedRange(newMinifiedRange)); + for (ComputedMappedRangeForOutline computedMappedRangeForOutline : + outlineCallsitesToPatchUp.get(outlineCallSite)) { + Int2IntSortedMap newPositionMap = + new Int2IntLinkedOpenHashMap(outlineCallSite.getPositions().size()); + visitOutlineMappedPositions( + outlineCallSite, + computedMappedRangeForOutline.current.getOriginalSignature(), + positionInfo -> { + int newIndex = firstAvailableRange.getAndIncrement(); + Range newMinifiedRange = new Range(newIndex, newIndex); + MappedRange outerMostOutlineCallsiteFrame = + ListUtils.last(positionInfo.mappedRanges()); + for (MappedRange inlineMappedRangeInOutlinePosition : positionInfo.mappedRanges()) { + if (inlineMappedRangeInOutlinePosition != outerMostOutlineCallsiteFrame) { + composedRanges.add( + inlineMappedRangeInOutlinePosition.withMinifiedRange(newMinifiedRange)); + } } - } - int originalPosition = - outerMostOutlineCallsiteFrame.getOriginalLineNumber( - positionInfo.outlineCallsitePosition()); - boolean hasInlineFrames = positionInfo.mappedRanges().size() > 1; - composedRanges.add( - new MappedRange( - newMinifiedRange, - lastComposedRange.signature, - hasInlineFrames - ? new Range(originalPosition) - : new Range(originalPosition, originalPosition), - lastComposedRange.getRenamedName())); - newPositionMap.put(positionInfo.outlinePosition(), newIndex); - outlineCallSite.setPositionsInternal(newPositionMap); - }); + int originalPosition = + outerMostOutlineCallsiteFrame.getOriginalLineNumber( + positionInfo.outlineCallsitePosition()); + boolean hasInlineFrames = positionInfo.mappedRanges().size() > 1; + composedRanges.add( + new MappedRange( + newMinifiedRange, + lastComposedRange.signature, + hasInlineFrames + ? new Range(originalPosition) + : new Range(originalPosition, originalPosition), + lastComposedRange.getRenamedName())); + newPositionMap.put(positionInfo.outlinePosition(), newIndex); + outlineCallSite.setPositionsInternal(newPositionMap); + }); + } } }
diff --git a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java index 8c2f8b7..253aa47 100644 --- a/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java +++ b/src/main/java/com/android/tools/r8/naming/dexitembasedstring/RecordFieldNamesComputationInfo.java
@@ -16,7 +16,6 @@ import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.StringUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.function.IntFunction; @@ -119,7 +118,6 @@ DexDefinitionSupplier definitions, GraphLens graphLens, IntFunction<String> nameSupplier) { - assert Arrays.stream(fields).allMatch(f -> f.holder == type); DexClass recordClass = definitions.contextIndependentDefinitionFor(type); assert recordClass != null; List<String> names = new ArrayList<>(fields.length);
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java index f5482db..6304490 100644 --- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java +++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
@@ -15,8 +15,6 @@ import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexMethodSignature; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.FieldAccessFlags; -import com.android.tools.r8.graph.FieldAccessInfo; import com.android.tools.r8.graph.ImmediateProgramSubtypingInfo; import com.android.tools.r8.graph.InnerClassAttribute; import com.android.tools.r8.graph.MethodAccessFlags; @@ -106,15 +104,13 @@ DexProgramClass clazz, AccessModifierNamingState namingState, BottomUpTraversalState traversalState) { - publicizeClass(clazz); - publicizeFields(clazz); + publicizeClass(clazz, traversalState); + publicizeFields(clazz, traversalState); publicizeMethods(clazz, namingState, traversalState); - // TODO(b/278736230): Also finalize classes and methods here. - finalizeFields(clazz); } - private void publicizeClass(DexProgramClass clazz) { - if (isAccessModificationAllowed(clazz) && !clazz.getAccessFlags().isPublic()) { + private void publicizeClass(DexProgramClass clazz, BottomUpTraversalState traversalState) { + if (isAccessModificationAllowed(clazz, traversalState) && !clazz.getAccessFlags().isPublic()) { clazz.getAccessFlags().promoteToPublic(); } @@ -130,12 +126,12 @@ } } - private void publicizeFields(DexProgramClass clazz) { - clazz.forEachProgramField(this::publicizeField); + private void publicizeFields(DexProgramClass clazz, BottomUpTraversalState traversalState) { + clazz.forEachProgramField(field -> publicizeField(field, traversalState)); } - private void publicizeField(ProgramField field) { - if (isAccessModificationAllowed(field) && !field.getAccessFlags().isPublic()) { + private void publicizeField(ProgramField field, BottomUpTraversalState traversalState) { + if (isAccessModificationAllowed(field, traversalState) && !field.getAccessFlags().isPublic()) { field.getAccessFlags().promoteToPublic(); } } @@ -165,7 +161,7 @@ AccessModifierNamingState namingState, BottomUpTraversalState traversalState) { MethodAccessFlags accessFlags = method.getAccessFlags(); - if (accessFlags.isPublic() || !isAccessModificationAllowed(method)) { + if (accessFlags.isPublic() || !isAccessModificationAllowed(method, traversalState)) { return commitMethod(method, localNamingState, namingState); } @@ -254,18 +250,35 @@ return newMethodReference; } - private boolean isAccessModificationAllowed(ProgramDefinition definition) { + private boolean isAccessModificationAllowed( + ProgramDefinition definition, BottomUpTraversalState traversalState) { if (!appView.getKeepInfo(definition).isAccessModificationAllowed(options)) { + if (!options.getAccessModifierOptions().isForceModifyingPackagePrivateAndProtectedMethods() + || !definition.isMethod() + || definition.getAccessFlags().isPrivate()) { + return false; + } + } + if (!appView.getKeepInfo(definition).isAccessModificationAllowedForTesting(options)) { return false; } + if (isFailedResolutionTarget(definition)) { + return false; + } + return definition.isClass() + || options.getAccessModifierOptions().canPollutePublicApi() + || !traversalState.isKeptOrHasKeptSubclass; + } + + private boolean isFailedResolutionTarget(ProgramDefinition definition) { if (definition.isClass()) { - return !appView.appInfo().isFailedClassResolutionTarget(definition.asClass().getType()); + return appView.appInfo().isFailedClassResolutionTarget(definition.asClass().getType()); } if (definition.isField()) { - return !appView.appInfo().isFailedFieldResolutionTarget(definition.asField().getReference()); + return appView.appInfo().isFailedFieldResolutionTarget(definition.asField().getReference()); } assert definition.isMethod(); - return !appView.appInfo().isFailedMethodResolutionTarget(definition.asMethod().getReference()); + return appView.appInfo().isFailedMethodResolutionTarget(definition.asMethod().getReference()); } private boolean isRenamingAllowed(ProgramMethod method) { @@ -296,28 +309,4 @@ } return method.getDefinition(); } - - // Finalization of classes and members. - - private void finalizeFields(DexProgramClass clazz) { - clazz.forEachProgramField(this::finalizeField); - } - - private void finalizeField(ProgramField field) { - FieldAccessFlags flags = field.getAccessFlags(); - FieldAccessInfo accessInfo = - appView.appInfo().getFieldAccessInfoCollection().get(field.getReference()); - if (!appView.getKeepInfo(field).isPinned(options) - && !accessInfo.hasReflectiveWrite() - && !accessInfo.isWrittenFromMethodHandle() - && accessInfo.isWrittenOnlyInMethodSatisfying( - method -> - method.getDefinition().isInitializer() - && method.getAccessFlags().isStatic() == flags.isStatic() - && method.getHolder() == field.getHolder()) - && !flags.isFinal() - && !flags.isVolatile()) { - flags.promoteToFinal(); - } - } }
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java index a9d69d6..99a0645 100644 --- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java +++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
@@ -8,14 +8,42 @@ public class AccessModifierOptions { + // TODO(b/131130038): Do not allow accessmodification when kept. + private boolean forceModifyPackagePrivateAndProtectedMethods = true; + private InternalOptions options; public AccessModifierOptions(InternalOptions options) { this.options = options; } + public boolean canPollutePublicApi() { + return isAccessModificationRulePresent() || options.isGeneratingDex(); + } + public boolean isAccessModificationEnabled() { + // TODO(b/288062771): Enable access modification for L8. + if (!options.synthesizedClassPrefix.isEmpty()) { + return false; + } + if (options.forceProguardCompatibility) { + return isAccessModificationRulePresent(); + } + return true; + } + + private boolean isAccessModificationRulePresent() { return options.hasProguardConfiguration() && options.getProguardConfiguration().isAccessModificationAllowed(); } + + public boolean isForceModifyingPackagePrivateAndProtectedMethods() { + return forceModifyPackagePrivateAndProtectedMethods; + } + + public void setForceModifyPackagePrivateAndProtectedMethods( + boolean forceModifyPackagePrivateAndProtectedMethods) { + this.forceModifyPackagePrivateAndProtectedMethods = + forceModifyPackagePrivateAndProtectedMethods; + } }
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierTraversal.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierTraversal.java index 1fef67f..e07407b 100644 --- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierTraversal.java +++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierTraversal.java
@@ -14,6 +14,8 @@ import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.optimize.argumentpropagation.utils.DepthFirstTopDownClassHierarchyTraversal; import com.android.tools.r8.shaking.AppInfoWithLiveness; +import com.android.tools.r8.shaking.KeepClassInfo; +import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.MapUtils; import com.android.tools.r8.utils.collections.DexMethodSignatureMap; import com.google.common.collect.Iterables; @@ -65,7 +67,11 @@ states.remove(clazz.getType()); // Remove and join the bottom up traversal states of the subclasses. - BottomUpTraversalState state = new BottomUpTraversalState(); + KeepClassInfo keepInfo = appView.getKeepInfo(clazz); + InternalOptions options = appView.options(); + BottomUpTraversalState state = + new BottomUpTraversalState( + !keepInfo.isMinificationAllowed(options) && !keepInfo.isShrinkingAllowed(options)); forEachSubClass( clazz, subclass -> { @@ -125,11 +131,14 @@ private static final BottomUpTraversalState EMPTY = new BottomUpTraversalState(DexMethodSignatureMap.empty()); + boolean isKeptOrHasKeptSubclass; + // The set of non-private virtual methods below the current class. DexMethodSignatureMap<Set<String>> nonPrivateVirtualMethods; - BottomUpTraversalState() { + BottomUpTraversalState(boolean isKept) { this(DexMethodSignatureMap.create()); + this.isKeptOrHasKeptSubclass = isKept; } BottomUpTraversalState(DexMethodSignatureMap<Set<String>> packagePrivateMethods) { @@ -146,6 +155,7 @@ } void add(BottomUpTraversalState backtrackingState) { + isKeptOrHasKeptSubclass |= backtrackingState.isKeptOrHasKeptSubclass; backtrackingState.nonPrivateVirtualMethods.forEach( (methodSignature, packageDescriptors) -> this.nonPrivateVirtualMethods @@ -173,5 +183,9 @@ boolean isEmpty() { return nonPrivateVirtualMethods.isEmpty(); } + + void setIsKeptOrHasKeptSubclass() { + isKeptOrHasKeptSubclass = true; + } } }
diff --git a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java index 73a0444..ad329a1 100644 --- a/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java +++ b/src/main/java/com/android/tools/r8/optimize/redundantbridgeremoval/RedundantBridgeRemover.java
@@ -43,13 +43,20 @@ private final RedundantBridgeRemovalLens.Builder lensBuilder = new RedundantBridgeRemovalLens.Builder(); + private boolean mustRetargetInvokesToTargetMethod = false; + public RedundantBridgeRemover(AppView<AppInfoWithLiveness> appView) { this.appView = appView; this.immediateSubtypingInfo = ImmediateProgramSubtypingInfo.create(appView); this.redundantBridgeRemovalOptions = appView.options().getRedundantBridgeRemovalOptions(); } - private DexClassAndMethod getTargetForRedundantBridge(ProgramMethod method) { + public RedundantBridgeRemover setMustRetargetInvokesToTargetMethod() { + mustRetargetInvokesToTargetMethod = true; + return this; + } + + private DexClassAndMethod getTargetForRedundantNonAbstractBridge(ProgramMethod method) { DexEncodedMethod definition = method.getDefinition(); BridgeInfo bridgeInfo = definition.getOptimizationInfo().getBridgeInfo(); boolean isBridge = definition.isBridge() || bridgeInfo != null; @@ -112,10 +119,14 @@ return false; } + public void run(ExecutorService executorService, Timing timing) throws ExecutionException { + run(executorService, timing, null); + } + public void run( - MemberRebindingIdentityLens memberRebindingIdentityLens, ExecutorService executorService, - Timing timing) + Timing timing, + MemberRebindingIdentityLens memberRebindingIdentityLens) throws ExecutionException { assert memberRebindingIdentityLens == null || memberRebindingIdentityLens == appView.graphLens(); @@ -148,6 +159,7 @@ } appView.notifyOptimizationFinishedForTesting(); + appView.appInfo().notifyRedundantBridgeRemoverFinished(true); timing.end(); } @@ -185,38 +197,42 @@ return traversal.getRemovedBridges(); } - private boolean isRedundantAbstractBridge(ProgramMethod method) { + private DexClassAndMethod getTargetForRedundantAbstractBridge(ProgramMethod method) { if (!method.getAccessFlags().isAbstract() || method.getDefinition().getCode() != null) { - return false; + return null; } DexProgramClass holder = method.getHolder(); if (holder.getSuperType() == null) { assert holder.getType() == appView.dexItemFactory().objectType; - return false; + return null; } MethodResolutionResult superTypeResolution = appView.appInfo().resolveMethodOn(holder.getSuperType(), method.getReference(), false); if (superTypeResolution.isMultiMethodResolutionResult()) { - return false; + return null; } // Check if there is a definition in the super type hieararchy that is also abstract and has the // same visibility. if (superTypeResolution.isSingleResolution()) { - DexClassAndMethod resolutionPair = + DexClassAndMethod resolvedMethod = superTypeResolution.asSingleResolution().getResolutionPair(); - return resolutionPair.getDefinition().isAbstract() - && resolutionPair + if (resolvedMethod.getDefinition().isAbstract() + && resolvedMethod .getDefinition() .isAtLeastAsVisibleAsOtherInSameHierarchy(method.getDefinition(), appView) - && (!resolutionPair.getHolder().isInterface() || holder.getInterfaces().isEmpty()); + && (!resolvedMethod.getHolder().isInterface() || holder.getInterfaces().isEmpty())) { + return resolvedMethod; + } + return null; } // Only check for interfaces if resolving the method on super type causes NoSuchMethodError. FailedResolutionResult failedResolutionResult = superTypeResolution.asFailedResolution(); if (failedResolutionResult == null || !failedResolutionResult.isNoSuchMethodErrorResult(holder, appView, appView.appInfo()) || holder.getInterfaces().isEmpty()) { - return false; + return null; } + DexClassAndMethod representativeInterfaceMethod = null; for (DexType iface : holder.getInterfaces()) { SingleResolutionResult<?> singleIfaceResult = appView @@ -228,10 +244,14 @@ || !singleIfaceResult .getResolvedMethod() .isAtLeastAsVisibleAsOtherInSameHierarchy(method.getDefinition(), appView)) { - return false; + return null; + } + if (representativeInterfaceMethod == null) { + representativeInterfaceMethod = singleIfaceResult.getResolutionPair(); } } - return true; + assert representativeInterfaceMethod != null; + return representativeInterfaceMethod; } private void pruneApp( @@ -266,21 +286,23 @@ || !keepInfo.isOptimizationAllowed(appView.options())) { return; } - if (isRedundantAbstractBridge(method)) { - // Record that the redundant bridge should be removed. - bridgesToRemoveForClass.add(method); - return; - } - DexClassAndMethod target = getTargetForRedundantBridge(method); - if (target != null) { - // Record that the redundant bridge should be removed. - bridgesToRemoveForClass.add(method); - - // Rewrite invokes to the bridge to the target if it is accessible. - if (canRetargetInvokesToTargetMethod(method, target)) { - lensBuilder.map(method, target); + DexClassAndMethod target = getTargetForRedundantAbstractBridge(method); + if (target == null) { + target = getTargetForRedundantNonAbstractBridge(method); + if (target == null) { + return; } } + + // Rewrite invokes to the bridge to the target if it is accessible. + if (canRetargetInvokesToTargetMethod(method, target)) { + lensBuilder.map(method, target); + } else if (mustRetargetInvokesToTargetMethod) { + return; + } + + // Record that the redundant bridge should be removed. + bridgesToRemoveForClass.add(method); }); if (!bridgesToRemoveForClass.isEmpty()) { clazz.getMethodCollection().removeMethods(bridgesToRemoveForClass.toDefinitionSet()); @@ -295,6 +317,14 @@ && !redundantBridgeRemovalOptions.isRetargetingOfConstructorBridgeCallsEnabled()) { return false; } + // Check if the current method is an interface method targeted by invoke-super. + if (method.getHolder().isInterface() + && appView + .appInfo() + .getMethodAccessInfoCollection() + .hasSuperInvoke(method.getReference())) { + return false; + } // Check if all possible contexts that have access to the holder of the redundant bridge // method also have access to the holder of the target method. DexProgramClass methodHolder = method.getHolder();
diff --git a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java index a64d1c7..8919b83 100644 --- a/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java +++ b/src/main/java/com/android/tools/r8/profile/startup/instrumentation/StartupInstrumentation.java
@@ -33,6 +33,7 @@ import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.ir.conversion.IRConverter; import com.android.tools.r8.ir.conversion.IRToDexFinalizer; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.startup.generated.InstrumentationServerFactory; @@ -99,7 +100,11 @@ List<DexProgramClass> extraProgramClasses = createStartupRuntimeLibraryClasses(); MethodProcessorEventConsumer eventConsumer = MethodProcessorEventConsumer.empty(); - converter.processClassesConcurrently(extraProgramClasses, eventConsumer, executorService); + converter.processClassesConcurrently( + extraProgramClasses, + eventConsumer, + MethodConversionOptions.forD8(appView), + executorService); DexApplication newApplication = appView.app().builder().addProgramClasses(extraProgramClasses).build(); @@ -167,7 +172,7 @@ // Disable StringSwitch conversion to avoid having to run the StringSwitchRemover before // finalizing the code. MutableMethodConversionOptions conversionOptions = - new MutableMethodConversionOptions(options).disableStringSwitchConversion(); + MethodConversionOptions.forD8(appView).disableStringSwitchConversion(); IRCode code = method.buildIR(appView, conversionOptions); InstructionListIterator instructionIterator = code.entryBlock().listIterator(code); instructionIterator.positionBeforeNextInstructionThatMatches(not(Instruction::isArgument));
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java index ab4015d..1666178 100644 --- a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java +++ b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
@@ -360,6 +360,9 @@ if (clazz.getClassSignature().isValid() && keepInfo.isSignatureRemovalAllowed(options)) { clazz.clearClassSignature(); } + if (keepInfo.isPermittedSubclassesRemovalAllowed(options)) { + clazz.clearPermittedSubclasses(); + } } private boolean canRemoveInnerClassAttribute(
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java index d3ed9d1..5b459c3 100644 --- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java +++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -504,7 +504,13 @@ public void notifyMemberRebindingFinished(AppView<AppInfoWithLiveness> appView) { getFieldAccessInfoCollection().restrictToProgram(appView); - getMethodAccessInfoCollection().destroyNonDirectInvokes(); + getMethodAccessInfoCollection().destroyNonDirectNonSuperInvokes(); + } + + public void notifyRedundantBridgeRemoverFinished(boolean initial) { + if (initial) { + getMethodAccessInfoCollection().destroySuperInvokes(); + } } @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java index 471c6b0..1ea86b5 100644 --- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java +++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -23,7 +23,6 @@ import com.android.tools.r8.contexts.CompilationContext.ProcessorContext; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.code.CfOrDexInstruction; -import com.android.tools.r8.errors.CompilationError; import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.experimental.graphinfo.GraphConsumer; @@ -108,6 +107,7 @@ import com.android.tools.r8.ir.code.InvokeVirtual; import com.android.tools.r8.ir.code.NewArrayEmpty; import com.android.tools.r8.ir.code.Value; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection; import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer; import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringCollection; @@ -2051,11 +2051,6 @@ assert !appView.unboxedEnums().isUnboxedEnum(clazz) : "Enum " + clazz.toSourceString() + " has been unboxed but is still in the program."; - if (options.isGeneratingClassFiles() && clazz.hasPermittedSubclassAttributes()) { - throw new CompilationError( - "Sealed classes are not supported as program classes when generating class files", - clazz.getOrigin()); - } // Mark types in inner-class attributes referenced. { BiConsumer<DexType, ProgramDerivedContext> missingClassConsumer = @@ -3495,7 +3490,11 @@ DexProgramClass clazz = asProgramClassOrNull(definitionFor(referencedType, context)); if (clazz != null) { applyMinimumKeepInfoWhenLive( - clazz, KeepClassInfo.newEmptyJoiner().disallowMinification().disallowOptimization()); + clazz, + KeepClassInfo.newEmptyJoiner() + .disallowMinification() + .disallowOptimization() + .disallowRepackaging()); } } } @@ -4913,7 +4912,7 @@ } private void handleReflectiveBehavior(ProgramMethod method) { - IRCode code = method.buildIR(appView); + IRCode code = method.buildIR(appView, MethodConversionOptions.nonConverting()); InstructionIterator iterator = code.instructionIterator(); while (iterator.hasNext()) { Instruction instruction = iterator.next();
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java index 8f08d77..adbf8d0 100644 --- a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java +++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.conversion.IRFinalizer; import com.android.tools.r8.ir.conversion.IRToCfFinalizer; import com.android.tools.r8.ir.conversion.IRToDexFinalizer; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; import com.android.tools.r8.ir.conversion.passes.ThrowCatchOptimizer; import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo; @@ -264,8 +265,8 @@ // Build IR. MutableMethodConversionOptions conversionOptions = mode.isInitialTreeShaking() - ? new MutableMethodConversionOptions(options).setIsGeneratingClassFiles(true) - : new MutableMethodConversionOptions(options); + ? MethodConversionOptions.forPreLirPhase(appView) + : MethodConversionOptions.forPostLirPhase(appView); conversionOptions.disableStringSwitchConversion(); IRCode ir = method.buildIR(appView, conversionOptions); @@ -274,7 +275,7 @@ rewriter.rewriteCode(ir, initializedClassesWithContexts, prunedFields); // Run dead code elimination. - new ThrowCatchOptimizer(appView).optimizeAlwaysThrowingInstructions(ir); + new ThrowCatchOptimizer(appView).run(ir, Timing.empty()); rewriter.getDeadCodeRemover().run(ir, Timing.empty()); // Finalize to class files or dex.
diff --git a/src/main/java/com/android/tools/r8/shaking/GlobalKeepInfoConfiguration.java b/src/main/java/com/android/tools/r8/shaking/GlobalKeepInfoConfiguration.java index 7ff0803..9fec619 100644 --- a/src/main/java/com/android/tools/r8/shaking/GlobalKeepInfoConfiguration.java +++ b/src/main/java/com/android/tools/r8/shaking/GlobalKeepInfoConfiguration.java
@@ -39,4 +39,6 @@ boolean isKeepRuntimeVisibleTypeAnnotationsEnabled(); boolean isKeepRuntimeInvisibleTypeAnnotationsEnabled(); + + boolean isKeepPermittedSubclassesEnabled(); }
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java index f504792..9898d34 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepClassInfo.java
@@ -14,10 +14,12 @@ public final class KeepClassInfo extends KeepInfo<KeepClassInfo.Builder, KeepClassInfo> { // Requires all aspects of a class to be kept. - private static final KeepClassInfo TOP = new Builder().makeTop().disallowRepackaging().build(); + private static final KeepClassInfo TOP = + new Builder().makeTop().disallowRepackaging().disallowPermittedSubclassesRemoval().build(); // Requires no aspects of a class to be kept. - private static final KeepClassInfo BOTTOM = new Builder().makeBottom().allowRepackaging().build(); + private static final KeepClassInfo BOTTOM = + new Builder().makeBottom().allowRepackaging().allowPermittedSubclassesRemoval().build(); public static KeepClassInfo top() { return TOP; @@ -33,11 +35,13 @@ private final boolean allowRepackaging; private final boolean checkEnumUnboxed; + private final boolean allowPermittedSubclassesRemoval; private KeepClassInfo(Builder builder) { super(builder); this.allowRepackaging = builder.isRepackagingAllowed(); this.checkEnumUnboxed = builder.isCheckEnumUnboxedEnabled(); + this.allowPermittedSubclassesRemoval = builder.isPermittedSubclassesRemovalAllowed(); } @Override @@ -58,6 +62,11 @@ return new Joiner(this); } + public boolean isPermittedSubclassesRemovalAllowed(GlobalKeepInfoConfiguration configuration) { + return !configuration.isKeepPermittedSubclassesEnabled() + && internalIsPermittedSubclassesRemovalAllowed(); + } + /** * True if an item may be repackaged. * @@ -92,6 +101,10 @@ || !getClassInfo.apply(kotlinMetadataClass.asProgramClass()).isShrinkingAllowed(options); } + boolean internalIsPermittedSubclassesRemovalAllowed() { + return allowPermittedSubclassesRemoval; + } + @Override public boolean isTop() { return this.equals(top()); @@ -106,6 +119,7 @@ private boolean allowRepackaging; private boolean checkEnumUnboxed; + private boolean allowPermittedSubclassesRemoval; private Builder() { super(); @@ -115,6 +129,7 @@ super(original); allowRepackaging = original.internalIsRepackagingAllowed(); checkEnumUnboxed = original.internalIsCheckEnumUnboxedEnabled(); + allowPermittedSubclassesRemoval = original.internalIsPermittedSubclassesRemovalAllowed(); } // Check enum unboxed. @@ -153,6 +168,23 @@ return setCheckEnumUnboxed(false); } + public Builder allowPermittedSubclassesRemoval() { + return setAllowPermittedSubclassesRemoval(true); + } + + public boolean isPermittedSubclassesRemovalAllowed() { + return allowPermittedSubclassesRemoval; + } + + private Builder setAllowPermittedSubclassesRemoval(boolean allowPermittedSubclassesRemoval) { + this.allowPermittedSubclassesRemoval = allowPermittedSubclassesRemoval; + return self(); + } + + public Builder disallowPermittedSubclassesRemoval() { + return setAllowPermittedSubclassesRemoval(false); + } + @Override public KeepClassInfo getTopInfo() { return TOP; @@ -177,7 +209,9 @@ boolean internalIsEqualTo(KeepClassInfo other) { return super.internalIsEqualTo(other) && isRepackagingAllowed() == other.internalIsRepackagingAllowed() - && isCheckEnumUnboxedEnabled() == other.internalIsCheckEnumUnboxedEnabled(); + && isCheckEnumUnboxedEnabled() == other.internalIsCheckEnumUnboxedEnabled() + && isPermittedSubclassesRemovalAllowed() + == other.internalIsPermittedSubclassesRemovalAllowed(); } @Override @@ -187,12 +221,18 @@ @Override public Builder makeTop() { - return super.makeTop().unsetCheckEnumUnboxed().disallowRepackaging(); + return super.makeTop() + .unsetCheckEnumUnboxed() + .disallowRepackaging() + .disallowPermittedSubclassesRemoval(); } @Override public Builder makeBottom() { - return super.makeBottom().unsetCheckEnumUnboxed().allowRepackaging(); + return super.makeBottom() + .unsetCheckEnumUnboxed() + .allowRepackaging() + .allowPermittedSubclassesRemoval(); } } @@ -212,6 +252,11 @@ return self(); } + public Joiner disallowPermittedSubclassesRemoval() { + builder.disallowPermittedSubclassesRemoval(); + return self(); + } + @Override public Joiner asClassJoiner() { return this; @@ -222,7 +267,10 @@ // Should be extended to merge the fields of this class in case any are added. return super.merge(joiner) .applyIf(joiner.builder.isCheckEnumUnboxedEnabled(), Joiner::setCheckEnumUnboxed) - .applyIf(!joiner.builder.isRepackagingAllowed(), Joiner::disallowRepackaging); + .applyIf(!joiner.builder.isRepackagingAllowed(), Joiner::disallowRepackaging) + .applyIf( + !joiner.builder.isPermittedSubclassesRemovalAllowed(), + Joiner::disallowPermittedSubclassesRemoval); } @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java index 092f4ea..fc0ec2d 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
@@ -18,6 +18,7 @@ public abstract class KeepInfo<B extends Builder<B, K>, K extends KeepInfo<B, K>> { private final boolean allowAccessModification; + private final boolean allowAccessModificationForTesting; private final boolean allowAnnotationRemoval; private final boolean allowMinification; private final boolean allowOptimization; @@ -27,6 +28,7 @@ private KeepInfo( boolean allowAccessModification, + boolean allowAccessModificationForTesting, boolean allowAnnotationRemoval, boolean allowMinification, boolean allowOptimization, @@ -34,6 +36,7 @@ boolean allowSignatureRemoval, boolean checkDiscarded) { this.allowAccessModification = allowAccessModification; + this.allowAccessModificationForTesting = allowAccessModificationForTesting; this.allowAnnotationRemoval = allowAnnotationRemoval; this.allowMinification = allowMinification; this.allowOptimization = allowOptimization; @@ -45,6 +48,7 @@ KeepInfo(B builder) { this( builder.isAccessModificationAllowed(), + builder.isAccessModificationAllowedForTesting(), builder.isAnnotationRemovalAllowed(), builder.isMinificationAllowed(), builder.isOptimizationAllowed(), @@ -171,6 +175,15 @@ return allowAccessModification; } + public boolean isAccessModificationAllowedForTesting(GlobalKeepInfoConfiguration configuration) { + return internalIsAccessModificationAllowedForTesting(); + } + + // Internal accessor for the items access-modification bit. + boolean internalIsAccessModificationAllowedForTesting() { + return allowAccessModificationForTesting; + } + public boolean isEnclosingMethodAttributeRemovalAllowed( GlobalKeepInfoConfiguration configuration, EnclosingMethodAttribute enclosingMethodAttribute, @@ -213,6 +226,8 @@ // An item is less, aka, lower in the lattice, if each of its attributes is at least as // permissive of that on other. return (allowAccessModification || !other.internalIsAccessModificationAllowed()) + && (allowAccessModificationForTesting + || !other.internalIsAccessModificationAllowedForTesting()) && (allowAnnotationRemoval || !other.internalIsAnnotationRemovalAllowed()) && (allowMinification || !other.internalIsMinificationAllowed()) && (allowOptimization || !other.internalIsOptimizationAllowed()) @@ -236,6 +251,7 @@ protected K original; private boolean allowAccessModification; + private boolean allowAccessModificationForTesting; private boolean allowAnnotationRemoval; private boolean allowMinification; private boolean allowOptimization; @@ -250,6 +266,7 @@ Builder(K original) { this.original = original; allowAccessModification = original.internalIsAccessModificationAllowed(); + allowAccessModificationForTesting = original.internalIsAccessModificationAllowedForTesting(); allowAnnotationRemoval = original.internalIsAnnotationRemovalAllowed(); allowMinification = original.internalIsMinificationAllowed(); allowOptimization = original.internalIsOptimizationAllowed(); @@ -260,6 +277,7 @@ B makeTop() { disallowAccessModification(); + disallowAccessModificationForTesting(); disallowAnnotationRemoval(); disallowMinification(); disallowOptimization(); @@ -271,6 +289,7 @@ B makeBottom() { allowAccessModification(); + allowAccessModificationForTesting(); allowAnnotationRemoval(); allowMinification(); allowOptimization(); @@ -297,6 +316,8 @@ boolean internalIsEqualTo(K other) { return isAccessModificationAllowed() == other.internalIsAccessModificationAllowed() + && isAccessModificationAllowedForTesting() + == other.internalIsAccessModificationAllowedForTesting() && isAnnotationRemovalAllowed() == other.internalIsAnnotationRemovalAllowed() && isMinificationAllowed() == other.internalIsMinificationAllowed() && isOptimizationAllowed() == other.internalIsOptimizationAllowed() @@ -309,6 +330,10 @@ return allowAccessModification; } + public boolean isAccessModificationAllowedForTesting() { + return allowAccessModificationForTesting; + } + public boolean isAnnotationRemovalAllowed() { return allowAnnotationRemoval; } @@ -398,6 +423,19 @@ return setAllowAccessModification(false); } + public B setAllowAccessModificationForTesting(boolean allowAccessModificationForTesting) { + this.allowAccessModificationForTesting = allowAccessModificationForTesting; + return self(); + } + + public B allowAccessModificationForTesting() { + return setAllowAccessModificationForTesting(true); + } + + public B disallowAccessModificationForTesting() { + return setAllowAccessModificationForTesting(false); + } + public B setAllowAnnotationRemoval(boolean allowAnnotationRemoval) { this.allowAnnotationRemoval = allowAnnotationRemoval; return self(); @@ -524,6 +562,11 @@ return self(); } + public J disallowAccessModificationForTesting() { + builder.disallowAccessModificationForTesting(); + return self(); + } + public J disallowAnnotationRemoval() { builder.disallowAnnotationRemoval(); return self(); @@ -557,6 +600,9 @@ public J merge(J joiner) { Builder<B, K> builder = joiner.builder; applyIf(!builder.isAccessModificationAllowed(), Joiner::disallowAccessModification); + applyIf( + !builder.isAccessModificationAllowedForTesting(), + Joiner::disallowAccessModificationForTesting); applyIf(!builder.isAnnotationRemovalAllowed(), Joiner::disallowAnnotationRemoval); applyIf(!builder.isMinificationAllowed(), Joiner::disallowMinification); applyIf(!builder.isOptimizationAllowed(), Joiner::disallowOptimization);
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardKeepAttributes.java b/src/main/java/com/android/tools/r8/shaking/ProguardKeepAttributes.java index e47ff67..19a6946 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardKeepAttributes.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardKeepAttributes.java
@@ -31,6 +31,7 @@ public static final String RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations"; public static final String ANNOTATION_DEFAULT = "AnnotationDefault"; + public static final String PERMITTED_SUBCLASSES = "PermittedSubclasses"; public static final String STACK_MAP_TABLE = "StackMapTable"; public static final List<String> KEEP_ALL = ImmutableList.of("*"); @@ -54,6 +55,7 @@ public boolean runtimeInvisibleTypeAnnotations = false; public boolean annotationDefault = false; public boolean stackMapTable = false; + public boolean permittedSubclasses = false; private ProguardKeepAttributes() { } @@ -138,6 +140,7 @@ RUNTIME_INVISIBLE_TYPE_ANNOTATIONS, patterns); annotationDefault = update(annotationDefault, ANNOTATION_DEFAULT, patterns); stackMapTable = update(stackMapTable, STACK_MAP_TABLE, patterns); + permittedSubclasses = update(permittedSubclasses, PERMITTED_SUBCLASSES, patterns); } public void ensureValid(boolean forceProguardCompatibility) { @@ -189,7 +192,8 @@ && this.runtimeVisibleTypeAnnotations == other.runtimeVisibleTypeAnnotations && this.runtimeInvisibleTypeAnnotations == other.runtimeInvisibleTypeAnnotations && this.annotationDefault == other.annotationDefault - && this.stackMapTable == other.stackMapTable; + && this.stackMapTable == other.stackMapTable + && this.permittedSubclasses == other.permittedSubclasses; } @Override @@ -209,7 +213,8 @@ + (this.runtimeInvisibleTypeAnnotations ? 1 << 12 : 0) + (this.annotationDefault ? 1 << 13 : 0) + (this.stackMapTable ? 1 << 14 : 0) - + (this.methodParameters ? 1 << 15 : 0); + + (this.methodParameters ? 1 << 15 : 0) + + (this.permittedSubclasses ? 1 << 16 : 0); } public boolean isEmpty() { @@ -228,7 +233,8 @@ && !runtimeVisibleTypeAnnotations && !runtimeInvisibleTypeAnnotations && !annotationDefault - && !stackMapTable; + && !stackMapTable + && !permittedSubclasses; } public StringBuilder append(StringBuilder builder) { @@ -281,6 +287,9 @@ if (stackMapTable) { attributes.add(STACK_MAP_TABLE); } + if (permittedSubclasses) { + attributes.add(PERMITTED_SUBCLASSES); + } if (attributes.size() > 0) { builder.append("-keepattributes ");
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java index 367a2fc..8678717 100644 --- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java +++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -385,6 +385,8 @@ } appView.withGeneratedMessageLiteShrinker( shrinker -> shrinker.extendRootSet(dependentMinimumKeepInfo)); + appView.withGeneratedMessageLiteBuilderShrinker( + shrinker -> shrinker.extendRootSet(dependentMinimumKeepInfo)); if (appView.options().protoShrinking().enableGeneratedMessageLiteBuilderShrinking) { GeneratedMessageLiteBuilderShrinker.addInliningHeuristicsForBuilderInlining( appView, @@ -1236,7 +1238,7 @@ assert item.isProgramDefinition(); dependentMinimumKeepInfo .getOrCreateUnconditionalMinimumKeepInfoFor(item.getReference()) - .disallowAccessModification(); + .disallowAccessModificationForTesting(); context.markAsUsed(); } else if (context instanceof NoFieldTypeStrengtheningRule) { assert item.isProgramField();
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java index a7106fc..4ad6ef2 100644 --- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java +++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -393,11 +393,7 @@ // before merging [clazz] into its subtype. private boolean isStillMergeCandidate(DexProgramClass sourceClass, DexProgramClass targetClass) { assert isMergeCandidate(sourceClass, targetClass, pinnedTypes); - if (mergedClasses.containsValue(sourceClass.getType())) { - // Do not allow merging the resulting class into its subclass. - // TODO(christofferqa): Get rid of this limitation. - return false; - } + assert !mergedClasses.containsValue(sourceClass.getType()); // For interface types, this is more complicated, see: // https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-5.html#jvms-5.5 // We basically can't move the clinit, since it is not called when implementing classes have @@ -447,13 +443,14 @@ } private boolean mergeMayLeadToIllegalAccesses(DexProgramClass source, DexProgramClass target) { - if (source.type.isSamePackage(target.type)) { + if (source.isSamePackage(target)) { // When merging two classes from the same package, we only need to make sure that [source] // does not get less visible, since that could make a valid access to [source] from another // package illegal after [source] has been merged into [target]. - int accessLevel = source.isPrivate() ? 0 : (source.isPublic() ? 2 : 1); - int otherAccessLevel = target.isPrivate() ? 0 : (target.isPublic() ? 2 : 1); - return accessLevel > otherAccessLevel; + assert source.getAccessFlags().isPackagePrivateOrPublic(); + assert target.getAccessFlags().isPackagePrivateOrPublic(); + // TODO(b/287891322): Allow merging if `source` is only accessed from inside its own package. + return source.getAccessFlags().isPublic() && target.getAccessFlags().isPackagePrivate(); } // Check that all accesses to [source] and its members from inside the current package of @@ -801,12 +798,12 @@ DexType singleSubtype = subtypingInfo.getSingleDirectSubtype(clazz.type); DexProgramClass targetClass = appView.definitionFor(singleSubtype).asProgramClass(); - assert isMergeCandidate(clazz, targetClass, pinnedTypes); assert !mergedClasses.containsKey(targetClass.type); - - boolean clazzOrTargetClassHasBeenMerged = - mergedClasses.containsValue(clazz.type) || mergedClasses.containsValue(targetClass.type); - if (clazzOrTargetClassHasBeenMerged) { + if (mergedClasses.containsValue(clazz.type)) { + return; + } + assert isMergeCandidate(clazz, targetClass, pinnedTypes); + if (mergedClasses.containsValue(targetClass.type)) { if (!isStillMergeCandidate(clazz, targetClass)) { return; } @@ -907,7 +904,11 @@ DexEncodedMethod definition = directMethod.getDefinition(); if (definition.isInstanceInitializer()) { DexEncodedMethod resultingConstructor = - renameConstructor(definition, availableMethodSignatures); + renameConstructor( + definition, + candidate -> + availableMethodSignatures.test(candidate) + && source.lookupVirtualMethod(candidate) == null); add(directMethods, resultingConstructor, MethodSignatureEquivalence.get()); blockRedirectionOfSuperCalls(resultingConstructor.getReference()); } else {
diff --git a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java index 19b4d38..df0ac25 100644 --- a/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java +++ b/src/main/java/com/android/tools/r8/utils/DescriptorUtils.java
@@ -740,7 +740,8 @@ * @param innerDescriptor the inner descriptor, such as Lfoo/bar/Baz$Qux; * @return the inner name or null, i.e. Qux in the example above */ - public static String getInnerClassName(String outerDescriptor, String innerDescriptor) { + public static String getInnerClassNameFromDescriptor( + String outerDescriptor, String innerDescriptor) { if (innerDescriptor.length() <= outerDescriptor.length()) { return null; } @@ -752,6 +753,18 @@ return null; } + public static String getInnerClassNameFromSimpleName( + String outerSimpleName, String innerSimpleName) { + if (innerSimpleName.length() <= outerSimpleName.length()) { + return null; + } + String prefix = outerSimpleName + INNER_CLASS_SEPARATOR; + if (innerSimpleName.startsWith(prefix)) { + return innerSimpleName.substring(prefix.length()); + } + return null; + } + public static class ModuleAndDescriptor { private final String module; private final String descriptor;
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java index 6ef1691..c284670 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -828,6 +828,12 @@ return proguardConfiguration.getKeepAttributes().runtimeInvisibleTypeAnnotations; } + @Override + public boolean isKeepPermittedSubclassesEnabled() { + return proguardConfiguration == null + || proguardConfiguration.getKeepAttributes().permittedSubclasses; + } + /** * If any non-static class merging is enabled, information about types referred to by instanceOf * and check cast instructions needs to be collected. @@ -1693,9 +1699,11 @@ if (simpleInliningInstructionLimit >= 0) { return simpleInliningInstructionLimit; } - // Allow 2 instructions when using LIR regardless of backend. + // Allow 4 instructions when using LIR regardless of backend. if (options.testing.useLir) { - return 2; + // TODO(b/288226522): We should reevaluate this for size and other inputs as it regresses + // compared to DEX code with limit 5. This is set to 4 to avoid discard errors in chrome. + return 4; } // Allow 3 instructions when generating to class files. if (options.isGeneratingClassFiles()) { @@ -2097,9 +2105,39 @@ } public boolean canUseLir(AppView<?> appView) { - return useLir - && appView.enableWholeProgramOptimizations() - && !appView.options().protoShrinking().isProtoShrinkingEnabled(); + return useLir && appView.enableWholeProgramOptimizations(); + } + + // As part of integrating LIR the compiler is split in three phases: pre, supported, and post. + // Any attempt at building IR must have conversion options consistent with the active phase. + private enum LirPhase { + PRE, + SUPPORTED, + POST + } + + private LirPhase currentPhase = LirPhase.PRE; + + public void enterLirSupportedPhase() { + assert isPreLirPhase(); + currentPhase = LirPhase.SUPPORTED; + } + + public void exitLirSupportedPhase() { + assert isSupportedLirPhase(); + currentPhase = LirPhase.POST; + } + + public boolean isPreLirPhase() { + return currentPhase == LirPhase.PRE; + } + + public boolean isSupportedLirPhase() { + return currentPhase == LirPhase.SUPPORTED; + } + + public boolean isPostLirPhase() { + return currentPhase == LirPhase.POST; } // If false, use the desugared library implementation when desugared library is enabled. @@ -2218,7 +2256,6 @@ */ public boolean addCallEdgesForLibraryInvokes = false; - public boolean allowCheckDiscardedErrors = false; public boolean allowClassInliningOfSynthetics = true; public boolean allowInjectedAnnotationMethods = false; public boolean allowInliningOfSynthetics = true; @@ -2256,7 +2293,8 @@ public BiConsumer<IRCode, AppView<?>> irModifier = null; public Consumer<IRCode> inlineeIrModifier = null; public int basicBlockMuncherIterationLimit = NO_LIMIT; - public boolean dontReportFailingCheckDiscarded = false; + public boolean dontReportFailingCheckDiscarded = + System.getProperty("com.android.tools.r8.testing.dontReportFailingCheckDiscarded") != null; public boolean disableRecordApplicationReaderMap = false; public boolean trackDesugaredAPIConversions = System.getProperty("com.android.tools.r8.trackDesugaredAPIConversions") != null;
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java index 54efc7d..7fe3d32 100644 --- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java +++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -79,6 +79,7 @@ PositionRangeAllocator.createCardinalPositionRangeAllocator(); private final NonCardinalPositionRangeAllocator nonCardinalRangeCache = PositionRangeAllocator.createNonCardinalPositionRangeAllocator(); + private final int maxGap = 1000; private MappedPositionToClassNameMapperBuilder( AppView<?> appView, OriginalSourceFiles originalSourceFiles) { @@ -301,7 +302,7 @@ MappedPosition currentMappedPosition = mappedPositions.get(j); mappedPositionRange = mappedPositionRange.canAddNextMappingToRange( - lastMappedPosition, currentMappedPosition); + lastMappedPosition, currentMappedPosition, maxGap); // Note that currentPosition.caller and lastPosition.class must be deep-compared since // multiple inlining passes lose the canonical property of the positions. Position currentPosition = currentMappedPosition.getPosition(); @@ -538,7 +539,7 @@ } public MappedPositionRange canAddNextMappingToRange( - MappedPosition lastPosition, MappedPosition currentPosition) { + MappedPosition lastPosition, MappedPosition currentPosition, int maxGap) { if (isOutOfRange()) { return this; } @@ -562,10 +563,12 @@ // We cannot recover a delta encoding if we have had range to single encoding. return OUT_OF_RANGE; } + int gap = currentPosition.getObfuscatedLine() - lastPosition.getObfuscatedLine(); + boolean gapLessThanMaxGap = gap >= 0 && gap <= maxGap; boolean sameDelta = currentOriginalLine - lastOriginalLine == currentPosition.getObfuscatedLine() - lastPosition.getObfuscatedLine(); - return sameDelta ? SAME_DELTA : OUT_OF_RANGE; + return (gapLessThanMaxGap && sameDelta) ? SAME_DELTA : OUT_OF_RANGE; } }
diff --git a/src/test/examples/classmerging/ConflictInGeneratedNameTest.java b/src/test/examples/classmerging/ConflictInGeneratedNameTest.java index 528f9bf..e76a8e3 100644 --- a/src/test/examples/classmerging/ConflictInGeneratedNameTest.java +++ b/src/test/examples/classmerging/ConflictInGeneratedNameTest.java
@@ -51,6 +51,7 @@ } // There is a private method in B with the same name as this one. + @NoAccessModification private String getName() { return name; } @@ -101,10 +102,12 @@ super.boo(); } + @NoAccessModification private void boo$classmerging$ConflictInGeneratedNameTest$A() { print("In B.boo$classmerging$ConflictInGeneratedNameTest$A()"); } + @NoAccessModification private String getName() { return name; }
diff --git a/src/test/examples/classmerging/NoAccessModification.java b/src/test/examples/classmerging/NoAccessModification.java new file mode 100644 index 0000000..b78d447 --- /dev/null +++ b/src/test/examples/classmerging/NoAccessModification.java
@@ -0,0 +1,10 @@ +// Copyright (c) 2023, 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 classmerging; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD, ElementType.TYPE}) +public @interface NoAccessModification {}
diff --git a/src/test/examples/classmerging/SimpleInterfaceAccessTest.java b/src/test/examples/classmerging/SimpleInterfaceAccessTest.java index 804b4ed..56095b5 100644 --- a/src/test/examples/classmerging/SimpleInterfaceAccessTest.java +++ b/src/test/examples/classmerging/SimpleInterfaceAccessTest.java
@@ -45,6 +45,7 @@ void bar(); } + @NoAccessModification private static class OtherSimpleInterfaceImpl implements OtherSimpleInterface { @Override
diff --git a/src/test/examples/classmerging/keep-rules.txt b/src/test/examples/classmerging/keep-rules.txt index 8b87740..316bf73 100644 --- a/src/test/examples/classmerging/keep-rules.txt +++ b/src/test/examples/classmerging/keep-rules.txt
@@ -73,5 +73,7 @@ @classmerging.NeverInline <methods>; } -neverpropagatevalue class * { @classmerging.NeverPropagateValue *; } +-noaccessmodification @classmerging.NoAccessModification class * +-noaccessmodification class * { @classmerging.NoAccessModification *; } -nohorizontalclassmerging @classmerging.NoHorizontalClassMerging class * -noredundantfieldloadelimination class * { @classmerging.NoRedundantFieldLoadElimination *; }
diff --git a/src/test/examples/classmerging/pkg/SimpleInterfaceImplRetriever.java b/src/test/examples/classmerging/pkg/SimpleInterfaceImplRetriever.java index 22391e9..63ae103 100644 --- a/src/test/examples/classmerging/pkg/SimpleInterfaceImplRetriever.java +++ b/src/test/examples/classmerging/pkg/SimpleInterfaceImplRetriever.java
@@ -4,6 +4,7 @@ package classmerging.pkg; +import classmerging.NoAccessModification; import classmerging.SimpleInterfaceAccessTest.SimpleInterface; public class SimpleInterfaceImplRetriever { @@ -15,6 +16,7 @@ // This class is intentionally marked private. It is not possible to merge the interface // SimpleInterface into SimpleInterfaceImpl, since this would lead to an illegal class access // in SimpleInterfaceAccessTest. + @NoAccessModification private static class SimpleInterfaceImpl implements SimpleInterface { @Override
diff --git a/src/test/examples/inlining/InlineConstructor.java b/src/test/examples/inlining/InlineConstructor.java index 09973fd..87d3a1d 100644 --- a/src/test/examples/inlining/InlineConstructor.java +++ b/src/test/examples/inlining/InlineConstructor.java
@@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. package inlining; +@NoHorizontalClassMerging class InlineConstructor { int a;
diff --git a/src/test/examples/inlining/keep-rules-discard.txt b/src/test/examples/inlining/keep-rules-discard.txt index 1021e5d..6f93c15 100644 --- a/src/test/examples/inlining/keep-rules-discard.txt +++ b/src/test/examples/inlining/keep-rules-discard.txt
@@ -20,3 +20,5 @@ -neverinline class * { @inlining.NeverInline <methods>; } + +-nohorizontalclassmerging @inlining.NoHorizontalClassMerging class *
diff --git a/src/test/examples/memberrebinding2/NoAccessModification.java b/src/test/examples/memberrebinding2/NoAccessModification.java new file mode 100644 index 0000000..0feebb6 --- /dev/null +++ b/src/test/examples/memberrebinding2/NoAccessModification.java
@@ -0,0 +1,10 @@ +// Copyright (c) 2023, 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 memberrebinding2; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE}) +public @interface NoAccessModification {}
diff --git a/src/test/examples/memberrebinding2/keep-rules.txt b/src/test/examples/memberrebinding2/keep-rules.txt index ae40c43..b405146 100644 --- a/src/test/examples/memberrebinding2/keep-rules.txt +++ b/src/test/examples/memberrebinding2/keep-rules.txt
@@ -9,4 +9,6 @@ } # Remove once b/62048823 is fixed. --allowaccessmodification \ No newline at end of file +-allowaccessmodification + +-noaccessmodification @memberrebinding2.NoAccessModification class *
diff --git a/src/test/examples/memberrebinding2/subpackage/PackagePrivateClass.java b/src/test/examples/memberrebinding2/subpackage/PackagePrivateClass.java index 733776c..a8ab2c6 100644 --- a/src/test/examples/memberrebinding2/subpackage/PackagePrivateClass.java +++ b/src/test/examples/memberrebinding2/subpackage/PackagePrivateClass.java
@@ -3,6 +3,9 @@ // BSD-style license that can be found in the LICENSE file. package memberrebinding2.subpackage; +import memberrebinding2.NoAccessModification; + +@NoAccessModification abstract class PackagePrivateClass { public static int staticField;
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java index 802e714..6aa0a30 100644 --- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java +++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -463,37 +463,38 @@ "1337-gc-coverage" ); - private static List<String> expectedToFailRunWithArtNonDefault = ImmutableList.of( - // Fails due to missing symbol, jni tests, fails on non-R8/D8 run. - "004-JniTest", - "004-SignalTest", - "004-ThreadStress", - "004-UnsafeTest", - "044-proxy", - "051-thread", - "136-daemon-jni-shutdown", - "139-register-natives", - "148-multithread-gc-annotations", - "149-suspend-all-stress", - "154-gc-loop", - "155-java-set-resolved-type", - "157-void-class", - "158-app-image-class-table", - "466-get-live-vreg", - "497-inlining-and-class-loader", - "566-polymorphic-inlining", - "596-app-images", - "616-cha", - "616-cha-abstract", - "616-cha-regression-proxy-method", - "616-cha-native", - "626-set-resolved-string", - "629-vdex-speed", - "1337-gc-coverage", + private static List<String> expectedToFailRunWithArtNonDefault = + ImmutableList.of( + // Fails due to missing symbol, jni tests, fails on non-R8/D8 run. + "004-JniTest", + "004-SignalTest", + "004-ThreadStress", + "004-UnsafeTest", + "044-proxy", + "051-thread", + "136-daemon-jni-shutdown", + "139-register-natives", + "148-multithread-gc-annotations", + "149-suspend-all-stress", + "154-gc-loop", + "155-java-set-resolved-type", + "157-void-class", + "158-app-image-class-table", + "466-get-live-vreg", + "497-inlining-and-class-loader", + "566-polymorphic-inlining", + "537-checker-inline-and-unverified", + "596-app-images", + "616-cha", + "616-cha-abstract", + "616-cha-regression-proxy-method", + "616-cha-native", + "626-set-resolved-string", + "629-vdex-speed", + "1337-gc-coverage", - // Fails on non-R8/D8 run - "031-class-attributes" - ); + // Fails on non-R8/D8 run + "031-class-attributes"); private static Map<DexVm.Version, List<String>> expectedToFailRunWithArtVersion; @@ -764,11 +765,12 @@ // by the program at runtime. .put("005-annotations", TestCondition.match(TestCondition.D8_COMPILER)) // On Art 4.4.4 we have fewer refs than expected (except for d8 when compiled with dx). - .put("072-precise-gc", + .put( + "072-precise-gc", TestCondition.match( - TestCondition.R8_COMPILER, - TestCondition.runtimesUpTo(DexVm.Version.V4_4_4))) - .put("072-precise-gc", + TestCondition.R8_COMPILER, TestCondition.runtimesUpTo(DexVm.Version.V4_4_4))) + .put( + "072-precise-gc", TestCondition.match( TestCondition.tools(DexTool.NONE), TestCondition.D8_COMPILER, @@ -779,16 +781,23 @@ .put("099-vmdebug", TestCondition.any()) // This test relies on output on stderr, which we currently do not collect. .put("143-string-value", TestCondition.any()) - .put("800-smali", + .put( + "800-smali", TestCondition.match( TestCondition.D8_COMPILER, TestCondition.runtimes(DexVm.Version.V5_1_1, DexVm.Version.V6_0_1))) // Triggers regression test in 6.0.1 when using R8/D8 in debug mode. - .put("474-fp-sub-neg", + .put( + "474-fp-sub-neg", TestCondition.match( TestCondition.tools(DexTool.NONE), TestCondition.D8_NOT_AFTER_R8CF_COMPILER, TestCondition.runtimes(DexVm.Version.V6_0_1))) + .put( + "536-checker-needs-access-check", + // DEX VMs incorrectly check access before checking null-value in instanceof. + // See IllegalAccessDeadInstanceOfTest and b/288376353. + TestCondition.anyDexVm()) .build(); private static final TestCondition beforeAndroidN = @@ -1168,12 +1177,34 @@ "958-methodhandle-stackframe", "1338-gc-no-los"); + private static final String NO_CLASS_ACCESS_MODIFICATION_RULE = + "-keep,allowobfuscation,allowoptimization,allowshrinking class *"; + private static final String NO_MEMBER_ACCESS_MODIFICATION_RULE = + "-keepclassmembers,allowobfuscation,allowoptimization,allowshrinking class * { *; }"; + private static Map<String, List<String>> keepRules = ImmutableMap.of( + "005-annotations", + ImmutableList.of(NO_MEMBER_ACCESS_MODIFICATION_RULE), "021-string2", ImmutableList.of("-dontwarn junit.framework.**"), + "042-new-instance", + ImmutableList.of(NO_MEMBER_ACCESS_MODIFICATION_RULE), + "046-reflect", + ImmutableList.of(NO_MEMBER_ACCESS_MODIFICATION_RULE), + "064-field-access", + ImmutableList.of(NO_MEMBER_ACCESS_MODIFICATION_RULE), "082-inline-execute", ImmutableList.of("-dontwarn junit.framework.**"), + "100-reflect2", + ImmutableList.of(NO_CLASS_ACCESS_MODIFICATION_RULE), + "301-abstract-protected", + ImmutableList.of( + "-keepclassmembers,allowobfuscation,allowoptimization,allowshrinking class Abstract {" + + " protected abstract java.lang.String m();" + + "}"), + "435-new-instance", + ImmutableList.of(NO_CLASS_ACCESS_MODIFICATION_RULE), // Constructor MakeBoundType.<init>(int) is called using reflection. "476-checker-ctor-fence-redun-elim", ImmutableList.of( @@ -1566,6 +1597,7 @@ if (configuration != null) { configuration.accept(options); } + options.getAccessModifierOptions().setForceModifyPackagePrivateAndProtectedMethods(false); } @Override
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java index 35eb6dd..ec3a345 100644 --- a/src/test/java/com/android/tools/r8/TestBase.java +++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -1757,6 +1757,11 @@ && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N); } + // TODO(b/131130038): Do not allow accessmodification when kept. + public boolean isForceAccessModifyingPackagePrivateAndProtectedMethods() { + return true; + } + public Path compileToZip( TestParameters parameters, Collection<Class<?>> classPath, Class<?>... compilationUnit) throws Exception {
diff --git a/src/test/java/com/android/tools/r8/TestParameters.java b/src/test/java/com/android/tools/r8/TestParameters.java index c792710..76f237b 100644 --- a/src/test/java/com/android/tools/r8/TestParameters.java +++ b/src/test/java/com/android/tools/r8/TestParameters.java
@@ -120,6 +120,14 @@ return isDexRuntime() && getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.U); } + public boolean isAccessModificationEnabled(boolean allowAccessModification) { + return allowAccessModification || isAccessModificationEnabledByDefault(); + } + + public boolean isAccessModificationEnabledByDefault() { + return true; + } + public boolean runtimeWithClassValue() { assert isCfRuntime() || isDexRuntime(); return isCfRuntime() || getDexRuntimeVersion().isNewerThanOrEqual(DexVm.Version.V14_0_0);
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java index cfd2a95..f27b3b8 100644 --- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java +++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.utils.FileUtils; import com.android.tools.r8.utils.OptionalBool; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import java.io.IOException; import java.lang.annotation.Annotation; @@ -243,6 +244,24 @@ return self(); } + private final List<String> keepModifiers = + ImmutableList.of( + // TODO: Add allowannotationremoval (currently requires options.isTestingOptionsEnabled()) + // TODO: Add (optional) allowshrinking as well? + "allowobfuscation", "allowoptimization", "allowrepackage"); + + public T addKeepPermittedSubclasses(Class<?>... classes) { + return addKeepPermittedSubclasses( + Arrays.stream(classes).map(Class::getTypeName).toArray(String[]::new)); + } + + public T addKeepPermittedSubclasses(String... classes) { + for (String clazz : classes) { + addKeepRules("-keep," + String.join(",", keepModifiers) + " class " + clazz); + } + return self(); + } + public T addKeepClassAndMembersRules(Class<?>... classes) { return addKeepClassAndMembersRules( Arrays.stream(classes).map(Class::getTypeName).toArray(String[]::new)); @@ -446,6 +465,10 @@ return addKeepAttributes(ProguardKeepAttributes.RUNTIME_INVISIBLE_TYPE_ANNOTATIONS); } + public T addKeepAttributePermittedSubclasses() { + return addKeepAttributes(ProguardKeepAttributes.PERMITTED_SUBCLASSES); + } + public T addKeepAllAttributes() { return addKeepAttributes("*"); }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java index 069acbf..42b728e 100644 --- a/src/test/java/com/android/tools/r8/ToolHelper.java +++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -101,16 +101,19 @@ } public static String getProjectRoot() { - String userDirProperty = System.getProperty("user.dir"); - if (userDirProperty.endsWith("d8_r8/test")) { - return Paths.get(userDirProperty).getParent().getParent().toString() + "/"; + String current = System.getProperty("user.dir"); + if (!current.contains("test_modules")) { + return ""; } - return ""; + while (current.contains("test_modules")) { + current = Paths.get(current).getParent().toString(); + } + return Paths.get(current).getParent().toString() + "/"; } public static final String SOURCE_DIR = "src/main/java/"; public static final String RESOURCES_DIR = "src/main/resources/"; - public static final String BUILD_DIR = "build/"; + public static final String BUILD_DIR = getProjectRoot() + "build/"; public static final String TEST_MODULE_DIR = getProjectRoot() + "d8_r8/test_modules/"; public static final String GENERATED_TEST_BUILD_DIR = BUILD_DIR + "generated/test/"; public static final String LIBS_DIR = BUILD_DIR + "libs/"; @@ -135,8 +138,7 @@ public static final String EXAMPLES_JAVA11_BUILD_DIR = BUILD_DIR + "classes/java/examplesJava11/"; public static final String EXAMPLES_PROTO_BUILD_DIR = TESTS_BUILD_DIR + "examplesProto/"; public static final String GENERATED_PROTO_BUILD_DIR = GENERATED_TEST_BUILD_DIR + "proto/"; - public static final String SMALI_DIR = TESTS_DIR + "smali/"; - public static final String SMALI_BUILD_DIR = TESTS_BUILD_DIR + "smali/"; + public static final String SMALI_BUILD_DIR = THIRD_PARTY_DIR + "smali/"; public static final String JAVA_CLASSES_DIR = BUILD_DIR + "classes/java/"; public static final String JDK_11_TESTS_CLASSES_DIR = JAVA_CLASSES_DIR + "jdk11Tests/"; @@ -972,7 +974,7 @@ } if (isLinux() || isMac()) { // The Linux version is used on Mac, where it is run in a Docker container. - return TOOLS_DIR + "/linux/" + dir; + return TOOLS_DIR + "linux/" + dir; } fail("Unsupported platform, we currently only support mac and linux: " + getPlatform()); return ""; //never here @@ -1305,7 +1307,7 @@ public static Path getClassPathForTests() { if (isNewGradleSetup()) { - return Paths.get(TEST_MODULE_DIR, "tests_java_8", "build", "classes", "java", "main"); + return Paths.get(TEST_MODULE_DIR, "tests_java_8", "build", "classes", "java", "test"); } else { return Paths.get(BUILD_DIR, "classes", "java", "test"); }
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java new file mode 100644 index 0000000..cf4b361 --- /dev/null +++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationByDefaultTest.java
@@ -0,0 +1,131 @@ +// Copyright (c) 2023, 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.accessrelaxation; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic; +import static com.android.tools.r8.utils.codeinspector.Matchers.onlyIf; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoHorizontalClassMerging; +import com.android.tools.r8.NoVerticalClassMerging; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.MethodSubject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class AccessRelaxationByDefaultTest extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void testR8() throws Exception { + runTest(false); + } + + @Test + public void testR8Compat() throws Exception { + runTest(true); + } + + private void runTest(boolean isCompat) throws Exception { + testForR8Compat(parameters.getBackend(), isCompat) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) + .addKeepClassRules(B.class) + .enableInliningAnnotations() + .enableNeverClassInliningAnnotations() + .enableNoHorizontalClassMergingAnnotations() + .enableNoVerticalClassMergingAnnotations() + .setMinApi(parameters) + .compile() + .inspect( + inspector -> { + ClassSubject aClassSubject = inspector.clazz(A.class); + assertThat(aClassSubject, isPresent()); + assertThat(aClassSubject, onlyIf(!isCompat, isPublic())); // Always publicized. + + MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithOriginalName("foo"); + assertThat(fooMethodSubject, isPresent()); + assertThat( + fooMethodSubject, onlyIf(parameters.isDexRuntime() && !isCompat, isPublic())); + + ClassSubject bClassSubject = inspector.clazz(B.class); + assertThat(bClassSubject, isPresent()); + assertThat(bClassSubject, not(isPublic())); // Kept, so never publicized. + + MethodSubject barMethodSubject = bClassSubject.uniqueMethodWithOriginalName("bar"); + assertThat(barMethodSubject, isPresent()); + assertThat( + barMethodSubject, onlyIf(parameters.isDexRuntime() && !isCompat, isPublic())); + + ClassSubject cClassSubject = inspector.clazz(C.class); + assertThat(cClassSubject, isPresent()); + assertThat(cClassSubject, onlyIf(!isCompat, isPublic())); // Always publicized. + + MethodSubject bazMethodSubject = cClassSubject.uniqueMethodWithOriginalName("baz"); + assertThat(bazMethodSubject, isPresent()); + assertThat(bazMethodSubject, onlyIf(!isCompat, isPublic())); // Always publicized. + }) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("A.foo()", "B.bar()", "C.baz()"); + } + + static class Main { + + public static void main(String[] args) { + new A().foo(); + new B().bar(); + new C().baz(); + } + } + + @NeverClassInline + @NoHorizontalClassMerging + @NoVerticalClassMerging + static class A { + + @NeverInline + void foo() { + System.out.println("A.foo()"); + } + } + + // @Keep + @NeverClassInline + static class B extends A { + + @NeverInline + void bar() { + System.out.println("B.bar()"); + } + } + + @NeverClassInline + @NoHorizontalClassMerging + static class C { + + @NeverInline + void baz() { + System.out.println("C.baz()"); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java index d491189..364b35e 100644 --- a/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java +++ b/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java
@@ -7,7 +7,6 @@ import static com.android.tools.r8.utils.codeinspector.Matchers.isFinal; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static com.android.tools.r8.utils.codeinspector.Matchers.onlyIf; -import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.NoRedundantFieldLoadElimination; @@ -51,11 +50,18 @@ ClassSubject mainClassSubject = inspector.clazz(Main.class); assertThat(mainClassSubject, isPresent()); assertThat( + mainClassSubject.uniqueFieldWithOriginalName("instanceField"), isPresent()); + assertThat( mainClassSubject.uniqueFieldWithOriginalName("instanceField"), - allOf(isPresent(), onlyIf(allowAccessModification, isFinal()))); + onlyIf( + parameters.isAccessModificationEnabled(allowAccessModification) + && !parameters.canInitNewInstanceUsingSuperclassConstructor(), + isFinal())); + assertThat(mainClassSubject.uniqueFieldWithOriginalName("staticField"), isPresent()); assertThat( mainClassSubject.uniqueFieldWithOriginalName("staticField"), - allOf(isPresent(), onlyIf(allowAccessModification, isFinal()))); + onlyIf( + parameters.isAccessModificationEnabled(allowAccessModification), isFinal())); }) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("Hello, world!");
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateNonOverridePublicizerTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateNonOverridePublicizerTest.java index f253c40..0d6d2ee 100644 --- a/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateNonOverridePublicizerTest.java +++ b/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateNonOverridePublicizerTest.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.accessrelaxation; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static org.hamcrest.CoreMatchers.not; +import static com.android.tools.r8.utils.codeinspector.Matchers.notIf; import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.NeverClassInline; @@ -65,14 +65,15 @@ .assertSuccessWithOutputLines(EXPECTED) .inspect( inspector -> { - ClassSubject clazz = inspector.clazz(ViewModel.class); // ViewModel.clear() is package private. When we publicize the method, we can inline // the clearBridge() into Main and thereby remove the ViewModel class entirely. - if (allowAccessModification) { - assertThat(clazz, not(isPresent())); - } else { - assertThat(clazz, isPresent()); - } + ClassSubject clazz = inspector.clazz(ViewModel.class); + assertThat( + clazz, + notIf( + isPresent(), + allowAccessModification + || parameters.isAccessModificationEnabledByDefault())); }); }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelFieldAssignNewInstanceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelFieldAssignNewInstanceTest.java index 4145d38..14f996d 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelFieldAssignNewInstanceTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelFieldAssignNewInstanceTest.java
@@ -13,6 +13,7 @@ import static org.junit.Assume.assumeTrue; import com.android.tools.r8.CompilationMode; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestCompileResult; @@ -29,7 +30,7 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; -/** This i a regression test for b/269097876. */ +/** This is a regression test for b/269097876. */ @RunWith(Parameterized.class) public class ApiModelFieldAssignNewInstanceTest extends TestBase { @@ -134,6 +135,7 @@ testForR8(parameters.getBackend()) .apply(this::setupTestBuilder) .addKeepMainRule(Main.class) + .enableNoAccessModificationAnnotationsForMembers() .compile() .inspect(this::inspect) .apply(this::setupRuntime) @@ -178,7 +180,7 @@ public static class Helper { - private LibraryClass libraryClass; + @NoAccessModification private LibraryClass libraryClass; public void setLibraryClass() { if (AndroidBuildVersion.VERSION >= 30) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java index 668bea6..8bd3d88 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfHigherApiLevelInterfaceTest.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.KeepConstantArguments; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -48,6 +49,7 @@ .addKeepMainRule(Main.class) .enableConstantArgumentAnnotations() .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoHorizontalClassMergingAnnotations() .apply(setMockApiLevelForClass(Api.class, AndroidApiLevel.L_MR1)) .apply(setMockApiLevelForMethod(apiMethod, AndroidApiLevel.L_MR1)) @@ -92,15 +94,14 @@ public static class Main { public static void main(String[] args) { - A.noApiCall( - args.length > 0 - ? new Api() { - @Override - public void apiLevel22() { - throw new RuntimeException("Foo"); - } - } - : null); + @NoAccessModification + class ApiImpl implements Api { + @Override + public void apiLevel22() { + throw new RuntimeException("Foo"); + } + } + A.noApiCall(args.length > 0 ? new ApiImpl() : null); } } }
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/BridgeWithInvokeSuperTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/BridgeWithInvokeSuperTest.java index 93795cf..3ff48dc 100644 --- a/src/test/java/com/android/tools/r8/bridgeremoval/BridgeWithInvokeSuperTest.java +++ b/src/test/java/com/android/tools/r8/bridgeremoval/BridgeWithInvokeSuperTest.java
@@ -4,10 +4,10 @@ package com.android.tools.r8.bridgeremoval; -import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static org.hamcrest.CoreMatchers.not; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentIf; import static org.hamcrest.MatcherAssert.assertThat; +import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; @@ -51,18 +51,20 @@ .addProgramClassFileData(getAWithBridgeAccessFlag()) .setMinApi(parameters) .addKeepMainRule(Main.class) - .enableNoVerticalClassMergingAnnotations() .enableInliningAnnotations() + .enableNeverClassInliningAnnotations() + .enableNoVerticalClassMergingAnnotations() .compile() .inspect( inspector -> { + boolean canUseDefaultAndStaticInterfaceMethods = + parameters.canUseDefaultAndStaticInterfaceMethods(); // Check that we are removing the bridge if we support default methods. - if (parameters.canUseDefaultAndStaticInterfaceMethods()) { - ClassSubject A = inspector.clazz(A.class); - assertThat(A, isPresent()); - MethodSubject fooMethod = A.uniqueMethodWithOriginalName("foo"); - assertThat(fooMethod, not(isPresent())); - } + ClassSubject A = inspector.clazz(A.class); + assertThat(A, isPresentIf(!canUseDefaultAndStaticInterfaceMethods)); + + MethodSubject fooMethod = A.uniqueMethodWithOriginalName("foo"); + assertThat(fooMethod, isPresentIf(!canUseDefaultAndStaticInterfaceMethods)); }) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines(EXPECTED); @@ -83,6 +85,7 @@ } } + @NeverClassInline public static class A implements I { @Override
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java index 2868cd8..2a2f7e9 100644 --- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java +++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.KeepConstantArguments; import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; @@ -75,6 +76,7 @@ .addKeepMainRule(TestClass.class) .enableConstantArgumentAnnotations() .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoMethodStaticizingAnnotations() .enableNoVerticalClassMergingAnnotations() @@ -127,6 +129,7 @@ // in TestClass.main(). @KeepConstantArguments @NeverInline + @NoAccessModification @NoMethodStaticizing /*bridge*/ String bridgeB(Object o) { return (String) m((String) o); @@ -154,6 +157,7 @@ // in TestClass.main(). @KeepConstantArguments @NeverInline + @NoAccessModification @NoMethodStaticizing /*bridge*/ String bridgeB(Object o, int a, int b, int c, int d, int e) { return (String) m((String) o, a, b, c, d, e);
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java index 06f1e31..517edfe 100644 --- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java +++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java
@@ -43,6 +43,7 @@ transformer(C.class).setBridge(C.class.getDeclaredMethod("bridge")).transform()) .addKeepMainRule(TestClass.class) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .enableNeverClassInliningAnnotations() .setMinApi(parameters)
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/testclasses/NonReboundBridgeHoistingTestClasses.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/testclasses/NonReboundBridgeHoistingTestClasses.java index c419f7f..7a40b3f 100644 --- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/testclasses/NonReboundBridgeHoistingTestClasses.java +++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/testclasses/NonReboundBridgeHoistingTestClasses.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.bridgeremoval.hoisting.testclasses; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; public class NonReboundBridgeHoistingTestClasses { @@ -13,6 +14,7 @@ return A.class; } + @NoAccessModification @NoVerticalClassMerging static class A {
diff --git a/src/test/java/com/android/tools/r8/classmerging/StatefulSingletonClassesMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/StatefulSingletonClassesMergingTest.java index 3604880..852fc89 100644 --- a/src/test/java/com/android/tools/r8/classmerging/StatefulSingletonClassesMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/StatefulSingletonClassesMergingTest.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -34,20 +35,14 @@ testForR8(parameters.getBackend()) .addInnerClasses(getClass()) .addKeepMainRule(Main.class) - // TODO(b/280384153): A and B should always be merged in the final round of tree shaking - // since their class initializers are postponeable, but we fail to conclude so with - // constructor inlining enabled. .addHorizontallyMergedClassesInspector( inspector -> - inspector - .applyIf( - !parameters.canInitNewInstanceUsingSuperclassConstructor(), - i -> i.assertIsCompleteMergeGroup(A.class, B.class)) - .assertNoOtherClassesMerged()) + inspector.assertIsCompleteMergeGroup(A.class, B.class).assertNoOtherClassesMerged()) .enableConstantArgumentAnnotations() .enableInliningAnnotations() .enableMemberValuePropagationAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("A", "B"); @@ -65,11 +60,12 @@ static final A INSTANCE = new A("A"); - @NeverPropagateValue private final String data; + @NeverPropagateValue @NoAccessModification private final String data; // TODO(b/198758663): With argument propagation the constructors end up not being equivalent, // which prevents merging in the final round of horizontal class merging. @KeepConstantArguments + @NeverInline A(String data) { this.data = data; } @@ -85,11 +81,12 @@ static final B INSTANCE = new B("B"); - @NeverPropagateValue private String data; + @NeverPropagateValue @NoAccessModification private String data; // TODO(b/198758663): With argument propagation the constructors end up not being equivalent, // which prevents merging in the final round of horizontal class merging. @KeepConstantArguments + @NeverInline B(String data) { this.data = data; }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java index ebbb020..7406b9b 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java
@@ -11,6 +11,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.FieldSubject; @@ -29,6 +30,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .addHorizontallyMergedClassesInspector( inspector -> inspector.assertMergedInto(B.class, A.class)) @@ -66,7 +68,9 @@ @NeverClassInline public static class A { - private int v1; + + @NoAccessModification private int v1; + public int v2; public A(int v) { @@ -92,8 +96,10 @@ @NeverClassInline public static class B { + public int v1; - private int v2; + + @NoAccessModification private int v2; public B(int v) { v1 = 3 * v;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithOverlappingVisibilitiesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithOverlappingVisibilitiesTest.java index f3380dc..57e100b 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithOverlappingVisibilitiesTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithOverlappingVisibilitiesTest.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.MethodSubject; @@ -29,6 +30,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("foo A", "FOO B", "FOO C", "foo D", "FOO E") @@ -59,6 +61,7 @@ @NeverClassInline public static class A { @NeverInline + @NoAccessModification void foo() { System.out.println("foo A"); } @@ -72,6 +75,7 @@ @Override @NeverInline + @NoAccessModification void foo() { System.out.println("FOO B"); } @@ -86,6 +90,7 @@ @Override @NeverInline + @NoAccessModification void foo() { System.out.println("FOO C"); }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java index 3b62f5b..f2db164 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import org.junit.Test; @@ -25,6 +26,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("c", "foo: foo") @@ -48,16 +50,21 @@ @NeverClassInline public static class C { + + @NoAccessModification C() { System.out.println("c"); } } public static class D { + + @NoAccessModification D() { foo(new B()); } + @NoAccessModification @NeverInline static void foo(A a) { System.out.println("foo: " + a.foo());
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java index c4aafe8..5e15d11 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/EquivalentConstructorsWithClassIdAndExtraNullsMergingTest.java
@@ -9,6 +9,7 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -43,6 +44,7 @@ inspector -> inspector.assertIsCompleteMergeGroup(A.class, B.class).assertNoOtherClassesMerged()) .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .setMinApi(parameters) .compile() @@ -74,7 +76,7 @@ @NeverClassInline static class A { - private final Object c; + @NoAccessModification private final Object c; A(C c) { this.c = c; @@ -94,7 +96,7 @@ @NeverClassInline static class B { - private final D d; + @NoAccessModification private final D d; B(D d) { this.d = d;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java index c48c0c1..e8b40c2 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.classmerging.horizontal; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -49,6 +50,7 @@ .addHorizontallyMergedClassesInspector( HorizontallyMergedClassesInspector::assertNoClassesMerged) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .setMinApi(parameters) .compile() @@ -88,13 +90,14 @@ public static class A2 { // Will remain due to the use in Main.main. - static int f = (int) System.currentTimeMillis(); + @NoAccessModification static int f = (int) System.currentTimeMillis(); static { System.out.print("Hello"); } // Will be inlined. + @NoAccessModification static void sayHello() {} }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/InterfacesVisibilityTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/InterfacesVisibilityTest.java index aeccb3c..5430a70 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/InterfacesVisibilityTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/InterfacesVisibilityTest.java
@@ -33,6 +33,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoMethodStaticizingAnnotations() .enableNoParameterTypeStrengtheningAnnotations() .enableNoVerticalClassMergingAnnotations()
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergePackagePrivateWithPublicClassTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergePackagePrivateWithPublicClassTest.java index d348bb4..bf3e27f 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergePackagePrivateWithPublicClassTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergePackagePrivateWithPublicClassTest.java
@@ -27,6 +27,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .setMinApi(parameters) .compile() .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergingWithSafeCheckCastTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergingWithSafeCheckCastTest.java index 0810864..2a36a79 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergingWithSafeCheckCastTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergingWithSafeCheckCastTest.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoUnusedInterfaceRemoval; import com.android.tools.r8.NoVerticalClassMerging; @@ -35,6 +36,7 @@ .enableInliningAnnotations() .enableMemberValuePropagationAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoUnusedInterfaceRemovalAnnotations() .enableNoVerticalClassMergingAnnotations() @@ -76,7 +78,7 @@ @NeverClassInline public static class A { - @NeverPropagateValue I f; + @NeverPropagateValue @NoAccessModification I f; A(I f) { this.f = f; @@ -86,7 +88,7 @@ @NeverClassInline public static class B { - @NeverPropagateValue J f; + @NeverPropagateValue @NoAccessModification J f; B(J f) { this.f = f;
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NoClassesOrMembersWithAnnotationsTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NoClassesOrMembersWithAnnotationsTest.java index ebe21cf..4efe443 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NoClassesOrMembersWithAnnotationsTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NoClassesOrMembersWithAnnotationsTest.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.KeepConstantArguments; import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.BooleanUtils; @@ -57,6 +58,7 @@ }) .enableConstantArgumentAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableInliningAnnotations() .setMinApi(parameters) .compile() @@ -135,13 +137,14 @@ C c = new C("c"); c.foo(); foo(null); - foo2( - new MethodAnnotation() { - @Override - public Class<? extends Annotation> annotationType() { - return null; - } - }); + @NoAccessModification + class MethodAnnotationImpl implements MethodAnnotation { + @Override + public Class<? extends Annotation> annotationType() { + return null; + } + } + foo2(new MethodAnnotationImpl()); if (b.getClass().getAnnotations().length > 0) { System.out.println( b.getClass().getAnnotations()[0].toString().replaceFirst(".*", "annotation 1"));
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java index 39b5438..e9af361 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
@@ -14,6 +14,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.NoVerticalClassMerging; @@ -48,6 +49,7 @@ HorizontallyMergedClassesInspector::assertNoClassesMerged) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoMethodStaticizingAnnotations() .enableNoVerticalClassMergingAnnotations() @@ -88,6 +90,7 @@ abstract static class A { @NeverInline + @NoAccessModification @NoMethodStaticizing void m() { System.out.println("A.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java index dbe5c95..1edbf47 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoUnusedInterfaceRemoval; import com.android.tools.r8.NoVerticalClassMerging; @@ -47,6 +48,7 @@ inspector.assertIsCompleteMergeGroup(I.class, J.class).assertNoOtherClassesMerged()) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoUnusedInterfaceRemovalAnnotations() .enableNoVerticalClassMergingAnnotations() @@ -94,6 +96,7 @@ static class A extends I { @NeverInline + @NoAccessModification void m() { System.out.println("A.m()"); }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/UnresolvableMethodWithClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/UnresolvableMethodWithClassMergingTest.java index ba7e586..dc66746 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/UnresolvableMethodWithClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/UnresolvableMethodWithClassMergingTest.java
@@ -21,7 +21,7 @@ .addKeepMainRule(Main.class) .addDontWarn(Missing.class) .addHorizontallyMergedClassesInspector( - HorizontallyMergedClassesInspector::assertNoOtherClassesMerged) + HorizontallyMergedClassesInspector::assertNoClassesMerged) .setMinApi(parameters) .compile() .addRunClasspathFiles(buildOnDexRuntime(parameters, Missing.class))
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/dispatch/OverrideDefaultOnSuperMethodTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/dispatch/OverrideDefaultOnSuperMethodTest.java index 93548c1..8f92bab 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/dispatch/OverrideDefaultOnSuperMethodTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/dispatch/OverrideDefaultOnSuperMethodTest.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoUnusedInterfaceRemoval; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestParameters; @@ -29,6 +30,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoUnusedInterfaceRemovalAnnotations() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) @@ -69,6 +71,7 @@ }); } + @NoAccessModification @NoVerticalClassMerging interface I { @NeverInline @@ -92,6 +95,7 @@ } @NeverClassInline + @NoAccessModification @NoUnusedInterfaceRemoval @NoVerticalClassMerging interface J extends I {
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java index b3a256c..f91ff1e 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java
@@ -13,6 +13,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.NoUnusedInterfaceRemoval; @@ -48,6 +49,7 @@ HorizontallyMergedClassesInspector::assertNoClassesMerged) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoMethodStaticizingAnnotations() .enableNoUnusedInterfaceRemovalAnnotations() @@ -99,6 +101,7 @@ // Intentionally package private. If J is merged into I then this is an illegal override of // I.m(). @NeverInline + @NoAccessModification @NoMethodStaticizing void m() { System.out.println("A.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java index e03a298..775d754 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java
@@ -14,6 +14,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.NoUnusedInterfaceRemoval; @@ -49,6 +50,7 @@ HorizontallyMergedClassesInspector::assertNoClassesMerged) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .enableNoMethodStaticizingAnnotations() .enableNoUnusedInterfaceRemovalAnnotations() @@ -104,6 +106,7 @@ // Intentionally package private. If J is merged into I then this is an illegal override of // I.m(). @NeverInline + @NoAccessModification @NoMethodStaticizing void m() { System.out.println("A.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/InterfacesVisibilityTestClasses.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/InterfacesVisibilityTestClasses.java index c857046..47428cc 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/InterfacesVisibilityTestClasses.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/InterfacesVisibilityTestClasses.java
@@ -6,6 +6,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoParameterTypeStrengthening; import com.android.tools.r8.NoVerticalClassMerging; @@ -27,6 +28,7 @@ } } + @NoAccessModification @NoHorizontalClassMerging @NoVerticalClassMerging interface PackagePrivateInterface {
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/PackagePrivateClass.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/PackagePrivateClass.java index 7deccb2..dfa6ba9 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/PackagePrivateClass.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/testclasses/PackagePrivateClass.java
@@ -5,8 +5,10 @@ package com.android.tools.r8.classmerging.horizontal.testclasses; import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NoAccessModification; @NeverClassInline +@NoAccessModification class PackagePrivateClass { public PackagePrivateClass() { System.out.println("package private");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerVisibilityTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerVisibilityTest.java index aa373c6..8b5680a 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerVisibilityTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontalstatic/StaticClassMergerVisibilityTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -41,34 +42,35 @@ .addHorizontallyMergedClassesInspector( inspector -> inspector - .assertMergedInto(A.class, D.class) - .assertMergedInto(B.class, D.class) - .assertMergedInto(C.class, D.class)) + .assertIsCompleteMergeGroup(A.class, B.class, C.class, D.class) + .assertNoOtherClassesMerged()) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) - .addDontObfuscate() .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("A.print()", "B.print()", "C.print()", "D.print()") .inspect( inspector -> { - // All classes are merged into D. - ClassSubject clazzD = inspector.clazz(D.class); - assertThat(clazzD, isPresent()); - assertThat(clazzD, isPublic()); - // D now has 5 methods (there is a synthetic access bridge for the private A.print()). - assertEquals(5, clazzD.allMethods().size()); + // All classes are merged into C. + ClassSubject classSubject = inspector.clazz(C.class); + assertThat(classSubject, isPresent()); + assertThat(classSubject, isPublic()); + // A now has 5 methods (there is a synthetic access bridge for the private A.print()). + assertEquals(5, classSubject.allMethods().size()); }); } - // Will be merged into D. + // Will be merged into C. private static class A { + @NeverInline + @NoAccessModification private static void print() { System.out.println("A.print()"); } } - // Will be merged into D. + // Will be merged into C. static class B { @NeverInline static void print() { @@ -76,7 +78,6 @@ } } - // Will be merged into D public static class C { @NeverInline public static void print() { @@ -84,6 +85,7 @@ } } + // Will be merged into C. protected static class D { @NeverInline protected static void print() {
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java index 07d4778..3063698 100644 --- a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java +++ b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
@@ -9,12 +9,14 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; 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.HorizontallyMergedClassesInspector; import com.android.tools.r8.utils.codeinspector.MethodSubject; import org.junit.Test; import org.junit.runner.RunWith; @@ -50,7 +52,10 @@ .addKeepMainRule(TestClass.class) .setMinApi(parameters) .addKeepAttributes("Signatures") + .addHorizontallyMergedClassesInspector( + HorizontallyMergedClassesInspector::assertNoClassesMerged) .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .addDontObfuscate() .compile() .inspect(this::inspect) @@ -90,6 +95,7 @@ } static abstract class Box<T extends BoxValue> { + @NoAccessModification @SuppressWarnings("unchecked") private T[] _storage = (T[]) (new BoxValue[1]);
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/NonReboundFieldAccessOnMergedClassTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/NonReboundFieldAccessOnMergedClassTest.java index 913f012..d94fbf9 100644 --- a/src/test/java/com/android/tools/r8/classmerging/vertical/NonReboundFieldAccessOnMergedClassTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/vertical/NonReboundFieldAccessOnMergedClassTest.java
@@ -37,6 +37,7 @@ .addVerticallyMergedClassesInspector( inspector -> inspector.assertMergedIntoSubtype(C.class)) .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) .compile()
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java index e01af0f..162f678 100644 --- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -256,6 +256,7 @@ Path[] programFiles = new Path[] { CF_DIR.resolve("NeverPropagateValue.class"), + CF_DIR.resolve("NoAccessModification.class"), CF_DIR.resolve("NoRedundantFieldLoadElimination.class"), CF_DIR.resolve("ConflictInGeneratedNameTest.class"), CF_DIR.resolve("ConflictInGeneratedNameTest$A.class"), @@ -1081,6 +1082,7 @@ CF_DIR.resolve("pkg/SimpleInterfaceImplRetriever$SimpleInterfaceImpl.class"), CF_DIR.resolve("pkg/SimpleInterfaceImplRetriever$1.class"), CF_DIR.resolve("NeverInline.class"), + CF_DIR.resolve("NoAccessModification.class"), CF_DIR.resolve("NoHorizontalClassMerging.class") }; // SimpleInterface cannot be merged into SimpleInterfaceImpl because SimpleInterfaceImpl
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/testclasses/NonReboundFieldAccessOnMergedClassTestClasses.java b/src/test/java/com/android/tools/r8/classmerging/vertical/testclasses/NonReboundFieldAccessOnMergedClassTestClasses.java index 7653f54..f8caa00 100644 --- a/src/test/java/com/android/tools/r8/classmerging/vertical/testclasses/NonReboundFieldAccessOnMergedClassTestClasses.java +++ b/src/test/java/com/android/tools/r8/classmerging/vertical/testclasses/NonReboundFieldAccessOnMergedClassTestClasses.java
@@ -4,10 +4,12 @@ package com.android.tools.r8.classmerging.vertical.testclasses; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; public class NonReboundFieldAccessOnMergedClassTestClasses { + @NoAccessModification @NoVerticalClassMerging static class A {
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java index 742b463..0fc4708 100644 --- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java +++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingBindsTest.java
@@ -71,15 +71,23 @@ } private void inspect(CodeInspector inspector) { + ImmutableSet.Builder<String> expectedClasses = + ImmutableSet.<String>builder() + .add( + "basic.I1Impl1", + "basic.I2Impl1", + "basic.I3Impl1", + "basic.MainUsingBinds", + "dagger.internal.DoubleCheck", + "javax.inject.Provider"); + if (parameters.isCfRuntime()) { + expectedClasses.add("basic.DaggerMainComponentUsingBinds"); + } + if (target.equals("1.8") || parameters.isDexRuntime()) { + expectedClasses.add("basic.DaggerMainComponentUsingBinds$Builder"); + } assertEquals( - ImmutableSet.of( - "basic.I1Impl1", - "basic.I2Impl1", - "basic.I3Impl1", - "basic.MainUsingBinds", - "basic.DaggerMainComponentUsingBinds", - "dagger.internal.DoubleCheck", - "javax.inject.Provider"), + expectedClasses.build(), inspector.allClasses().stream() .map(FoundClassSubject::getOriginalName) .filter(name -> !name.contains("_Factory")) @@ -93,24 +101,27 @@ .setMinApi(parameters) .addKeepMainRule(MAIN_CLASS) .addHorizontallyMergedClassesInspector( - inspector -> { - inspector - .applyIf( - target.equals("1.8") || parameters.isDexRuntime(), - i -> - i.assertIsCompleteMergeGroup( - "basic.I1Impl1_Factory", - "basic.I2Impl1_Factory", - "basic.I3Impl1_Factory")) - .applyIf( - target.equals("1.8") || parameters.isDexRuntime(), - i -> - i.assertIsCompleteMergeGroup( - "basic.I1Impl1_Factory$InstanceHolder", - "basic.I2Impl1_Factory$InstanceHolder", - "basic.I3Impl1_Factory$InstanceHolder")) - .assertNoOtherClassesMerged(); - }) + inspector -> + inspector + .applyIf( + target.equals("1.8") || parameters.isDexRuntime(), + i -> + i.assertIsCompleteMergeGroup( + "basic.DaggerMainComponentUsingBinds$Builder", + "basic.I1Impl1_Factory", + "basic.I2Impl1_Factory", + "basic.I3Impl1_Factory") + .assertIsCompleteMergeGroup( + "a.I1Impl1_Factory$InstanceHolder", + "a.I2Impl1_Factory$InstanceHolder", + "a.I3Impl1_Factory$InstanceHolder")) + .applyIf( + target.equals("1.8"), + i -> + i.assertIsCompleteMergeGroup( + "dagger.internal.Preconditions", + "basic.DaggerMainComponentUsingBinds$1")) + .assertNoOtherClassesMerged()) .addVerticallyMergedClassesInspector( inspector -> inspector.assertMergedIntoSubtype("basic.I1", "basic.I2", "basic.I3")) .run(parameters.getRuntime(), MAIN_CLASS)
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java index 4a3efd7..16117c6 100644 --- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java +++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicSingletonUsingProvidesTest.java
@@ -51,15 +51,23 @@ ImmutableList.of("true", "true", "true", "I1Impl2", "I2Impl2", "I3Impl2"); private void inspect(CodeInspector inspector) { + ImmutableSet.Builder<String> expectedClasses = + ImmutableSet.<String>builder() + .add( + "basic.I1Impl2", + "basic.I2Impl2", + "basic.I3Impl2", + "basic.MainUsingProvides", + "dagger.internal.DoubleCheck", + "javax.inject.Provider"); + if (parameters.isCfRuntime()) { + expectedClasses.add("basic.DaggerMainComponentUsingProvides"); + } + if (target.equals("1.8") || parameters.isDexRuntime()) { + expectedClasses.add("basic.DaggerMainComponentUsingProvides$Builder"); + } assertEquals( - ImmutableSet.of( - "basic.I1Impl2", - "basic.I2Impl2", - "basic.I3Impl2", - "basic.MainUsingProvides", - "basic.DaggerMainComponentUsingProvides", - "dagger.internal.DoubleCheck", - "javax.inject.Provider"), + expectedClasses.build(), inspector.allClasses().stream() .map(FoundClassSubject::getOriginalName) .filter(name -> !name.contains("Factory")) @@ -100,6 +108,7 @@ target.equals("1.8") || parameters.isDexRuntime(), i -> i.assertIsCompleteMergeGroup( + "basic.DaggerMainComponentUsingProvides$Builder", "basic.ModuleUsingProvides_I1Factory", "basic.ModuleUsingProvides_I2Factory", "basic.ModuleUsingProvides_I3Factory")) @@ -107,15 +116,19 @@ target.equals("1.8") || parameters.isDexRuntime(), i -> i.assertIsCompleteMergeGroup( - "basic.ModuleUsingProvides_I1Factory$InstanceHolder", - "basic.ModuleUsingProvides_I2Factory$InstanceHolder", - "basic.ModuleUsingProvides_I3Factory$InstanceHolder")) + "a.ModuleUsingProvides_I1Factory$InstanceHolder", + "a.ModuleUsingProvides_I2Factory$InstanceHolder", + "a.ModuleUsingProvides_I3Factory$InstanceHolder")) .applyIf( target.equals("1.8"), i -> i.assertIsCompleteMergeGroup( "basic.ModuleUsingProvides", - "basic.DaggerMainComponentUsingProvides$1")) + "basic.DaggerMainComponentUsingProvides$1", + "dagger.internal.Preconditions"), + i -> + i.assertIsCompleteMergeGroup( + "basic.ModuleUsingProvides", "dagger.internal.Preconditions")) .assertNoOtherClassesMerged(); }) .addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java b/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java index 820789c..3d882a5 100644 --- a/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java +++ b/src/test/java/com/android/tools/r8/desugar/DesugarInstanceLambdaWithReadsTest.java
@@ -66,8 +66,7 @@ inspector .clazz(Main.class) .allMethods(m -> m.getOriginalName().startsWith(R8_LAMBDA_ACCESSOR_METHOD_PREFIX)); - assertEquals( - BooleanUtils.intValue(parameters.isDexRuntime() && isR8), lambdaAccessorMethods.size()); + assertEquals(0, lambdaAccessorMethods.size()); // When generating DEX, R8 will inline the javac-generated lambda$ method into the synthesized // $r8$lambda$ accessor method.
diff --git a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java index b6669cd..78d4db5 100644 --- a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java +++ b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java
@@ -3,7 +3,7 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.constantdynamic; -import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -20,6 +20,7 @@ import com.android.tools.r8.jacoco.JacocoClasses; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.MethodSubject; import java.io.IOException; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; @@ -56,6 +57,8 @@ "java.lang.invoke.MethodHandles$Lookup", "java.lang.String", "java.lang.Class"); + private static final String EXPECTED_OUTPUT_WITHOUT_PARAMETERS = + StringUtils.lines(jacocoBootstrapMethodName, "0"); private static final String EXPECTED_OUTPUT_WITHOUT_METHOD_HANDLES = StringUtils.lines( jacocoBootstrapMethodName, @@ -130,6 +133,10 @@ .addProgramFiles(ToolHelper.JACOCO_AGENT) .setMinApi(parameters) .addKeepMainRules(TestRunner.class) + .addKeepRules( + "-keepclassmembers,allowoptimization,allowshrinking class " + MAIN_CLASS + " {", + " boolean[] " + jacocoBootstrapMethodName + "(...);", + "}") .applyIf( parameters.getApiLevel().isLessThan(AndroidApiLevel.O), b -> b.addDontWarn(MethodHandles.Lookup.class)) @@ -138,13 +145,14 @@ .runWithJaCoCo(agentOutput, parameters.getRuntime(), MAIN_CLASS) .inspect( inspector -> { - assertThat( + MethodSubject jacocoBootstrapMethodSubject = inspector .clazz(TestRunner.class) - .uniqueMethodWithOriginalName(jacocoBootstrapMethodName), - isAbsent()); + .uniqueMethodWithOriginalName(jacocoBootstrapMethodName); + assertThat(jacocoBootstrapMethodSubject, isPresent()); + assertEquals(0, jacocoBootstrapMethodSubject.getParameters().size()); }) - .assertSuccessWithOutputLines("No " + jacocoBootstrapMethodName + " method"); + .assertSuccessWithOutput(EXPECTED_OUTPUT_WITHOUT_PARAMETERS); checkJacocoReport(agentOutput); }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java b/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java index d345744..e60c81f 100644 --- a/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java +++ b/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.desugar.records; import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -69,6 +70,8 @@ @Test public void testR8() throws Exception { + // TODO(b/288360309): Correctly deal with non-identity lenses in R8 record rewriting. + assumeTrue(parameters.isDexRuntime()); parameters.assumeR8TestParameters(); testForR8(parameters.getBackend()) .addProgramClassFileData(PROGRAM_DATA)
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java index 0137c4f..0c007f2 100644 --- a/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java +++ b/src/test/java/com/android/tools/r8/desugar/records/RecordShrinkFieldTest.java
@@ -69,7 +69,7 @@ .addKeepMainRule(MAIN_TYPE) .minification(minifying) .compile() - .inspect(this::assertSingleField) + .inspect(inspector -> inspect(inspector, false)) .run(parameters.getRuntime(), MAIN_TYPE) .assertSuccessWithOutput( minifying ? EXPECTED_RESULT_R8 : EXPECTED_RESULT_R8_NO_MINIFICATION); @@ -92,17 +92,21 @@ .addKeepMainRule(MAIN_TYPE) .minification(minifying) .compile() - .inspect(this::assertSingleField) + .inspect(inspector -> inspect(inspector, true)) .run(parameters.getRuntime(), MAIN_TYPE) .assertSuccessWithOutput( minifying ? EXPECTED_RESULT_R8 : EXPECTED_RESULT_R8_NO_MINIFICATION); } - private void assertSingleField(CodeInspector inspector) { + private void inspect(CodeInspector inspector, boolean isCfThenDex) { ClassSubject recordClass = inspector.clazz(minifying ? "records.a" : "records.RecordShrinkField$Person"); - assertEquals(1, recordClass.allInstanceFields().size()); - assertEquals( - "java.lang.String", recordClass.allInstanceFields().get(0).getField().type().toString()); + if (isCfThenDex || !minifying) { + assertEquals(1, recordClass.allInstanceFields().size()); + assertEquals( + "java.lang.String", recordClass.allInstanceFields().get(0).getField().type().toString()); + } else { + assertEquals(0, recordClass.allInstanceFields().size()); + } } }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordWithNonMaterializableConstClassTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordWithNonMaterializableConstClassTest.java index 2f60f2a..0262140 100644 --- a/src/test/java/com/android/tools/r8/desugar/records/RecordWithNonMaterializableConstClassTest.java +++ b/src/test/java/com/android/tools/r8/desugar/records/RecordWithNonMaterializableConstClassTest.java
@@ -4,6 +4,8 @@ package com.android.tools.r8.desugar.records; +import static org.junit.Assume.assumeTrue; + import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -90,6 +92,8 @@ .apply(this::configureR8) .compile() .writeToZip(); + // TODO(b/288360309): Correctly deal with non-identity lenses in R8 record rewriting. + assumeTrue(parameters.isDexRuntime()); testForR8(parameters.getBackend()) .addProgramFiles(desugared) .apply(this::configureR8)
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesEnumJdk17CompiledTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesEnumJdk17CompiledTest.java index 16009e6..07d4ef7 100644 --- a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesEnumJdk17CompiledTest.java +++ b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesEnumJdk17CompiledTest.java
@@ -4,20 +4,22 @@ package com.android.tools.r8.desugar.sealed; -import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThrows; +import static junit.framework.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assume.assumeTrue; -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.DesugarTestConfiguration; -import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.TestShrinkerBuilder; import com.android.tools.r8.examples.jdk17.EnumSealed; +import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.Matchers; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -30,16 +32,22 @@ @Parameter(0) public TestParameters parameters; + @Parameter(1) + public boolean keepPermittedSubclassesAttribute; + static final String EXPECTED = StringUtils.lines("A", "a B"); - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(); + @Parameters(name = "{0}, keepPermittedSubclasses = {1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + BooleanUtils.values()); } @Test public void testJvm() throws Exception { parameters.assumeJvmTestParameters(); + assumeTrue(keepPermittedSubclassesAttribute); assumeTrue(parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)); testForJvm(parameters) .addRunClasspathFiles(EnumSealed.jar()) @@ -49,6 +57,7 @@ @Test public void testDesugaring() throws Exception { + assumeTrue(keepPermittedSubclassesAttribute); testForDesugaring(parameters) .addProgramFiles(EnumSealed.jar()) .run(parameters.getRuntime(), EnumSealed.Main.typeName()) @@ -60,28 +69,33 @@ r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } + private void inspect(CodeInspector inspector) { + ClassSubject clazz = inspector.clazz("enum_sealed.Enum"); + assertThat(clazz, Matchers.isPresentAndRenamed()); + if (!parameters.isCfRuntime()) { + return; + } + assertEquals( + keepPermittedSubclassesAttribute ? 1 : 0, + clazz.getFinalPermittedSubclassAttributes().size()); + } + @Test public void testR8() throws Exception { parameters.assumeR8TestParameters(); - R8FullTestBuilder builder = - testForR8(parameters.getBackend()) - .addProgramFiles(EnumSealed.jar()) - .setMinApi(parameters) - .addKeepMainRule(EnumSealed.Main.typeName()); - if (parameters.isCfRuntime()) { - assertThrows( - CompilationFailedException.class, - () -> - builder.compileWithExpectedDiagnostics( - diagnostics -> - diagnostics.assertErrorThatMatches( - diagnosticMessage( - containsString( - "Sealed classes are not supported as program classes"))))); - } else { - builder - .run(parameters.getRuntime(), EnumSealed.Main.typeName()) - .assertSuccessWithOutput(EXPECTED); - } + testForR8(parameters.getBackend()) + .addProgramFiles(EnumSealed.jar()) + .setMinApi(parameters) + .applyIf( + keepPermittedSubclassesAttribute, + TestShrinkerBuilder::addKeepAttributePermittedSubclasses) + .addKeepMainRule(EnumSealed.Main.typeName()) + .compile() + .inspect(this::inspect) + .run(parameters.getRuntime(), EnumSealed.Main.typeName()) + .applyIf( + parameters.isDexRuntime() || parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17), + r -> r.assertSuccessWithOutput(EXPECTED), + r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesIllegalSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesIllegalSubclassTest.java index 330da7e..03d9160 100644 --- a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesIllegalSubclassTest.java +++ b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesIllegalSubclassTest.java
@@ -4,20 +4,25 @@ package com.android.tools.r8.desugar.sealed; -import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; +import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThrows; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.DesugarTestConfiguration; -import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestBuilder; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.TestShrinkerBuilder; +import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.Matchers; +import java.util.List; +import org.hamcrest.Matcher; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -30,11 +35,18 @@ @Parameter(0) public TestParameters parameters; - static final String EXPECTED = StringUtils.lines("Success!"); + @Parameter(1) + public boolean keepPermittedSubclassesAttribute; - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(); + static final Matcher<String> EXPECTED = containsString("cannot inherit from sealed class"); + static final String EXPECTED_WITHOUT_PERMITTED_SUBCLASSES_ATTRIBUTE = + StringUtils.lines("Success!"); + + @Parameters(name = "{0}, keepPermittedSubclasses = {1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + BooleanUtils.values()); } private void addTestClasses(TestBuilder<?, ?> builder) throws Exception { @@ -46,52 +58,67 @@ @Test public void testJvm() throws Exception { parameters.assumeJvmTestParameters(); + assumeTrue(keepPermittedSubclassesAttribute); assumeTrue(parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)); testForJvm(parameters) .apply(this::addTestClasses) .run(parameters.getRuntime(), TestClass.class) - .assertFailureWithErrorThatMatches(containsString("cannot inherit from sealed class")); + .assertFailureWithErrorThatMatches(EXPECTED); } @Test public void testDesugaring() throws Exception { + assumeTrue(keepPermittedSubclassesAttribute); testForDesugaring(parameters) .apply(this::addTestClasses) .run(parameters.getRuntime(), TestClass.class) .applyIf( DesugarTestConfiguration::isNotJavac, - r -> r.assertSuccessWithOutput(EXPECTED), + r -> r.assertSuccessWithOutput(EXPECTED_WITHOUT_PERMITTED_SUBCLASSES_ATTRIBUTE), c -> parameters.getRuntime().asCf().isNewerThanOrEqual(CfVm.JDK17), - r -> - r.assertFailureWithErrorThatMatches( - containsString("cannot inherit from sealed class")), + r -> r.assertFailureWithErrorThatMatches(EXPECTED), r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } + private void inspect(CodeInspector inspector) { + ClassSubject clazz = inspector.clazz(C.class); + assertThat(clazz, Matchers.isPresentAndRenamed()); + if (!parameters.isCfRuntime()) { + return; + } + assertEquals( + keepPermittedSubclassesAttribute ? 2 : 0, + clazz.getFinalPermittedSubclassAttributes().size()); + } + @Test public void testR8() throws Exception { parameters.assumeR8TestParameters(); - R8FullTestBuilder builder = - testForR8(parameters.getBackend()) - .apply(this::addTestClasses) - .setMinApi(parameters) - .addKeepMainRule(TestClass.class); - if (parameters.isCfRuntime()) { - // TODO(b/227160052): Support sealed classes for R8 class file output. - assertThrows( - CompilationFailedException.class, - () -> - builder.compileWithExpectedDiagnostics( - diagnostics -> - diagnostics.assertErrorThatMatches( - diagnosticMessage( - containsString( - "Sealed classes are not supported as program classes"))))); - } else { - builder - .run(parameters.getRuntime(), TestClass.class) - .assertSuccessWithOutputLines("Success!"); - } + assumeFalse(parameters.isDexRuntime() && keepPermittedSubclassesAttribute); + testForR8(parameters.getBackend()) + .apply(this::addTestClasses) + .setMinApi(parameters) + .applyIf( + keepPermittedSubclassesAttribute, + TestShrinkerBuilder::addKeepAttributePermittedSubclasses) + // Keep the sealed class to ensure the PermittedSubclasses attribute stays live. + .addKeepPermittedSubclasses(C.class) + // Keep subclasses as the PermittedSubclasses attribute is not rewritten. + .addKeepRules("-keep class * extends " + C.class.getTypeName()) + .addKeepMainRule(TestClass.class) + .compile() + .inspect(this::inspect) + .run(parameters.getRuntime(), TestClass.class) + .applyIf( + parameters.isDexRuntime() + || (!keepPermittedSubclassesAttribute + && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)), + r -> r.assertSuccessWithOutput(EXPECTED_WITHOUT_PERMITTED_SUBCLASSES_ATTRIBUTE), + parameters.isCfRuntime() + && parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17) + && keepPermittedSubclassesAttribute, + r -> r.assertFailureWithErrorThatMatches(EXPECTED), + r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } public byte[] getTransformedClasses() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesJdk17CompiledTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesJdk17CompiledTest.java index 2a6eee8..2b7d981 100644 --- a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesJdk17CompiledTest.java +++ b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesJdk17CompiledTest.java
@@ -4,20 +4,22 @@ package com.android.tools.r8.desugar.sealed; -import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThrows; +import static junit.framework.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assume.assumeTrue; -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.DesugarTestConfiguration; -import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.TestShrinkerBuilder; import com.android.tools.r8.examples.jdk17.Sealed; +import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.Matchers; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -30,16 +32,22 @@ @Parameter(0) public TestParameters parameters; + @Parameter(1) + public boolean keepPermittedSubclassesAttribute; + static final String EXPECTED = StringUtils.lines("R8 compiler", "D8 compiler"); - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(); + @Parameters(name = "{0}, keepPermittedSubclasses = {1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + BooleanUtils.values()); } @Test public void testJvm() throws Exception { parameters.assumeJvmTestParameters(); + assumeTrue(keepPermittedSubclassesAttribute); assumeTrue(parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)); testForJvm(parameters) .addRunClasspathFiles(Sealed.jar()) @@ -49,6 +57,7 @@ @Test public void testDesugaring() throws Exception { + assumeTrue(keepPermittedSubclassesAttribute); testForDesugaring(parameters) .addProgramFiles(Sealed.jar()) .run(parameters.getRuntime(), Sealed.Main.typeName()) @@ -60,28 +69,35 @@ r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } + private void inspect(CodeInspector inspector) { + ClassSubject clazz = inspector.clazz("sealed.Compiler"); + assertThat(clazz, Matchers.isPresentAndRenamed()); + if (!parameters.isCfRuntime()) { + return; + } + assertEquals( + keepPermittedSubclassesAttribute ? 2 : 0, + clazz.getFinalPermittedSubclassAttributes().size()); + } + @Test public void testR8() throws Exception { parameters.assumeR8TestParameters(); - R8FullTestBuilder builder = - testForR8(parameters.getBackend()) - .addProgramFiles(Sealed.jar()) - .setMinApi(parameters) - .addKeepMainRule(Sealed.Main.typeName()); - if (parameters.isCfRuntime()) { - assertThrows( - CompilationFailedException.class, - () -> - builder.compileWithExpectedDiagnostics( - diagnostics -> - diagnostics.assertErrorThatMatches( - diagnosticMessage( - containsString( - "Sealed classes are not supported as program classes"))))); - } else { - builder - .run(parameters.getRuntime(), Sealed.Main.typeName()) - .assertSuccessWithOutput(EXPECTED); - } + testForR8(parameters.getBackend()) + .addProgramFiles(Sealed.jar()) + .setMinApi(parameters) + .applyIf( + keepPermittedSubclassesAttribute, + TestShrinkerBuilder::addKeepAttributePermittedSubclasses) + // Keep the sealed class to ensure the PermittedSubclasses attribute stays live. + .addKeepPermittedSubclasses(Sealed.Compiler.typeName()) + .addKeepMainRule(Sealed.Main.typeName()) + .compile() + .inspect(this::inspect) + .run(parameters.getRuntime(), Sealed.Main.typeName()) + .applyIf( + parameters.isDexRuntime() || parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17), + r -> r.assertSuccessWithOutput(EXPECTED), + r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesTest.java index 420c077..3aa1a38 100644 --- a/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesTest.java +++ b/src/test/java/com/android/tools/r8/desugar/sealed/SealedClassesTest.java
@@ -4,20 +4,22 @@ package com.android.tools.r8.desugar.sealed; -import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThrows; +import static junit.framework.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assume.assumeTrue; -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.DesugarTestConfiguration; -import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestBuilder; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.TestShrinkerBuilder; +import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.Matchers; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -30,11 +32,16 @@ @Parameter(0) public TestParameters parameters; + @Parameter(1) + public boolean keepPermittedSubclassesAttribute; + static final String EXPECTED = StringUtils.lines("Success!"); - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(); + @Parameters(name = "{0}, keepPermittedSubclasses = {1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + BooleanUtils.values()); } private void addTestClasses(TestBuilder<?, ?> builder) throws Exception { @@ -46,6 +53,7 @@ @Test public void testJvm() throws Exception { parameters.assumeJvmTestParameters(); + assumeTrue(keepPermittedSubclassesAttribute); assumeTrue(parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17)); testForJvm(parameters) .apply(this::addTestClasses) @@ -55,6 +63,7 @@ @Test public void testDesugaring() throws Exception { + assumeTrue(keepPermittedSubclassesAttribute); testForDesugaring(parameters) .apply(this::addTestClasses) .run(parameters.getRuntime(), TestClass.class) @@ -66,28 +75,36 @@ r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } + private void inspect(CodeInspector inspector) { + ClassSubject clazz = inspector.clazz(C.class); + assertThat(clazz, Matchers.isPresentAndRenamed()); + if (!parameters.isCfRuntime()) { + return; + } + assertEquals( + keepPermittedSubclassesAttribute ? 2 : 0, + clazz.getFinalPermittedSubclassAttributes().size()); + } + @Test public void testR8() throws Exception { parameters.assumeR8TestParameters(); - R8FullTestBuilder builder = - testForR8(parameters.getBackend()) - .apply(this::addTestClasses) - .setMinApi(parameters) - .addKeepMainRule(TestClass.class); - if (parameters.isCfRuntime()) { - // TODO(b/227160052): Support sealed classes for R8 class file output. - assertThrows( - CompilationFailedException.class, - () -> - builder.compileWithExpectedDiagnostics( - diagnostics -> - diagnostics.assertErrorThatMatches( - diagnosticMessage( - containsString( - "Sealed classes are not supported as program classes"))))); - } else { - builder.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED); - } + testForR8(parameters.getBackend()) + .apply(this::addTestClasses) + .setMinApi(parameters) + .applyIf( + keepPermittedSubclassesAttribute, + TestShrinkerBuilder::addKeepAttributePermittedSubclasses) + // Keep the sealed class to ensure the PermittedSubclasses attribute stays live. + .addKeepPermittedSubclasses(C.class) + .addKeepMainRule(TestClass.class) + .compile() + .inspect(this::inspect) + .run(parameters.getRuntime(), TestClass.class) + .applyIf( + !parameters.isCfRuntime() || parameters.asCfRuntime().isNewerThanOrEqual(CfVm.JDK17), + r -> r.assertSuccessWithOutput(EXPECTED), + r -> r.assertFailureWithErrorThatThrows(UnsupportedClassVersionError.class)); } public byte[] getTransformedClasses() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java index c55ecf6..1f0492d 100644 --- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java +++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java
@@ -4,10 +4,6 @@ package com.android.tools.r8.enumunboxing; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThrows; - -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -29,24 +25,14 @@ } @Test - public void testR8() { - // TODO(b/287193321): We should not fail compilation. - assertThrows( - CompilationFailedException.class, - () -> - testForR8(parameters.getBackend()) - .addInnerClasses(getClass()) - .setMinApi(parameters) - .addKeepMainRule(Main.class) - // TODO(b/287193321): Using LIR avoids the issue, is it fixed or just hidden? - .addOptionsModification(options -> options.testing.disableLir()) - .compileWithExpectedDiagnostics( - diagnostics -> { - if (parameters.isDexRuntime()) { - diagnostics.assertErrorMessageThatMatches( - containsString("Cannot constrain type")); - } - })); + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .setMinApi(parameters) + .addKeepMainRule(Main.class) + .addOptionsModification(options -> options.testing.disableLir()) + .run(parameters.getRuntime(), Main.class) + .assertFailureWithErrorThatThrows(NullPointerException.class); } public enum MyEnum {
diff --git a/src/test/java/com/android/tools/r8/examples/jumbostring/JumboStringTestRunner.java b/src/test/java/com/android/tools/r8/examples/jumbostring/JumboStringTestRunner.java index dd474a2..db99557 100644 --- a/src/test/java/com/android/tools/r8/examples/jumbostring/JumboStringTestRunner.java +++ b/src/test/java/com/android/tools/r8/examples/jumbostring/JumboStringTestRunner.java
@@ -53,7 +53,8 @@ @Test public void testR8() throws Exception { - runTestR8(); + // Disable shrinking and obfuscation so that the fields and their names are retained. + runTestR8(b -> b.addDontShrink().addDontObfuscate()); } @Test
diff --git a/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java b/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java index c66a13d..870109f 100644 --- a/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java +++ b/src/test/java/com/android/tools/r8/graph/invokespecial/InvokeSpecialOnOtherInterfaceTest.java
@@ -8,11 +8,13 @@ import static org.junit.Assert.assertEquals; import static org.objectweb.asm.Opcodes.INVOKESPECIAL; +import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector; import java.io.IOException; import org.junit.Test; import org.junit.runner.RunWith; @@ -57,6 +59,9 @@ .addProgramClasses(I.class) .addProgramClassFileData(getClassWithTransformedInvoked()) .addKeepMainRule(Main.class) + .addHorizontallyMergedClassesInspector( + HorizontallyMergedClassesInspector::assertNoClassesMerged) + .enableNoHorizontalClassMergingAnnotations() .enableNoMethodStaticizingAnnotations() .setMinApi(parameters) .run(parameters.getRuntime(), Main.class) @@ -92,6 +97,7 @@ } } + @NoHorizontalClassMerging public static class A { public void bar(I i) {
diff --git a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java index a2adf72..f9822e9 100644 --- a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java +++ b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
@@ -51,7 +51,6 @@ .addDontWarn("android.content.pm.IPackageManager") .addOptionsModification( options -> options.getOpenClosedInterfacesOptions().suppressAllOpenInterfaces()) - .allowCheckDiscardedErrors() .allowUnusedDontWarnPatterns() .allowUnusedProguardConfigurationRules() .enableProtoShrinking(false)
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java index 2cdeffd..e373513 100644 --- a/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java +++ b/src/test/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldBitAccessInfoTest.java
@@ -27,6 +27,7 @@ import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadataProvider; import com.android.tools.r8.ir.code.IRCode; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.MethodProcessorEventConsumer; import com.android.tools.r8.ir.conversion.MethodProcessorWithWave; import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore; @@ -94,7 +95,7 @@ clazz.forEachProgramMethod( method -> { - IRCode code = method.buildIR(appView); + IRCode code = method.buildIR(appView, MethodConversionOptions.nonConverting()); fieldAccessAnalysis.recordFieldAccesses( code, BytecodeMetadataProvider.builder(), feedback, new PrimaryMethodProcessorMock()); });
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java index ce9bdd7..7527b96 100644 --- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java +++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -44,6 +45,7 @@ .enableInliningAnnotations() .enableMemberValuePropagationAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .compile() .inspect(this::inspect) @@ -72,7 +74,7 @@ @NeverClassInline static class A { - private static A INSTANCE; + @NoAccessModification private static A INSTANCE; static { A a = new A();
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java index f9cf925..b2644a7 100644 --- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java +++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -44,6 +45,7 @@ .enableInliningAnnotations() .enableMemberValuePropagationAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .compile() .inspect(this::inspect) @@ -77,7 +79,7 @@ @NeverClassInline static class A { - private static A INSTANCE; + @NoAccessModification private static A INSTANCE; static { A a = new A();
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java index 40c87b6..e370d88 100644 --- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java +++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -30,14 +30,11 @@ import com.android.tools.r8.origin.Origin; import com.android.tools.r8.smali.SmaliTestBase; import com.android.tools.r8.utils.AndroidApp; -import com.android.tools.r8.utils.Smali; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.MethodSubject; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; @@ -64,32 +61,34 @@ public TypeAnalysisTest(String test, BiConsumer<AppView<?>, CodeInspector> inspection) { dirName = test.substring(0, test.lastIndexOf('/')); - smaliFileName = test.substring(test.lastIndexOf('/') + 1) + ".smali"; + smaliFileName = test.substring(test.lastIndexOf('/') + 1) + ".dex"; this.inspection = inspection; } @Parameters(name = "{0}") public static Collection<Object[]> data() { - List<String> tests = Arrays.asList( - "arithmetic/Arithmetic", - "fibonacci/Fibonacci", - "fill-array-data/FillArrayData", - "filled-new-array/FilledNewArray", - "infinite-loop/InfiniteLoop1", - "try-catch/TryCatch", - "type-confusion-regression/TestObject", - "type-confusion-regression5/TestObject" - ); + List<String> tests = + Arrays.asList( + "arithmetic/arithmetic", + "fibonacci/fibonacci", + "fill-array-data/fill-array-data", + "filled-new-array/filled-new-array", + "infinite-loop/infinite-loop", + "try-catch/try-catch", + "type-confusion-regression/type-confusion-regression", + "type-confusion-regression5/type-confusion-regression5"); Map<String, BiConsumer<AppView<?>, CodeInspector>> inspections = new HashMap<>(); - inspections.put("arithmetic/Arithmetic", TypeAnalysisTest::arithmetic); - inspections.put("fibonacci/Fibonacci", TypeAnalysisTest::fibonacci); - inspections.put("fill-array-data/FillArrayData", TypeAnalysisTest::fillArrayData); - inspections.put("filled-new-array/FilledNewArray", TypeAnalysisTest::filledNewArray); - inspections.put("infinite-loop/InfiniteLoop1", TypeAnalysisTest::infiniteLoop); - inspections.put("try-catch/TryCatch", TypeAnalysisTest::tryCatch); - inspections.put("type-confusion-regression/TestObject", TypeAnalysisTest::typeConfusion); - inspections.put("type-confusion-regression5/TestObject", TypeAnalysisTest::typeConfusion5); + inspections.put("arithmetic/arithmetic", TypeAnalysisTest::arithmetic); + inspections.put("fibonacci/fibonacci", TypeAnalysisTest::fibonacci); + inspections.put("fill-array-data/fill-array-data", TypeAnalysisTest::fillArrayData); + inspections.put("filled-new-array/filled-new-array", TypeAnalysisTest::filledNewArray); + inspections.put("infinite-loop/infinite-loop", TypeAnalysisTest::infiniteLoop); + inspections.put("try-catch/try-catch", TypeAnalysisTest::tryCatch); + inspections.put( + "type-confusion-regression/type-confusion-regression", TypeAnalysisTest::typeConfusion); + inspections.put( + "type-confusion-regression5/type-confusion-regression5", TypeAnalysisTest::typeConfusion5); List<Object[]> testCases = new ArrayList<>(); for (String test : tests) { @@ -101,11 +100,8 @@ @Test public void typeAnalysisTest() throws Exception { - Path smaliPath = Paths.get(ToolHelper.SMALI_DIR, dirName, smaliFileName); - StringBuilder smaliStringBuilder = new StringBuilder(); - Files.lines(smaliPath, StandardCharsets.UTF_8) - .forEach(s -> smaliStringBuilder.append(s).append(System.lineSeparator())); - byte[] content = Smali.compile(smaliStringBuilder.toString()); + byte[] content = + Files.readAllBytes(Paths.get(ToolHelper.SMALI_BUILD_DIR, dirName, smaliFileName)); AndroidApp app = AndroidApp.builder().addDexProgramData(content, Origin.unknown()).build(); AppView<AppInfo> appView = computeAppView(app); inspection.accept(appView, new CodeInspector(appView.appInfo().app()));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java index 60cad4c..93ad7a7 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -5,6 +5,8 @@ import static org.junit.Assert.assertEquals; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexApplication; @@ -22,7 +24,7 @@ import com.android.tools.r8.ir.code.Position.SyntheticPosition; import com.android.tools.r8.ir.code.Return; import com.android.tools.r8.ir.code.Value; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator; import com.android.tools.r8.ir.regalloc.LiveIntervals; import com.android.tools.r8.origin.Origin; @@ -30,9 +32,22 @@ import com.android.tools.r8.utils.InternalOptions; import java.util.LinkedList; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +@RunWith(Parameterized.class) public class ConstantRemovalTest { + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return TestParameters.builder().withNoneRuntime().build(); + } + + public ConstantRemovalTest(TestParameters parameters) { + parameters.assertNoneRuntime(); + } + private static class MockLinearScanRegisterAllocator extends LinearScanRegisterAllocator { MockLinearScanRegisterAllocator(AppView<?> appView, IRCode code) { super(appView, code); @@ -152,7 +167,7 @@ basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown(), - new MutableMethodConversionOptions(options)); + MethodConversionOptions.nonConverting()); PeepholeOptimizer.optimize(appView, code, new MockLinearScanRegisterAllocator(appView, code)); // Check that all four constant number instructions remain.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java index 049bfdf..00e0441 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -317,29 +317,29 @@ // These constants describe the expected number of invoke instructions calling a possibly // inlined method. - final int ALWAYS_INLINABLE = 0; - final int INLINABLE = allowAccessModification ? 0 : 1; - final int NEVER_INLINABLE = 1; + int ALWAYS_INLINABLE = 0; + int INLINABLE_WHEN_DISABLED = allowAccessModification ? 1 : 0; + int NEVER_INLINABLE = 1; ClassSubject clazz = inspector.clazz(nullabilityClass); MethodSubject m; m = clazz.method("int", "inlinable", ImmutableList.of("inlining.A")); - assertCounters(INLINABLE, INLINABLE, countInvokes(inspector, m)); + assertCounters(ALWAYS_INLINABLE, ALWAYS_INLINABLE, countInvokes(inspector, m)); m = clazz.method( allowAccessModification ? "void" : "int", "notInlinable", ImmutableList.of("inlining." + (allowAccessModification ? "B" : "A"))); - assertCounters(INLINABLE, NEVER_INLINABLE, countInvokes(inspector, m)); + assertCounters(ALWAYS_INLINABLE, INLINABLE_WHEN_DISABLED, countInvokes(inspector, m)); m = clazz.method("int", "notInlinableDueToMissingNpe", ImmutableList.of("inlining.A")); - assertCounters(INLINABLE, ALWAYS_INLINABLE, countInvokes(inspector, m)); + assertCounters(ALWAYS_INLINABLE, ALWAYS_INLINABLE, countInvokes(inspector, m)); m = clazz.method("int", "notInlinableDueToSideEffect", ImmutableList.of("inlining.A")); assertCounters( - parameters.isCfRuntime() ? INLINABLE : NEVER_INLINABLE, + parameters.isCfRuntime() ? ALWAYS_INLINABLE : NEVER_INLINABLE, NEVER_INLINABLE, countInvokes(inspector, m));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java index 9e02653..18c5121 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -28,7 +28,7 @@ import com.android.tools.r8.ir.code.Return; import com.android.tools.r8.ir.code.Throw; import com.android.tools.r8.ir.code.Value; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.ir.conversion.passes.TrivialGotosCollapser; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.AndroidApp; @@ -108,7 +108,7 @@ basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown(), - new MutableMethodConversionOptions(options)); + MethodConversionOptions.forD8(appView)); new TrivialGotosCollapser(appView).run(code, Timing.empty()); assertTrue(code.entryBlock().isTrivialGoto()); assertTrue(blocks.contains(block0)); @@ -197,7 +197,7 @@ basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown(), - new MutableMethodConversionOptions(options)); + MethodConversionOptions.forD8(appView)); new TrivialGotosCollapser(appView).run(code, Timing.empty()); assertTrue(block0.getInstructions().get(1).isIf()); assertEquals(block1, block0.getInstructions().get(1).asIf().fallthroughBlock());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastChainRemoval2Test.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastChainRemoval2Test.java new file mode 100644 index 0000000..b1f7de9 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastChainRemoval2Test.java
@@ -0,0 +1,65 @@ +// Copyright (c) 2023, 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.ir.optimize.checkcast; + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class CheckCastChainRemoval2Test extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + public CheckCastChainRemoval2Test() {} + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void testCheckCast() throws Exception { + testForR8(parameters.getBackend()) + .addProgramClasses(A.class, B.class, Main.class) + .addKeepAllClassesRule() + .addKeepMainRule(Main.class) + .addOptionsModification((opt) -> opt.testing.enableCheckCastAndInstanceOfRemoval = false) + .enableInliningAnnotations() + .setMinApi(this.parameters) + .run(this.parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("false"); + } + + public static class Main { + + public static void main(String[] args) { + System.out.println(check()); + } + + @NeverInline + private static boolean check() { + Object o = null; + A a = (A) o; + if (a instanceof B) { + B b = (B) a; + return true; + } else { + return false; + } + } + } + + static class B extends A {} + + static class A {} +}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineInstanceInitializerWithInaccessibleStaticGetTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineInstanceInitializerWithInaccessibleStaticGetTest.java index 47f8ffa..62e08ce 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineInstanceInitializerWithInaccessibleStaticGetTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineInstanceInitializerWithInaccessibleStaticGetTest.java
@@ -41,6 +41,7 @@ ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses.class) .addKeepMainRule(TestClass.class) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoHorizontalClassMergingAnnotations() .setMinApi(parameters) .compile()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/testclasses/ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/testclasses/ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses.java index 4943a47..b344030 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/testclasses/ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/testclasses/ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.ir.optimize.classinliner.testclasses; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; public class ClassInlineInstanceInitializerWithInaccessibleStaticGetTestClasses { @@ -24,7 +25,7 @@ public static class Environment { - /*package-private*/ static boolean VALUE; + @NoAccessModification /*package-private*/ static boolean VALUE; public static void setValue(boolean value) { VALUE = value;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java index 441f149..ccd59c6 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java
@@ -5,7 +5,6 @@ package com.android.tools.r8.ir.optimize.inliner; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static com.android.tools.r8.utils.codeinspector.Matchers.notIf; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; @@ -39,6 +38,7 @@ .addKeepMainRule(TestClass.class) .enableNeverClassInliningAnnotations() .setMinApi(parameters) + .addOptionsModification(o -> o.testing.enableLir()) .compile() .inspect(this::inspect) .run(parameters.getRuntime(), TestClass.class) @@ -52,9 +52,8 @@ // Used by the invoke-custom instruction. assertThat(inspector.clazz(I.class), isPresent()); } - - // When compiling to DEX, A.m() will be single caller inlined in the second optimization pass. - assertThat(inspector.clazz(A.class), notIf(isPresent(), parameters.isDexRuntime())); + // A.m() will be single caller inlined in the second optimization pass. + assertThat(inspector.clazz(A.class), not(isPresent())); } static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java index e4ad5b8..0179d87 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
@@ -10,26 +10,44 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ir.optimize.inliner.testclasses.Greeting; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; /** Regression test for b/128604123. */ +@RunWith(Parameterized.class) public class InlineNonReboundFieldTest extends TestBase { + @Parameter(0) + public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + @Test public void test() throws Exception { String expectedOutput = StringUtils.lines("Greeter: Hello world!"); CodeInspector inspector = - testForR8(Backend.DEX) + testForR8(parameters.getBackend()) .addProgramClasses( TestClass.class, Greeter.class, Greeting.class, Greeting.getGreetingBase()) .addKeepMainRule(TestClass.class) .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() + .enableNoAccessModificationAnnotationsForMembers() .enableNoVerticalClassMergingAnnotations() - .run(TestClass.class) + .setMinApi(parameters) + .run(parameters.getRuntime(), TestClass.class) .assertSuccessWithOutput(expectedOutput) .inspector();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java index 4498fe9..ade059d 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
@@ -56,6 +56,7 @@ .addKeepMainRule(TestClass.class) .addInliningAnnotations() .applyIf(neverInline, R8TestBuilder::enableInliningAnnotations) + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .enableProguardTestOptions() .setMinApi(parameters)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java index 706f8f0..95cf23e 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.ir.optimize.inliner; +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static com.android.tools.r8.utils.codeinspector.Matchers.notIf; import static org.hamcrest.CoreMatchers.not; @@ -83,7 +84,9 @@ ClassSubject bClassSubject = inspector.clazz(B.class); assertThat(bClassSubject, isPresent()); // TODO(b/286058449): We could inline this. - assertThat(bClassSubject.uniqueMethodWithOriginalName("foo"), isPresent()); + assertThat( + bClassSubject.uniqueMethodWithOriginalName("foo"), + (parameters.isCfRuntime() && maxInliningDepth == 1) ? isAbsent() : isPresent()); // B.bar() should always be inlined because it is marked as @AlwaysInline. assertThat(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/Greeting.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/Greeting.java index 717c09f..b4005aa 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/Greeting.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/Greeting.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.ir.optimize.inliner.testclasses; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; @NoVerticalClassMerging @@ -14,8 +15,9 @@ } } +@NoAccessModification @NoVerticalClassMerging class GreetingBase { - protected String greeting; + @NoAccessModification protected String greeting; }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java index e856133..6732d39 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/testclasses/InliningIntoVisibilityBridgeTestClasses.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.ir.optimize.inliner.testclasses; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; public class InliningIntoVisibilityBridgeTestClasses { @@ -13,6 +14,7 @@ return InliningIntoVisibilityBridgeTestClassA.class; } + @NoAccessModification @NoVerticalClassMerging static class InliningIntoVisibilityBridgeTestClassA {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/IllegalAccessDeadInstanceOfTest.java b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/IllegalAccessDeadInstanceOfTest.java new file mode 100644 index 0000000..68b19e4 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/IllegalAccessDeadInstanceOfTest.java
@@ -0,0 +1,70 @@ +// Copyright (c) 2023, 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.ir.optimize.instanceofremoval.illegalaccess; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.ir.optimize.instanceofremoval.illegalaccess.pkg.A; +import java.io.IOException; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class IllegalAccessDeadInstanceOfTest extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + public IllegalAccessDeadInstanceOfTest() {} + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void testReference() throws Exception { + testForRuntime(parameters) + .addProgramClasses(Main.class) + .addProgramClassFileData(getTransformedA()) + .run(this.parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("false"); + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addProgramClasses(Main.class) + .addProgramClassFileData(getTransformedA()) + .addKeepMainRule(Main.class) + .setMinApi(this.parameters) + .run(this.parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("false"); + } + + private static byte[] getTransformedA() throws IOException { + return transformer(A.class).setClassAccessFlags(0).transform(); + } + + public static class Main { + + public static void main(String[] args) { + System.out.println(check()); + } + + private static boolean check() { + Object o = null; + // A is transformed to be a non-public class in a different package. + if (o instanceof A) { + return true; + } + return false; + } + } +}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/pkg/A.java b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/pkg/A.java new file mode 100644 index 0000000..989006a --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/illegalaccess/pkg/A.java
@@ -0,0 +1,7 @@ +// Copyright (c) 2023, 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.ir.optimize.instanceofremoval.illegalaccess.pkg; + +public /* will be private */ class A {}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java index 7b02aea..156a17d 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
@@ -203,7 +203,11 @@ public static class FeatureAPI { private static String featureClassName() { - return FeatureAPI.class.getPackage().getName() + ".B149971007$FeatureClass"; + String packageName = + System.currentTimeMillis() > 0 + ? "com.android.tools.r8.ir.optimize.outliner.b149971007" + : null; + return packageName + ".B149971007$FeatureClass"; } public static boolean hasFeature() {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java index 085002e..9626829 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
@@ -60,8 +60,11 @@ .enableNoVerticalClassMergingAnnotations() .addOptionsModification( options -> { + options.testing.enableLir(); options.enableDevirtualization = false; options.inlinerOptions().enableInliningOfInvokesWithNullableReceivers = false; + // The checks for I being present rely on not simple inlining. + options.inlinerOptions().simpleInliningInstructionLimit = 3; }) .setMinApi(AndroidApiLevel.B) .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java index badd467..eff87f7 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/PrivateInstanceMethodCollisionTest.java
@@ -10,6 +10,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.TestBase; @@ -68,6 +69,10 @@ .enableNoMethodStaticizingAnnotations() .minification(minification) .allowAccessModification(allowAccessModification) + .applyIf( + allowAccessModification, + testBuilder -> testBuilder.addNoAccessModificationAnnotation(), + testBuilder -> testBuilder.enableNoAccessModificationAnnotationsForMembers()) .setMinApi(parameters) .compile() .inspect(this::verifyUninstantiatedArgumentsRemovedAndNoCollisions) @@ -115,6 +120,7 @@ @NeverClassInline static class A { @NeverInline + @NoAccessModification @NoMethodStaticizing private void foo(B instantiated) { System.out.println("A#foo(" + instantiated + ")");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java index 30c55f2..ccfb422 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/PrivateInstanceMethodCollisionTest.java
@@ -11,6 +11,7 @@ import com.android.tools.r8.KeepConstantArguments; import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -68,6 +69,10 @@ .enableNoMethodStaticizingAnnotations() .minification(minification) .allowAccessModification(allowAccessModification) + .applyIf( + allowAccessModification, + testBuilder -> testBuilder.addNoAccessModificationAnnotation(), + testBuilder -> testBuilder.enableNoAccessModificationAnnotationsForMembers()) .setMinApi(parameters) .compile() .inspect(this::verifyUnusedArgumentsRemovedAndNoCollisions) @@ -113,8 +118,10 @@ @NeverClassInline static class A { + @KeepConstantArguments @NeverInline + @NoAccessModification @NoMethodStaticizing private void foo(String used) { System.out.println("A#foo(" + used + ")"); @@ -122,6 +129,7 @@ @KeepConstantArguments @NeverInline + @NoAccessModification @NoMethodStaticizing void foo(String used, Object unused) { System.out.println("A#foo(" + used + ", Object)");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java index 718a3e0..433bb6c 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsObjectTest.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoMethodStaticizing; import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestParameters; @@ -59,18 +60,21 @@ } @NeverInline + @NoAccessModification @NoMethodStaticizing private Object privateMethod(Object a) { return a; } @NeverInline + @NoAccessModification @NoMethodStaticizing private Object privateMethod(Object a, Object b) { return a; } @NeverInline + @NoAccessModification @NoMethodStaticizing private Object privateMethod(Object a, Object b, Object c) { return a; @@ -116,6 +120,7 @@ builder .enableNeverClassInliningAnnotations() .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoMethodStaticizingAnnotations(); }
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java index 983dfdb..d2bf214 100644 --- a/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java +++ b/src/test/java/com/android/tools/r8/ir/regalloc/IdenticalAfterRegisterAllocationTest.java
@@ -20,7 +20,7 @@ import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.code.Value; -import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.utils.InternalOptions; import java.util.List; import org.junit.Test; @@ -126,6 +126,34 @@ // not equivalent. assertFalse( add0.identicalAfterRegisterAllocation( - add1, allocator, new MutableMethodConversionOptions(allocator.options()))); + add1, + allocator, + new MethodConversionOptions() { + + @Override + public boolean isGeneratingDex() { + return true; + } + + @Override + public boolean isGeneratingLir() { + return false; + } + + @Override + public boolean isGeneratingClassFiles() { + return false; + } + + @Override + public boolean isPeepholeOptimizationsEnabled() { + return false; + } + + @Override + public boolean isStringSwitchConversionEnabled() { + return false; + } + })); } }
diff --git a/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java new file mode 100644 index 0000000..adc446c --- /dev/null +++ b/src/test/java/com/android/tools/r8/keepanno/CheckOptimizedOutAnnotationTest.java
@@ -0,0 +1,129 @@ +// Copyright (c) 2023, 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.keepanno; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.DiagnosticsLevel; +import com.android.tools.r8.DiagnosticsMatcher; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.errors.CheckDiscardDiagnostic; +import com.android.tools.r8.keepanno.annotations.CheckOptimizedOut; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class CheckOptimizedOutAnnotationTest extends TestBase { + + static final String EXPECTED = StringUtils.lines("A", "B.baz"); + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build(); + } + + public CheckOptimizedOutAnnotationTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void testReference() throws Exception { + testForRuntime(parameters) + .addProgramClasses(getInputClasses()) + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutput(EXPECTED); + } + + @Test + public void testWithRuleExtraction() throws Exception { + testForR8(parameters.getBackend()) + .enableExperimentalKeepAnnotations() + .addProgramClasses(getInputClasses()) + .addKeepMainRule(TestClass.class) + .setMinApi(parameters) + .allowDiagnosticWarningMessages() + .setDiagnosticsLevelModifier( + (level, diagnostic) -> + level == DiagnosticsLevel.ERROR ? DiagnosticsLevel.WARNING : level) + .compileWithExpectedDiagnostics( + diagnostics -> { + diagnostics + .assertOnlyWarnings() + .assertWarningsMatch( + DiagnosticsMatcher.diagnosticType(CheckDiscardDiagnostic.class)); + CheckDiscardDiagnostic discard = + (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0); + // The discard error should report one error for A.toString. + assertEquals(discard.getDiagnosticMessage(), 1, discard.getNumberOfFailures()); + }) + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutput(EXPECTED) + .inspect(this::checkOutput); + } + + public List<Class<?>> getInputClasses() { + return ImmutableList.of(TestClass.class, A.class, B.class); + } + + private void checkOutput(CodeInspector inspector) { + // A is escaping in the call println(this) and remains in the residual. + assertThat(inspector.clazz(A.class), isPresent()); + assertThat(inspector.clazz(A.class).uniqueMethodWithOriginalName("toString"), isPresent()); + + // Both foo and bar are respectively inlined and dead. + assertThat(inspector.clazz(A.class).uniqueMethodWithOriginalName("foo"), isAbsent()); + assertThat(inspector.clazz(A.class).uniqueMethodWithOriginalName("bar"), isAbsent()); + + // B is fully inlined and not in the residual program. + assertThat(inspector.clazz(B.class), isAbsent()); + } + + static class A { + + @CheckOptimizedOut + public void foo() { + System.out.println(this); + } + + @CheckOptimizedOut + public void bar() { + System.out.println("A.bar"); + } + + @CheckOptimizedOut + @Override + public String toString() { + return "A"; + } + } + + @CheckOptimizedOut + static class B { + + public void baz() { + System.out.println("B.baz"); + } + } + + static class TestClass { + + public static void main(String[] args) throws Exception { + new A().foo(); + new B().baz(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java b/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java new file mode 100644 index 0000000..0ed35c1 --- /dev/null +++ b/src/test/java/com/android/tools/r8/keepanno/CheckRemovedAnnotationTest.java
@@ -0,0 +1,122 @@ +// Copyright (c) 2023, 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.keepanno; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.DiagnosticsLevel; +import com.android.tools.r8.DiagnosticsMatcher; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.errors.CheckDiscardDiagnostic; +import com.android.tools.r8.keepanno.annotations.CheckRemoved; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class CheckRemovedAnnotationTest extends TestBase { + + static final String EXPECTED = StringUtils.lines("A.foo", "B.baz"); + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build(); + } + + public CheckRemovedAnnotationTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void testReference() throws Exception { + testForRuntime(parameters) + .addProgramClasses(getInputClasses()) + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutput(EXPECTED); + } + + @Test + public void testWithRuleExtraction() throws Exception { + testForR8(parameters.getBackend()) + .enableExperimentalKeepAnnotations() + .addProgramClasses(getInputClasses()) + .addKeepMainRule(TestClass.class) + .setMinApi(parameters) + .allowDiagnosticWarningMessages() + .setDiagnosticsLevelModifier( + (level, diagnostic) -> + level == DiagnosticsLevel.ERROR ? DiagnosticsLevel.WARNING : level) + .compileWithExpectedDiagnostics( + diagnostics -> { + diagnostics + .assertOnlyWarnings() + .assertWarningsMatch( + DiagnosticsMatcher.diagnosticType(CheckDiscardDiagnostic.class)); + CheckDiscardDiagnostic discard = + (CheckDiscardDiagnostic) diagnostics.getWarnings().get(0); + // The discard error should report for both the method A.foo and the class B. + assertEquals(discard.getDiagnosticMessage(), 2, discard.getNumberOfFailures()); + }) + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutput(EXPECTED) + .inspect(this::checkOutput); + } + + public List<Class<?>> getInputClasses() { + return ImmutableList.of(TestClass.class, A.class, B.class); + } + + private void checkOutput(CodeInspector inspector) { + // Because 'foo' is annotated with @CheckRemoved it is soft-pinned to ensure it is fully + // removed. However, 'foo' is live and thus its method (and class) will be retained in the + // output. + assertThat(inspector.clazz(A.class), isPresent()); + assertThat(inspector.clazz(A.class).uniqueMethodWithOriginalName("foo"), isPresent()); + // Bar is unused and must be removed regardless of the soft-pinning. + assertThat(inspector.clazz(A.class).uniqueMethodWithOriginalName("bar"), isAbsent()); + // B is used and soft-pinned, so it should be present. + assertThat(inspector.clazz(B.class), isPresent()); + } + + static class A { + + @CheckRemoved + public void foo() { + System.out.println("A.foo"); + } + + @CheckRemoved + public void bar() { + System.out.println("A.bar"); + } + } + + @CheckRemoved + static class B { + + public void baz() { + System.out.println("B.baz"); + } + } + + static class TestClass { + + public static void main(String[] args) throws Exception { + new A().foo(); + new B().baz(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java index ac6b939..4505562 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepAccessVisibilityFlagsTest.java
@@ -77,6 +77,7 @@ .enableExperimentalKeepAnnotations() .addProgramClasses(getInputClasses()) .addKeepMainRule(TestClass.class) + .allowAccessModification() .setMinApi(parameters) .run(parameters.getRuntime(), TestClass.class) .assertSuccessWithOutput(EXPECTED) @@ -235,6 +236,11 @@ int mod = method.getModifiers(); if (!Modifier.isPublic(mod) && !Modifier.isProtected(mod)) { privateOrPackagePrivateMethods.add(method.getName()); + } else { + // TODO(b/131130038): The package-private method should not be publicized. + if (method.getName().equals("packagePrivateMethod")) { + privateOrPackagePrivateMethods.add(method.getName()); + } } } printSorted(privateOrPackagePrivateMethods);
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java index 1864fba..e8696b7 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepEdgeAnnotationsTest.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.keepanno.asm.KeepEdgeWriter.AnnotationVisitorInterface; import com.android.tools.r8.keepanno.ast.AnnotationConstants; import com.android.tools.r8.keepanno.ast.AnnotationConstants.Edge; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.ast.KeepEdge; import com.android.tools.r8.keepanno.processor.KeepEdgeProcessor; import com.android.tools.r8.keepanno.testsource.KeepClassAndDefaultConstructorSource; @@ -221,9 +222,9 @@ .transform(); // Read the edges from each version. - Set<KeepEdge> originalEdges = KeepEdgeReader.readKeepEdges(original); - Set<KeepEdge> strippedEdges = KeepEdgeReader.readKeepEdges(stripped); - Set<KeepEdge> readdedEdges = KeepEdgeReader.readKeepEdges(readded); + Set<KeepDeclaration> originalEdges = KeepEdgeReader.readKeepEdges(original); + Set<KeepDeclaration> strippedEdges = KeepEdgeReader.readKeepEdges(stripped); + Set<KeepDeclaration> readdedEdges = KeepEdgeReader.readKeepEdges(readded); // The edges are compared to the "expected" ast to ensure we don't hide failures in reading or // writing. @@ -252,7 +253,7 @@ assertThat(synthesizedEdgesClass.annotation(Edge.CLASS.getTypeName()), isPresent()); String entry = ZipUtils.zipEntryNameForClass(synthesizedEdgesClass.getFinalReference()); byte[] bytes = ZipUtils.readSingleEntry(data, entry); - Set<KeepEdge> keepEdges = KeepEdgeReader.readKeepEdges(bytes); + Set<KeepDeclaration> keepEdges = KeepEdgeReader.readKeepEdges(bytes); assertEquals(KeepSourceEdges.getExpectedEdges(source), keepEdges); } }
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidForApiTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidForApiTest.java index 14cb1d1..97fd716 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidForApiTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidForApiTest.java
@@ -15,7 +15,7 @@ import com.android.tools.r8.keepanno.annotations.KeepForApi; import com.android.tools.r8.keepanno.annotations.MemberAccessFlags; import com.android.tools.r8.keepanno.asm.KeepEdgeReader; -import com.android.tools.r8.keepanno.ast.KeepEdge; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.ast.KeepEdgeException; import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor; import java.io.IOException; @@ -41,7 +41,8 @@ } private static List<String> extractRuleForClass(Class<?> clazz) throws IOException { - Set<KeepEdge> keepEdges = KeepEdgeReader.readKeepEdges(ToolHelper.getClassAsBytes(clazz)); + Set<KeepDeclaration> keepEdges = + KeepEdgeReader.readKeepEdges(ToolHelper.getClassAsBytes(clazz)); List<String> rules = new ArrayList<>(); KeepRuleExtractor extractor = new KeepRuleExtractor(rules::add); keepEdges.forEach(extractor::extract);
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java index f40ca56..943f9b7 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepInvalidTargetTest.java
@@ -16,7 +16,7 @@ import com.android.tools.r8.keepanno.annotations.KeepTarget; import com.android.tools.r8.keepanno.annotations.UsesReflection; import com.android.tools.r8.keepanno.asm.KeepEdgeReader; -import com.android.tools.r8.keepanno.ast.KeepEdge; +import com.android.tools.r8.keepanno.ast.KeepDeclaration; import com.android.tools.r8.keepanno.ast.KeepEdgeException; import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor; import java.io.IOException; @@ -42,7 +42,8 @@ } private static List<String> extractRuleForClass(Class<?> clazz) throws IOException { - Set<KeepEdge> keepEdges = KeepEdgeReader.readKeepEdges(ToolHelper.getClassAsBytes(clazz)); + Set<KeepDeclaration> keepEdges = + KeepEdgeReader.readKeepEdges(ToolHelper.getClassAsBytes(clazz)); List<String> rules = new ArrayList<>(); KeepRuleExtractor extractor = new KeepRuleExtractor(rules::add); keepEdges.forEach(extractor::extract);
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java index d221ad9..a8cc34b 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepMembersAccessFlagsTest.java
@@ -91,13 +91,17 @@ memberAccess = {MemberAccessFlags.PUBLIC, MemberAccessFlags.NON_STATIC}) }) void foo() throws Exception { - for (Field field : getClass().getDeclaredFields()) { + String[] fieldNames = new String[] {"fieldA"}; + for (String fieldName : fieldNames) { + Field field = getClass().getDeclaredField(fieldName); int modifiers = field.getModifiers(); if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) { System.out.println(field.get(this)); } } - for (Method method : getClass().getDeclaredMethods()) { + String[] methodNames = new String[] {"bar"}; + for (String methodName : methodNames) { + Method method = getClass().getDeclaredMethod(methodName); int modifiers = method.getModifiers(); if (Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) { System.out.println(method.getName());
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java index b8c55aa..9d064d7 100644 --- a/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java +++ b/src/test/java/com/android/tools/r8/keepanno/KeepMethodsEmptyAccessFlagsTest.java
@@ -29,6 +29,7 @@ public class KeepMethodsEmptyAccessFlagsTest extends TestBase { static final String EXPECTED = StringUtils.lines("hello", "world"); + static final String EXPECTED_ACCESS_MODIFICATION = StringUtils.lines("hello", "old", "world"); private final TestParameters parameters; @@ -57,7 +58,11 @@ .addKeepMainRule(TestClass.class) .setMinApi(parameters) .run(parameters.getRuntime(), TestClass.class) - .assertSuccessWithOutput(EXPECTED) + // TODO(b/131130038): Should not publicize kept method old(). + .assertSuccessWithOutput( + parameters.isAccessModificationEnabledByDefault() && parameters.isDexRuntime() + ? EXPECTED_ACCESS_MODIFICATION + : EXPECTED) .inspect(this::checkOutput); } @@ -111,7 +116,7 @@ static class TestClass { - public static void main(String[] args) throws Exception { + public static void main(String[] args) { new A().foo(); } }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java index fde9d75..9e7c52a 100644 --- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
@@ -81,8 +81,7 @@ long checkParameterIsNotNull = countCall(main, "checkParameterIsNotNull"); long checkNotNullParameter = countCall(main, "checkNotNullParameter"); if (kotlinc.getCompilerVersion().isGreaterThan(KotlinCompilerVersion.KOTLINC_1_6_0)) { - assertEquals( - BooleanUtils.intValue(!allowAccessModification), checkNotNullParameter); + assertEquals(0, checkNotNullParameter); assertEquals(0, checkParameterIsNotNull); } else if (parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.I)) {
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java index 483f18b..cff6a7c 100644 --- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -4,11 +4,7 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_5_0; -import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_6_0; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; @@ -16,14 +12,9 @@ import com.android.tools.r8.ToolHelper.ProcessResult; import com.android.tools.r8.jasmin.JasminBuilder; import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder; -import com.android.tools.r8.kotlin.TestKotlinClass.AccessorKind; import com.android.tools.r8.kotlin.TestKotlinClass.Visibility; -import com.android.tools.r8.naming.MemberNaming; -import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.BooleanUtils; -import com.android.tools.r8.utils.codeinspector.ClassSubject; -import com.android.tools.r8.utils.codeinspector.FieldSubject; import java.nio.file.Path; import java.util.Collection; import java.util.Collections; @@ -88,29 +79,7 @@ String mainClass = addMainToClasspath("properties.CompanionPropertiesKt", "companionProperties_usePrimitiveProp"); runTest(PROPERTIES_PACKAGE_NAME, mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getOuterClassName()); - return; - } - - ClassSubject outerClass = - checkClassIsKept(inspector, testedClass.getOuterClassName()); - String propertyName = "primitiveProp"; - FieldSubject fieldSubject = checkFieldIsKept(outerClass, "int", propertyName); - assertTrue(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - checkMethodIsKept(outerClass, getterAccessor); - checkMethodIsRemoved(outerClass, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getOuterClassName())); } @Test @@ -119,31 +88,7 @@ String mainClass = addMainToClasspath("properties.CompanionPropertiesKt", "companionProperties_usePrivateProp"); runTest(PROPERTIES_PACKAGE_NAME, mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getOuterClassName()); - return; - } - - ClassSubject outerClass = - checkClassIsKept(inspector, testedClass.getOuterClassName()); - String propertyName = "privateProp"; - FieldSubject fieldSubject = - checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName); - assertTrue(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - - checkMethodIsKept(outerClass, getterAccessor); - checkMethodIsRemoved(outerClass, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getOuterClassName())); } @Test @@ -152,31 +97,7 @@ String mainClass = addMainToClasspath("properties.CompanionPropertiesKt", "companionProperties_useInternalProp"); runTest(PROPERTIES_PACKAGE_NAME, mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getOuterClassName()); - return; - } - - ClassSubject outerClass = - checkClassIsKept(inspector, testedClass.getOuterClassName()); - String propertyName = "internalProp"; - FieldSubject fieldSubject = - checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName); - assertTrue(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - checkMethodIsKept(outerClass, getterAccessor); - checkMethodIsRemoved(outerClass, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getOuterClassName())); } @Test @@ -185,31 +106,7 @@ String mainClass = addMainToClasspath("properties.CompanionPropertiesKt", "companionProperties_usePublicProp"); runTest(PROPERTIES_PACKAGE_NAME, mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getOuterClassName()); - return; - } - - ClassSubject outerClass = - checkClassIsKept(inspector, testedClass.getOuterClassName()); - String propertyName = "publicProp"; - FieldSubject fieldSubject = - checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName); - assertTrue(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - checkMethodIsKept(outerClass, getterAccessor); - checkMethodIsRemoved(outerClass, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getOuterClassName())); } @Test @@ -218,32 +115,7 @@ String mainClass = addMainToClasspath("properties.CompanionLateInitPropertiesKt", "companionLateInitProperties_usePrivateLateInitProp"); runTest(PROPERTIES_PACKAGE_NAME, mainClass) - .inspect( - inspector -> { - if (allowAccessModification - || (testParameters.isDexRuntime() - && testParameters.getApiLevel().isGreaterThan(AndroidApiLevel.B))) { - checkClassIsRemoved(inspector, testedClass.getOuterClassName()); - return; - } - - ClassSubject outerClass = - checkClassIsKept(inspector, testedClass.getOuterClassName()); - String propertyName = "privateLateInitProp"; - FieldSubject fieldSubject = - checkFieldIsKept(outerClass, JAVA_LANG_STRING, propertyName); - assertTrue(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty( - propertyName, AccessorKind.FROM_COMPANION); - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - checkMethodIsKept(outerClass, getterAccessor); - checkMethodIsRemoved(outerClass, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getOuterClassName())); } @Test @@ -314,28 +186,7 @@ String mainClass = addMainToClasspath(testedClass.className + "Kt", "usePrivatePropertyAccessorFromInnerClass"); runTest("accessors", mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getClassName()); - return; - } - - ClassSubject classSubject = checkClassIsKept(inspector, testedClass.getClassName()); - - String propertyName = "privateProp"; - FieldSubject fieldSubject = - checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName); - assertFalse(fieldSubject.getField().accessFlags.isStatic()); - - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty(propertyName, AccessorKind.FROM_INNER); - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - checkMethodIsKept(classSubject, getterAccessor); - checkMethodIsRemoved(classSubject, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getClassName())); } @Test @@ -362,40 +213,7 @@ String mainClass = addMainToClasspath(testedClass.className + "Kt", "usePropertyAccessorFromLambda"); runTest("accessors", mainClass) - .inspect( - inspector -> { - if (allowAccessModification) { - checkClassIsRemoved(inspector, testedClass.getClassName()); - return; - } - - ClassSubject classSubject = checkClassIsKept(inspector, testedClass.getClassName()); - - // For kotlin 1.6 we completely remove the field and accessors. We are unable to - // remove the entire class because we are not reprocessing TestMain.main. - String propertyName = "property"; - if (kotlinParameters.isNewerThanOrEqualTo(KOTLINC_1_6_0)) { - FieldSubject field = classSubject.field(JAVA_LANG_STRING, propertyName); - assertFalse(field.isPresent()); - return; - } - - FieldSubject fieldSubject = - checkFieldIsKept(classSubject, JAVA_LANG_STRING, propertyName); - assertFalse(fieldSubject.getField().accessFlags.isStatic()); - assertTrue(fieldSubject.getField().accessFlags.isPrivate()); - - AccessorKind accessorKind = - kotlinc.getCompilerVersion().isGreaterThanOrEqualTo(KOTLINC_1_5_0) - ? AccessorKind.FROM_INNER - : AccessorKind.FROM_LAMBDA; - MemberNaming.MethodSignature getterAccessor = - testedClass.getGetterAccessorForProperty(propertyName, accessorKind); - MemberNaming.MethodSignature setterAccessor = - testedClass.getSetterAccessorForProperty(propertyName, accessorKind); - checkMethodIsKept(classSubject, getterAccessor); - checkMethodIsKept(classSubject, setterAccessor); - }); + .inspect(inspector -> checkClassIsRemoved(inspector, testedClass.getClassName())); } @Test
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java index 3584975..0ff1942 100644 --- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -4,8 +4,6 @@ package com.android.tools.r8.kotlin; -import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_5_0; -import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_6_0; import com.android.tools.r8.KotlinTestParameters; import com.android.tools.r8.TestParameters; @@ -122,7 +120,6 @@ @Test public void testDataclassCopyDefaultIsRemovedIfNotUsed() throws Exception { - boolean useLir = true; String mainClassName = "dataclass.MainCopyKt"; MethodSignature testMethodSignature = new MethodSignature("testDataClassCopyWithDefault", "void", Collections.emptyList()); @@ -132,29 +129,8 @@ testBuilder -> testBuilder .addKeepRules(keepClassMethod(mainClassName, testMethodSignature)) - .addOptionsModification( - o -> { - if (useLir) { - o.testing.enableLir(); - } else { - o.testing.disableLir(); - } - }) + .addOptionsModification(o -> o.testing.enableLir()) .addOptionsModification(disableClassInliner)) - .inspect( - inspector -> { - // TODO(b/210828502): Investigate why Person is not removed with kotlin 1.7 and 1.8. - // It looks like this is related to size estimates as using LIR changes the result. - if (allowAccessModification - && (kotlinc.isOneOf(KOTLINC_1_5_0, KOTLINC_1_6_0) - || testParameters.isDexRuntime() - || useLir)) { - checkClassIsRemoved(inspector, TEST_DATA_CLASS.getClassName()); - } else { - ClassSubject dataClass = - checkClassIsKept(inspector, TEST_DATA_CLASS.getClassName()); - checkMethodIsRemoved(dataClass, COPY_DEFAULT_METHOD); - } - }); + .inspect(inspector -> checkClassIsRemoved(inspector, TEST_DATA_CLASS.getClassName())); } }
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java index 527e568..ba11cfa 100644 --- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -131,7 +131,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, MUTABLE_PROPERTY_CLASS.getClassName()); return; } @@ -161,7 +161,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, MUTABLE_PROPERTY_CLASS.getClassName()); return; } @@ -189,7 +189,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, MUTABLE_PROPERTY_CLASS.getClassName()); return; } @@ -217,7 +217,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, MUTABLE_PROPERTY_CLASS.getClassName()); return; } @@ -245,7 +245,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, MUTABLE_PROPERTY_CLASS.getClassName()); return; } @@ -285,7 +285,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, LATE_INIT_PROPERTY_CLASS.getClassName()); return; } @@ -364,7 +364,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, USER_DEFINED_PROPERTY_CLASS.getClassName()); return; } @@ -397,7 +397,7 @@ inspector -> { checkClassIsRemoved(inspector, COMPANION_PROPERTY_CLASS.getClassName()); - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, "properties.CompanionProperties"); return; } @@ -423,7 +423,7 @@ inspector -> { checkClassIsRemoved(inspector, COMPANION_PROPERTY_CLASS.getClassName()); - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, "properties.CompanionProperties"); return; } @@ -454,7 +454,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, "properties.CompanionProperties"); return; } @@ -482,7 +482,7 @@ inspector -> { checkClassIsRemoved(inspector, COMPANION_PROPERTY_CLASS.getClassName()); - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, "properties.CompanionProperties"); return; } @@ -510,7 +510,7 @@ inspector -> { checkClassIsRemoved(inspector, testedClass.getClassName()); - if (allowAccessModification + if (testParameters.isAccessModificationEnabled(allowAccessModification) || (testParameters.isDexRuntime() && testParameters.getApiLevel().isGreaterThan(AndroidApiLevel.B))) { checkClassIsRemoved(inspector, testedClass.getOuterClassName()); @@ -572,7 +572,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -601,7 +601,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -634,7 +634,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -666,7 +666,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -698,7 +698,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -755,7 +755,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -785,7 +785,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -817,7 +817,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -850,7 +850,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; } @@ -882,7 +882,7 @@ testBuilder -> testBuilder.addOptionsModification(disableAggressiveClassOptimizations)) .inspect( inspector -> { - if (allowAccessModification) { + if (testParameters.isAccessModificationEnabled(allowAccessModification)) { checkClassIsRemoved(inspector, testedClass.getClassName()); return; }
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java index 695849f..2007fa0 100644 --- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingSingletonTest.java
@@ -107,7 +107,7 @@ getTestName(), "MainKt$test2$$inlined$process$3"), lambdasInInput.getKStyleLambdaReferenceFromTypeName( getTestName(), "MainKt$test2$$inlined$process$4")); - if (allowAccessModification) { + if (parameters.isAccessModificationEnabled(allowAccessModification)) { kStyleLambdaMergeGroup.add( lambdasInInput.getKStyleLambdaReferenceFromTypeName( getTestName(), "MainKt$test2$lambda$1"));
diff --git a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialKotlinStyleTest.java b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialKotlinStyleTest.java index 2dc729e..580b42c 100644 --- a/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialKotlinStyleTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/lambda/KotlinLambdaMergingTrivialKotlinStyleTest.java
@@ -93,7 +93,7 @@ assertEquals(0, lambdasInInput.getNumberOfJStyleLambdas()); assertEquals(28, lambdasInInput.getNumberOfKStyleLambdas()); - if (!allowAccessModification) { + if (!parameters.isAccessModificationEnabled(allowAccessModification)) { // Only a subset of all K-style Kotlin lambdas are merged without -allowaccessmodification. Set<ClassReference> unmergedLambdas = ImmutableSet.of(
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java index c5b5ff4..90df133 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataStripTest.java
@@ -71,9 +71,5 @@ // Main class is kept, hence the presence of Metadata. AnnotationSubject annotationSubject = clazz.annotation(METADATA_TYPE); assertThat(annotationSubject, isPresent()); - ClassSubject impl1 = inspector.clazz(implementer1ClassName); - assertThat(impl1, isPresentAndRenamed()); - // All other classes can be renamed, hence the absence of Metadata; - assertThat(impl1.annotation(METADATA_TYPE), not(isPresent())); } }
diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeOutlineCallSiteInlinedTest.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeOutlineCallSiteInlinedTest.java new file mode 100644 index 0000000..2e55faf --- /dev/null +++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeOutlineCallSiteInlinedTest.java
@@ -0,0 +1,112 @@ +// Copyright (c) 2023, 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.mappingcompose; + +import static com.android.tools.r8.mappingcompose.ComposeTestHelpers.doubleToSingleQuote; +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.naming.ClassNameMapper; +import com.android.tools.r8.naming.MappingComposer; +import com.android.tools.r8.utils.StringUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** This is a regression test for b/288117378. */ +@RunWith(Parameterized.class) +public class ComposeOutlineCallSiteInlinedTest extends TestBase { + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withNoneRuntime().build(); + } + + public ComposeOutlineCallSiteInlinedTest(TestParameters parameters) { + parameters.assertNoneRuntime(); + } + + private static final String mappingFoo = + StringUtils.unixLines( + "# {'id':'com.android.tools.r8.mapping','version':'2.2'}", + "com.android.tools.r8.D8Command -> com.android.tools.r8.D8Command:", + "# {'id':'sourceFile','fileName':'D8Command.java'}", + " 1:1:java.util.List getParseFlagsInformation():592:592 -> getParseFlagsInformation", + " 1:1:foo.MapConsumer lambda$bar$0(foo.StringConsumer):0:0 -> lambda$bar$0", + " # {'id':'com.android.tools.r8.residualsignature'," + + "'signature':'(Lfoo/StringConsumer;)Lfoo/internal/MapConsumer;'}", + " # {'id':'com.android.tools.r8.outlineCallsite'," + + "'positions':{'23':724,'24':725,'25':726}," + + "'outline':'Lfoo/SomeClass;outline(JJJ)V'}", + " 724:724:foo.MapConsumer lambda$bar$0(foo.StringConsumer):720:720 -> lambda$bar$0", + " 725:725:foo.PGMapConsumer foo.PGMapConsumer.builder():52:52 -> lambda$bar$0", + " 725:725:foo.MapConsumer lambda$bar$0(foo.StringConsumer):720 -> lambda$bar$0", + " 726:726:void foo.PGMapConsumer.<init>():55:55 -> lambda$bar$0", + " 726:726:foo.PGMapConsumer foo.PGMapConsumer.builder():52 -> lambda$bar$0", + " 726:726:foo.MapConsumer lambda$bar$0(foo.StringConsumer):720 -> lambda$bar$0"); + private static final String mappingBar = + StringUtils.unixLines( + "# {'id':'com.android.tools.r8.mapping','version':'2.2'}", + "com.android.tools.r8.D8Command -> com.android.tools.r8.D8Command:", + "# {'id':'sourceFile','fileName':'SourceFile'}", + " 1:724:foo.internal.MapConsumer lambda$bar$0(foo.StringConsumer):0:723" + + " -> lambda$bar$0$com-android-tools-r8-D8Command", + " 1:724:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):0" + + " -> lambda$bar$0$com-android-tools-r8-D8Command", + " # {'id':'com.android.tools.r8.synthesized'}"); + private static final String mappingResult = + StringUtils.unixLines( + "# {'id':'com.android.tools.r8.mapping','version':'2.2'}", + "com.android.tools.r8.D8Command -> com.android.tools.r8.D8Command:", + "# {'id':'sourceFile','fileName':'D8Command.java'}", + // TODO(b/288117378): This 1:1 range corresponds to position 0 in the residual of R8. This + // should probably not have the `getParseFlagsInformation` inline frame. + " 1:1:java.util.List getParseFlagsInformation():592:592 -> getParseFlagsInformation", + " 1:1:foo.internal.MapConsumer lambda$bar$0(foo.StringConsumer):0:0 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 1:1:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):0:0 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " # {'id':'com.android.tools.r8.synthesized'}", + " 2:2:foo.MapConsumer lambda$bar$0(foo.StringConsumer):0:0 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " # {'id':'com.android.tools.r8.residualsignature'," + + "'signature':'(Lfoo/StringConsumer;)Lfoo/internal/MapConsumer;'}", + " # {'id':'com.android.tools.r8.outlineCallsite'," + + "'positions':{'23':725,'24':726,'25':727}," + + "'outline':'Lfoo/SomeClass;outline(JJJ)V'}", + " 2:2:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):0:0 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 3:724:foo.internal.MapConsumer lambda$bar$0(foo.StringConsumer) ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 3:724:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):0:0 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 725:725:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):720:720 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 726:726:foo.PGMapConsumer foo.PGMapConsumer.builder():52:52 -> lambda$bar$0", + " 726:726:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):720 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command", + " 727:727:void foo.PGMapConsumer.<init>():55:55 -> lambda$bar$0", + " 727:727:foo.PGMapConsumer foo.PGMapConsumer.builder():52 -> lambda$bar$0", + " 727:727:foo.internal.MapConsumer" + + " lambda$bar$0$com-android-tools-r8-D8Command(foo.StringConsumer):720 ->" + + " lambda$bar$0$com-android-tools-r8-D8Command"); + + @Test + public void testCompose() throws Exception { + ClassNameMapper mappingForFoo = ClassNameMapper.mapperFromString(mappingFoo); + ClassNameMapper mappingForBar = ClassNameMapper.mapperFromString(mappingBar); + String composed = MappingComposer.compose(mappingForFoo, mappingForBar); + assertEquals(mappingResult, doubleToSingleQuote(composed)); + } +}
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/IllegalFieldRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/IllegalFieldRebindingTest.java index 1dbbec9..841cc0f 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/IllegalFieldRebindingTest.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/IllegalFieldRebindingTest.java
@@ -54,6 +54,7 @@ .addInnerClasses(IllegalFieldRebindingTest.class) .addInnerClasses(IllegalFieldRebindingTestClasses.class) .addKeepMainRule(TestClass.class) + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) .run(parameters.getRuntime(), TestClass.class) @@ -87,6 +88,7 @@ .addInnerClasses(IllegalFieldRebindingTest.class) .addInnerClasses(IllegalFieldRebindingTestClasses.class) .addKeepMainRule(OtherTestClass.class) + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) .run(parameters.getRuntime(), OtherTestClass.class)
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingBridgeRemovalTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingBridgeRemovalTest.java index d8e0f19..54600ce 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingBridgeRemovalTest.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingBridgeRemovalTest.java
@@ -43,6 +43,7 @@ MemberRebindingBridgeRemovalTest.class, MemberRebindingBridgeRemovalTestClasses.class) .addKeepMainRule(TestClass.class) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) .compile()
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveStaticBridgeTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveStaticBridgeTest.java index 1ef45c0..bbd1e88 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveStaticBridgeTest.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveStaticBridgeTest.java
@@ -9,6 +9,7 @@ import static org.junit.Assert.assertTrue; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -46,6 +47,7 @@ .setMinApi(parameters) .addKeepMainRule(newMainTypeName) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoVerticalClassMergingAnnotations() .addHorizontallyMergedClassesInspector( HorizontallyMergedClassesInspector::assertNoClassesMerged) @@ -59,6 +61,7 @@ }); } + @NoAccessModification @NoVerticalClassMerging static class A {
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveVirtualBridgeTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveVirtualBridgeTest.java index 0ca6131..4013b58 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveVirtualBridgeTest.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingRemoveVirtualBridgeTest.java
@@ -11,6 +11,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoInliningOfDefaultInitializer; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; @@ -49,6 +50,7 @@ .setMinApi(parameters) .addKeepMainRule(newMainTypeName) .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .enableNoInliningOfDefaultInitializerAnnotations() .enableNoVerticalClassMergingAnnotations() .enableNeverClassInliningAnnotations() @@ -69,6 +71,7 @@ }); } + @NoAccessModification @NoVerticalClassMerging static class A {
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java index 0bf9bc8..72be6ed 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.R8Command; import com.android.tools.r8.TestBase; -import com.android.tools.r8.TestBase.Backend; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.naming.MemberNaming.MethodSignature; @@ -48,6 +47,7 @@ private final String name; private final Backend backend; + private final String keepRuleFile; private final Path programFile; private final Consumer<CodeInspector> inspection; private final int minApiLevel; @@ -58,6 +58,7 @@ public MemberRebindingTest(TestConfiguration configuration) { this.name = configuration.name; this.backend = configuration.backend; + this.keepRuleFile = configuration.keepRuleFile; this.programFile = configuration.getJarPath(); this.inspection = configuration.processedInspection; this.minApiLevel = configuration.getMinApiLevel(); @@ -78,6 +79,10 @@ if (backend == Backend.DEX) { builder.setMinApiLevel(minApiLevel); } + if (keepRuleFile != null) { + builder.addProguardConfigurationFiles(Paths.get(ToolHelper.EXAMPLES_DIR, name, keepRuleFile)); + ToolHelper.allowTestProguardOptions(builder); + } ToolHelper.getAppBuilder(builder).addProgramFiles(programFile); ToolHelper.runR8( builder.build(), @@ -178,16 +183,19 @@ final String name; final Backend backend; + final String keepRuleFile; final AndroidVersion version; final Consumer<CodeInspector> processedInspection; private TestConfiguration( String name, Backend backend, + String keepRuleFile, AndroidVersion version, Consumer<CodeInspector> processedInspection) { this.name = name; this.backend = backend; + this.keepRuleFile = keepRuleFile; this.version = version; this.processedInspection = processedInspection; } @@ -196,9 +204,10 @@ ImmutableList.Builder<TestConfiguration> builder, String name, Backend backend, + String keepRuleFile, AndroidVersion version, Consumer<CodeInspector> processedInspection) { - builder.add(new TestConfiguration(name, backend, version, processedInspection)); + builder.add(new TestConfiguration(name, backend, keepRuleFile, version, processedInspection)); } public Path getDexPath() { @@ -244,24 +253,28 @@ builder, "memberrebinding", backend, + null, TestConfiguration.AndroidVersion.PRE_N, MemberRebindingTest::inspectMain); TestConfiguration.add( builder, "memberrebinding2", backend, + "keep-rules.txt", TestConfiguration.AndroidVersion.PRE_N, MemberRebindingTest::inspectMain2); TestConfiguration.add( builder, "memberrebinding3", backend, + null, TestConfiguration.AndroidVersion.PRE_N, MemberRebindingTest::inspect3); TestConfiguration.add( builder, "memberrebinding4", backend, + null, TestConfiguration.AndroidVersion.N, MemberRebindingTest::inspect4); }
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/testclasses/IllegalFieldRebindingTestClasses.java b/src/test/java/com/android/tools/r8/memberrebinding/testclasses/IllegalFieldRebindingTestClasses.java index aaba050..930325d 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/testclasses/IllegalFieldRebindingTestClasses.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/testclasses/IllegalFieldRebindingTestClasses.java
@@ -4,10 +4,12 @@ package com.android.tools.r8.memberrebinding.testclasses; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; public class IllegalFieldRebindingTestClasses { + @NoAccessModification @NoVerticalClassMerging static class A { public static int f;
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/testclasses/MemberRebindingBridgeRemovalTestClasses.java b/src/test/java/com/android/tools/r8/memberrebinding/testclasses/MemberRebindingBridgeRemovalTestClasses.java index 12ebac3..8324300 100644 --- a/src/test/java/com/android/tools/r8/memberrebinding/testclasses/MemberRebindingBridgeRemovalTestClasses.java +++ b/src/test/java/com/android/tools/r8/memberrebinding/testclasses/MemberRebindingBridgeRemovalTestClasses.java
@@ -5,10 +5,12 @@ package com.android.tools.r8.memberrebinding.testclasses; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; public class MemberRebindingBridgeRemovalTestClasses { + @NoAccessModification @NoVerticalClassMerging static class A {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java index 58a6eff..d8a870f 100644 --- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java +++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLambdaRepackageTest.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.R8TestRunResult; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -38,6 +39,7 @@ .addKeepRules("-repackageclasses foo") .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines("Hello World"); R8TestRunResult secondRunResult = @@ -47,6 +49,7 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .addApplyMapping(firstRunResult.proguardMap()) .compile() .run(parameters.getRuntime(), Main.class); @@ -58,6 +61,7 @@ public static class PackagePrivate { @NeverInline + @NoAccessModification void print() { System.out.println("Hello World"); }
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java index d38f2c4..d4afe52 100644 --- a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java +++ b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionAsmTest.java
@@ -75,7 +75,7 @@ private final String noMappingMain = "NoMappingMain"; private final String noMappingExpected = StringUtils.lines("HasMapping#foo", "NoMapping#foo"); - private List<byte[]> noMappingInputs() throws Exception { + private List<byte[]> noMappingInputs() { return ImmutableList.of(HasMappingDump.dump(), NoMappingDump.dump(), NoMappingMainDump.dump()); } @@ -103,7 +103,9 @@ .addProgramClassFileData(noMappingInputs()) .setMinApi(parameters) .addKeepMainRule(noMappingMain) + .addKeepRules("-noaccessmodification class NoMapping { private void foo(); }") .addApplyMapping(pgMap) + .enableNoAccessModificationAnnotationsForMembers() .addOptionsModification( options -> { options.inlinerOptions().enableInlining = false; @@ -113,19 +115,24 @@ .assertSuccessWithOutput(noMappingExpected) .inspector(); - ClassSubject base = codeInspector.clazz("HasMapping"); - assertThat(base, isPresentAndRenamed()); - assertEquals("X", base.getFinalName()); - MethodSubject x = base.method("void", "foo", ImmutableList.of()); - assertThat(x, isPresentAndRenamed()); - assertEquals("a", x.getFinalName()); + ClassSubject hasMappingClassSubject = codeInspector.clazz("HasMapping"); + assertThat(hasMappingClassSubject, isPresentAndRenamed()); + assertEquals("X", hasMappingClassSubject.getFinalName()); + + MethodSubject virtualFooMethodSubject = + hasMappingClassSubject.uniqueMethodWithOriginalName("foo"); + assertThat(virtualFooMethodSubject, isPresentAndRenamed()); + assertEquals("a", virtualFooMethodSubject.getFinalName()); // To ensure still getting illegal-access error we need to rename consistently. - ClassSubject sub = codeInspector.clazz("NoMapping"); - assertThat(sub, isPresentAndRenamed()); - assertEquals("Y", sub.getFinalName()); - MethodSubject y = sub.method("void", "a", ImmutableList.of()); - assertThat(y, isPresent()); + ClassSubject noMappingClassSubject = codeInspector.clazz("NoMapping"); + assertThat(noMappingClassSubject, isPresentAndRenamed()); + assertEquals("Y", noMappingClassSubject.getFinalName()); + + MethodSubject privateFooMethodSubject = + noMappingClassSubject.uniqueMethodWithOriginalName("foo"); + assertThat(privateFooMethodSubject, isPresent()); + assertEquals("a", privateFooMethodSubject.getFinalName()); } // class A { // : X
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java index e71747b..e7ef37a 100644 --- a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java +++ b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/MemberResolutionTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -34,6 +35,7 @@ @NeverPropagateValue private String tag = "PrivateInitialTag_AbstractChecker"; // check() -> x + @NoAccessModification private void check() { System.out.println("AbstractChecker#check:" + tag); } @@ -56,6 +58,7 @@ // This should not be conflict with AbstractChecker#check due to the access control. // check() -> y + @NoAccessModification private void check() { System.out.println("ConcreteChecker#check:" + tag); } @@ -124,6 +127,7 @@ .addKeepMainRule(MemberResolutionTestMain.class) .addKeepRules("-applymapping " + mapPath) .enableMemberValuePropagationAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoVerticalClassMergingAnnotations() .addOptionsModification(options -> options.inlinerOptions().enableInlining = false) .setMinApi(parameters)
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java index ab72433..8db8492 100644 --- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java +++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -6,6 +6,7 @@ import static com.android.tools.r8.utils.codeinspector.Matchers.isPackagePrivate; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; @@ -112,7 +113,7 @@ @Test public void test_keepAll() throws Exception { Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored()); - Class mainClass = TestMain.class; + Class<?> mainClass = TestMain.class; String keep = !minify ? "-keep" : "-keep,allowobfuscation"; List<String> config = ImmutableList.of( "-printmapping", @@ -144,7 +145,11 @@ // Test the totally unused method. MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused"); assertThat(staticMethod, isPresent()); - assertThat(staticMethod, isPackagePrivate()); + assertThat( + staticMethod, + isForceAccessModifyingPackagePrivateAndProtectedMethods() + ? isPublic() + : isPackagePrivate()); assertEquals(minify, staticMethod.isRenamed()); // Test an indirectly referred method. @@ -152,10 +157,23 @@ assertThat(staticMethod, isPresent()); assertEquals(minify, staticMethod.isRenamed()); boolean publicizeCondition = - shrinker.isProguard() && minify && repackagePrefix != null && allowAccessModification; + isForceAccessModifyingPackagePrivateAndProtectedMethods() + || (shrinker.isProguard() + && minify + && repackagePrefix != null + && allowAccessModification); assertEquals(publicizeCondition, staticMethod.getMethod().isPublic()); } + @Override + public boolean isForceAccessModifyingPackagePrivateAndProtectedMethods() { + if (!super.isForceAccessModifyingPackagePrivateAndProtectedMethods()) { + return false; + } + return (shrinker.isCompatR8() && allowAccessModification) + || (shrinker.isFullModeR8() && (shrinker.isR8Dex() || allowAccessModification || minify)); + } + @Test public void test_keepNonPublic() throws Exception { Assume.assumeFalse(shrinker.generatesDex() && vmVersionIgnored()); @@ -191,7 +209,11 @@ // Test the totally unused method. MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused"); assertThat(staticMethod, isPresent()); - assertThat(staticMethod, isPackagePrivate()); + assertThat( + staticMethod, + isForceAccessModifyingPackagePrivateAndProtectedMethods() + ? isPublic() + : isPackagePrivate()); assertEquals(minify, staticMethod.isRenamed()); // Test an indirectly referred method. @@ -199,7 +221,11 @@ assertThat(staticMethod, isPresent()); assertEquals(minify, staticMethod.isRenamed()); boolean publicizeCondition = - shrinker.isProguard() && minify && repackagePrefix != null && allowAccessModification; + isForceAccessModifyingPackagePrivateAndProtectedMethods() + || (shrinker.isProguard() + && minify + && repackagePrefix != null + && allowAccessModification); assertEquals(publicizeCondition, staticMethod.getMethod().isPublic()); } @@ -258,8 +284,14 @@ staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod"); assertThat(staticMethod, isPresent()); assertEquals(minify, staticMethod.isRenamed()); - boolean publicizeCondition = shrinker.isR8() ? allowAccessModification - : minify && repackagePrefix != null && allowAccessModification; + boolean publicizeCondition = + (shrinker.isCompatR8() && allowAccessModification) + || (shrinker.isFullModeR8() + && (shrinker.isR8Dex() || allowAccessModification || minify)) + || (shrinker.isProguard() + && minify + && repackagePrefix != null + && allowAccessModification); assertEquals(publicizeCondition, staticMethod.getMethod().accessFlags.isPublic()); } }
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java index 016d4ac..7f536a5 100644 --- a/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java +++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/InliningRetraceTest.java
@@ -56,6 +56,7 @@ @Test public void testSourceFileAndLineNumberTable() throws Exception { + assumeTrue("b/288405478", mode.isRelease()); runTest( ImmutableList.of("-keepattributes SourceFile,LineNumberTable"), (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> { @@ -67,6 +68,7 @@ @Test public void testLineNumberTableOnly() throws Exception { + assumeTrue("b/288405478", mode.isRelease()); assumeTrue(compat); assumeTrue(parameters.isDexRuntime()); runTest( @@ -79,6 +81,7 @@ @Test public void testNoLineNumberTable() throws Exception { + assumeTrue("b/288405478", mode.isRelease()); assumeTrue(compat); assumeTrue(parameters.isDexRuntime()); runTest(
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java index ef6b3a3..53fb532 100644 --- a/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java +++ b/src/test/java/com/android/tools/r8/profile/art/completeness/SyntheticLambdaClassProfileRewritingTest.java
@@ -239,7 +239,7 @@ inspector, parameters.canHaveNonReboundConstructorInvoke(), parameters.isCfRuntime(), - false); + parameters.isAccessModificationEnabledByDefault()); } static class Main {
diff --git a/src/test/java/com/android/tools/r8/regress/b76025099/B76025099.java b/src/test/java/com/android/tools/r8/regress/b76025099/B76025099.java index 5ef06ad..e0b1d4f 100644 --- a/src/test/java/com/android/tools/r8/regress/b76025099/B76025099.java +++ b/src/test/java/com/android/tools/r8/regress/b76025099/B76025099.java
@@ -85,6 +85,8 @@ testForR8(parameters.getBackend()) .addProgramFiles(ToolHelper.getClassFilesForTestPackage(Main.class.getPackage())) .addKeepMainRule(Main.class) + .enableNoAccessModificationAnnotationsForClasses() + .enableNoAccessModificationAnnotationsForMembers() .enableNoVerticalClassMergingAnnotations() .addDontObfuscate() .setMinApi(parameters)
diff --git a/src/test/java/com/android/tools/r8/regress/b76025099/testclasses/helper/AbstractBase.java b/src/test/java/com/android/tools/r8/regress/b76025099/testclasses/helper/AbstractBase.java index 9d5694c..bf454a9 100644 --- a/src/test/java/com/android/tools/r8/regress/b76025099/testclasses/helper/AbstractBase.java +++ b/src/test/java/com/android/tools/r8/regress/b76025099/testclasses/helper/AbstractBase.java
@@ -3,12 +3,15 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.regress.b76025099.testclasses.helper; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.regress.b76025099.testclasses.Logger; +@NoAccessModification @NoVerticalClassMerging abstract class AbstractBase implements Logger { - protected String name; + + @NoAccessModification protected String name; @Override public String getName() {
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java index f1965fe..b1c34e2 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageAllowRepackagingTest.java
@@ -6,6 +6,7 @@ import static org.hamcrest.MatcherAssert.assertThat; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import org.junit.Test; import org.junit.runner.RunWith; @@ -30,6 +31,7 @@ "-keep,allowrepackage class " + typeName(ShouldStayInPackage.class) + " { *; }") .addKeepRules( "-keep,allowrepackage class " + typeName(ShouldBeRepackaged.class) + " { *; }") + .enableNoAccessModificationAnnotationsForMembers() .compile() .inspect( inspector -> { @@ -42,6 +44,7 @@ public static class ShouldStayInPackage { + @NoAccessModification static void foo() { System.out.println("ShouldStayInPackage::foo"); }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java index 5651252..a33ab6f 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageTest.java
@@ -110,10 +110,13 @@ " <methods>;", "}") .allowAccessModification(allowAccessModification) + .applyIf( + allowAccessModification, + testBuilder -> testBuilder.addNoAccessModificationAnnotation(), + testBuilder -> testBuilder.enableNoAccessModificationAnnotationsForMembers()) .apply(this::configureRepackaging) .enableInliningAnnotations() .enableNoHorizontalClassMergingAnnotations() - .enableNoHorizontalClassMergingAnnotations() .setMinApi(parameters) .compile() .inspect(this::inspect)
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java index 55e260d..d6cce99 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java
@@ -11,6 +11,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.NeverPropagateValue; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.codeinspector.ClassSubject; @@ -52,6 +53,7 @@ .addMemberValuePropagationAnnotations() .apply(this::configureRepackaging) .enableMemberValuePropagationAnnotations(enableMemberValuePropagationAnnotations) + .enableNoAccessModificationAnnotationsForMembers() .addOptionsModification(options -> options.enableRedundantFieldLoadElimination = false) .setMinApi(parameters) .compile() @@ -98,7 +100,7 @@ public static class StaticMemberValuePropagation { - @NeverPropagateValue static String HELLO = "Hello"; + @NeverPropagateValue @NoAccessModification static String HELLO = "Hello"; public static String WORLD = " world!";
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithOverridesOfPackagePrivateMethodsTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithOverridesOfPackagePrivateMethodsTest.java index 56436b4..2f7657a 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageWithOverridesOfPackagePrivateMethodsTest.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithOverridesOfPackagePrivateMethodsTest.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoParameterTypeStrengthening; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestParameters; @@ -32,6 +33,7 @@ .apply(this::configureRepackaging) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForMembers() .enableNoParameterTypeStrengtheningAnnotations() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) @@ -69,6 +71,7 @@ @NoVerticalClassMerging public abstract static class HelloGreeterBase { + @NoAccessModification abstract void greet(); } @@ -85,6 +88,7 @@ @NoVerticalClassMerging public abstract static class WorldGreeterBase { + @NoAccessModification abstract void greet(); }
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithStringIdentifier.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithStringIdentifier.java index 3f8e0bb..a4bc84c 100644 --- a/src/test/java/com/android/tools/r8/repackage/RepackageWithStringIdentifier.java +++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithStringIdentifier.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestParameters; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,6 +48,8 @@ .addKeepMainRule(Main.class) .enableInliningAnnotations() .enableNeverClassInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() + .enableNoAccessModificationAnnotationsForMembers() .setMinApi(parameters) .compile() .inspect(inspector -> assertThat(A.class, isRepackaged(inspector))) @@ -55,8 +58,12 @@ } @NeverClassInline + @NoAccessModification static class A { + @NoAccessModification + A() {} + @NeverInline public void foo() { System.out.println("Hello World!");
diff --git a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/AccessPackagePrivateMethodOnKeptClassIndirect.java b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/AccessPackagePrivateMethodOnKeptClassIndirect.java index 355420d..ffb3588 100644 --- a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/AccessPackagePrivateMethodOnKeptClassIndirect.java +++ b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/AccessPackagePrivateMethodOnKeptClassIndirect.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.repackage.testclasses.repackagetest; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; @NoHorizontalClassMerging @@ -19,6 +20,7 @@ public static class Helper { @NeverInline + @NoAccessModification static void test() { KeptClass.packagePrivateMethod(); }
diff --git a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClass.java b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClass.java index 5f2632f..8ab03ba 100644 --- a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClass.java +++ b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClass.java
@@ -5,10 +5,12 @@ package com.android.tools.r8.repackage.testclasses.repackagetest; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; public class KeptClass { @NeverInline + @NoAccessModification static void packagePrivateMethod() { System.out.println("KeptClass.packagePrivateMethod()"); }
diff --git a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClassAllowRenaming.java b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClassAllowRenaming.java index f6ca601..8ad73d9 100644 --- a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClassAllowRenaming.java +++ b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/KeptClassAllowRenaming.java
@@ -5,10 +5,12 @@ package com.android.tools.r8.repackage.testclasses.repackagetest; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; public class KeptClassAllowRenaming { @NeverInline + @NoAccessModification static void packagePrivateMethod() { System.out.println("KeptClassAllowRenaming.packagePrivateMethod()"); }
diff --git a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethod.java b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethod.java index e408270..47ab945 100644 --- a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethod.java +++ b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethod.java
@@ -5,10 +5,12 @@ package com.android.tools.r8.repackage.testclasses.repackagetest; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; public class ReachableClassWithKeptMethod { @NeverInline + @NoAccessModification static void packagePrivateMethod() { System.out.println("ReachableClassWithKeptMethod.packagePrivateMethod()"); }
diff --git a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethodAllowRenaming.java b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethodAllowRenaming.java index 7555b9b..568e526 100644 --- a/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethodAllowRenaming.java +++ b/src/test/java/com/android/tools/r8/repackage/testclasses/repackagetest/ReachableClassWithKeptMethodAllowRenaming.java
@@ -5,10 +5,12 @@ package com.android.tools.r8.repackage.testclasses.repackagetest; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; public class ReachableClassWithKeptMethodAllowRenaming { @NeverInline + @NoAccessModification static void packagePrivateMethod() { System.out.println("ReachableClassWithKeptMethodAllowRenaming.packagePrivateMethod()"); }
diff --git a/src/test/java/com/android/tools/r8/resolution/b77944861/B77944861.java b/src/test/java/com/android/tools/r8/resolution/b77944861/B77944861.java index 4e1ae5c..631aa50 100644 --- a/src/test/java/com/android/tools/r8/resolution/b77944861/B77944861.java +++ b/src/test/java/com/android/tools/r8/resolution/b77944861/B77944861.java
@@ -65,6 +65,7 @@ .addKeepMainRule(MAIN) .addDontObfuscate() .addDontShrink() + .enableNoAccessModificationAnnotationsForClasses() .setMinApi(parameters) .compile() .inspect(
diff --git a/src/test/java/com/android/tools/r8/resolution/b77944861/inner/TopLevelPolicy.java b/src/test/java/com/android/tools/r8/resolution/b77944861/inner/TopLevelPolicy.java index 0c22769..848f76f 100644 --- a/src/test/java/com/android/tools/r8/resolution/b77944861/inner/TopLevelPolicy.java +++ b/src/test/java/com/android/tools/r8/resolution/b77944861/inner/TopLevelPolicy.java
@@ -3,6 +3,8 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.resolution.b77944861.inner; +import com.android.tools.r8.NoAccessModification; + public class TopLevelPolicy { public static void set(MobileIconState state, String desc) { @@ -11,6 +13,7 @@ state.description = desc; } + @NoAccessModification private static abstract class IconState { public String description; }
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java index 861e990..7193719 100644 --- a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java +++ b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
@@ -36,6 +36,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.function.Supplier; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -43,6 +44,7 @@ import org.junit.runners.Parameterized.Parameters; import org.objectweb.asm.MethodVisitor; +@Ignore("b/288117378") @RunWith(Parameterized.class) public class RetraceStackTraceFunctionalCompositionTest extends TestBase {
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java index 3644aa8..3c5aa5b 100644 --- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java +++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -26,6 +26,7 @@ import com.android.tools.r8.retrace.stacktraces.AmbiguousInlineFramesStackTrace; import com.android.tools.r8.retrace.stacktraces.AmbiguousMethodVerboseStackTrace; import com.android.tools.r8.retrace.stacktraces.AmbiguousMissingLineStackTrace; +import com.android.tools.r8.retrace.stacktraces.AmbiguousMultipleInlineStackTrace; import com.android.tools.r8.retrace.stacktraces.AmbiguousStackTrace; import com.android.tools.r8.retrace.stacktraces.AmbiguousWithMultipleLineMappingsStackTrace; import com.android.tools.r8.retrace.stacktraces.AmbiguousWithSignatureStackTrace; @@ -232,6 +233,11 @@ } @Test + public void testAmbiguousMultipleInlineStackTrace() throws Exception { + runRetraceTest(new AmbiguousMultipleInlineStackTrace()); + } + + @Test public void testAmbiguousMultipleMappingsTest() throws Exception { runRetraceTest(new AmbiguousWithMultipleLineMappingsStackTrace()); }
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousMultipleInlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousMultipleInlineStackTrace.java new file mode 100644 index 0000000..abf5ba6 --- /dev/null +++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousMultipleInlineStackTrace.java
@@ -0,0 +1,55 @@ +// Copyright (c) 2023, 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.retrace.stacktraces; + +import com.android.tools.r8.utils.StringUtils; +import java.util.Arrays; +import java.util.List; + +public class AmbiguousMultipleInlineStackTrace implements StackTraceForTest { + + @Override + public List<String> obfuscatedStackTrace() { + return Arrays.asList( + "java.lang.IndexOutOfBoundsException", + "\tat com.android.tools.r8.Internal.zza(SourceFile:10)"); + } + + @Override + public String mapping() { + return StringUtils.lines( + "com.android.tools.r8.Internal -> com.android.tools.r8.Internal:", + " 10:10:void some.inlinee1(int):10:10 -> zza", + " 10:10:void foo(int):10 -> zza", + " 11:12:void foo(int):11:12 -> zza", + " 10:10:void some.inlinee2(int, int):20:20 -> zza", + " 10:10:void foo(int, int):42 -> zza"); + } + + @Override + public List<String> retracedStackTrace() { + return Arrays.asList( + "java.lang.IndexOutOfBoundsException", + "\tat some.inlinee1(some.java:10)", + "\t<OR> at some.inlinee2(some.java:20)", + "\tat com.android.tools.r8.Internal.foo(Internal.java:10)", + "\t<OR> at com.android.tools.r8.Internal.foo(Internal.java:42)"); + } + + @Override + public List<String> retraceVerboseStackTrace() { + return Arrays.asList( + "java.lang.IndexOutOfBoundsException", + "\tat some.void inlinee1(int)(some.java:10)", + "\t<OR> at some.void inlinee2(int,int)(some.java:20)", + "\tat com.android.tools.r8.Internal.void foo(int)(Internal.java:10)", + "\t<OR> at com.android.tools.r8.Internal.void foo(int,int)(Internal.java:42)"); + } + + @Override + public int expectedWarnings() { + return 0; + } +}
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java index 35991a7..97045ca 100644 --- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java +++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -159,6 +159,12 @@ .enableMemberValuePropagationAnnotations() .enableSideEffectAnnotations() .addOptionsModification(this::configure) + .addOptionsModification( + o -> { + o.testing.enableLir(); + // Not inlining toString depends on simple inlining limit. + o.inlinerOptions().simpleInliningInstructionLimit = 3; + }) .setMinApi(parameters) .compile() .inspect(this::inspectToStrings)
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java index a47a068..faba9a5 100644 --- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java +++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -233,7 +233,7 @@ .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable) .compile() .graphInspector(); - assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector, true); + assertRetainedClassesEqual(referenceInspector, ifThenKeepClassMembersInspector, true, true); GraphInspector ifThenKeepClassesWithMembersInspector = testForR8(Backend.CF) @@ -252,7 +252,8 @@ .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable) .compile() .graphInspector(); - assertRetainedClassesEqual(referenceInspector, ifThenKeepClassesWithMembersInspector, true); + assertRetainedClassesEqual( + referenceInspector, ifThenKeepClassesWithMembersInspector, true, true); GraphInspector ifHasMemberThenKeepClassInspector = testForR8(Backend.CF) @@ -273,7 +274,7 @@ .apply(this::suppressZipFileAssignmentsToJavaLangAutoCloseable) .compile() .graphInspector(); - assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector, true); + assertRetainedClassesEqual(referenceInspector, ifHasMemberThenKeepClassInspector, true, true); } private void configureHorizontalClassMerging(R8FullTestBuilder testBuilder) { @@ -300,6 +301,15 @@ GraphInspector referenceResult, GraphInspector conditionalResult, boolean expectConditionalIsLarger) { + assertRetainedClassesEqual( + referenceResult, conditionalResult, expectConditionalIsLarger, false); + } + + private void assertRetainedClassesEqual( + GraphInspector referenceResult, + GraphInspector conditionalResult, + boolean expectConditionalIsLarger, + boolean expectNotConditionalIsLarger) { Set<String> referenceClasses = new TreeSet<>( referenceResult.codeInspector().allClasses().stream() @@ -321,10 +331,15 @@ } Set<String> notInConditional = new TreeSet<>(Sets.difference(referenceClasses, conditionalClasses)); - assertEquals( - "Classes in -keepclassmembers rule that are not in -if rule", - Collections.emptySet(), - notInConditional); + if (expectNotConditionalIsLarger) { + assertFalse( + "Expected classes in -keepclassmembers rule to retain more", notInConditional.isEmpty()); + } else { + assertEquals( + "Classes in -keepclassmembers rule that are not in -if rule", + Collections.emptySet(), + notInConditional); + } } private void suppressZipFileAssignmentsToJavaLangAutoCloseable(R8TestBuilder<?> testBuilder) {
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java index 1ae00db..c91b930 100644 --- a/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java +++ b/src/test/java/com/android/tools/r8/shaking/LibraryMethodOverrideInLambdaMarkingTest.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.shaking; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import com.android.tools.r8.NoVerticalClassMerging; @@ -16,8 +17,6 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.shaking.Enqueuer.Mode; import java.util.Iterator; -import java.util.Spliterator; -import java.util.function.Consumer; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -41,6 +40,8 @@ testForR8(parameters.getBackend()) .addInnerClasses(LibraryMethodOverrideInLambdaMarkingTest.class) .addKeepMainRule(TestClass.class) + // Keep J since redundant bridge removal will otherwise remove it. + .addKeepClassAndMembersRules(J.class) .addOptionsModification( options -> options.testing.enqueuerInspector = this::verifyLibraryOverrideInformation) .enableNoVerticalClassMergingAnnotations() @@ -61,7 +62,8 @@ AppInfoWithLiveness appInfo, DexType type) { DexProgramClass clazz = appInfo.definitionFor(type).asProgramClass(); DexEncodedMethod method = - clazz.lookupVirtualMethod(m -> m.getReference().name.toString().equals("iterator")); + clazz.lookupVirtualMethod(m -> m.getName().toString().equals("iterator")); + assertNotNull(method); // TODO(b/149976493): Mark library overrides from lambda instances. if (parameters.isCfRuntime()) { assertTrue(method.isLibraryMethodOverride().isFalse()); @@ -98,15 +100,5 @@ @Override Iterator<Object> iterator(); - - @Override - default void forEach(Consumer<? super Object> action) { - // Intentionally empty. - } - - @Override - default Spliterator<Object> spliterator() { - return null; - } } }
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java index 845e598..9d39bbc 100644 --- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java +++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationTest.java
@@ -79,6 +79,7 @@ : StringUtils.lines( // Itf#info has side effects due to the missing Base2. "[Sub1, info]: message00", + "[Sub1, info]: message1", "[Base2, info]: message08", // Base2#info also has side effects. "[Base2, info]: message4", @@ -89,6 +90,7 @@ "[AnotherSub2, debug]: message08", "[AnotherSub2, debug]: message5", "The end") : StringUtils.lines( "[Base1, debug]: message00", + "[Base1, debug]: message2", "[AnotherSub2, debug]: message08", "[AnotherSub2, debug]: message5", "The end");
diff --git a/src/test/java/com/android/tools/r8/shaking/constructor/ForwardingConstructorShakingOnDexWithClassMergingTest.java b/src/test/java/com/android/tools/r8/shaking/constructor/ForwardingConstructorShakingOnDexWithClassMergingTest.java index fddfa66..786b46e 100644 --- a/src/test/java/com/android/tools/r8/shaking/constructor/ForwardingConstructorShakingOnDexWithClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/shaking/constructor/ForwardingConstructorShakingOnDexWithClassMergingTest.java
@@ -8,6 +8,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import com.android.tools.r8.NeverClassInline; import com.android.tools.r8.NeverInline; import com.android.tools.r8.NoVerticalClassMerging; import com.android.tools.r8.TestBase; @@ -49,6 +50,7 @@ .addHorizontallyMergedClassesInspector( inspector -> inspector.assertMergedInto(A.class, B.class).assertNoOtherClassesMerged()) .enableInliningAnnotations() + .enableNeverClassInliningAnnotations() .enableNoVerticalClassMergingAnnotations() .setMinApi(parameters) .compile() @@ -111,6 +113,7 @@ } } + @NeverClassInline public static class ASub extends A { // After horizontal class merging and unused argument removal, this is rewritten to target
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java index d8afbb3..820cc29 100644 --- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java +++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatibilityTestBase.java
@@ -50,6 +50,14 @@ || this == R8_CF; } + public boolean isCompatR8() { + return this == R8_COMPAT || this == R8_COMPAT_CF; + } + + public boolean isR8Dex() { + return this == R8_COMPAT || this == R8; + } + public boolean isProguard() { return this == PROGUARD5 || this == PROGUARD6 || this == PROGUARD6_THEN_D8; }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java index 3f426a5..7af5d20 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -5,9 +5,9 @@ import static com.android.tools.r8.utils.codeinspector.Matchers.isPackagePrivate; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeFalse; @@ -93,7 +93,7 @@ assertThat(methodSubject, not(isPresent())); methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod"); assertThat(methodSubject, isPresent()); - assertFalse(methodSubject.getMethod().accessFlags.isPublic()); + assertThat(methodSubject, shrinker.isR8() ? isPublic() : isPackagePrivate()); classSubject = inspector.clazz(ClassForSubsequent.class); assertThat(classSubject, not(isPresent())); }); @@ -176,7 +176,11 @@ assertThat(methodSubject, not(isPresent())); methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod"); assertThat(methodSubject, isPresent()); - assertThat(methodSubject, isPackagePrivate()); + assertThat( + methodSubject, + shrinker.isR8() && isForceAccessModifyingPackagePrivateAndProtectedMethods() + ? isPublic() + : isPackagePrivate()); }); } @@ -255,7 +259,11 @@ assertThat(methodSubject, not(isPresent())); methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod"); assertThat(methodSubject, isPresent()); - assertThat(methodSubject, isPackagePrivate()); + assertThat( + methodSubject, + shrinker.isR8() && isForceAccessModifyingPackagePrivateAndProtectedMethods() + ? isPublic() + : isPackagePrivate()); }); } }
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java index 74d2cfb..39ec9a9 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -10,6 +10,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatibilityTestBase; import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.codeinspector.ClassSubject; @@ -33,7 +34,8 @@ EmptyMainClassForIfOnClassTests.class, Precondition.class, DependentUser.class, - Dependent.class); + Dependent.class, + NoAccessModification.class); private final Shrinker shrinker; private final boolean keepPrecondition; @@ -164,12 +166,15 @@ @Test public void ifThenKeepClassesWithMembers() throws Exception { - List<String> config = ImmutableList.of( - "-if class **.Precondition", - "-keepclasseswithmembers,allowobfuscation class **.*User {", - " static void callFoo(...);", - "}" - ); + List<String> config = + ImmutableList.of( + "-if class **.Precondition", + "-keepclasseswithmembers,allowobfuscation class **.*User {", + " static void callFoo(...);", + "}", + shrinker.isR8() + ? "-noaccessmodification class * { @com.android.tools.r8.NoAccessModification *; }" + : ""); CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config); if (!keepPrecondition) { @@ -293,15 +298,18 @@ @Test public void ifThenKeepNames() throws Exception { - List<String> config = ImmutableList.of( - // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. - // We're testing renaming of Dependent itself and members. - "-keepclasseswithmembers,allowobfuscation class **.*User {", - " static void callFoo(...);", - "}", - "-if class **.Precondition", - "-keepnames class **.Dependent" - ); + List<String> config = + ImmutableList.of( + // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. + // We're testing renaming of Dependent itself and members. + "-keepclasseswithmembers,allowobfuscation class **.*User {", + " static void callFoo(...);", + "}", + "-if class **.Precondition", + "-keepnames class **.Dependent", + shrinker.isR8() + ? "-noaccessmodification class * { @com.android.tools.r8.NoAccessModification *; }" + : ""); CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config); @@ -316,17 +324,20 @@ @Test public void ifThenKeepClassesWithMemberNames() throws Exception { - List<String> config = ImmutableList.of( - // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. - // We're testing renaming of Dependent itself and members. - "-keepclasseswithmembers,allowobfuscation class **.*User {", - " static void callFoo(...);", - "}", - "-if class **.Precondition", - "-keepclasseswithmembernames class **.Dependent {", - " <methods>;", - "}" - ); + List<String> config = + ImmutableList.of( + // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. + // We're testing renaming of Dependent itself and members. + "-keepclasseswithmembers,allowobfuscation class **.*User {", + " static void callFoo(...);", + "}", + "-if class **.Precondition", + "-keepclasseswithmembernames class **.Dependent {", + " <methods>;", + "}", + shrinker.isR8() + ? "-noaccessmodification class * { @com.android.tools.r8.NoAccessModification *; }" + : ""); CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config); @@ -342,17 +353,20 @@ @Test public void ifThenKeepClassMemberNames() throws Exception { - List<String> config = ImmutableList.of( - // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. - // We're testing renaming of Dependent itself and members. - "-keepclasseswithmembers,allowobfuscation class **.*User {", - " static void callFoo(...);", - "}", - "-if class **.Precondition", - "-keepclassmembernames class **.Dependent {", - " <methods>;", - "}" - ); + List<String> config = + ImmutableList.of( + // To keep DependentUser#callFoo, which in turn kept Dependent#<init> as well. + // We're testing renaming of Dependent itself and members. + "-keepclasseswithmembers,allowobfuscation class **.*User {", + " static void callFoo(...);", + "}", + "-if class **.Precondition", + "-keepclassmembernames class **.Dependent {", + " <methods>;", + "}", + shrinker.isR8() + ? "-noaccessmodification class * { @com.android.tools.r8.NoAccessModification *; }" + : ""); CodeInspector codeInspector = inspectAfterShrinking(shrinker, CLASSES, config);
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTestClasses.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTestClasses.java index 65b5c29..78575b1 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTestClasses.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTestClasses.java
@@ -3,6 +3,8 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.shaking.ifrule; +import com.android.tools.r8.NoAccessModification; + class EmptyMainClassForIfOnClassTests { public static void main(String[] args) { } @@ -11,8 +13,10 @@ // Precondition -> DependentUser -> Dependent // That is, this class and members will be kept only if Precondition and DependentUser are kept. class Dependent { - private int intField; - private String strField; + + @NoAccessModification private int intField; + + @NoAccessModification private String strField; Dependent(int i, String s) { intField = i;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java index c330985..fbde552 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; @@ -41,6 +42,7 @@ .addKeepRules( "-if class * extends " + A.class.getTypeName(), "-keep class <1> { <init>(...); }") .enableInliningAnnotations() + .enableNoAccessModificationAnnotationsForClasses() .setMinApi(parameters) .compile() .inspect( @@ -65,6 +67,8 @@ } } + // TODO(b/287891322): Allow vertical class merging even when A is made public. + @NoAccessModification static class A {} static class B extends A {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java index df888c0..f28c2a5 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
@@ -11,6 +11,7 @@ import static org.junit.Assert.assertNotEquals; import com.android.tools.r8.NeverClassInline; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoRedundantFieldLoadElimination; import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestParameters; @@ -50,6 +51,7 @@ public static class MergedFieldTypeWithCollisionTest extends MergedTypeBaseTest { + @NoAccessModification static class SuperTestClass { @NoRedundantFieldLoadElimination private A field = new B(); @@ -85,6 +87,7 @@ @Override public void configure(R8FullTestBuilder builder) { + super.configure(builder); builder .enableNeverClassInliningAnnotations() .enableNoRedundantFieldLoadEliminationAnnotations();
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java index 32d30d9..01f8190 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedParameterTypeTest.java
@@ -10,6 +10,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestParameters; @@ -54,6 +55,7 @@ public static class MergedParameterTypeWithCollisionTest extends MergedTypeBaseTest { + @NoAccessModification @NoHorizontalClassMerging static class SuperTestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java index 5a03792..9e98e16 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedReturnTypeTest.java
@@ -11,6 +11,7 @@ import static org.junit.Assert.assertNotEquals; import com.android.tools.r8.AssumeMayHaveSideEffects; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.NoHorizontalClassMerging; import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestParameters; @@ -62,6 +63,7 @@ public static class MergedReturnTypeWithCollisionTest extends MergedTypeBaseTest { + @NoAccessModification @NoHorizontalClassMerging static class SuperTestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java index f6e1ea7..da7c397 100644 --- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedTypeBaseTest.java
@@ -9,6 +9,7 @@ import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; +import com.android.tools.r8.NoAccessModification; import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; @@ -29,12 +30,18 @@ static class B extends A {} + // TODO(b/287891322): Allow vertical class merging even when C is made public. + @NoAccessModification static class C {} + // TODO(b/287891322): Allow vertical class merging even when I is made public. + @NoAccessModification interface I {} interface J extends I {} + // TODO(b/287891322): Allow vertical class merging even when K is made public. + @NoAccessModification interface K {} static class Unused {} @@ -68,8 +75,10 @@ } public void configure(R8FullTestBuilder builder) { - builder.addOptionsModification( - options -> options.enableVerticalClassMerging = enableVerticalClassMerging); + builder + .addOptionsModification( + options -> options.enableVerticalClassMerging = enableVerticalClassMerging) + .enableNoAccessModificationAnnotationsForClasses(); } public abstract Class<?> getTestClass();
diff --git a/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java b/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java index c16510e..8124058 100644 --- a/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java +++ b/src/test/java/com/android/tools/r8/shaking/innerclassattributes/MissingOuterClassTest.java
@@ -82,8 +82,9 @@ assertEquals(outerClassSubject.getDexProgramClass().getType(), innerClassAttribute.getOuter()); if (parameters.isCfRuntime() || hostClassSubject == innerClassSubject) { assertEquals( - DescriptorUtils.getInnerClassName( - outerClassSubject.getFinalDescriptor(), innerClassSubject.getFinalDescriptor()), + DescriptorUtils.getInnerClassNameFromSimpleName( + outerClassSubject.getDexProgramClass().getSimpleName(), + innerClassSubject.getDexProgramClass().getSimpleName()), innerClassAttribute.getInnerName().toSourceString()); } else { assertEquals(DexItemFactory.unknownTypeName, innerClassAttribute.getInnerName());
diff --git a/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideDefaultMethodTest.java b/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideDefaultMethodTest.java index 1b727a0..f20b1b5 100644 --- a/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideDefaultMethodTest.java +++ b/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideDefaultMethodTest.java
@@ -4,6 +4,8 @@ package com.android.tools.r8.shaking.librarymethodoverride; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import com.android.tools.r8.TestBase; @@ -62,9 +64,13 @@ appInfo .definitionFor(dexItemFactory.createType(descriptor(ProgramI.class))) .asProgramClass(); - DexEncodedMethod method = - clazz.lookupVirtualMethod(m -> m.getReference().name.toString().equals("foo")); - assertTrue(method.isLibraryMethodOverride().isTrue()); + DexEncodedMethod method = clazz.lookupVirtualMethod(m -> m.getName().toString().equals("foo")); + if (appInfo.options().canUseDefaultAndStaticInterfaceMethods() || mode.isInitialTreeShaking()) { + assertNotNull(method); + assertTrue(method.isLibraryMethodOverride().isTrue()); + } else { + assertNull(method); + } } public interface LibraryI {
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java index 2e3df74..5c8821d 100644 --- a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java +++ b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
@@ -187,6 +187,22 @@ return classReference; } + public ClassFileTransformer setClassAccessFlags(int accessFlags) { + return addClassTransformer( + new ClassTransformer() { + @Override + public void visit( + int version, + int access, + String name, + String signature, + String superName, + String[] interfaces) { + super.visit(version, accessFlags, name, signature, superName, interfaces); + } + }); + } + /** Unconditionally replace the implements clause of a class. */ public ClassFileTransformer setImplements(Class<?>... interfaces) { return setImplementsClassDescriptors(
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java index cc336b6..fd18f5a 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -30,6 +30,7 @@ import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.IRCode; +import com.android.tools.r8.ir.conversion.MethodConversionOptions; import com.android.tools.r8.naming.MemberNaming; import com.android.tools.r8.naming.MemberNaming.MethodSignature; import com.android.tools.r8.naming.signature.GenericSignatureParser; @@ -74,7 +75,12 @@ @Override public IRCode buildIR(AppView<?> appView) { assert codeInspector.application.options.programConsumer != null; - return getProgramMethod().buildIR(appView); + return getProgramMethod() + .buildIR( + appView, + appView.enableWholeProgramOptimizations() + ? MethodConversionOptions.nonConverting() + : MethodConversionOptions.forD8(appView)); } @Override
diff --git a/src/test/java/com/android/tools/r8/workaround/IncorrectTypeRefinementForThrowableTest.java b/src/test/java/com/android/tools/r8/workaround/IncorrectTypeRefinementForThrowableTest.java new file mode 100644 index 0000000..bf3f43e --- /dev/null +++ b/src/test/java/com/android/tools/r8/workaround/IncorrectTypeRefinementForThrowableTest.java
@@ -0,0 +1,57 @@ +// Copyright (c) 2023, 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.workaround; + + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class IncorrectTypeRefinementForThrowableTest extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void testD8() throws Exception { + parameters.assumeDexRuntime(); + testForD8(parameters.getBackend()) + .addInnerClasses(getClass()) + .release() + .setMinApi(parameters) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithEmptyOutput(); + } + + @Test + public void testJvm() throws Exception { + parameters.assumeJvmTestParameters(); + testForJvm(parameters) + .addInnerClasses(getClass()) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithEmptyOutput(); + } + + static class Main { + + public static void main(String[] args) { + RuntimeException o = null; + if (o instanceof Object) { + throw o; + } + } + } +}
diff --git a/src/test/smali/arithmetic/Arithmetic.smali b/src/test/smali/arithmetic/Arithmetic.smali deleted file mode 100644 index f76b9b3..0000000 --- a/src/test/smali/arithmetic/Arithmetic.smali +++ /dev/null
@@ -1,254 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method static addMinusOne(I)I - .locals 1 - - const/4 v0, -1 - add-int v0, p0, v0 - return v0 -.end method - -.method static addTwoConstants()I - .locals 2 - - const/4 v0, 1 - const/4 v1, 2 - add-int v0, v0, v1 - return v0 -.end method - -.method static addSameTwoConstants()I - .locals 2 - - const/4 v0, 1 - add-int v0, v0, v0 - return v0 -.end method - -.method static subMinusOne(I)I - .locals 1 - - const/4 v0, -1 - sub-int v0, p0, v0 - return v0 -.end method - -.method static subSameTwoConstants()I - .locals 2 - - const/4 v0, 1 - sub-int v0, v0, v0 - return v0 -.end method - -.method static subtractConstants()I - .locals 9 - - const/4 v0, 0 - - const v1, 127 # Max 8-bit signed integer. - const v2, -128 # Min 8-bit signed integer. - const v3, 128 # Max 8-bit signed integer plus one. - const v4, -129 # Min 8-bit signed integer minus one. - - const v5, 32767 # Max 16-bit signed integer. - const v6, -32768 # Min 16-bit signed integer. - const v7, 32768 # Max 16-bit signed integer plus one. - const v8, -32769 # Min 16-bit signed integer minus one. - - sub-int v0, v0, v1 - sub-int v0, v0, v2 - sub-int v0, v0, v3 - sub-int v0, v0, v4 - sub-int v0, v0, v5 - sub-int v0, v0, v6 - sub-int v0, v0, v7 - sub-int v0, v0, v8 - sub-int v0, v1, v0 - sub-int v0, v2, v0 - sub-int v0, v3, v0 - sub-int v0, v4, v0 - sub-int v0, v5, v0 - sub-int v0, v6, v0 - sub-int v0, v7, v0 - sub-int v0, v8, v0 - - return v0 -.end method - -.method static sixteenIntArgMethod(IIIIIIIIIIIIIIII)V - .locals 0 - return-void -.end method - -# Same code as subtractConstants, but try to force the register allocator to allocate registers for -# the arithmetic operations above 15. -.method static subtractConstants8bitRegisters()I - .locals 32 - - const/4 v0, 0 - - const v1, 127 # Max 8-bit signed integer. - const v2, -128 # Min 8-bit signed integer. - const v3, 128 # Max 8-bit signed integer plus one. - const v4, -129 # Min 8-bit signed integer minus one. - - const v5, 32767 # Max 16-bit signed integer. - const v6, -32768 # Min 16-bit signed integer. - const v7, 32768 # Max 16-bit signed integer plus one. - const v8, -32769 # Min 16-bit signed integer minus one. - - const v9, 9 - const v10, 10 - const v11, 11 - const v12, 12 - const v13, 13 - const v14, 14 - const v15, 15 - - sub-int v16, v0, v1 - sub-int v17, v16, v2 - sub-int v18, v17, v3 - sub-int v19, v18, v4 - sub-int v20, v19, v5 - sub-int v21, v20, v6 - sub-int v22, v21, v7 - sub-int v23, v22, v8 - sub-int v24, v1, v23 - sub-int v25, v2, v24 - sub-int v26, v3, v25 - sub-int v27, v4, v26 - sub-int v28, v5, v27 - sub-int v29, v6, v28 - sub-int v30, v7, v29 - sub-int v31, v8, v30 - - invoke-static/range {v16 .. v31}, LTest;->sixteenIntArgMethod(IIIIIIIIIIIIIIII)V - - return v31 -.end method - -.method static addConstantUsedTwice()I - .locals 4 - - const/4 v0, 0 - const/4 v1, 1 - add-int/2addr v0, v1 - add-int/2addr v0, v1 - return v0 -.end method - -.method static addTwoLongConstants()J - .locals 4 - - const-wide v0, 1 - const-wide v2, 2 - add-long v0, v0, v2 - return-wide v0 -.end method - -.method static addTwoDoubleConstants()D - .locals 4 - - const-wide v0, 0x3ff0000000000000L # 1.0 - const-wide v2, 0x4000000000000000L # 2.0 - add-double v0, v0, v2 - return-wide v0 -.end method - -.method static cmpFold()I - .locals 4 - - const-wide v0, 0 - const-wide v2, 0 - cmp-long v0, v0, v2 - return v0 -.end method - -.method static addFoldLeft(I)I - .locals 2 - - const/4 v0, 1 - const/4 v1, 2 - add-int/2addr v0, v1 - add-int/2addr v0, p0 - return v0 -.end method - -.method static subFoldLeft(I)I - .locals 2 - - const/4 v0, 1 - const/4 v1, 2 - sub-int/2addr v0, v1 - sub-int/2addr v0, p0 - return v0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 3 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - # Calculate: 0 + (-1). - const/4 v1, 0 - invoke-static {v1}, LTest;->addMinusOne(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->addTwoConstants()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->addSameTwoConstants()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->addTwoLongConstants()J - move-result-wide v1 - invoke-virtual {v0, v1, v2}, Ljava/io/PrintStream;->println(J)V - - invoke-static {}, LTest;->addTwoDoubleConstants()D - move-result-wide v1 - invoke-virtual {v0, v1, v2}, Ljava/io/PrintStream;->println(D)V - - # Calculate: 0 - (-1). - const/4 v1, 0 - invoke-static {v1}, LTest;->subMinusOne(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->subSameTwoConstants()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->subtractConstants()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->subtractConstants8bitRegisters()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->addConstantUsedTwice()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - const/4 v1, 1 - invoke-static {v1}, LTest;->addFoldLeft(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - const/4 v1, 1 - invoke-static {v1}, LTest;->subFoldLeft(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - return-void -.end method
diff --git a/src/test/smali/bad-codegen/Test.java b/src/test/smali/bad-codegen/Test.java deleted file mode 100644 index f301ed7..0000000 --- a/src/test/smali/bad-codegen/Test.java +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright (c) 2016, 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. - -import java.util.Map; - -public class Test { - public Test a; - public static Test P; - - public Test() { - } - - public Test(int a, Test b, Test c, Long d, Test e, Map f) { - } - - public Test(int i1, int i2, int i3) { - } - - public long b() { - return 0; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public static void main(String[] args) { - Test test = new Test(); - try { - new TestObject().a(test, test, test, test, true); - } catch (Throwable t) { - System.out.println(t); - } - } -}
diff --git a/src/test/smali/bad-codegen/TestObject.java b/src/test/smali/bad-codegen/TestObject.java deleted file mode 100644 index dc96fca..0000000 --- a/src/test/smali/bad-codegen/TestObject.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public Test a(Test a, Test b, Test c, Test d, boolean e) { - return new Test(); - } -}
diff --git a/src/test/smali/bad-codegen/TestObject.smali b/src/test/smali/bad-codegen/TestObject.smali deleted file mode 100644 index 811cd21..0000000 --- a/src/test/smali/bad-codegen/TestObject.smali +++ /dev/null
@@ -1,1494 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field public a:LTest; -.field public b:Ljava/util/List; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final a(LTest;LTest;LTest;LTest;Z)LTest; - .registers 34 - move-object/from16 v0, p0 - iget-object v12, v0, LTestObject;->a:LTest; - iget-object v4, v12, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->b()J - move-result-wide v14 - const/4 v10, 0x0 - const/4 v4, 0x0 - if-eqz p2, :cond_9cf - move-object/from16 v0, p2 - iget-object v10, v0, LTest;->a:LTest; - move-object/from16 v0, p2 - iget-object v4, v0, LTest;->b:Ljava/util/List; - move-object v13, v4 - :goto_17 - if-eqz v10, :cond_1f - invoke-virtual {v10}, LTest;->d()Z - move-result v4 - if-nez v4, :cond_21d - :cond_1f - new-instance v4, LTest; - const/4 v5, 0x0 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - const-wide/16 v8, 0x0 - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - :goto_2c - if-nez p4, :cond_44 - iget-object v4, v14, LTest;->a:LTest; - sget-object v5, LTest;->P:LTest; - if-ne v4, v5, :cond_44 - iget-object v4, v14, LTest;->a:LTest; - new-instance p4, LTest; - iget v5, v4, LTest;->c:I - iget v4, v4, LTest;->d:I - const v6, 0x2faf080 - move-object/from16 v0, p4 - invoke-direct {v0, v5, v4, v6}, LTest;-><init>(III)V - :cond_44 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - invoke-virtual {v4}, LTest;->a()Z - move-result v5 - if-eqz v5, :cond_6c5 - iget-object v8, v4, LTest;->a:LTest; - if-nez p1, :cond_61e - const/4 v4, 0x0 - :cond_53 - :goto_53 - if-eqz v4, :cond_6c8 - move-object v12, v4 - :goto_56 - iget-object v4, v12, LTest;->a:LTest; - sget-object v5, LTest;->P:LTest; - if-ne v4, v5, :cond_931 - const/4 v4, 0x1 - :goto_5d - iget-object v5, v14, LTest;->a:LTest; - sget-object v6, LTest;->P:LTest; - if-ne v5, v6, :cond_934 - const/4 v5, 0x1 - :goto_64 - if-nez v4, :cond_937 - if-nez v5, :cond_937 - const/4 v4, 0x0 - move-object v13, v4 - :goto_6a - sget-object v4, LTest;->P:LTest; - invoke-static {v4}, LTest;->a(LTest;)Z - move-result v4 - if-eqz v4, :cond_212 - const/4 v5, 0x0 - const/4 v4, 0x0 - if-eqz v13, :cond_9c8 - if-ne v13, v14, :cond_976 - const/4 v5, 0x1 - move v11, v4 - move v15, v5 - :goto_7b - if-eqz v12, :cond_97b - iget-object v4, v12, LTest;->a:LTest; - sget-object v5, LTest;->P:LTest; - if-ne v4, v5, :cond_97b - const/4 v4, 0x1 - :goto_84 - if-eqz v4, :cond_9c - const/4 v7, 0x0 - iget v4, v12, LTest;->a:I - packed-switch v4, :pswitch_data_9d2 - :goto_8c - :pswitch_8c - if-eqz v7, :cond_9c - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - const-string v5, "" - const-string v6, "" - const-wide/16 v8, 0x1 - const/4 v10, 0x1 - invoke-interface/range {v4 .. v10}, LTest;->a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V - :cond_9c - iget-object v4, v14, LTest;->a:LTest; - sget-object v5, LTest;->P:LTest; - if-ne v4, v5, :cond_98e - const/4 v4, 0x1 - :goto_a3 - if-eqz v4, :cond_bb - const/4 v7, 0x0 - iget v4, v14, LTest;->a:I - packed-switch v4, :pswitch_data_9e0 - :goto_ab - if-eqz v7, :cond_bb - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - const-string v5, "" - const-string v6, "" - const-wide/16 v8, 0x1 - const/4 v10, 0x1 - invoke-interface/range {v4 .. v10}, LTest;->a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V - :cond_bb - if-eqz v15, :cond_999 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - const-string v5, "" - const-string v6, "" - const-string v7, "" - const-wide/16 v8, 0x1 - const/4 v10, 0x1 - invoke-interface/range {v4 .. v10}, LTest;->a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V - :goto_cd - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - if-eqz v4, :cond_119 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->a:LTest; - const-string v6, "" - invoke-virtual {v4}, LTest;->a()Z - move-result v7 - if-eqz v7, :cond_f6 - iget-object v4, v4, LTest;->a:LTest; - iget-object v7, v4, LTest;->a:LTest; - if-eqz v7, :cond_f6 - iget-object v7, v4, LTest;->a:LTest; - iget-object v7, v7, LTest;->a:LTest; - if-eqz v7, :cond_f6 - iget-object v4, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - invoke-virtual {v4, v5, v6}, LTest;->a(LTest;Ljava/lang/String;)V - :cond_f6 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->a:LTest; - const-string v6, "" - invoke-virtual {v4}, LTest;->b()Z - move-result v7 - if-eqz v7, :cond_119 - iget-object v4, v4, LTest;->a:LTest; - iget-object v7, v4, LTest;->a:LTest; - if-eqz v7, :cond_119 - iget-object v7, v4, LTest;->a:LTest; - iget-object v7, v7, LTest;->a:LTest; - if-eqz v7, :cond_119 - iget-object v4, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - invoke-virtual {v4, v5, v6}, LTest;->a(LTest;Ljava/lang/String;)V - :cond_119 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - if-eqz v4, :cond_212 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->a:LTest; - const-string v6, "" - invoke-virtual {v4}, LTest;->a()Z - move-result v7 - if-eqz v7, :cond_212 - iget-object v4, v4, LTest;->a:LTest; - invoke-static {v5}, LTest;->a(Ljava/lang/Object;)Ljava/lang/Object; - invoke-static {v6}, LTest;->a(Ljava/lang/Object;)Ljava/lang/Object; - iget-object v7, v4, LTest;->a:LTest; - iget-object v15, v7, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-object v7, v4, LTest;->a:LTest; - if-eqz v7, :cond_9bf - iget-object v4, v4, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->b()J - move-result-wide v8 - move-wide/from16 v16, v8 - :goto_149 - iget-wide v8, v15, LTest;->l:J - const-wide/16 v10, -0x1 - cmp-long v4, v8, v10 - if-eqz v4, :cond_191 - iget-wide v8, v15, LTest;->l:J - cmp-long v4, v16, v8 - if-lez v4, :cond_191 - iget-wide v8, v15, LTest;->l:J - sub-long v8, v16, v8 - long-to-float v4, v8 - const v7, 0x4ca4cb80 # 8.64E7f - div-float v10, v4, v7 - const-string v7, "" - iget v4, v15, LTest;->g:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - const-string v7, "" - iget v4, v15, LTest;->c:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - const-string v7, "" - iget v4, v15, LTest;->b:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - const-string v7, "" - iget v4, v15, LTest;->a:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - const-string v7, "" - iget v4, v15, LTest;->d:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - const-string v7, "" - iget v4, v15, LTest;->h:I - int-to-long v8, v4 - invoke-static/range {v5 .. v10}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JF)V - :cond_191 - const-string v7, "" - iget v4, v15, LTest;->h:I - int-to-long v8, v4 - iget v10, v15, LTest;->g:I - const/4 v11, 0x0 - invoke-static/range {v5 .. v11}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JII)I - move-result v4 - iput v4, v15, LTest;->h:I - const-string v7, "" - iget-wide v8, v15, LTest;->k:J - iget v10, v15, LTest;->g:I - const/4 v11, 0x0 - invoke-static/range {v5 .. v11}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JII)I - move-result v4 - int-to-long v8, v4 - iput-wide v8, v15, LTest;->k:J - const-string v7, "" - iget v4, v15, LTest;->i:I - int-to-long v8, v4 - iget v10, v15, LTest;->j:I - const/4 v11, 0x0 - invoke-static/range {v5 .. v11}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JII)I - move-result v4 - iput v4, v15, LTest;->i:I - const/4 v4, 0x0 - iput v4, v15, LTest;->j:I - const-string v7, "" - iget v4, v15, LTest;->e:I - int-to-long v8, v4 - iget v10, v15, LTest;->a:I - const/4 v11, 0x0 - invoke-static/range {v5 .. v11}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;JII)I - move-result v4 - iput v4, v15, LTest;->e:I - const-string v4, "" - iget v7, v15, LTest;->a:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->a:I - const-string v4, "" - iget v7, v15, LTest;->b:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->b:I - const-string v4, "" - iget v7, v15, LTest;->c:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->c:I - const-string v4, "" - iget v7, v15, LTest;->d:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->d:I - const-string v4, "" - iget v7, v15, LTest;->f:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->f:I - const-string v4, "" - iget v7, v15, LTest;->g:I - const/4 v8, 0x0 - invoke-static {v5, v6, v4, v7, v8}, LTest;->a(LTest;Ljava/lang/String;Ljava/lang/String;II)I - move-result v4 - iput v4, v15, LTest;->g:I - move-wide/from16 v0, v16 - iput-wide v0, v15, LTest;->l:J - :cond_212 - if-eqz p5, :cond_9c5 - if-ne v13, v14, :cond_9c5 - const/4 v4, 0x1 - :goto_217 - new-instance v5, LTest; - invoke-direct {v5, v13, v12, v14, v4}, LTest;-><init>(LTest;LTest;LTest;Z)V - return-object v5 - :cond_21d - invoke-virtual {v12}, LTest;->a()Z - move-result v4 - if-eqz v4, :cond_57c - iget-object v8, v12, LTest;->a:LTest; - iget-wide v4, v8, LTest;->b:J - const-wide/16 v6, 0x1 - add-long/2addr v4, v6 - iput-wide v4, v8, LTest;->b:J - if-eqz v10, :cond_578 - iget v4, v10, LTest;->k:I - const/4 v5, 0x3 - if-ne v4, v5, :cond_29b - const/4 v4, 0x1 - :goto_234 - if-eqz v4, :cond_578 - iget-object v9, v8, LTest;->a:LTest; - invoke-static {v10}, LTest;->a(LTest;)J - move-result-wide v16 - const-wide/16 v4, 0x0 - cmp-long v4, v16, v4 - if-gez v4, :cond_2ca - const/4 v4, 0x0 - :cond_243 - :goto_243 - if-nez v4, :cond_543 - iget-object v4, v8, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget v5, v4, LTest;->d:I - add-int/lit8 v5, v5, 0x1 - iput v5, v4, LTest;->d:I - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-boolean v4, v5, LTest;->b:Z - if-nez v4, :cond_53c - iget-object v4, v5, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->f:Ljava/lang/String; - if-eqz v4, :cond_539 - const/4 v4, 0x1 - :goto_260 - if-eqz v4, :cond_53c - iget-object v4, v5, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->b()J - move-result-wide v6 - iget-wide v8, v5, LTest;->c:J - sub-long/2addr v6, v8 - iget v4, v5, LTest;->j:I - int-to-long v4, v4 - cmp-long v4, v6, v4 - if-lez v4, :cond_53c - const/4 v4, 0x1 - :goto_273 - if-eqz v4, :cond_53f - new-instance v4, LTest; - const/4 v5, 0x0 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - const-wide/16 v8, 0x0 - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v6, v4 - :goto_282 - if-eqz v6, :cond_57c - iget-object v4, v6, LTest;->a:LTest; - sget-object v5, LTest;->P:LTest; - if-ne v4, v5, :cond_57c - new-instance v4, LTest; - iget v5, v6, LTest;->a:I - iget-object v6, v6, LTest;->a:LTest; - sget-object v7, LTest;->P:LTest; - iget-wide v8, v10, LTest;->i:J - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - goto/16 :goto_2c - :cond_29b - const/4 v5, 0x4 - if-ne v4, v5, :cond_2c7 - sget-object v4, LTest;->P:LTest; - invoke-virtual {v4}, LTest;->b()Ljava/lang/Object; - move-result-object v4 - check-cast v4, Ljava/lang/Integer; - invoke-virtual {v4}, Ljava/lang/Integer;->intValue()I - move-result v4 - and-int/lit8 v4, v4, 0x1 - if-nez v4, :cond_2c4 - sget-object v4, LTest;->P:LTest; - invoke-virtual {v4}, LTest;->a()Ljava/lang/Object; - move-result-object v4 - check-cast v4, Ljava/lang/Long; - invoke-virtual {v4}, Ljava/lang/Long;->intValue()I - move-result v4 - and-int/lit8 v4, v4, 0x1 - if-nez v4, :cond_2c1 - const/4 v4, 0x1 - goto/16 :goto_234 - :cond_2c1 - const/4 v4, 0x0 - goto/16 :goto_234 - :cond_2c4 - const/4 v4, 0x1 - goto/16 :goto_234 - :cond_2c7 - const/4 v4, 0x0 - goto/16 :goto_234 - :cond_2ca - iget-object v11, v9, LTest;->a:LTest; - iget-object v4, v11, LTest;->a:LTest; - if-eqz v4, :cond_325 - iget-wide v4, v11, LTest;->d:J - cmp-long v4, v16, v4 - if-nez v4, :cond_325 - iget-object v4, v11, LTest;->a:LTest; - :goto_2d8 - if-nez v4, :cond_243 - invoke-virtual {v10}, LTest;->a()Ljava/lang/String; - move-result-object v5 - iget v6, v10, LTest;->k:I - const/4 v7, 0x3 - if-ne v6, v7, :cond_4e1 - const-string v6, "" - invoke-virtual {v5, v6}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String; - move-result-object v5 - array-length v6, v5 - const/4 v7, 0x5 - if-ne v6, v7, :cond_2f7 - const/4 v6, 0x0 - aget-object v6, v5, v6 - invoke-static {v6}, LTest;->a(Ljava/lang/String;)I - move-result v6 - const/4 v7, 0x3 - if-eq v6, v7, :cond_489 - :cond_2f7 - const/4 v5, 0x0 - :goto_2f8 - if-eqz v5, :cond_2fe - iget-object v6, v9, LTest;->a:LTest; - iput-object v5, v6, LTest;->f:Ljava/lang/String; - :cond_2fe - iget-object v5, v9, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->b()J - move-result-wide v6 - iget-wide v0, v9, LTest;->g:J - move-wide/from16 v16, v0 - sub-long v16, v6, v16 - iget-wide v0, v9, LTest;->e:J - move-wide/from16 v18, v0 - cmp-long v5, v16, v18 - if-lez v5, :cond_243 - iget-wide v0, v9, LTest;->f:J - move-wide/from16 v16, v0 - sub-long v16, v6, v16 - iget-object v5, v9, LTest;->a:LTest; - iget-object v5, v5, LTest;->a:LTest; - move-wide/from16 v0, v16 - invoke-virtual {v5, v0, v1}, LTest;->a(J)V - iput-wide v6, v9, LTest;->g:J - goto/16 :goto_243 - :cond_325 - iget-object v4, v11, LTest;->a:LTest; - const/4 v5, 0x1 - move-wide/from16 v0, v16 - invoke-virtual {v4, v0, v1, v5}, LTest;->a(JZ)[B - move-result-object v5 - if-nez v5, :cond_332 - const/4 v4, 0x0 - goto :goto_2d8 - :cond_332 - iget-object v0, v11, LTest;->a:LTest; - move-object/from16 v18, v0 - new-instance v4, LTest; - sget-object v6, LTest;->P:LTest; - invoke-direct {v4, v6}, LTest;-><init>(LTest;)V - array-length v6, v5 - const/4 v7, 0x6 - if-ge v6, v7, :cond_346 - const/4 v4, 0x0 - :cond_342 - :goto_342 - if-nez v4, :cond_481 - const/4 v4, 0x0 - goto :goto_2d8 - :cond_346 - const/4 v6, 0x0 - invoke-static {v5, v6}, LTest;->b([BI)I - move-result v19 - const/4 v6, 0x3 - move-object/from16 v0, v18 - move/from16 v1, v19 - invoke-virtual {v0, v1, v5, v6}, LTest;->a(I[BI)[D - move-result-object v6 - if-eqz v6, :cond_35d - array-length v7, v6 - const/16 v20, 0x3 - move/from16 v0, v20 - if-eq v7, v0, :cond_35f - :cond_35d - const/4 v4, 0x0 - goto :goto_342 - :cond_35f - const/4 v7, 0x2 - const/16 v20, 0x0 - aget-wide v20, v6, v20 - const-wide v22, 0x416312d000000000L # 1.0E7 - mul-double v20, v20, v22 - move-wide/from16 v0, v20 - double-to-int v0, v0 - move/from16 v20, v0 - move/from16 v0, v20 - int-to-long v0, v0 - move-wide/from16 v20, v0 - move-wide/from16 v0, v20 - invoke-virtual {v4, v7, v0, v1}, LTest;->b(IJ)LTest; - const/4 v7, 0x3 - const/16 v20, 0x1 - aget-wide v20, v6, v20 - const-wide v22, 0x416312d000000000L # 1.0E7 - mul-double v20, v20, v22 - move-wide/from16 v0, v20 - double-to-int v0, v0 - move/from16 v20, v0 - move/from16 v0, v20 - int-to-long v0, v0 - move-wide/from16 v20, v0 - move-wide/from16 v0, v20 - invoke-virtual {v4, v7, v0, v1}, LTest;->b(IJ)LTest; - const/4 v7, 0x4 - const/16 v20, 0x2 - aget-wide v20, v6, v20 - move-wide/from16 v0, v20 - double-to-float v6, v0 - invoke-virtual {v4, v7, v6}, LTest;->b(IF)LTest; - array-length v6, v5 - const/4 v7, 0x6 - if-eq v6, v7, :cond_47e - array-length v6, v5 - add-int/lit8 v6, v6, -0x6 - new-array v0, v6, [B - move-object/from16 v20, v0 - const/4 v7, 0x6 - const/16 v21, 0x0 - move-object/from16 v0, v20 - move/from16 v1, v21 - invoke-static {v5, v7, v0, v1, v6}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V - new-instance v21, LTest; - move-object/from16 v0, v21 - move-object/from16 v1, v20 - invoke-direct {v0, v1}, LTest;-><init>([B)V - const/4 v5, 0x0 - move-object/from16 v0, v21 - iput v5, v0, LTest;->a:I - :goto_3c3 - move-object/from16 v0, v21 - iget v5, v0, LTest;->a:I - move-object/from16 v0, v21 - iget-object v6, v0, LTest;->b:[B - array-length v6, v6 - add-int/lit8 v6, v6, -0x1 - if-ge v5, v6, :cond_47e - move-object/from16 v0, v21 - iget v6, v0, LTest;->a:I - invoke-virtual/range {v21 .. v21}, LTest;->a()I - move-result v5 - move-object/from16 v0, v20 - array-length v7, v0 - add-int/2addr v5, v6 - if-ge v7, v5, :cond_3e7 - const/4 v5, 0x0 - :goto_3df - if-nez v5, :cond_46b - const/4 v5, 0x0 - :goto_3e2 - if-nez v5, :cond_342 - const/4 v4, 0x0 - goto/16 :goto_342 - :cond_3e7 - new-instance v5, LTest; - sget-object v7, LTest;->P:LTest; - invoke-direct {v5, v7}, LTest;-><init>(LTest;)V - move-object/from16 v0, v20 - invoke-static {v0, v6}, LTest;->a([BI)I - move-result v22 - add-int/lit8 v6, v6, 0x1 - aget-byte v23, v20, v6 - add-int/lit8 v7, v6, 0x1 - const/4 v6, 0x0 - :goto_3fb - move/from16 v0, v22 - if-ge v6, v0, :cond_41a - move-object/from16 v0, v20 - move/from16 v1, v23 - invoke-static {v0, v7, v1, v6}, LTest;->a([BIBI)I - move-result v24 - const/16 v25, 0x2 - move/from16 v0, v24 - int-to-long v0, v0 - move-wide/from16 v26, v0 - move/from16 v0, v25 - move-wide/from16 v1, v26 - invoke-virtual {v5, v0, v1, v2}, LTest;->a(IJ)V - add-int/lit8 v7, v7, 0x1 - add-int/lit8 v6, v6, 0x1 - goto :goto_3fb - :cond_41a - move-object/from16 v0, v18 - move/from16 v1, v19 - move-object/from16 v2, v20 - invoke-virtual {v0, v1, v2, v7}, LTest;->a(I[BI)[D - move-result-object v6 - if-nez v6, :cond_428 - const/4 v5, 0x0 - goto :goto_3df - :cond_428 - const/4 v7, 0x3 - const/16 v22, 0x0 - aget-wide v22, v6, v22 - const-wide v24, 0x416312d000000000L # 1.0E7 - mul-double v22, v22, v24 - move-wide/from16 v0, v22 - double-to-int v0, v0 - move/from16 v22, v0 - move/from16 v0, v22 - int-to-long v0, v0 - move-wide/from16 v22, v0 - move-wide/from16 v0, v22 - invoke-virtual {v5, v7, v0, v1}, LTest;->a(IJ)V - const/4 v7, 0x4 - const/16 v22, 0x1 - aget-wide v22, v6, v22 - const-wide v24, 0x416312d000000000L # 1.0E7 - mul-double v22, v22, v24 - move-wide/from16 v0, v22 - double-to-int v0, v0 - move/from16 v22, v0 - move/from16 v0, v22 - int-to-long v0, v0 - move-wide/from16 v22, v0 - move-wide/from16 v0, v22 - invoke-virtual {v5, v7, v0, v1}, LTest;->a(IJ)V - const/4 v7, 0x5 - const/16 v22, 0x2 - aget-wide v22, v6, v22 - move-wide/from16 v0, v22 - double-to-float v6, v0 - invoke-virtual {v5, v7, v6}, LTest;->a(IF)V - goto/16 :goto_3df - :cond_46b - const/4 v6, 0x5 - invoke-virtual {v4, v6, v5}, LTest;->a(ILjava/lang/Object;)V - move-object/from16 v0, v21 - iget v5, v0, LTest;->a:I - invoke-virtual/range {v21 .. v21}, LTest;->a()I - move-result v6 - add-int/2addr v5, v6 - move-object/from16 v0, v21 - iput v5, v0, LTest;->a:I - goto/16 :goto_3c3 - :cond_47e - const/4 v5, 0x1 - goto/16 :goto_3e2 - :cond_481 - iput-object v4, v11, LTest;->a:LTest; - move-wide/from16 v0, v16 - iput-wide v0, v11, LTest;->d:J - goto/16 :goto_2d8 - :cond_489 - new-instance v6, Ljava/lang/StringBuilder; - invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V - const/4 v7, 0x0 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x1 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x2 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x4 - aget-object v7, v5, v7 - invoke-static {v7}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I - move-result v7 - shr-int/lit8 v7, v7, 0x10 - const v11, 0xffff - and-int/2addr v7, v11 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x4 - aget-object v5, v5, v7 - invoke-static {v5}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I - move-result v5 - const v7, 0xffff - and-int/2addr v5, v7 - invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; - move-result-object v5 - invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - move-result-object v5 - goto/16 :goto_2f8 - :cond_4e1 - iget v6, v10, LTest;->k:I - const/4 v7, 0x4 - if-ne v6, v7, :cond_536 - const-string v6, "" - invoke-virtual {v5, v6}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String; - move-result-object v5 - array-length v6, v5 - const/4 v7, 0x4 - if-ne v6, v7, :cond_4fa - const/4 v6, 0x0 - aget-object v6, v5, v6 - invoke-static {v6}, LTest;->a(Ljava/lang/String;)I - move-result v6 - const/4 v7, 0x4 - if-eq v6, v7, :cond_4fd - :cond_4fa - const/4 v5, 0x0 - goto/16 :goto_2f8 - :cond_4fd - new-instance v6, Ljava/lang/StringBuilder; - invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V - const/4 v7, 0x0 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x1 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x2 - aget-object v7, v5, v7 - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const-string v7, "" - invoke-virtual {v6, v7}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v6 - const/4 v7, 0x3 - aget-object v5, v5, v7 - invoke-virtual {v6, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - move-result-object v5 - invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - move-result-object v5 - goto/16 :goto_2f8 - :cond_536 - const/4 v5, 0x0 - goto/16 :goto_2f8 - :cond_539 - const/4 v4, 0x0 - goto/16 :goto_260 - :cond_53c - const/4 v4, 0x0 - goto/16 :goto_273 - :cond_53f - const/4 v4, 0x0 - move-object v6, v4 - goto/16 :goto_282 - :cond_543 - iget-object v5, v8, LTest;->a:LTest; - iget-object v5, v5, LTest;->a:LTest; - iget-object v6, v10, LTest;->j:Ljava/util/Collection; - invoke-interface {v6}, Ljava/util/Collection;->size()I - move-result v6 - iget v7, v5, LTest;->e:I - add-int/2addr v6, v7 - iput v6, v5, LTest;->e:I - invoke-virtual {v8, v10, v4}, LTest;->a(LTest;LTest;)LTest; - move-result-object v6 - if-eqz v6, :cond_578 - iget-object v4, v8, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget v5, v4, LTest;->c:I - add-int/lit8 v5, v5, 0x1 - iput v5, v4, LTest;->c:I - iget-wide v4, v8, LTest;->c:J - const-wide/16 v16, 0x1 - add-long v4, v4, v16 - iput-wide v4, v8, LTest;->c:J - new-instance v4, LTest; - const/4 v5, 0x2 - sget-object v7, LTest;->P:LTest; - iget-wide v8, v10, LTest;->i:J - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v6, v4 - goto/16 :goto_282 - :cond_578 - const/4 v4, 0x0 - move-object v6, v4 - goto/16 :goto_282 - :cond_57c - const/4 v4, 0x0 - invoke-virtual {v12, v10, v4, v14, v15}, LTest;->a(LTest;Ljava/util/Map;J)LTest; - move-result-object v4 - if-nez v4, :cond_5a1 - iget-object v4, v12, LTest;->a:LTest; - invoke-interface {v4}, LTest;->c()J - move-result-wide v4 - invoke-virtual {v10, v4, v5}, LTest;->a(J)LTest; - move-result-object v4 - move-object/from16 v0, p3 - invoke-virtual {v0, v4}, LTest;->a(LTest;)V - new-instance v4, LTest; - const/4 v5, 0x1 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - const-wide/16 v8, 0x0 - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - goto/16 :goto_2c - :cond_5a1 - invoke-virtual {v4}, LTest;->b()Z - move-result v4 - if-nez v4, :cond_5b6 - new-instance v4, LTest; - const/4 v5, 0x0 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - const-wide/16 v8, 0x0 - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - goto/16 :goto_2c - :cond_5b6 - if-nez v13, :cond_60a - const/4 v4, 0x0 - :goto_5b9 - new-instance v16, LTest; - add-int/lit8 v4, v4, 0x1 - move-object/from16 v0, v16 - invoke-direct {v0, v4}, LTest;-><init>(I)V - new-instance v11, LTest; - const/4 v13, 0x0 - invoke-direct/range {v11 .. v16}, LTest;-><init>(LTest;Ljava/util/Map;JLTest;)V - iget-wide v0, v10, LTest;->i:J - move-wide/from16 v18, v0 - const-wide/16 v20, 0x7530 - move-object/from16 v17, p2 - move-object/from16 v22, v11 - invoke-virtual/range {v17 .. v22}, LTest;->a(JJLTest;)V - new-instance v6, LTest; - invoke-virtual/range {v16 .. v16}, LTest;->a()D - move-result-wide v4 - invoke-static {v4, v5}, LTest;->a(D)I - move-result v4 - invoke-virtual/range {v16 .. v16}, LTest;->b()D - move-result-wide v8 - invoke-static {v8, v9}, LTest;->a(D)I - move-result v5 - invoke-virtual/range {v16 .. v16}, LTest;->c()I - move-result v7 - invoke-static {v7}, LTest;->b(I)I - move-result v7 - move-object/from16 v0, v16 - iget v8, v0, LTest;->d:I - invoke-direct {v6, v4, v5, v7, v8}, LTest;-><init>(IIII)V - invoke-static {v6}, LTest;->c(LTest;)Z - move-result v4 - if-eqz v4, :cond_60f - new-instance v4, LTest; - const/4 v5, 0x1 - sget-object v7, LTest;->P:LTest; - iget-wide v8, v10, LTest;->i:J - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - goto/16 :goto_2c - :cond_60a - invoke-interface {v13}, Ljava/util/LTest;->size()I - move-result v4 - goto :goto_5b9 - :cond_60f - new-instance v4, LTest; - const/4 v5, 0x0 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - const-wide/16 v8, 0x0 - const/4 v11, 0x0 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - move-object v14, v4 - goto/16 :goto_2c - :cond_61e - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget v6, v5, LTest;->d:I - add-int/lit8 v6, v6, 0x1 - iput v6, v5, LTest;->d:I - invoke-virtual {v4}, LTest;->c()J - move-result-wide v6 - iput-wide v6, v5, LTest;->f:J - move-object/from16 v0, p1 - invoke-virtual {v8, v0}, LTest;->a(LTest;)LTest; - move-result-object v6 - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->a()V - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->b()J - move-result-wide v10 - iget-wide v12, v4, LTest;->m:J - sub-long v12, v10, v12 - iget-wide v0, v4, LTest;->k:J - move-wide/from16 v16, v0 - cmp-long v5, v12, v16 - if-lez v5, :cond_65f - iget-wide v12, v4, LTest;->l:J - sub-long v12, v10, v12 - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5, v12, v13}, LTest;->a(J)V - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5, v12, v13}, LTest;->a(J)V - iput-wide v10, v4, LTest;->m:J - :cond_65f - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->a()V - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->a()V - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->a()V - iget-object v4, v4, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->a()V - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-wide v10, v5, LTest;->f:J - const-wide/16 v12, -0x1 - cmp-long v7, v10, v12 - if-eqz v7, :cond_698 - invoke-virtual {v4}, LTest;->c()J - move-result-wide v10 - iget-wide v12, v5, LTest;->f:J - sub-long/2addr v10, v12 - const-wide/16 v12, -0x1 - iput-wide v12, v5, LTest;->f:J - const-wide/16 v12, 0x0 - cmp-long v4, v10, v12 - if-ltz v4, :cond_698 - const-wide/16 v12, 0x7530 - cmp-long v4, v10, v12 - if-lez v4, :cond_6b0 - :cond_698 - :goto_698 - const/4 v4, 0x0 - if-eqz v6, :cond_53 - new-instance v4, LTest; - const/4 v5, 0x4 - sget-object v7, LTest;->P:LTest; - iget-object v8, v8, LTest;->a:LTest; - iget-object v8, v8, LTest;->a:LTest; - invoke-virtual {v8}, LTest;->c()J - move-result-wide v8 - const/4 v11, 0x0 - move-object/from16 v10, p1 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - goto/16 :goto_53 - :cond_6b0 - long-to-int v4, v10 - iput v4, v5, LTest;->a:I - if-eqz v6, :cond_6c0 - iget v4, v5, LTest;->e:I - add-int/lit8 v4, v4, 0x1 - iput v4, v5, LTest;->e:I - iget v4, v5, LTest;->a:I - iput v4, v5, LTest;->b:I - goto :goto_698 - :cond_6c0 - iget v4, v5, LTest;->a:I - iput v4, v5, LTest;->c:I - goto :goto_698 - :cond_6c5 - const/4 v4, 0x0 - goto/16 :goto_53 - :cond_6c8 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - invoke-virtual {v4}, LTest;->b()Z - move-result v5 - if-eqz v5, :cond_91d - iget-object v8, v4, LTest;->a:LTest; - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-boolean v4, v5, LTest;->d:Z - if-nez v4, :cond_716 - sget-object v4, LTest;->P:LTest; - :goto_6de - iput-object v4, v8, LTest;->a:LTest; - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v8, LTest;->a:LTest; - iget-object v5, v5, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->b()J - move-result-wide v6 - invoke-virtual {v4, v6, v7}, LTest;->a(J)V - if-nez p1, :cond_721 - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x3 - iget-object v6, v8, LTest;->a:LTest; - iget-object v6, v6, LTest;->a:LTest; - invoke-virtual {v6}, LTest;->b()J - move-result-wide v6 - invoke-virtual {v4, v5, v6, v7}, LTest;->a(IJ)V - const/4 v4, 0x0 - :goto_6fe - if-eqz v4, :cond_920 - iget-object v5, v4, LTest;->a:LTest; - sget-object v6, LTest;->P:LTest; - if-ne v5, v6, :cond_9cc - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->a:LTest; - move-object/from16 v0, p1 - move-object/from16 v1, p4 - move-object/from16 v2, p3 - invoke-virtual {v5, v0, v1, v2}, LTest;->a(LTest;LTest;LTest;)LTest; - move-object v12, v4 - goto/16 :goto_56 - :cond_716 - new-instance v4, LTest; - invoke-direct {v4}, LTest;-><init>()V - iget-object v5, v5, LTest;->a:LTest; - invoke-virtual {v5, v4}, LTest;->a(Ljava/lang/Object;)Ljava/lang/Object; - goto :goto_6de - :cond_721 - iget-object v4, v8, LTest;->a:LTest; - move-object/from16 v0, p1 - invoke-virtual {v4, v0}, LTest;->a(LTest;)V - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - const-string v6, "" - invoke-virtual {v5, v6}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v5 - iget v6, v5, LTest;->c:I - add-int/lit8 v6, v6, 0x1 - iput v6, v5, LTest;->c:I - invoke-virtual {v4}, LTest;->c()J - move-result-wide v6 - iput-wide v6, v5, LTest;->b:J - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - const-string v6, "" - invoke-virtual {v5, v6}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v5 - iget v6, v5, LTest;->c:I - add-int/lit8 v6, v6, 0x1 - iput v6, v5, LTest;->c:I - invoke-virtual {v4}, LTest;->c()J - move-result-wide v6 - iput-wide v6, v5, LTest;->b:J - move-object/from16 v0, p1 - invoke-virtual {v8, v0}, LTest;->a(LTest;)Z - move-result v4 - iget-object v5, v8, LTest;->a:LTest; - iget-object v6, v5, LTest;->a:LTest; - iget-object v5, v5, LTest;->a:LTest; - const-string v7, "" - invoke-virtual {v6, v7}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v6 - iget-wide v10, v6, LTest;->b:J - const-wide/16 v12, -0x1 - cmp-long v7, v10, v12 - if-eqz v7, :cond_789 - invoke-virtual {v5}, LTest;->c()J - move-result-wide v10 - iget-wide v12, v6, LTest;->b:J - sub-long/2addr v10, v12 - const-wide/16 v12, -0x1 - iput-wide v12, v6, LTest;->b:J - const-wide/16 v12, 0x0 - cmp-long v5, v10, v12 - if-ltz v5, :cond_789 - const-wide/16 v12, 0x7530 - cmp-long v5, v10, v12 - if-lez v5, :cond_83e - :cond_789 - :goto_789 - if-eqz v4, :cond_793 - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->c()Z - move-result v4 - if-eqz v4, :cond_843 - :cond_793 - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->a()V - const/4 v6, 0x0 - :goto_799 - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x0 - invoke-virtual {v4, v5}, LTest;->a(Ljava/util/LTest;)V - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->a()V - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->b()J - move-result-wide v10 - iget-wide v12, v4, LTest;->q:J - sub-long v12, v10, v12 - iget-wide v0, v4, LTest;->o:J - move-wide/from16 v16, v0 - cmp-long v5, v12, v16 - if-lez v5, :cond_7c3 - iget-wide v12, v4, LTest;->p:J - sub-long v12, v10, v12 - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5, v12, v13}, LTest;->a(J)V - iput-wide v10, v4, LTest;->q:J - :cond_7c3 - iget-wide v12, v4, LTest;->s:J - sub-long v12, v10, v12 - iget-wide v0, v4, LTest;->r:J - move-wide/from16 v16, v0 - cmp-long v5, v12, v16 - if-lez v5, :cond_7d6 - iget-object v5, v4, LTest;->a:LTest; - invoke-virtual {v5}, LTest;->a()V - iput-wide v10, v4, LTest;->s:J - :cond_7d6 - iget-object v4, v4, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->a()V - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - const-string v7, "" - invoke-virtual {v5, v7}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v7 - iget-wide v10, v7, LTest;->b:J - const-wide/16 v12, -0x1 - cmp-long v9, v10, v12 - if-eqz v9, :cond_806 - invoke-virtual {v4}, LTest;->c()J - move-result-wide v10 - iget-wide v12, v7, LTest;->b:J - sub-long/2addr v10, v12 - const-wide/16 v12, -0x1 - iput-wide v12, v7, LTest;->b:J - const-wide/16 v12, 0x0 - cmp-long v4, v10, v12 - if-ltz v4, :cond_806 - const-wide/16 v12, 0x7530 - cmp-long v4, v10, v12 - if-lez v4, :cond_8d7 - :cond_806 - :goto_806 - if-eqz v6, :cond_8dc - iget v4, v5, LTest;->f:I - add-int/lit8 v4, v4, 0x1 - iput v4, v5, LTest;->f:I - iget v4, v7, LTest;->a:I - iput v4, v5, LTest;->g:I - :goto_812 - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->c()Z - move-result v4 - if-eqz v4, :cond_8e2 - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x7 - iget-object v6, v8, LTest;->a:LTest; - iget-object v6, v6, LTest;->a:LTest; - invoke-virtual {v6}, LTest;->b()J - move-result-wide v6 - invoke-virtual {v4, v5, v6, v7}, LTest;->a(IJ)V - new-instance v4, LTest; - const/4 v5, 0x0 - const/4 v6, 0x0 - sget-object v7, LTest;->P:LTest; - iget-object v8, v8, LTest;->a:LTest; - iget-object v8, v8, LTest;->a:LTest; - invoke-virtual {v8}, LTest;->c()J - move-result-wide v8 - const/4 v11, 0x0 - move-object/from16 v10, p1 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - goto/16 :goto_6fe - :cond_83e - long-to-int v5, v10 - iput v5, v6, LTest;->a:I - goto/16 :goto_789 - :cond_843 - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - const-string v6, "" - invoke-virtual {v5, v6}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v5 - iget v6, v5, LTest;->c:I - add-int/lit8 v6, v6, 0x1 - iput v6, v5, LTest;->c:I - invoke-virtual {v4}, LTest;->c()J - move-result-wide v6 - iput-wide v6, v5, LTest;->b:J - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->b()LTest; - move-result-object v4 - iput-object v4, v8, LTest;->a:LTest; - iget-object v4, v8, LTest;->a:LTest; - iget-object v5, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->a:LTest; - const-string v6, "" - invoke-virtual {v5, v6}, LTest;->a(Ljava/lang/String;)LTest; - move-result-object v5 - iget-wide v6, v5, LTest;->b:J - const-wide/16 v10, -0x1 - cmp-long v6, v6, v10 - if-eqz v6, :cond_88e - invoke-virtual {v4}, LTest;->c()J - move-result-wide v6 - iget-wide v10, v5, LTest;->b:J - sub-long/2addr v6, v10 - const-wide/16 v10, -0x1 - iput-wide v10, v5, LTest;->b:J - const-wide/16 v10, 0x0 - cmp-long v4, v6, v10 - if-ltz v4, :cond_88e - const-wide/16 v10, 0x7530 - cmp-long v4, v6, v10 - if-lez v4, :cond_8a7 - :cond_88e - :goto_88e - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4}, LTest;->b()Z - move-result v4 - if-nez v4, :cond_8ab - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x4 - iget-object v6, v8, LTest;->a:LTest; - iget-object v6, v6, LTest;->a:LTest; - invoke-virtual {v6}, LTest;->b()J - move-result-wide v6 - invoke-virtual {v4, v5, v6, v7}, LTest;->a(IJ)V - const/4 v6, 0x0 - goto/16 :goto_799 - :cond_8a7 - long-to-int v4, v6 - iput v4, v5, LTest;->a:I - goto :goto_88e - :cond_8ab - iget-object v4, v8, LTest;->a:LTest; - iget-wide v4, v4, LTest;->a:J - const/4 v6, 0x2 - new-array v6, v6, [I - invoke-static {v4, v5, v6}, LTest;->a(J[I)[I - move-result-object v4 - iget-object v5, v8, LTest;->a:LTest; - iget-object v6, v8, LTest;->a:LTest; - iget-object v6, v6, LTest;->a:LTest; - iget v6, v6, LTest;->b:I - iget-object v7, v8, LTest;->a:LTest; - iget-object v7, v7, LTest;->a:LTest; - iget v7, v7, LTest;->b:I - invoke-virtual {v5, v6, v7, v4}, LTest;->a(II[I)I - move-result v5 - new-instance v6, LTest; - const/4 v7, 0x0 - aget v7, v4, v7 - const/4 v9, 0x1 - aget v4, v4, v9 - const/16 v9, 0x6d - invoke-direct {v6, v7, v4, v5, v9}, LTest;-><init>(IIII)V - goto/16 :goto_799 - :cond_8d7 - long-to-int v4, v10 - iput v4, v7, LTest;->a:I - goto/16 :goto_806 - :cond_8dc - iget v4, v7, LTest;->a:I - iput v4, v5, LTest;->h:I - goto/16 :goto_812 - :cond_8e2 - if-nez v6, :cond_8f5 - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x5 - iget-object v6, v8, LTest;->a:LTest; - iget-object v6, v6, LTest;->a:LTest; - invoke-virtual {v6}, LTest;->b()J - move-result-wide v6 - invoke-virtual {v4, v5, v6, v7}, LTest;->a(IJ)V - const/4 v4, 0x0 - goto/16 :goto_6fe - :cond_8f5 - iget-object v4, v8, LTest;->a:LTest; - invoke-virtual {v4, v6}, LTest;->a(LTest;)V - iget-object v4, v8, LTest;->a:LTest; - const/4 v5, 0x1 - iget-object v7, v8, LTest;->a:LTest; - iget-object v7, v7, LTest;->a:LTest; - invoke-virtual {v7}, LTest;->b()J - move-result-wide v10 - invoke-virtual {v4, v5, v10, v11}, LTest;->a(IJ)V - new-instance v4, LTest; - const/4 v5, 0x5 - sget-object v7, LTest;->P:LTest; - iget-object v8, v8, LTest;->a:LTest; - iget-object v8, v8, LTest;->a:LTest; - invoke-virtual {v8}, LTest;->c()J - move-result-wide v8 - const/4 v11, 0x0 - move-object/from16 v10, p1 - invoke-direct/range {v4 .. v11}, LTest;-><init>(ILTest;LTest;JLTest;Ljava/util/Map;)V - goto/16 :goto_6fe - :cond_91d - const/4 v4, 0x0 - goto/16 :goto_6fe - :cond_920 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - move-object/from16 v0, p1 - move-object/from16 v1, p4 - move-object/from16 v2, p3 - invoke-virtual {v4, v0, v1, v2}, LTest;->a(LTest;LTest;LTest;)LTest; - move-result-object v4 - move-object v12, v4 - goto/16 :goto_56 - :cond_931 - const/4 v4, 0x0 - goto/16 :goto_5d - :cond_934 - const/4 v5, 0x0 - goto/16 :goto_64 - :cond_937 - if-nez v4, :cond_93c - move-object v13, v14 - goto/16 :goto_6a - :cond_93c - if-eqz v5, :cond_973 - iget-object v5, v12, LTest;->a:LTest; - iget-object v6, v14, LTest;->a:LTest; - invoke-static {v5, v6}, LTest;->a(LTest;LTest;)I - move-result v4 - iget v7, v5, LTest;->e:I - iget v8, v6, LTest;->e:I - add-int/2addr v7, v8 - const v8, 0x3567e0 - invoke-static {v7, v8}, Ljava/lang/Math;->max(II)I - move-result v7 - div-int/lit16 v7, v7, 0x3e8 - if-gt v4, v7, :cond_965 - const/4 v4, 0x1 - :goto_957 - if-eqz v4, :cond_969 - iget v4, v5, LTest;->e:I - iget v5, v6, LTest;->e:I - if-le v4, v5, :cond_967 - const/4 v4, 0x1 - :goto_960 - if-eqz v4, :cond_973 - move-object v13, v14 - goto/16 :goto_6a - :cond_965 - const/4 v4, 0x0 - goto :goto_957 - :cond_967 - const/4 v4, 0x0 - goto :goto_960 - :cond_969 - iget v4, v5, LTest;->f:I - iget v5, v6, LTest;->f:I - if-ge v4, v5, :cond_971 - const/4 v4, 0x1 - goto :goto_960 - :cond_971 - const/4 v4, 0x0 - goto :goto_960 - :cond_973 - move-object v13, v12 - goto/16 :goto_6a - :cond_976 - const/4 v4, 0x1 - move v11, v4 - move v15, v5 - goto/16 :goto_7b - :cond_97b - const/4 v4, 0x0 - goto/16 :goto_84 - :pswitch_97e - const-string v7, "" - goto/16 :goto_8c - :pswitch_982 - const-string v7, "" - goto/16 :goto_8c - :pswitch_986 - const-string v7, "" - goto/16 :goto_8c - :pswitch_98a - const-string v7, "" - goto/16 :goto_8c - :cond_98e - const/4 v4, 0x0 - goto/16 :goto_a3 - :pswitch_991 - const-string v7, "" - goto/16 :goto_ab - :pswitch_995 - const-string v7, "" - goto/16 :goto_ab - :cond_999 - if-eqz v11, :cond_9ad - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - const-string v5, "" - const-string v6, "" - const-string v7, "" - const-wide/16 v8, 0x1 - const/4 v10, 0x1 - invoke-virtual/range {v4 .. v10}, LTest;->a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V - goto/16 :goto_cd - :cond_9ad - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->a:LTest; - const-string v5, "" - const-string v6, "" - const-string v7, "" - const-wide/16 v8, 0x1 - const/4 v10, 0x1 - invoke-virtual/range {v4 .. v10}, LTest;->a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V - goto/16 :goto_cd - :cond_9bf - const-wide/16 v8, 0x0 - move-wide/from16 v16, v8 - goto/16 :goto_149 - :cond_9c5 - const/4 v4, 0x0 - goto/16 :goto_217 - :cond_9c8 - move v11, v4 - move v15, v5 - goto/16 :goto_7b - :cond_9cc - move-object v12, v4 - goto/16 :goto_56 - :cond_9cf - move-object v13, v4 - goto/16 :goto_17 - :pswitch_data_9d2 - .packed-switch 0x1 - :pswitch_97e - :pswitch_982 - :pswitch_8c - :pswitch_986 - :pswitch_98a - .end packed-switch - :pswitch_data_9e0 - .packed-switch 0x1 - :pswitch_991 - :pswitch_995 - .end packed-switch -.end method \ No newline at end of file
diff --git a/src/test/smali/chain-of-loops/Test.java b/src/test/smali/chain-of-loops/Test.java deleted file mode 100644 index 77d335d..0000000 --- a/src/test/smali/chain-of-loops/Test.java +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - public int b(int i, String s) { - throw new RuntimeException("b(ILjava/lang/String;)"); - } - - public int b(Test t) { - throw new RuntimeException("b(LTest;)"); - } - - public static int f(int i0, int i1) { - throw new RuntimeException("f(II)"); - } - - public static void main(String[] args) { - try { - new TestObject().method(); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/chain-of-loops/TestObject.java b/src/test/smali/chain-of-loops/TestObject.java deleted file mode 100644 index 85cb78a..0000000 --- a/src/test/smali/chain-of-loops/TestObject.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public final int method() { - return 0; - } -}
diff --git a/src/test/smali/chain-of-loops/TestObject.smali b/src/test/smali/chain-of-loops/TestObject.smali deleted file mode 100644 index ff971cb..0000000 --- a/src/test/smali/chain-of-loops/TestObject.smali +++ /dev/null
@@ -1,1034 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field public i:I -.field public e:Ljava/lang/String; -.field public z:Ljava/lang/String; -.field public f:LTest; -.field public a:[LTest; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final method()I - .registers 7 - .prologue - const/4 v5, 0x1 - const/4 v1, 0x0 - invoke-virtual {p0}, LTestObject;->method2()I - move-result v0 - iget-object v2, p0, LTestObject;->e:Ljava/lang/String; - if-eqz v2, :cond_1b - iget-object v2, p0, LTestObject;->e:Ljava/lang/String; - const-string v3, "" - invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - move-result v2 - if-nez v2, :cond_1b - iget-object v2, p0, LTestObject;->e:Ljava/lang/String; - invoke-static {v5, v2}, LTest;->b(ILjava/lang/String;)I - move-result v2 - add-int/2addr v0, v2 - :cond_1b - iget-object v2, p0, LTestObject;->f:LTest; - if-eqz v2, :cond_27 - const/4 v2, 0x2 - iget-object v3, p0, LTestObject;->f:LTest; - invoke-static {v2, v3}, LTest;->d(ILTest;)I - move-result v2 - add-int/2addr v0, v2 - :cond_27 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_47 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_47 - move v2, v0 - move v0, v1 - :goto_32 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_46 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_43 - const/4 v4, 0x3 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_43 - add-int/lit8 v0, v0, 0x1 - goto :goto_32 - :cond_46 - move v0, v2 - :cond_47 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_67 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_67 - move v2, v0 - move v0, v1 - :goto_52 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_66 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_63 - const/4 v4, 0x4 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_63 - add-int/lit8 v0, v0, 0x1 - goto :goto_52 - :cond_66 - move v0, v2 - :cond_67 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_87 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_87 - move v2, v0 - move v0, v1 - :goto_72 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_86 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_83 - const/4 v4, 0x5 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_83 - add-int/lit8 v0, v0, 0x1 - goto :goto_72 - :cond_86 - move v0, v2 - :cond_87 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_a7 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_a7 - move v2, v0 - move v0, v1 - :goto_92 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_a6 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_a3 - const/4 v4, 0x6 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_a3 - add-int/lit8 v0, v0, 0x1 - goto :goto_92 - :cond_a6 - move v0, v2 - :cond_a7 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_c7 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_c7 - move v2, v0 - move v0, v1 - :goto_b2 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_c6 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_c3 - const/4 v4, 0x7 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_c3 - add-int/lit8 v0, v0, 0x1 - goto :goto_b2 - :cond_c6 - move v0, v2 - :cond_c7 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_e8 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_e8 - move v2, v0 - move v0, v1 - :goto_d2 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_e7 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_e4 - const/16 v4, 0x8 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_e4 - add-int/lit8 v0, v0, 0x1 - goto :goto_d2 - :cond_e7 - move v0, v2 - :cond_e8 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_109 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_109 - move v2, v0 - move v0, v1 - :goto_f3 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_108 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_105 - const/16 v4, 0x9 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_105 - add-int/lit8 v0, v0, 0x1 - goto :goto_f3 - :cond_108 - move v0, v2 - :cond_109 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_12a - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_12a - move v2, v0 - move v0, v1 - :goto_114 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_129 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_126 - const/16 v4, 0xa - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_126 - add-int/lit8 v0, v0, 0x1 - goto :goto_114 - :cond_129 - move v0, v2 - :cond_12a - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_14b - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_14b - move v2, v0 - move v0, v1 - :goto_135 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_14a - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_147 - const/16 v4, 0xb - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_147 - add-int/lit8 v0, v0, 0x1 - goto :goto_135 - :cond_14a - move v0, v2 - :cond_14b - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_16c - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_16c - move v2, v0 - move v0, v1 - :goto_156 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_16b - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_168 - const/16 v4, 0xc - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_168 - add-int/lit8 v0, v0, 0x1 - goto :goto_156 - :cond_16b - move v0, v2 - :cond_16c - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_18d - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_18d - move v2, v0 - move v0, v1 - :goto_177 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_18c - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_189 - const/16 v4, 0xd - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_189 - add-int/lit8 v0, v0, 0x1 - goto :goto_177 - :cond_18c - move v0, v2 - :cond_18d - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_1ae - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_1ae - move v2, v0 - move v0, v1 - :goto_198 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_1ad - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_1aa - const/16 v4, 0xe - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_1aa - add-int/lit8 v0, v0, 0x1 - goto :goto_198 - :cond_1ad - move v0, v2 - :cond_1ae - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_1cf - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_1cf - move v2, v0 - move v0, v1 - :goto_1b9 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_1ce - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_1cb - const/16 v4, 0xf - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_1cb - add-int/lit8 v0, v0, 0x1 - goto :goto_1b9 - :cond_1ce - move v0, v2 - :cond_1cf - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_1f0 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_1f0 - move v2, v0 - move v0, v1 - :goto_1da - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_1ef - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_1ec - const/16 v4, 0x10 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_1ec - add-int/lit8 v0, v0, 0x1 - goto :goto_1da - :cond_1ef - move v0, v2 - :cond_1f0 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_211 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_211 - move v2, v0 - move v0, v1 - :goto_1fb - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_210 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_20d - const/16 v4, 0x11 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_20d - add-int/lit8 v0, v0, 0x1 - goto :goto_1fb - :cond_210 - move v0, v2 - :cond_211 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_232 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_232 - move v2, v0 - move v0, v1 - :goto_21c - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_231 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_22e - const/16 v4, 0x12 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_22e - add-int/lit8 v0, v0, 0x1 - goto :goto_21c - :cond_231 - move v0, v2 - :cond_232 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_253 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_253 - move v2, v0 - move v0, v1 - :goto_23d - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_252 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_24f - const/16 v4, 0x13 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_24f - add-int/lit8 v0, v0, 0x1 - goto :goto_23d - :cond_252 - move v0, v2 - :cond_253 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_274 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_274 - move v2, v0 - move v0, v1 - :goto_25e - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_273 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_270 - const/16 v4, 0x14 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_270 - add-int/lit8 v0, v0, 0x1 - goto :goto_25e - :cond_273 - move v0, v2 - :cond_274 - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - if-eqz v2, :cond_28b - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - const-string v3, "" - invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - move-result v2 - if-nez v2, :cond_28b - const/16 v2, 0x15 - iget-object v3, p0, LTestObject;->z:Ljava/lang/String; - invoke-static {v2, v3}, LTest;->b(ILjava/lang/String;)I - move-result v2 - add-int/2addr v0, v2 - :cond_28b - iget v2, p0, LTestObject;->i:I - if-eq v2, v5, :cond_298 - const/16 v2, 0x16 - iget v3, p0, LTestObject;->i:I - invoke-static {v2, v3}, LTest;->f(II)I - move-result v2 - add-int/2addr v0, v2 - :cond_298 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_2b9 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_2b9 - move v2, v0 - move v0, v1 - :goto_2a3 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_2b8 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_2b5 - const/16 v4, 0x17 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_2b5 - add-int/lit8 v0, v0, 0x1 - goto :goto_2a3 - :cond_2b8 - move v0, v2 - :cond_2b9 - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - if-eqz v2, :cond_2d0 - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - const-string v3, "" - invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - move-result v2 - if-nez v2, :cond_2d0 - const/16 v2, 0x18 - iget-object v3, p0, LTestObject;->z:Ljava/lang/String; - invoke-static {v2, v3}, LTest;->b(ILjava/lang/String;)I - move-result v2 - add-int/2addr v0, v2 - :cond_2d0 - iget-object v2, p0, LTest;->M:LTest; - if-eqz v2, :cond_2dd - const/16 v2, 0x19 - iget-object v3, p0, LTest;->M:LTest; - invoke-static {v2, v3}, LTest;->d(ILTest;)I - move-result v2 - add-int/2addr v0, v2 - :cond_2dd - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - if-eqz v2, :cond_2f4 - iget-object v2, p0, LTestObject;->z:Ljava/lang/String; - const-string v3, "" - invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - move-result v2 - if-nez v2, :cond_2f4 - const/16 v2, 0x1a - iget-object v3, p0, LTestObject;->z:Ljava/lang/String; - invoke-static {v2, v3}, LTest;->b(ILjava/lang/String;)I - move-result v2 - add-int/2addr v0, v2 - :cond_2f4 - iget-object v2, p0, LTest;->o:[LTest; - if-eqz v2, :cond_315 - iget-object v2, p0, LTest;->o:[LTest; - array-length v2, v2 - if-lez v2, :cond_315 - move v2, v0 - move v0, v1 - :goto_2ff - iget-object v3, p0, LTest;->o:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_314 - iget-object v3, p0, LTest;->o:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_311 - const/16 v4, 0x1b - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_311 - add-int/lit8 v0, v0, 0x1 - goto :goto_2ff - :cond_314 - move v0, v2 - :cond_315 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_336 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_336 - move v2, v0 - move v0, v1 - :goto_320 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_335 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_332 - const/16 v4, 0x1c - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_332 - add-int/lit8 v0, v0, 0x1 - goto :goto_320 - :cond_335 - move v0, v2 - :cond_336 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_357 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_357 - move v2, v0 - move v0, v1 - :goto_341 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_356 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_353 - const/16 v4, 0x1d - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_353 - add-int/lit8 v0, v0, 0x1 - goto :goto_341 - :cond_356 - move v0, v2 - :cond_357 - iget-object v2, p0, LTest;->t:[LTest; - if-eqz v2, :cond_378 - iget-object v2, p0, LTest;->t:[LTest; - array-length v2, v2 - if-lez v2, :cond_378 - move v2, v0 - move v0, v1 - :goto_362 - iget-object v3, p0, LTest;->t:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_377 - iget-object v3, p0, LTest;->t:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_374 - const/16 v4, 0x1e - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_374 - add-int/lit8 v0, v0, 0x1 - goto :goto_362 - :cond_377 - move v0, v2 - :cond_378 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_399 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_399 - move v2, v0 - move v0, v1 - :goto_383 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_398 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_395 - const/16 v4, 0x1f - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_395 - add-int/lit8 v0, v0, 0x1 - goto :goto_383 - :cond_398 - move v0, v2 - :cond_399 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_3ba - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_3ba - move v2, v0 - move v0, v1 - :goto_3a4 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_3b9 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_3b6 - const/16 v4, 0x20 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_3b6 - add-int/lit8 v0, v0, 0x1 - goto :goto_3a4 - :cond_3b9 - move v0, v2 - :cond_3ba - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_3db - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_3db - move v2, v0 - move v0, v1 - :goto_3c5 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_3da - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_3d7 - const/16 v4, 0x21 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_3d7 - add-int/lit8 v0, v0, 0x1 - goto :goto_3c5 - :cond_3da - move v0, v2 - :cond_3db - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_3fc - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_3fc - move v2, v0 - move v0, v1 - :goto_3e6 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_3fb - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_3f8 - const/16 v4, 0x22 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_3f8 - add-int/lit8 v0, v0, 0x1 - goto :goto_3e6 - :cond_3fb - move v0, v2 - :cond_3fc - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_41d - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_41d - move v2, v0 - move v0, v1 - :goto_407 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_41c - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_419 - const/16 v4, 0x23 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_419 - add-int/lit8 v0, v0, 0x1 - goto :goto_407 - :cond_41c - move v0, v2 - :cond_41d - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_43e - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_43e - move v2, v0 - move v0, v1 - :goto_428 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_43d - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_43a - const/16 v4, 0x24 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_43a - add-int/lit8 v0, v0, 0x1 - goto :goto_428 - :cond_43d - move v0, v2 - :cond_43e - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_45f - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_45f - move v2, v0 - move v0, v1 - :goto_449 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_45e - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_45b - const/16 v4, 0x25 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_45b - add-int/lit8 v0, v0, 0x1 - goto :goto_449 - :cond_45e - move v0, v2 - :cond_45f - iget-object v2, p0, LTest;->T:LTest; - if-eqz v2, :cond_46c - const/16 v2, 0x26 - iget-object v3, p0, LTest;->T:LTest; - invoke-static {v2, v3}, LTest;->d(ILTest;)I - move-result v2 - add-int/2addr v0, v2 - :cond_46c - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_48d - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_48d - move v2, v0 - move v0, v1 - :goto_477 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_48c - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_489 - const/16 v4, 0x27 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_489 - add-int/lit8 v0, v0, 0x1 - goto :goto_477 - :cond_48c - move v0, v2 - :cond_48d - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_4ae - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_4ae - move v2, v0 - move v0, v1 - :goto_498 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_4ad - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_4aa - const/16 v4, 0x28 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_4aa - add-int/lit8 v0, v0, 0x1 - goto :goto_498 - :cond_4ad - move v0, v2 - :cond_4ae - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_4cf - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_4cf - move v2, v0 - move v0, v1 - :goto_4b9 - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_4ce - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_4cb - const/16 v4, 0x29 - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_4cb - add-int/lit8 v0, v0, 0x1 - goto :goto_4b9 - :cond_4ce - move v0, v2 - :cond_4cf - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_4f0 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_4f0 - move v2, v0 - move v0, v1 - :goto_4da - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_4ef - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_4ec - const/16 v4, 0x2a - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_4ec - add-int/lit8 v0, v0, 0x1 - goto :goto_4da - :cond_4ef - move v0, v2 - :cond_4f0 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_511 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_511 - move v2, v0 - move v0, v1 - :goto_4fb - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_510 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_50d - const/16 v4, 0x2b - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_50d - add-int/lit8 v0, v0, 0x1 - goto :goto_4fb - :cond_510 - move v0, v2 - :cond_511 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_532 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_532 - move v2, v0 - move v0, v1 - :goto_51c - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_531 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_52e - const/16 v4, 0x2c - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_52e - add-int/lit8 v0, v0, 0x1 - goto :goto_51c - :cond_531 - move v0, v2 - :cond_532 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_553 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_553 - move v2, v0 - move v0, v1 - :goto_53d - iget-object v3, p0, LTestObject;->a:[LTest; - array-length v3, v3 - if-ge v0, v3, :cond_552 - iget-object v3, p0, LTestObject;->a:[LTest; - aget-object v3, v3, v0 - if-eqz v3, :cond_54f - const/16 v4, 0x2d - invoke-static {v4, v3}, LTest;->d(ILTest;)I - move-result v3 - add-int/2addr v2, v3 - :cond_54f - add-int/lit8 v0, v0, 0x1 - goto :goto_53d - :cond_552 - move v0, v2 - :cond_553 - iget-object v2, p0, LTestObject;->a:[LTest; - if-eqz v2, :cond_571 - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-lez v2, :cond_571 - :goto_55c - iget-object v2, p0, LTestObject;->a:[LTest; - array-length v2, v2 - if-ge v1, v2, :cond_571 - iget-object v2, p0, LTestObject;->a:[LTest; - aget-object v2, v2, v1 - if-eqz v2, :cond_56e - const/16 v3, 0x2e - invoke-static {v3, v2}, LTest;->d(ILTest;)I - move-result v2 - add-int/2addr v0, v2 - :cond_56e - add-int/lit8 v1, v1, 0x1 - goto :goto_55c - :cond_571 - iget-object v1, p0, LTest;->V:LTest; - if-eqz v1, :cond_57e - const/16 v1, 0x64 - iget-object v2, p0, LTest;->V:LTest; - invoke-static {v1, v2}, LTest;->d(ILTest;)I - move-result v1 - add-int/2addr v0, v1 - :cond_57e - return v0 -.end method - -.method public final method2()I - .registers 1 - .prologue - const/4 v0, 0x1 - return v0 -.end method
diff --git a/src/test/smali/controlflow/ControlFlow.smali b/src/test/smali/controlflow/ControlFlow.smali deleted file mode 100644 index 35881fe..0000000 --- a/src/test/smali/controlflow/ControlFlow.smali +++ /dev/null
@@ -1,225 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method static constantEqTrue()I - .locals 1 - - const v0, 0 - if-eqz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantEqFalse()I - .locals 1 - - const v0, 1 - if-eqz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantNeTrue()I - .locals 1 - - const v0, 1 - if-nez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantNeFalse()I - .locals 1 - - const v0, 0 - if-nez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantLtzTrue()I - .locals 1 - - const v0, -1 - if-ltz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantLtzFalse()I - .locals 1 - - const v0, 0 - if-ltz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantLezTrue()I - .locals 1 - - const v0, 0 - if-lez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantLezFalse()I - .locals 1 - - const v0, 1 - if-lez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantGtzTrue()I - .locals 1 - - const v0, 1 - if-gtz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantGtzFalse()I - .locals 1 - - const v0, 0 - if-gtz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantGezTrue()I - .locals 1 - - const v0, 0 - if-gez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static constantGezFalse()I - .locals 1 - - const v0, -1 - if-gez v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method static cmpConstantLong()I - .locals 4 - - const-wide v0, 0 - const-wide v2, 0 - cmp-long v0, v0, v2 - if-eqz v0, :equals - const v0, 1 - return v0 - :equals - const v0, 2 - return v0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 3 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - invoke-static {}, LTest;->constantEqTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantEqFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantNeTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantNeFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantLtzTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantLtzFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantLezTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantLezFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantGtzTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantGtzFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantGezTrue()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->constantGezFalse()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - invoke-static {}, LTest;->cmpConstantLong()I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - return-void -.end method
diff --git a/src/test/smali/fibonacci/Fibonacci.smali b/src/test/smali/fibonacci/Fibonacci.smali deleted file mode 100644 index 3345ec0..0000000 --- a/src/test/smali/fibonacci/Fibonacci.smali +++ /dev/null
@@ -1,129 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method static fibonacci(I)I - .locals 2 - - if-eqz p0, :return - const/4 v0, 0x1 - if-ne p0, v0, :calc - - :return - return p0 - - :calc - add-int/lit8 v0, p0, -0x1 - invoke-static {v0}, LTest;->fibonacci(I)I - move-result v0 - add-int/lit8 v1, p0, -0x2 - invoke-static {v1}, LTest;->fibonacci(I)I - move-result v1 - add-int p0, v0, v1 - goto :return -.end method - -.method static fibonacciLong(J)J - .locals 4 - - const-wide/16 v2, 0x1 - const-wide/16 v0, 0x0 - cmp-long v0, p0, v0 - if-eqz v0, :return - cmp-long v0, p0, v2 - if-nez v0, :calc - - :return - return-wide p0 - - :calc - sub-long v0, p0, v2 - invoke-static {v0, v1}, LTest;->fibonacciLong(J)J - move-result-wide v0 - const-wide/16 v2, 0x2 - sub-long v2, p0, v2 - invoke-static {v2, v3}, LTest;->fibonacciLong(J)J - move-result-wide v2 - add-long p0, v0, v2 - goto :return -.end method - -.method static fibonacciJack(I)I - .locals 2 - - if-eqz p0, :return - const/4 v0, 0x1 - if-ne p0, v0, :calc - - :return - return p0 - - :calc - add-int/lit8 v0, p0, -0x1 - invoke-static {v0}, LTest;->fibonacciJack(I)I - move-result v0 - add-int/lit8 v1, p0, -0x2 - invoke-static {v1}, LTest;->fibonacciJack(I)I - move-result v1 - add-int/2addr v0, v1 - return v0 -.end method - -.method static fibonacciLongJack(J)J - .locals 4 - - const-wide/16 v2, 0x1 - const-wide/16 v0, 0x0 - cmp-long v0, p0, v0 - if-eqz v0, :return - cmp-long v0, p0, v2 - if-nez v0, :calc - - :return - return-wide p0 - - :calc - sub-long v0, p0, v2 - invoke-static {v0, v1}, LTest;->fibonacciLongJack(J)J - move-result-wide v0 - const-wide/16 v2, 0x2 - sub-long v2, p0, v2 - invoke-static {v2, v3}, LTest;->fibonacciLongJack(J)J - move-result-wide v2 - add-long/2addr v0, v2 - return-wide v0 -.end method - -.method public static main([Ljava/lang/String;)V - .registers 5 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const/16 v1, 0xa - invoke-static {v1}, LTest;->fibonacci(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - const-wide/16 v2, 0xa - invoke-static {v2, v3}, LTest;->fibonacciLong(J)J - move-result-wide v2 - invoke-virtual {v0, v2, v3}, Ljava/io/PrintStream;->println(J)V - - const/16 v1, 0xa - invoke-static {v1}, LTest;->fibonacciJack(I)I - move-result v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - const-wide/16 v2, 0xa - invoke-static {v2, v3}, LTest;->fibonacciLongJack(J)J - move-result-wide v2 - invoke-virtual {v0, v2, v3}, Ljava/io/PrintStream;->println(J)V - - return-void -.end method
diff --git a/src/test/smali/fill-array-data/FillArrayData.smali b/src/test/smali/fill-array-data/FillArrayData.smali deleted file mode 100644 index 81a5834..0000000 --- a/src/test/smali/fill-array-data/FillArrayData.smali +++ /dev/null
@@ -1,61 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -# Simple fill array data -.method public static test1()[I - .registers 2 - - const/4 v1, 3 - new-array v0, v1, [I - fill-array-data v0, :array_data - return-object v0 - - :array_data - .array-data 4 - 1 2 3 - .end array-data -.end method - -# Fill array data after data -.method public static test2()[I - .registers 2 - - goto :start - - :array_data - .array-data 4 - 4 5 6 - .end array-data - - :start - const/4 v1, 3 - new-array v0, v1, [I - fill-array-data v0, :array_data - return-object v0 - -.end method - -.method public static main([Ljava/lang/String;)V - .locals 2 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - invoke-static {}, LTest;->test1()[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-static {}, LTest;->test2()[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - return-void -.end method
diff --git a/src/test/smali/filled-new-array/FilledNewArray.smali b/src/test/smali/filled-new-array/FilledNewArray.smali deleted file mode 100644 index 2550e3f..0000000 --- a/src/test/smali/filled-new-array/FilledNewArray.smali +++ /dev/null
@@ -1,93 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -# Filled new array from arguments. -.method public static test1(III)[I - .locals 1 - - filled-new-array {p0, p1, p2}, [I - move-result-object v0 - return-object v0 -.end method - -# Filled new array from constants. -.method public static test2()[I - .locals 3 - - const/4 v0, 4 - const/4 v1, 5 - const/4 v2, 6 - filled-new-array {v0, v1, v2}, [I - move-result-object v0 - return-object v0 -.end method - -# Filled new array range from arguments. -.method public static test3(IIIIII)[I - .locals 1 - - filled-new-array/range {p0 .. p5}, [I - move-result-object v0 - return-object v0 -.end method - -# Filled new array range from constants. -.method public static test4()[I - .locals 6 - - const/4 v0, 6 - const/4 v1, 5 - const/4 v2, 4 - const/4 v3, 3 - const/4 v4, 2 - const/4 v5, 1 - filled-new-array/range {v0 .. v5}, [I - move-result-object v0 - return-object v0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 7 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const/4 v1, 1 - const/4 v2, 2 - const/4 v3, 3 - invoke-static {v1, v2, v3}, LTest;->test1(III)[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-static {}, LTest;->test2()[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 1 - const/4 v2, 2 - const/4 v3, 3 - const/4 v4, 4 - const/4 v5, 5 - const/4 v6, 6 - invoke-static/range {v1 .. v6}, LTest;->test3(IIIIII)[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-static {}, LTest;->test4()[I - move-result-object v1 - invoke-static {v1}, Ljava/util/Arrays;->toString([I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - return-void -.end method
diff --git a/src/test/smali/illegal-invokes/Iface.java b/src/test/smali/illegal-invokes/Iface.java deleted file mode 100644 index dd11626..0000000 --- a/src/test/smali/illegal-invokes/Iface.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2017, 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. - -public class Iface { - - public void bar() { - } -}
diff --git a/src/test/smali/illegal-invokes/Iface.smali b/src/test/smali/illegal-invokes/Iface.smali deleted file mode 100644 index 5f074dce..0000000 --- a/src/test/smali/illegal-invokes/Iface.smali +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright (c) 2017, 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. - -.class interface public abstract LIface; -.super Ljava/lang/Object; - -.method public abstract bar()V -.end method -
diff --git a/src/test/smali/illegal-invokes/Lowest.java b/src/test/smali/illegal-invokes/Lowest.java deleted file mode 100644 index e464313..0000000 --- a/src/test/smali/illegal-invokes/Lowest.java +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright (c) 2017, 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. - -public class Lowest extends Iface implements Super { - - @Override - public void foo() { - - } -}
diff --git a/src/test/smali/illegal-invokes/Lowest.smali b/src/test/smali/illegal-invokes/Lowest.smali deleted file mode 100644 index d6c5787..0000000 --- a/src/test/smali/illegal-invokes/Lowest.smali +++ /dev/null
@@ -1,12 +0,0 @@ -# Copyright (c) 2017, 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. - -.class public LLowest; -.super LSuper; - -.method public bar()V - .locals 0 - return-void -.end method -
diff --git a/src/test/smali/illegal-invokes/Super.java b/src/test/smali/illegal-invokes/Super.java deleted file mode 100644 index 54a8714..0000000 --- a/src/test/smali/illegal-invokes/Super.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2017, 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. - -public interface Super { - - public void foo(); -}
diff --git a/src/test/smali/illegal-invokes/Super.smali b/src/test/smali/illegal-invokes/Super.smali deleted file mode 100644 index 1ec4f0e..0000000 --- a/src/test/smali/illegal-invokes/Super.smali +++ /dev/null
@@ -1,13 +0,0 @@ -# Copyright (c) 2017, 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. - -.class public LSuper; -.super Ljava/lang/Object; -.implements LIface; - -.method public foo()V - .locals 0 - return-void -.end method -
diff --git a/src/test/smali/illegal-invokes/Test.java b/src/test/smali/illegal-invokes/Test.java deleted file mode 100644 index 8ddd18e..0000000 --- a/src/test/smali/illegal-invokes/Test.java +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright (c) 2017, 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. - -public class Test { - - int ignore; - - public static void main(String... args) { - Lowest l = new Lowest(); - callVirtualOnIface(l); - callIfaceOnVirtual(l); - } - - private static void callVirtualOnIface(Iface i) { - try { - i.bar(); - } catch (IncompatibleClassChangeError e) { - System.out.println("ICCE"); - } - } - - private static void callIfaceOnVirtual(Super s) { - try { - s.foo(); - } catch (IncompatibleClassChangeError e) { - System.out.println("ICCE"); - } - } -}
diff --git a/src/test/smali/infinite-loop/InfiniteLoop1.smali b/src/test/smali/infinite-loop/InfiniteLoop1.smali deleted file mode 100644 index a93923b..0000000 --- a/src/test/smali/infinite-loop/InfiniteLoop1.smali +++ /dev/null
@@ -1,53 +0,0 @@ -# Copyright (c) 2017, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method public static loop1()V - .locals 0 - goto :a - - :a - goto :b - - :b - goto :c - - :c - goto :d - - :d - goto :b - - return-void -.end method - -.method public static loop2()V - .locals 2 - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - const/4 v1, 0x1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V - goto :a - - :a - goto :b - - :b - goto :c - - :c - goto :d - - :d - goto :b - - return-void -.end method - -.method public static main([Ljava/lang/String;)V - .locals 0 - return-void -.end method
diff --git a/src/test/smali/merge-blocks-regression/Test.java b/src/test/smali/merge-blocks-regression/Test.java deleted file mode 100644 index ca61ff4..0000000 --- a/src/test/smali/merge-blocks-regression/Test.java +++ /dev/null
@@ -1,36 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - - public Object b; - public Test d; - public Test e; - public Test g; - public Test f; - - public void a() { throw new RuntimeException("Test.a()"); } - public void a(long p1) { throw new RuntimeException("Test.a(long)"); } - public void a(long p1, boolean p2) { throw new RuntimeException("Test.a(long, boolean)"); } - public Test a(java.io.DataInputStream p1) { throw new RuntimeException("Test.a(input-stream)"); } - public Test a(byte[] p1, Test p2) { throw new RuntimeException("Test.a(B[], Test)"); } - public java.io.File b() { throw new RuntimeException("Test.b()"); } - public Test bW_() { throw new RuntimeException("Test.bW_()"); } - public long c() { throw new RuntimeException("Test.d()"); } - public void c(boolean p1) { throw new RuntimeException("Test.c(boolean)"); } - public void c(java.nio.ByteBuffer p1) { throw new RuntimeException("Test.c(byte-buf)"); } - public byte[] cB() { throw new RuntimeException("Test.cB()"); } - public long d() { throw new RuntimeException("Test.d()"); } - public void d(boolean p1) { throw new RuntimeException("Test.d(boolean)"); } - public Test e() { throw new RuntimeException("Test.e()"); } - public void eV() { throw new RuntimeException("Test.eV()"); } - - public static void main(String[] args) { - try { - new TestObject().f(); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/merge-blocks-regression/TestObject.java b/src/test/smali/merge-blocks-regression/TestObject.java deleted file mode 100644 index 59b46f6..0000000 --- a/src/test/smali/merge-blocks-regression/TestObject.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public void f() { - } -}
diff --git a/src/test/smali/merge-blocks-regression/TestObject.smali b/src/test/smali/merge-blocks-regression/TestObject.smali deleted file mode 100644 index f14013e..0000000 --- a/src/test/smali/merge-blocks-regression/TestObject.smali +++ /dev/null
@@ -1,199 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field public c:LTest; -.field public b:LTest; -.field public d:LTest; -.field public e:LTest; -.field public h:LTest; -.field public i:LTest; -.field public j:LTest; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final f()V - .registers 15 - const/16 v11, 0xd - const/4 v2, 0x0 - const/4 v1, 0x1 - iget-object v3, p0, LTestObject;->c:LTest; - iget-object v0, p0, LTestObject;->b:LTest; - invoke-virtual {v0}, LTest;->bW_()LTest; - move-result-object v0 - iget-object v4, p0, LTestObject;->b:LTest; - invoke-virtual {v4}, LTest;->e()LTest; - move-result-object v4 - new-instance v5, Ljava/io/File; - invoke-virtual {v0}, LTest;->b()Ljava/io/File; - move-result-object v0 - const-string v6, "nlp_state" - invoke-direct {v5, v0, v6}, Ljava/io/File;-><init>(Ljava/io/File;Ljava/lang/String;)V - invoke-virtual {v4}, LTest;->d()J - move-result-wide v6 - invoke-virtual {v4}, LTest;->c()J - move-result-wide v8 - :try_start_25 - new-instance v0, Ljava/io/FileInputStream; - invoke-direct {v0, v5}, Ljava/io/FileInputStream;-><init>(Ljava/io/File;)V - new-instance v4, Ljava/io/BufferedInputStream; - invoke-direct {v4, v0}, Ljava/io/BufferedInputStream;-><init>(Ljava/io/InputStream;)V - iget-object v0, v3, LTest;->g:LTest; - invoke-virtual {v0}, LTest;->cB()[B - :try_end_34 - .catch Ljava/io/FileNotFoundException; {:try_start_25 .. :try_end_34} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_25 .. :try_end_34} :catch_c8 - .catch Ljava/io/IOException; {:try_start_25 .. :try_end_34} :catch_d8 - move-result-object v0 - :try_start_35 - new-instance v5, Ljava/io/DataInputStream; - invoke-direct {v5, v4}, Ljava/io/DataInputStream;-><init>(Ljava/io/InputStream;)V - invoke-virtual {v5}, Ljava/io/DataInputStream;->readUnsignedShort()I - move-result v10 - if-ne v10, v11, :cond_c4 - if-ne v10, v11, :cond_b2 - iget-object v10, v3, LTest;->f:LTest; - if-nez v10, :cond_4d - const/4 v10, 0x0 - invoke-static {v0, v10}, LTest;->a([BLTest;)LTest; - move-result-object v0 - iput-object v0, v3, LTest;->f:LTest; - :cond_4d - iget-object v0, v3, LTest;->f:LTest; - invoke-virtual {v0, v5}, LTest;->a(Ljava/io/DataInputStream;)LTest; - move-result-object v0 - iget-object v0, v0, LTest;->b:Ljava/lang/Object; - check-cast v0, [B - invoke-static {v0}, Ljava/nio/ByteBuffer;->wrap([B)Ljava/nio/ByteBuffer; - :try_end_5a - .catch Ljava/io/IOException; {:try_start_35 .. :try_end_5a} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_35 .. :try_end_5a} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_35 .. :try_end_5a} :catch_c8 - move-result-object v5 - :try_start_5b - invoke-virtual {v5}, Ljava/nio/ByteBuffer;->getLong()J - move-result-wide v10 - invoke-virtual {v5}, Ljava/nio/ByteBuffer;->getLong()J - move-result-wide v12 - add-long/2addr v10, v12 - sub-long v6, v10, v6 - invoke-static {v8, v9, v6, v7}, Ljava/lang/Math;->min(JJ)J - move-result-wide v6 - invoke-virtual {v5}, Ljava/nio/ByteBuffer;->get()B - move-result v0 - if-ne v0, v1, :cond_cd - move v0, v1 - :goto_71 - invoke-virtual {v3, v6, v7, v0}, LTest;->a(JZ)V - :try_end_74 - .catch Ljava/lang/IllegalArgumentException; {:try_start_5b .. :try_end_74} :catch_cf - .catch Ljava/nio/BufferUnderflowException; {:try_start_5b .. :try_end_74} :catch_dd - .catch Ljava/io/IOException; {:try_start_5b .. :try_end_74} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_5b .. :try_end_74} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_5b .. :try_end_74} :catch_c8 - :try_start_74 - iget-object v0, v3, LTest;->d:LTest; - invoke-virtual {v0, v5}, LTest;->c(Ljava/nio/ByteBuffer;)V - iget-object v0, v3, LTest;->e:LTest; - invoke-virtual {v0, v5}, LTest;->c(Ljava/nio/ByteBuffer;)V - :try_end_7e - .catch Ljava/io/IOException; {:try_start_74 .. :try_end_7e} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_74 .. :try_end_7e} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_74 .. :try_end_7e} :catch_c8 - :goto_7e - :try_start_7e - invoke-virtual {v4}, Ljava/io/BufferedInputStream;->close()V - :try_end_81 - .catch Ljava/io/FileNotFoundException; {:try_start_7e .. :try_end_81} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_7e .. :try_end_81} :catch_c8 - .catch Ljava/io/IOException; {:try_start_7e .. :try_end_81} :catch_d8 - :goto_81 - iget-object v0, p0, LTestObject;->i:LTest; - invoke-virtual {v0, v1}, LTest;->c(Z)V - iget-object v0, p0, LTestObject;->i:LTest; - invoke-virtual {v0, v2}, LTest;->d(Z)V - iget-object v0, p0, LTestObject;->d:LTest; - if-eqz v0, :cond_94 - iget-object v0, p0, LTestObject;->d:LTest; - invoke-virtual {v0}, LTest;->a()V - :cond_94 - iget-object v0, p0, LTestObject;->e:LTest; - if-eqz v0, :cond_9d - iget-object v0, p0, LTestObject;->e:LTest; - invoke-virtual {v0}, LTest;->eV()V - :cond_9d - iget-object v0, p0, LTestObject;->h:LTest; - iget-object v1, p0, LTestObject;->b:LTest; - invoke-virtual {v1}, LTest;->e()LTest; - move-result-object v1 - invoke-virtual {v1}, LTest;->c()J - move-result-wide v2 - invoke-virtual {v0, v2, v3}, LTest;->a(J)V - iget-object v0, p0, LTestObject;->j:LTest; - invoke-virtual {v0}, LTest;->a()V - return-void - :cond_b2 - :try_start_b2 - new-instance v0, Ljava/io/IOException; - const-string v4, "Incompatible version." - invoke-direct {v0, v4}, Ljava/io/IOException;-><init>(Ljava/lang/String;)V - throw v0 - :try_end_ba - .catch Ljava/io/IOException; {:try_start_b2 .. :try_end_ba} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_b2 .. :try_end_ba} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_b2 .. :try_end_ba} :catch_c8 - :catch_ba - move-exception v0 - :try_start_bb - invoke-virtual {v3, v8, v9}, LTest;->a(J)V - throw v0 - :try_end_bf - .catch Ljava/io/FileNotFoundException; {:try_start_bb .. :try_end_bf} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_bb .. :try_end_bf} :catch_c8 - .catch Ljava/io/IOException; {:try_start_bb .. :try_end_bf} :catch_d8 - :catch_bf - move-exception v0 - invoke-virtual {v3, v8, v9}, LTest;->a(J)V - goto :goto_81 - :cond_c4 - :try_start_c4 - invoke-virtual {v3, v8, v9}, LTest;->a(J)V - :try_end_c7 - .catch Ljava/io/IOException; {:try_start_c4 .. :try_end_c7} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_c4 .. :try_end_c7} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_c4 .. :try_end_c7} :catch_c8 - goto :goto_7e - :catch_c8 - move-exception v0 - invoke-virtual {v3, v8, v9}, LTest;->a(J)V - goto :goto_81 - :cond_cd - move v0, v2 - goto :goto_71 - :catch_cf - move-exception v0 - :goto_d0 - :try_start_d0 - new-instance v4, Ljava/io/IOException; - const-string v5, "Byte buffer read failed." - invoke-direct {v4, v5, v0}, Ljava/io/IOException;-><init>(Ljava/lang/String;Ljava/lang/Throwable;)V - throw v4 - :try_end_d8 - .catch Ljava/io/IOException; {:try_start_d0 .. :try_end_d8} :catch_ba - .catch Ljava/io/FileNotFoundException; {:try_start_d0 .. :try_end_d8} :catch_bf - .catch Ljava/lang/SecurityException; {:try_start_d0 .. :try_end_d8} :catch_c8 - :catch_d8 - move-exception v0 - invoke-virtual {v3, v8, v9}, LTest;->a(J)V - goto :goto_81 - :catch_dd - move-exception v0 - goto :goto_d0 -.end method
diff --git a/src/test/smali/multiple-returns/MultipleReturns.smali b/src/test/smali/multiple-returns/MultipleReturns.smali deleted file mode 100644 index 145736b..0000000 --- a/src/test/smali/multiple-returns/MultipleReturns.smali +++ /dev/null
@@ -1,126 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.field static private result:Ljava/lang/String; - -.method public static test1(Z)Ljava/lang/String; - .locals 1 - .param p0 - - if-eqz p0, :false_branch - - const-string v0, "T" - return-object v0 - - :false_branch - const-string v0, "F" - return-object v0 -.end method - -.method public static test2(Z)V - .locals 1 - .param p0 - - if-eqz p0, :false_branch - - const-string v0, "t" - sput-object v0, LTest;->result:Ljava/lang/String; - return-void - - :false_branch - const-string v0, "f" - sput-object v0, LTest;->result:Ljava/lang/String; - return-void -.end method - -.method public static test3(Z)J - .locals 2 - .param p0 - - if-eqz p0, :false_branch - - const-wide v0, 0x1 - return-wide v0 - - :false_branch - const-wide/high16 v0, 0x4000000000000000L - return-wide v0 -.end method - -.method public static test4(Z)Z - .locals 0 - .param p0 - - if-eqz p0, :false_branch - - return p0 - - :false_branch - return p0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 3 - .param p0 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const/4 v1, 0x1 - invoke-static {v1}, LTest;->test1(Z)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test1(Z)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x1 - invoke-static {v1}, LTest;->test2(Z)V - sget-object v1, LTest;->result:Ljava/lang/String; - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test2(Z)V - sget-object v1, LTest;->result:Ljava/lang/String; - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-virtual {v0}, Ljava/io/PrintStream;->println()V - - const/4 v1, 0x1 - invoke-static {v1}, LTest;->test3(Z)J - move-result-wide v1 - invoke-static {v1, v2}, Ljava/lang/Long;->toString(J)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test3(Z)J - move-result-wide v1 - invoke-static {v1, v2}, Ljava/lang/Long;->toString(J)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - - const/4 v1, 0x1 - invoke-static {v1}, LTest;->test4(Z)Z - move-result v1 - invoke-static {v1}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test4(Z)Z - move-result v1 - invoke-static {v1}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - - return-void -.end method - -
diff --git a/src/test/smali/new-instance-and-init/Test.java b/src/test/smali/new-instance-and-init/Test.java deleted file mode 100644 index a47e69d..0000000 --- a/src/test/smali/new-instance-and-init/Test.java +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - - public Test(int i) { - System.out.println("Test(" + i + ")"); - } - - public static void main(String[] args) { - TestObject.allocate(0); - TestObject.allocate(4); - TestObject.allocate(10); - } -}
diff --git a/src/test/smali/new-instance-and-init/TestObject.java b/src/test/smali/new-instance-and-init/TestObject.java deleted file mode 100644 index 003f09d..0000000 --- a/src/test/smali/new-instance-and-init/TestObject.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public static void allocate(int i) { - } -}
diff --git a/src/test/smali/new-instance-and-init/TestObject.smali b/src/test/smali/new-instance-and-init/TestObject.smali deleted file mode 100644 index 665de1b..0000000 --- a/src/test/smali/new-instance-and-init/TestObject.smali +++ /dev/null
@@ -1,26 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.method public static allocate(I)V - .registers 4 - new-instance v2, LTest; - if-nez v3, :cond_9 - const/4 v1, 0x0 - invoke-direct {v2, v1}, LTest;-><init>(I)V - :goto_8 - return-void - :cond_9 - const/16 v0, 0xa - if-ge v3, v0, :cond_14 - const/4 v1, 0x0 - invoke-direct {v2, v1}, LTest;-><init>(I)V - goto :goto_8 - :cond_14 - const/4 v1, 0x0 - invoke-direct {v2, v1}, LTest;-><init>(I)V - goto :goto_8 -.end method \ No newline at end of file
diff --git a/src/test/smali/overlapping-long-registers/Overlapping.smali b/src/test/smali/overlapping-long-registers/Overlapping.smali deleted file mode 100644 index 167eb1b..0000000 --- a/src/test/smali/overlapping-long-registers/Overlapping.smali +++ /dev/null
@@ -1,53 +0,0 @@ -# Copyright (c) 2017, 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. - -# Some versions of dalvik had a bug where you cannot use the second half of an input long -# as the first part of an output long. This smali code explicitly has that issue so the -# generated dex file can be used to test art/dalvik versions. -# -# The issue was that if you have -# -# add-long v3, v0, v2 -# -# dalvik would add v0 and v2 and store the result in v3 before adding v1 and v3 (now clobbered). - -.class public LTest; - -.super Ljava/lang/Object; - -.method static add(JJ)J - .locals 5 - move-wide v0, p0 - move-wide v2, p2 - add-long v3, v0, v2 - return-wide v3 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 10 - - sget-object v5, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const-wide/high16 v0, 0x4000000000000000L - const-wide/high16 v2, 0x4100000000000000L - invoke-static {v0, v1, v2, v3}, LTest;->add(JJ)J - move-result-wide v6 - invoke-virtual {v5, v6, v7}, Ljava/io/PrintStream;->println(J)V - - # Adding loop in an attempt to get the jit to process the add method. - const v8, 1000000 - const v9, 1 - :loop - if-eqz v8, :exit - const-wide v0, 0x4000000000040000L - const-wide v2, 0x4100000000041000L - invoke-static {v0, v1, v2, v3}, LTest;->add(JJ)J - move-result-wide v6 - sub-int v8, v8, v9 - goto :loop - - :exit - invoke-virtual {v5, v6, v7}, Ljava/io/PrintStream;->println(J)V - return-void -.end method
diff --git a/src/test/smali/packed-switch/PackedSwitch.smali b/src/test/smali/packed-switch/PackedSwitch.smali deleted file mode 100644 index 30ab926..0000000 --- a/src/test/smali/packed-switch/PackedSwitch.smali +++ /dev/null
@@ -1,106 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -# Empty packed switch -.method public static test1(I)I - .registers 1 - packed-switch v0, :packed_switch_data - const/4 v0, 0x1 - return v0 - - :packed_switch_data - .packed-switch 0x0 - .end packed-switch -.end method - -# Empty packed switch after data -.method public static test2(I)I - .registers 1 - - goto :packed_switch - - :packed_switch_data - .packed-switch 0x0 - .end packed-switch - - :packed_switch - packed-switch v0, :packed_switch_data - const/4 v0, 0x2 - return v0 -.end method - -# Packed switch after data -.method public static test3(I)I - .registers 1 - - goto :packed_switch - - :case_0 - const/4 v0, 0x3 - goto :return - - :packed_switch_data - .packed-switch 0x0 - :case_0 - :case_1 - .end packed-switch - - :packed_switch - packed-switch v0, :packed_switch_data - const/4 v0, 0x5 - goto :return - - :case_1 - const/4 v0, 0x4 - - :return - return v0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 2 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test1(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test2(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x1 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x2 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - return-void -.end method
diff --git a/src/test/smali/phi-removal-regression/Test.java b/src/test/smali/phi-removal-regression/Test.java deleted file mode 100644 index 7accd02..0000000 --- a/src/test/smali/phi-removal-regression/Test.java +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - boolean returnBoolean() { - System.out.println("returnBoolean"); - return true; - } - - boolean returnTheOtherBoolean(Test a) { - System.out.println("returnTheOtherBoolean"); - return a.returnBoolean(); - } - - public static void main(String[] args) { - new TestObject().a(new Test(), 42); - } -}
diff --git a/src/test/smali/phi-removal-regression/TestObject.java b/src/test/smali/phi-removal-regression/TestObject.java deleted file mode 100644 index 8a93611..0000000 --- a/src/test/smali/phi-removal-regression/TestObject.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public boolean a(Test a, int i) { - return true; - } -}
diff --git a/src/test/smali/phi-removal-regression/TestObject.smali b/src/test/smali/phi-removal-regression/TestObject.smali deleted file mode 100644 index 66efa4f..0000000 --- a/src/test/smali/phi-removal-regression/TestObject.smali +++ /dev/null
@@ -1,64 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field final list:Ljava/util/ArrayList; -.field private final s:Z - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final a(LTest;I)Z - .registers 9 - .prologue - const/4 v2, 0x1 - const/4 v1, 0x0 - invoke-virtual {p1}, LTest;->returnBoolean()Z - move-result v0 - if-eqz v0, :cond_a - move v0, v1 - :goto_9 - return v0 - :cond_a - and-int/lit8 v0, p2, 0x2 - if-nez v0, :cond_14 - iget-boolean v0, p0, LTestObject;->b:Z - if-eqz v0, :cond_14 - move v0, v2 - goto :goto_9 - :cond_14 - iget-object v0, p0, LTestObject;->list:Ljava/util/ArrayList; - invoke-virtual {v0}, Ljava/util/ArrayList;->size()I - move-result v4 - move v3, v1 - :goto_1b - if-ge v3, v4, :cond_3b - iget-object v0, p0, LTestObject;->list:Ljava/util/ArrayList; - invoke-virtual {v0, v3}, Ljava/util/ArrayList;->get(I)Ljava/lang/Object; - move-result-object v0 - check-cast v0, LTest; - and-int/lit8 v5, p2, 0x1 - if-eqz v5, :cond_2f - invoke-virtual {v0}, LTest;->returnBoolean()Z - move-result v5 - if-nez v5, :cond_37 - :cond_2f - invoke-virtual {v0, p1}, LTest;->returnTheOtherBoolean(LTest;)Z - move-result v0 - if-eqz v0, :cond_37 - move v0, v2 - goto :goto_9 - :cond_37 - add-int/lit8 v0, v3, 0x1 - move v3, v0 - goto :goto_1b - :cond_3b - move v0, v1 - goto :goto_9 -.end method
diff --git a/src/test/smali/regression/33336471/33336471.smali b/src/test/smali/regression/33336471/33336471.smali deleted file mode 100644 index 87e9cf6..0000000 --- a/src/test/smali/regression/33336471/33336471.smali +++ /dev/null
@@ -1,204 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -# This method is not called by the test, and is only for reference of dex code failing on -# art from Android 5.1.1 with mixed int/float constants. -# When run dex2oat prints the warning: -# -# dex2oat W 7568 7571 art/compiler/dex/vreg_analysis.cc:367] -# void Test.intAndFloatZeroConstantsNotWorking() op at block 6 has both fp and core/ref uses for -# same def. -.method static intAndFloatZeroConstantsNotWorking()V - .locals 8 - - const-string v6, "START" - sget-object v7, Ljava/lang/System;->out:Ljava/io/PrintStream; - invoke-virtual {v7, v6}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - const/high16 v0, 0x3f800000 # 1.0 - const/4 v1, 0x00 # 0 / 0.0 - const/4 v3, 2 - move v4, v1 - - :label_a - invoke-virtual {v7, v4}, Ljava/io/PrintStream;->println(I)V - invoke-virtual {v7, v3}, Ljava/io/PrintStream;->println(I)V - if-ge v4, v3, :label_b - const-string v6, "LOOP" - invoke-virtual {v7, v6}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - add-int/lit8 v4, v4, 0x01 # 1 - goto :label_a - - :label_b - const/4 v5, 0x01 - new-array v5, v5, [F - const/4 v3, 0x00 - aget v4, v5, v3 - cmpl-float v1, v4, v1 - if-nez v1, :label_c - cmpl-float v0, v4, v0 - if-eqz v0, :label_c - const-string v0, "DONE" - invoke-virtual {v7, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - goto :label_d - - :label_c - const-string v0, "FLOAT COMPARISON FAILED" - invoke-virtual {v7, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - :label_d - return-void -.end method - -.method static intAndFloatZeroConstants()V - .locals 8 - - const-string v6, "START" - sget-object v7, Ljava/lang/System;->out:Ljava/io/PrintStream; - invoke-virtual {v7, v6}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - const/high16 v0, 0x3f800000 # 1.0 - const/4 v1, 0x00 # 0 - const/4 v2, 0x00 # 0.0 - const/4 v3, 2 - move v4, v1 - - :label_a - invoke-virtual {v7, v4}, Ljava/io/PrintStream;->println(I)V - invoke-virtual {v7, v3}, Ljava/io/PrintStream;->println(I)V - if-ge v4, v3, :label_b - const-string v6, "LOOP" - invoke-virtual {v7, v6}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - add-int/lit8 v4, v4, 0x01 # 1 - goto :label_a - - :label_b - const/4 v5, 0x01 - new-array v5, v5, [F - const/4 v3, 0x00 - aget v4, v5, v3 - cmpl-float v1, v4, v2 - if-nez v1, :label_c - cmpl-float v0, v4, v0 - if-eqz v0, :label_c - const-string v0, "DONE" - invoke-virtual {v7, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - goto :label_d - - :label_c - const-string v0, "FLOAT COMPARISON FAILED" - invoke-virtual {v7, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - :label_d - return-void -.end method - -# This method is not called by the test, and is only for reference of dex code failing on -# art from Android 5.1.1 with mixed long/double constants. -# This code does actually work, but dex2oat still prints the warning: -# -# dex2oat W 7568 7571 art/compiler/dex/vreg_analysis.cc:367] -# void Test.longAndDoubleZeroConstantsNotWorking() op at block 6 has both fp and core/ref uses -#for same def. -.method static longAndDoubleZeroConstantsNotWorking()V - .locals 14 - - const-string v12, "START" - sget-object v13, Ljava/lang/System;->out:Ljava/io/PrintStream; - invoke-virtual {v13, v12}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - const-wide/high16 v0, 0x3f80000000000000L # 1.0 0->0 1->2 2->4 3->6 4->8 5->10+11 6->12 7->13 - const-wide/16 v2, 0x00L # 0 / 0.0 - const-wide/16 v6, 2 - move-wide v8, v2 - - :label_a - invoke-virtual {v13, v8, v9}, Ljava/io/PrintStream;->println(J)V - invoke-virtual {v13, v6, v7}, Ljava/io/PrintStream;->println(J)V - cmp-long v12, v8, v6 - if-gez v12, :label_b - const-string v12, "LOOP" - invoke-virtual {v13, v12}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - const-wide/16 v10, 0x01 - add-long v8, v8, v10 - goto :label_a - - :label_b - const/4 v10, 0x01 - new-array v10, v10, [D - const/4 v6, 0x00 - aget-wide v8, v10, v6 - cmpl-double v2, v8, v2 - if-nez v2, :label_c - cmpl-double v0, v8, v0 - if-eqz v0, :label_c - const-string v0, "DONE" - invoke-virtual {v13, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - goto :label_d - - :label_c - const-string v0, "FLOAT COMPARISON FAILED" - invoke-virtual {v13, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - :label_d - return-void -.end method - -.method static longAndDoubleZeroConstants()V - .locals 14 - - const-string v12, "START" - sget-object v13, Ljava/lang/System;->out:Ljava/io/PrintStream; - invoke-virtual {v13, v12}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - const-wide/high16 v0, 0x3f80000000000000L - const-wide/16 v2, 0x00L # 0 - const-wide/16 v4, 0x00L # 0.0 - const-wide/16 v6, 2 - move-wide v8, v2 - - :label_a - invoke-virtual {v13, v8, v9}, Ljava/io/PrintStream;->println(J)V - invoke-virtual {v13, v6, v7}, Ljava/io/PrintStream;->println(J)V - cmp-long v12, v8, v6 - if-gez v12, :label_b - const-string v12, "LOOP" - invoke-virtual {v13, v12}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V - const-wide/16 v10, 0x01 - add-long v8, v8, v10 - goto :label_a - - :label_b - const/4 v10, 0x01 - new-array v10, v10, [D - const/4 v6, 0x00 - aget-wide v8, v10, v6 - cmpl-double v2, v8, v4 - if-nez v2, :label_c - cmpl-double v0, v8, v0 - if-eqz v0, :label_c - const-string v0, "DONE" - invoke-virtual {v13, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - goto :label_d - - :label_c - const-string v0, "DOUBLE COMPARISON FAILED" - invoke-virtual {v13, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V - - :label_d - return-void -.end method - -.method public static main([Ljava/lang/String;)V - .locals 0 - - invoke-static {}, LTest;->intAndFloatZeroConstants()V - invoke-static {}, LTest;->longAndDoubleZeroConstants()V - - return-void -.end method
diff --git a/src/test/smali/regression/33846227/33846227.smali b/src/test/smali/regression/33846227/33846227.smali deleted file mode 100644 index c8553a7..0000000 --- a/src/test/smali/regression/33846227/33846227.smali +++ /dev/null
@@ -1,36 +0,0 @@ -# Copyright (c) 2016, 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. - -# Before Lollipop (Art 5.1.1) Art/Dalvik failed on verification if an empty sparse switch payload -# was the last instruction in a method. This was originally reported as 19827056, and fixed in -# https://android.googlesource.com/platform/art/+/9ccd151d0d27a729f88af9d00285afe4d147981a - -# This test is copied from -# https://android.googlesource.com/platform/art/+/9ccd151d0d27a729f88af9d00285afe4d147981a -.class public LTest; -.super Ljava/lang/Object; - -.method public static run()V - .registers 2 - - :start - const v0, 0 - - sparse-switch v0, :SparseSwitch - - return-void - - :SparseSwitch - .sparse-switch - .end sparse-switch - -.end method - -.method public static main([Ljava/lang/String;)V - .locals 0 - - invoke-static {}, LTest;->run()V - - return-void -.end method
diff --git a/src/test/smali/regression/78072750/78072750.smali b/src/test/smali/regression/78072750/78072750.smali deleted file mode 100644 index ecf4668..0000000 --- a/src/test/smali/regression/78072750/78072750.smali +++ /dev/null
@@ -1,22386 +0,0 @@ -# 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. - -.class Landroid/databinding/DataBinderMapperImpl; -.super Landroid/databinding/DataBinderMapper; -.source "DataBinderMapperImpl.java" - - -# annotations -.annotation system Ldalvik/annotation/MemberClasses; - value = { - Landroid/databinding/DataBinderMapperImpl$InnerBrLookup; - } -.end annotation - - -# direct methods -.method public constructor <init>()V - .registers 1 - - .line 5 - invoke-direct {p0}, Landroid/databinding/DataBinderMapper;-><init>()V - - .line 6 - return-void -.end method - - -# virtual methods -.method public convertBrIdToString(I)Ljava/lang/String; - .registers 3 - .param p1, "id" # I - - .line 4474 - if-ltz p1, :cond_d - - sget-object v0, Landroid/databinding/DataBinderMapperImpl$InnerBrLookup;->sKeys:[Ljava/lang/String; - - array-length v0, v0 - - if-lt p1, v0, :cond_8 - - goto :goto_d - - .line 4477 - :cond_8 - sget-object v0, Landroid/databinding/DataBinderMapperImpl$InnerBrLookup;->sKeys:[Ljava/lang/String; - - aget-object v0, v0, p1 - - return-object v0 - - .line 4475 - :cond_d - :goto_d - const/4 v0, 0x0 - - return-object v0 -.end method - -.method public getDataBinder(Landroid/databinding/DataBindingComponent;Landroid/view/View;I)Landroid/databinding/ViewDataBinding; - .registers 8 - .param p1, "bindingComponent" # Landroid/databinding/DataBindingComponent; - .param p2, "view" # Landroid/view/View; - .param p3, "layoutId" # I - - .line 9 - packed-switch p3, :pswitch_data_3bcc - - packed-switch p3, :pswitch_data_3bd6 - - packed-switch p3, :pswitch_data_3be2 - - packed-switch p3, :pswitch_data_3bea - - packed-switch p3, :pswitch_data_3bf8 - - packed-switch p3, :pswitch_data_3c00 - - packed-switch p3, :pswitch_data_3c10 - - packed-switch p3, :pswitch_data_3c18 - - packed-switch p3, :pswitch_data_3c22 - - packed-switch p3, :pswitch_data_3c2a - - packed-switch p3, :pswitch_data_3c32 - - packed-switch p3, :pswitch_data_3c40 - - packed-switch p3, :pswitch_data_3c4c - - packed-switch p3, :pswitch_data_3c58 - - packed-switch p3, :pswitch_data_3c62 - - packed-switch p3, :pswitch_data_3c72 - - packed-switch p3, :pswitch_data_3c8a - - packed-switch p3, :pswitch_data_3cd2 - - packed-switch p3, :pswitch_data_3cde - - packed-switch p3, :pswitch_data_3d2a - - packed-switch p3, :pswitch_data_3d92 - - packed-switch p3, :pswitch_data_3d9a - - packed-switch p3, :pswitch_data_3da8 - - packed-switch p3, :pswitch_data_3db2 - - packed-switch p3, :pswitch_data_3dd2 - - packed-switch p3, :pswitch_data_3de6 - - packed-switch p3, :pswitch_data_3df2 - - packed-switch p3, :pswitch_data_3dfc - - packed-switch p3, :pswitch_data_3e08 - - packed-switch p3, :pswitch_data_3e12 - - packed-switch p3, :pswitch_data_3e20 - - packed-switch p3, :pswitch_data_3e2a - - packed-switch p3, :pswitch_data_3e34 - - packed-switch p3, :pswitch_data_3e42 - - packed-switch p3, :pswitch_data_3e52 - - sparse-switch p3, :sswitch_data_3e5c - - .line 2648 - const/4 v0, 0x0 - - return-object v0 - - .line 1779 - :sswitch_6e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1780 - .local v0, "tag":Ljava/lang/Object; - if-nez v0, :cond_7d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1781 - :cond_7d - const-string v1, "layout/toolbar_onboarding_progress_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_8b - - .line 1782 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarOnboardingProgressLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarOnboardingProgressLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1784 - :cond_8b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_onboarding_progress_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 825 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_a2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 826 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_b1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 827 - :cond_b1 - const-string v1, "layout/toolbar_gray_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_bf - - .line 828 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarGrayLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarGrayLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 830 - :cond_bf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_gray_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 942 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_d6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 943 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_e5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 944 - :cond_e5 - const-string v1, "layout/toolbar_base_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_f3 - - .line 945 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarBaseLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarBaseLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 947 - :cond_f3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_base_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2259 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_10a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2260 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_119 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2261 - :cond_119 - const-string v1, "layout/thumbnail_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_127 - - .line 2262 - new-instance v1, Lcom/classdojo/components/databinding/ThumbnailItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/components/databinding/ThumbnailItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2264 - :cond_127 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for thumbnail_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1368 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_13e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1369 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_14d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1370 - :cond_14d - const-string v1, "layout/story_post_created_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_15b - - .line 1371 - new-instance v1, Lcom/classdojo/android/databinding/StoryPostCreatedBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/StoryPostCreatedBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1373 - :cond_15b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for story_post_created is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 315 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_172 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 316 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_181 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 317 - :cond_181 - const-string v1, "layout/setup_skills_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_18f - - .line 318 - new-instance v1, Lcom/classdojo/android/databinding/SetupSkillsListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/SetupSkillsListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 320 - :cond_18f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for setup_skills_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1518 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_1a6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1519 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1b5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1520 - :cond_1b5 - const-string v1, "layout/popup_item_copy_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1c3 - - .line 1521 - new-instance v1, Lcom/classdojo/android/databinding/PopupItemCopyBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/PopupItemCopyBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1523 - :cond_1c3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for popup_item_copy is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 585 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_1da - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 586 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1e9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 587 - :cond_1e9 - const-string v1, "layout/placeholder_offline_with_refresh_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1f7 - - .line 588 - new-instance v1, Lcom/classdojo/android/databinding/PlaceholderOfflineWithRefreshBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/PlaceholderOfflineWithRefreshBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 590 - :cond_1f7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for placeholder_offline_with_refresh is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 795 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_20e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 796 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_21d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 797 - :cond_21d - const-string v1, "layout/placeholder_empty_with_refresh_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_22b - - .line 798 - new-instance v1, Lcom/classdojo/android/databinding/PlaceholderEmptyWithRefreshBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/PlaceholderEmptyWithRefreshBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 800 - :cond_22b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for placeholder_empty_with_refresh is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1473 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_242 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1474 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_251 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1475 - :cond_251 - const-string v1, "layout/item_teacher_add_coteacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_25f - - .line 1476 - new-instance v1, Lcom/classdojo/android/databinding/ItemTeacherAddCoteacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemTeacherAddCoteacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1478 - :cond_25f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_teacher_add_coteacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1680 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_276 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1681 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_285 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1682 - :cond_285 - const-string v1, "layout/item_student_drawing_tool_sticker_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_293 - - .line 1683 - new-instance v1, Lcom/classdojo/android/databinding/ItemStudentDrawingToolStickerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemStudentDrawingToolStickerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1685 - :cond_293 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_student_drawing_tool_sticker is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1161 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_2aa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1162 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2b9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1163 - :cond_2b9 - const-string v1, "layout/item_parent_list_new_message_invite_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2c7 - - .line 1164 - new-instance v1, Lcom/classdojo/android/databinding/ItemParentListNewMessageInviteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemParentListNewMessageInviteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1166 - :cond_2c7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_parent_list_new_message_invite is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1044 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_2de - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1045 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ed - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1046 - :cond_2ed - const-string v1, "layout/item_image_resource_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2fb - - .line 1047 - new-instance v1, Lcom/classdojo/android/databinding/ItemImageResourceBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemImageResourceBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1049 - :cond_2fb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_image_resource is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1863 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_312 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1864 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_321 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1865 - :cond_321 - const-string v1, "layout/item_add_student_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_32f - - .line 1866 - new-instance v1, Lcom/classdojo/android/databinding/ItemAddStudentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemAddStudentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1868 - :cond_32f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_add_student is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1287 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_346 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1288 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_355 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1289 - :cond_355 - const-string v1, "layout/fragment_tab_class_wall_item_student_avatar_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_363 - - .line 1290 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentAvatarBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentAvatarBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1292 - :cond_363 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_student_avatar is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 351 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_37a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 352 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_389 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 353 - :cond_389 - const-string v1, "layout/fragment_tab_class_wall_generic_button_icon_text_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_397 - - .line 354 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallGenericButtonIconTextItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallGenericButtonIconTextItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 356 - :cond_397 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_generic_button_icon_text_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 648 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_3ae - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 649 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3bd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 650 - :cond_3bd - const-string v1, "layout/fragment_school_detail_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3cb - - .line 651 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDetailBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDetailBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 653 - :cond_3cb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_detail is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1815 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_3e2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1816 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3f1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1817 - :cond_3f1 - const-string v1, "layout/fragment_group_students_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3ff - - .line 1818 - new-instance v1, Lcom/classdojo/android/databinding/FragmentGroupStudentsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentGroupStudentsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1820 - :cond_3ff - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_group_students is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 567 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_416 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 568 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_425 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 569 - :cond_425 - const-string v1, "layout/fragment_account_switcher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_433 - - .line 570 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAccountSwitcherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAccountSwitcherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 572 - :cond_433 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_account_switcher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 978 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_44a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 979 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_459 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 980 - :cond_459 - const-string v1, "layout/debug_feature_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_467 - - .line 981 - new-instance v1, Lcom/classdojo/android/databinding/DebugFeatureListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DebugFeatureListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 983 - :cond_467 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for debug_feature_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1644 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_47e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1645 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_48d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1646 - :cond_48d - const-string v1, "layout/chat_empty_broadcasts_view_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_49b - - .line 1647 - new-instance v1, Lcom/classdojo/android/databinding/ChatEmptyBroadcastsViewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ChatEmptyBroadcastsViewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1649 - :cond_49b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for chat_empty_broadcasts_view is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1425 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_4b2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1426 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_4c1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1427 - :cond_4c1 - const-string v1, "layout-sw600dp-land/activity_student_capture_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_4cf - - .line 1428 - new-instance v1, Lcom/classdojo/android/databinding/ActivityStudentCaptureHomeBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityStudentCaptureHomeBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1430 - :cond_4cf - const-string v1, "layout/activity_student_capture_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_4dd - - .line 1431 - new-instance v1, Lcom/classdojo/android/databinding/ActivityStudentCaptureHomeBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityStudentCaptureHomeBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1433 - :cond_4dd - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_student_capture_home is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2349 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_4f4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2350 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_503 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2351 - :cond_503 - const-string v1, "layout/activity_school_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_511 - - .line 2352 - new-instance v1, Lcom/classdojo/android/databinding/ActivitySchoolBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivitySchoolBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2354 - :cond_511 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_school is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 495 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_528 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 496 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_537 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 497 - :cond_537 - const-string v1, "layout/activity_qrcode_scan_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_545 - - .line 498 - new-instance v1, Lcom/classdojo/android/databinding/ActivityQrcodeScanBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityQrcodeScanBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 500 - :cond_545 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_qrcode_scan is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 333 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_55c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 334 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_56b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 335 - :cond_56b - const-string v1, "layout/activity_passwordless_login_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_579 - - .line 336 - new-instance v1, Lcom/classdojo/android/databinding/ActivityPasswordlessLoginBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityPasswordlessLoginBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 338 - :cond_579 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_passwordless_login is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 960 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_590 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 961 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_59f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 962 - :cond_59f - const-string v1, "layout/activity_parent_setup_student_account_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_5ad - - .line 963 - new-instance v1, Lcom/classdojo/android/databinding/ActivityParentSetupStudentAccountBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityParentSetupStudentAccountBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 965 - :cond_5ad - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_parent_setup_student_account is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1572 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_5c4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1573 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_5d3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1574 - :cond_5d3 - const-string v1, "layout/activity_parent_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_5e1 - - .line 1575 - new-instance v1, Lcom/classdojo/android/databinding/ActivityParentHomeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityParentHomeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1577 - :cond_5e1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_parent_home is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1635 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_5f8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1636 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_607 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1637 - :cond_607 - const-string v1, "layout/activity_parent_checklist_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_615 - - .line 1638 - new-instance v1, Lcom/classdojo/android/databinding/ActivityParentChecklistBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityParentChecklistBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1640 - :cond_615 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_parent_checklist is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2520 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_62c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2521 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_63b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2522 - :cond_63b - const-string v1, "layout/activity_email_verified_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_649 - - .line 2523 - new-instance v1, Lcom/classdojo/android/databinding/ActivityEmailVerifiedBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityEmailVerifiedBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2525 - :cond_649 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_email_verified is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1797 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_660 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1798 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_66f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1799 - :cond_66f - const-string v1, "layout/activity_class_link_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_67d - - .line 1800 - new-instance v1, Lcom/classdojo/android/databinding/ActivityClassLinkBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityClassLinkBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1802 - :cond_67d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_class_link is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 180 - .end local v0 # "tag":Ljava/lang/Object; - :sswitch_694 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 181 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_6a3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 182 - :cond_6a3 - const-string v1, "layout/activity_add_edit_class_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_6b1 - - .line 183 - new-instance v1, Lcom/classdojo/android/databinding/ActivityAddEditClassBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityAddEditClassBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 185 - :cond_6b1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_add_edit_class is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1617 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_6c8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1618 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_6d7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1619 - :cond_6d7 - const-string v1, "layout/webview_fragment_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_6e5 - - .line 1620 - new-instance v1, Lcom/classdojo/android/databinding/WebviewFragmentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/WebviewFragmentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1622 - :cond_6e5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for webview_fragment is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 30 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_6fc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 31 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_70b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 32 - :cond_70b - const-string v1, "layout/view_teacher_student_connection_text_codes_instructions_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_719 - - .line 33 - new-instance v1, Lcom/classdojo/android/databinding/ViewTeacherStudentConnectionTextCodesInstructionsHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewTeacherStudentConnectionTextCodesInstructionsHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 35 - :cond_719 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_teacher_student_connection_text_codes_instructions_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1743 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_730 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1744 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_73f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1745 - :cond_73f - const-string v1, "layout/view_students_moved_tooltip_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_74d - - .line 1746 - new-instance v1, Lcom/classdojo/android/databinding/ViewStudentsMovedTooltipBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewStudentsMovedTooltipBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1748 - :cond_74d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_students_moved_tooltip is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2250 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_764 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2251 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_773 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2252 - :cond_773 - const-string v1, "layout/view_parent_pending_connection_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_781 - - .line 2253 - new-instance v1, Lcom/classdojo/android/databinding/ViewParentPendingConnectionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewParentPendingConnectionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2255 - :cond_781 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_parent_pending_connection is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2049 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_798 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2050 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_7a7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2051 - :cond_7a7 - const-string v1, "layout/view_list_header_limit_width_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_7b5 - - .line 2052 - new-instance v1, Lcom/classdojo/android/databinding/ViewListHeaderLimitWidthBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewListHeaderLimitWidthBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2054 - :cond_7b5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_list_header_limit_width is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 207 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_7cc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 208 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_7db - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 209 - :cond_7db - const-string v1, "layout/view_list_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_7e9 - - .line 210 - new-instance v1, Lcom/classdojo/android/databinding/ViewListHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewListHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 212 - :cond_7e9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_list_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1599 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_800 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1600 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_80f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1601 - :cond_80f - const-string v1, "layout/view_drawing_tool_sticker_drawer_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_81d - - .line 1602 - new-instance v1, Lcom/classdojo/android/databinding/ViewDrawingToolStickerDrawerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewDrawingToolStickerDrawerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1604 - :cond_81d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_drawing_tool_sticker_drawer is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2538 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_834 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2539 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_843 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2540 - :cond_843 - const-string v1, "layout/view_drawing_tool_discard_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_851 - - .line 2541 - new-instance v1, Lcom/classdojo/android/databinding/ViewDrawingToolDiscardBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewDrawingToolDiscardBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2543 - :cond_851 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_drawing_tool_discard is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2610 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_868 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2611 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_877 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2612 - :cond_877 - const-string v1, "layout/view_drawer_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_885 - - .line 2613 - new-instance v1, Lcom/classdojo/android/databinding/ViewDrawerItemBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewDrawerItemBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2615 - :cond_885 - const-string v1, "layout-sw600dp-land/view_drawer_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_893 - - .line 2616 - new-instance v1, Lcom/classdojo/android/databinding/ViewDrawerItemBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ViewDrawerItemBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2618 - :cond_893 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for view_drawer_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2286 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_8aa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2287 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_8b9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2288 - :cond_8b9 - const-string v1, "layout/toolbar_text_post_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_8c7 - - .line 2289 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarTextPostLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarTextPostLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2291 - :cond_8c7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_text_post_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 441 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_8de - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 442 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_8ed - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 443 - :cond_8ed - const-string v1, "layout/toolbar_text_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_8fb - - .line 444 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarTextLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarTextLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 446 - :cond_8fb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_text_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1824 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_912 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1825 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_921 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1826 - :cond_921 - const-string v1, "layout/toolbar_teacher_onboarding_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_92f - - .line 1827 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarTeacherOnboardingBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarTeacherOnboardingBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1829 - :cond_92f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_teacher_onboarding is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 924 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_946 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 925 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_955 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 926 - :cond_955 - const-string v1, "layout/toolbar_teacher_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_963 - - .line 927 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarTeacherHomeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarTeacherHomeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 929 - :cond_963 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_teacher_home is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1377 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_97a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1378 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_989 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1379 - :cond_989 - const-string v1, "layout/toolbar_teacher_approval_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_997 - - .line 1380 - new-instance v1, Lcom/classdojo/android/databinding/ToolbarTeacherApprovalBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ToolbarTeacherApprovalBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1382 - :cond_997 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for toolbar_teacher_approval is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1698 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_9ae - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1699 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_9bd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1700 - :cond_9bd - const-string v1, "layout/student_login_list_not_my_class_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_9cb - - .line 1701 - new-instance v1, Lcom/classdojo/android/databinding/StudentLoginListNotMyClassItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/StudentLoginListNotMyClassItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1703 - :cond_9cb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for student_login_list_not_my_class_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1842 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_9e2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1843 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_9f1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1844 - :cond_9f1 - const-string v1, "layout-sw600dp/student_login_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_9ff - - .line 1845 - new-instance v1, Lcom/classdojo/android/databinding/StudentLoginListItemBindingSw600dpImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/StudentLoginListItemBindingSw600dpImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1847 - :cond_9ff - const-string v1, "layout/student_login_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_a0d - - .line 1848 - new-instance v1, Lcom/classdojo/android/databinding/StudentLoginListItemBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/StudentLoginListItemBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1850 - :cond_a0d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for student_login_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2124 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_a24 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2125 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_a33 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2126 - :cond_a33 - const-string v1, "layout/student_connections_individual_codes_invite_section_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_a41 - - .line 2127 - new-instance v1, Lcom/classdojo/android/databinding/StudentConnectionsIndividualCodesInviteSectionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/StudentConnectionsIndividualCodesInviteSectionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2129 - :cond_a41 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for student_connections_individual_codes_invite_section is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1224 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_a58 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1225 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_a67 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1226 - :cond_a67 - const-string v1, "layout/parent_connections_single_code_invite_section_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_a75 - - .line 1227 - new-instance v1, Lcom/classdojo/android/databinding/ParentConnectionsSingleCodeInviteSectionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ParentConnectionsSingleCodeInviteSectionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1229 - :cond_a75 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for parent_connections_single_code_invite_section is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1833 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_a8c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1834 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_a9b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1835 - :cond_a9b - const-string v1, "layout/parent_connections_individual_codes_invite_section_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_aa9 - - .line 1836 - new-instance v1, Lcom/classdojo/android/databinding/ParentConnectionsIndividualCodesInviteSectionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ParentConnectionsIndividualCodesInviteSectionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1838 - :cond_aa9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for parent_connections_individual_codes_invite_section is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 216 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_ac0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 217 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_acf - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 218 - :cond_acf - const-string v1, "layout/parent_checklist_success_overlay_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_add - - .line 219 - new-instance v1, Lcom/classdojo/android/databinding/ParentChecklistSuccessOverlayBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ParentChecklistSuccessOverlayBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 221 - :cond_add - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for parent_checklist_success_overlay is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1890 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_af4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1891 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_b03 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1892 - :cond_b03 - const-string v1, "layout/layout_student_list_empty_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_b11 - - .line 1893 - new-instance v1, Lcom/classdojo/android/databinding/LayoutStudentListEmptyBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutStudentListEmptyBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1895 - :cond_b11 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_student_list_empty is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2214 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_b28 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2215 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_b37 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2216 - :cond_b37 - const-string v1, "layout/layout_student_connections_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_b45 - - .line 2217 - new-instance v1, Lcom/classdojo/android/databinding/LayoutStudentConnectionsListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutStudentConnectionsListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2219 - :cond_b45 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_student_connections_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1395 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_b5c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1396 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_b6b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1397 - :cond_b6b - const-string v1, "layout/layout_student_connections_invite_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_b79 - - .line 1398 - new-instance v1, Lcom/classdojo/android/databinding/LayoutStudentConnectionsInviteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutStudentConnectionsInviteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1400 - :cond_b79 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_student_connections_invite is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1170 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_b90 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1171 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_b9f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1172 - :cond_b9f - const-string v1, "layout/layout_student_connections_initial_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_bad - - .line 1173 - new-instance v1, Lcom/classdojo/android/databinding/LayoutStudentConnectionsInitialBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutStudentConnectionsInitialBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1175 - :cond_bad - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_student_connections_initial is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2358 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_bc4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2359 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_bd3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2360 - :cond_bd3 - const-string v1, "layout/layout_progress_footer_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_be1 - - .line 2361 - new-instance v1, Lcom/classdojo/android/databinding/LayoutProgressFooterBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutProgressFooterBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2363 - :cond_be1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_progress_footer is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1215 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_bf8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1216 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_c07 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1217 - :cond_c07 - const-string v1, "layout/layout_parent_connections_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_c15 - - .line 1218 - new-instance v1, Lcom/classdojo/android/databinding/LayoutParentConnectionsListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutParentConnectionsListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1220 - :cond_c15 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_parent_connections_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 468 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_c2c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 469 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_c3b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 470 - :cond_c3b - const-string v1, "layout/layout_parent_connections_invite_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_c49 - - .line 471 - new-instance v1, Lcom/classdojo/android/databinding/LayoutParentConnectionsInviteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutParentConnectionsInviteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 473 - :cond_c49 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_parent_connections_invite is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2640 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_c60 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2641 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_c6f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2642 - :cond_c6f - const-string v1, "layout/layout_parent_connections_initial_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_c7d - - .line 2643 - new-instance v1, Lcom/classdojo/android/databinding/LayoutParentConnectionsInitialBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutParentConnectionsInitialBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2645 - :cond_c7d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_parent_connections_initial is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2178 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_c94 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2179 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_ca3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2180 - :cond_ca3 - const-string v1, "layout/layout_legacy_video_view_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_cb1 - - .line 2181 - new-instance v1, Lcom/classdojo/android/databinding/LayoutLegacyVideoViewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutLegacyVideoViewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2183 - :cond_cb1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_legacy_video_view is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 723 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_cc8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 724 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_cd7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 725 - :cond_cd7 - const-string v1, "layout/layout_dojo_video_view_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_ce5 - - .line 726 - new-instance v1, Lcom/classdojo/android/databinding/LayoutDojoVideoViewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutDojoVideoViewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 728 - :cond_ce5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_dojo_video_view is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 603 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_cfc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 604 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_d0b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 605 - :cond_d0b - const-string v1, "layout/layout_create_account_splash_page_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_d19 - - .line 606 - new-instance v1, Lcom/classdojo/android/databinding/LayoutCreateAccountSplashPageBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/LayoutCreateAccountSplashPageBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 608 - :cond_d19 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for layout_create_account_splash_page is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1965 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_d30 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1966 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_d3f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1967 - :cond_d3f - const-string v1, "layout/item_teacher_student_text_code_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_d4d - - .line 1968 - new-instance v1, Lcom/classdojo/android/databinding/ItemTeacherStudentTextCodeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemTeacherStudentTextCodeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1970 - :cond_d4d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_teacher_student_text_code is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2475 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_d64 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2476 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_d73 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2477 - :cond_d73 - const-string v1, "layout/item_parent_checklist_complete_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_d81 - - .line 2478 - new-instance v1, Lcom/classdojo/android/databinding/ItemParentChecklistCompleteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemParentChecklistCompleteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2480 - :cond_d81 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_parent_checklist_complete is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1545 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_d98 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1546 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_da7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1547 - :cond_da7 - const-string v1, "layout/item_parent_checklist_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_db5 - - .line 1548 - new-instance v1, Lcom/classdojo/android/databinding/ItemParentChecklistBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemParentChecklistBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1550 - :cond_db5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_parent_checklist is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 714 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_dcc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 715 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_ddb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 716 - :cond_ddb - const-string v1, "layout/item_onboarding_class_code_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_de9 - - .line 717 - new-instance v1, Lcom/classdojo/android/databinding/ItemOnboardingClassCodeHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemOnboardingClassCodeHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 719 - :cond_de9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_onboarding_class_code_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1197 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_e00 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1198 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_e0f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1199 - :cond_e0f - const-string v1, "layout/item_grid_teacher_title_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_e1d - - .line 1200 - new-instance v1, Lcom/classdojo/android/databinding/ItemGridTeacherTitleBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemGridTeacherTitleBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1202 - :cond_e1d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_grid_teacher_title is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2106 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_e34 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2107 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_e43 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2108 - :cond_e43 - const-string v1, "layout/item_file_attachment_view_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_e51 - - .line 2109 - new-instance v1, Lcom/classdojo/android/databinding/ItemFileAttachmentViewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemFileAttachmentViewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2111 - :cond_e51 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_file_attachment_view is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2502 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_e68 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2503 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_e77 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2504 - :cond_e77 - const-string v1, "layout/item_class_code_student_select_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_e85 - - .line 2505 - new-instance v1, Lcom/classdojo/android/databinding/ItemClassCodeStudentSelectBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemClassCodeStudentSelectBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2507 - :cond_e85 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_class_code_student_select is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1770 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_e9c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1771 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_eab - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1772 - :cond_eab - const-string v1, "layout/item_class_code_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_eb9 - - .line 1773 - new-instance v1, Lcom/classdojo/android/databinding/ItemClassCodeHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ItemClassCodeHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1775 - :cond_eb9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for item_class_code_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1509 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_ed0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1510 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_edf - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1511 - :cond_edf - const-string v1, "layout/invite_parent_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_eed - - .line 1512 - new-instance v1, Lcom/classdojo/android/databinding/InviteParentListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/InviteParentListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1514 - :cond_eed - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for invite_parent_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 450 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_f04 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 451 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_f13 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 452 - :cond_f13 - const-string v1, "layout/invite_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_f21 - - .line 453 - new-instance v1, Lcom/classdojo/android/databinding/InviteListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/InviteListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 455 - :cond_f21 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for invite_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2241 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_f38 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2242 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_f47 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2243 - :cond_f47 - const-string v1, "layout/fragment_web_view_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_f55 - - .line 2244 - new-instance v1, Lcom/classdojo/android/databinding/FragmentWebViewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentWebViewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2246 - :cond_f55 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_web_view is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2574 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_f6c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2575 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_f7b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2576 - :cond_f7b - const-string v1, "layout/fragment_video_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_f89 - - .line 2577 - new-instance v1, Lcom/classdojo/android/databinding/FragmentVideoPreviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentVideoPreviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2579 - :cond_f89 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_video_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2088 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_fa0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2089 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_faf - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2090 - :cond_faf - const-string v1, "layout/fragment_teacher_welcome_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_fbd - - .line 2091 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherWelcomeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherWelcomeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2093 - :cond_fbd - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_welcome is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1098 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_fd4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1099 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_fe3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1100 - :cond_fe3 - const-string v1, "layout/fragment_teacher_student_connection_text_codes_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_ff1 - - .line 1101 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherStudentConnectionTextCodesBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherStudentConnectionTextCodesBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1103 - :cond_ff1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_student_connection_text_codes is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2511 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1008 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2512 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1017 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2513 - :cond_1017 - const-string v1, "layout/fragment_teacher_student_connection_class_code_qr_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1025 - - .line 2514 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherStudentConnectionClassCodeQrBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherStudentConnectionClassCodeQrBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2516 - :cond_1025 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_student_connection_class_code_qr is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1926 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_103c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1927 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_104b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1928 - :cond_104b - const-string v1, "layout/fragment_teacher_story_feed_approval_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1059 - - .line 1929 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherStoryFeedApprovalBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherStoryFeedApprovalBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1931 - :cond_1059 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_story_feed_approval is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2385 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1070 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2386 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_107f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2387 - :cond_107f - const-string v1, "layout/fragment_teacher_settings_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_108d - - .line 2388 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherSettingsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherSettingsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2390 - :cond_108d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_settings is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1899 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_10a4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1900 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_10b3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1901 - :cond_10b3 - const-string v1, "layout/fragment_teacher_search_item_empty_teacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_10c1 - - .line 1902 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherSearchItemEmptyTeacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherSearchItemEmptyTeacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1904 - :cond_10c1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_search_item_empty_teacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 504 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_10d8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 505 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_10e7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 506 - :cond_10e7 - const-string v1, "layout/fragment_teacher_connection_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_10f5 - - .line 507 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherConnectionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherConnectionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 509 - :cond_10f5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_connection is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1260 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_110c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1261 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_111b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1262 - :cond_111b - const-string v1, "layout/fragment_teacher_channel_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1129 - - .line 1263 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherChannelListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherChannelListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1265 - :cond_1129 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_channel_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 843 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1140 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 844 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_114f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 845 - :cond_114f - const-string v1, "layout/fragment_teacher_approval_feed_item_text_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_115d - - .line 846 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherApprovalFeedItemTextBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherApprovalFeedItemTextBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 848 - :cond_115d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_approval_feed_item_text is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2529 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1174 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2530 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1183 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2531 - :cond_1183 - const-string v1, "layout/fragment_teacher_approval_feed_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1191 - - .line 2532 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTeacherApprovalFeedItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTeacherApprovalFeedItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2534 - :cond_1191 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_teacher_approval_feed_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2493 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_11a8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2494 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_11b7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2495 - :cond_11b7 - const-string v1, "layout/fragment_tab_student_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_11c5 - - .line 2496 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabStudentListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabStudentListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2498 - :cond_11c5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_student_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1935 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_11dc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1936 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_11eb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1937 - :cond_11eb - const-string v1, "layout-sw600dp-land/fragment_tab_story_feed_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_11f9 - - .line 1938 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabStoryFeedBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabStoryFeedBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1940 - :cond_11f9 - const-string v1, "layout/fragment_tab_story_feed_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1207 - - .line 1941 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabStoryFeedBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabStoryFeedBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1943 - :cond_1207 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_story_feed is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 93 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_121e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 94 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_122d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 95 - :cond_122d - const-string v1, "layout/fragment_tab_notification_pending_posts_item_thumbnail_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_123b - - .line 96 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationPendingPostsItemThumbnailBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationPendingPostsItemThumbnailBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 98 - :cond_123b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_pending_posts_item_thumbnail is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2421 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1252 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2422 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1261 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2423 - :cond_1261 - const-string v1, "layout/fragment_tab_notification_pending_posts_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_126f - - .line 2424 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationPendingPostsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationPendingPostsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2426 - :cond_126f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_pending_posts_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1143 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1286 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1144 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1295 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1145 - :cond_1295 - const-string v1, "layout/fragment_tab_notification_list_pending_requests_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_12a3 - - .line 1146 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationListPendingRequestsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationListPendingRequestsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1148 - :cond_12a3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_list_pending_requests_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 750 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_12ba - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 751 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_12c9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 752 - :cond_12c9 - const-string v1, "layout/fragment_tab_notification_list_item_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_12d7 - - .line 753 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationListItemHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationListItemHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 755 - :cond_12d7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_list_item_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1455 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_12ee - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1456 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_12fd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1457 - :cond_12fd - const-string v1, "layout/fragment_tab_notification_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_130b - - .line 1458 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1460 - :cond_130b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1752 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1322 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1753 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1331 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1754 - :cond_1331 - const-string v1, "layout/fragment_tab_notification_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_133f - - .line 1755 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabNotificationListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabNotificationListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1757 - :cond_133f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_notification_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 153 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1356 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 154 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1365 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 155 - :cond_1365 - const-string v1, "layout/fragment_tab_class_wall_item_webview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1373 - - .line 156 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemWebviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemWebviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 158 - :cond_1373 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_webview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1386 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_138a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1387 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1399 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1388 - :cond_1399 - const-string v1, "layout/fragment_tab_class_wall_item_student_report_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_13a7 - - .line 1389 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentReportBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentReportBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1391 - :cond_13a7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_student_report is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1446 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_13be - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1447 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_13cd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1448 - :cond_13cd - const-string v1, "layout/fragment_tab_class_wall_item_student_permission_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_13db - - .line 1449 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentPermissionBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemStudentPermissionBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1451 - :cond_13db - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_student_permission is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1806 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_13f2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1807 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1401 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1808 - :cond_1401 - const-string v1, "layout/fragment_tab_class_wall_item_parent_empty_checklist_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_140f - - .line 1809 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemParentEmptyChecklistBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemParentEmptyChecklistBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1811 - :cond_140f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_parent_empty_checklist is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 888 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1426 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 889 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1435 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 890 - :cond_1435 - const-string v1, "layout/fragment_tab_class_wall_item_parent_empty_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1443 - - .line 891 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemParentEmptyBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemParentEmptyBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 893 - :cond_1443 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_parent_empty is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 804 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_145a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 805 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1469 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 806 - :cond_1469 - const-string v1, "layout/fragment_tab_class_wall_item_invite_card_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1477 - - .line 807 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemInviteCardBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemInviteCardBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 809 - :cond_1477 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_invite_card is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1251 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_148e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1252 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_149d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1253 - :cond_149d - const-string v1, "layout/fragment_tab_class_wall_item_invite_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_14ab - - .line 1254 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemInviteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemInviteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1256 - :cond_14ab - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_invite is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2013 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_14c2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2014 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_14d1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2015 - :cond_14d1 - const-string v1, "layout/fragment_tab_class_wall_item_demo_empty_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_14df - - .line 2016 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemDemoEmptyBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemDemoEmptyBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2018 - :cond_14df - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_demo_empty is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 522 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_14f6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 523 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1505 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 524 - :cond_1505 - const-string v1, "layout/fragment_tab_class_wall_item_compose_large_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1513 - - .line 525 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemComposeLargeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemComposeLargeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 527 - :cond_1513 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_compose_large is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 540 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_152a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 541 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1539 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 542 - :cond_1539 - const-string v1, "layout/fragment_tab_class_wall_item_compose_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1547 - - .line 543 - new-instance v1, Lcom/classdojo/android/databinding/FragmentTabClassWallItemComposeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentTabClassWallItemComposeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 545 - :cond_1547 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_tab_class_wall_item_compose is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1689 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_155e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1690 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_156d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1691 - :cond_156d - const-string v1, "layout/fragment_student_report_selector_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_157b - - .line 1692 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportSelectorItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportSelectorItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1694 - :cond_157b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_selector_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1554 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1592 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1555 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_15a1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1556 - :cond_15a1 - const-string v1, "layout/fragment_student_report_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_15af - - .line 1557 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1559 - :cond_15af - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 405 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_15c6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 406 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_15d5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 407 - :cond_15d5 - const-string v1, "layout/fragment_student_report_list_dialog_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_15e3 - - .line 408 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportListDialogBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportListDialogBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 410 - :cond_15e3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_list_dialog is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 270 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_15fa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 271 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1609 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 272 - :cond_1609 - const-string v1, "layout/fragment_student_report_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1617 - - .line 273 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 275 - :cond_1617 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 261 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_162e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 262 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_163d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 263 - :cond_163d - const-string v1, "layout/fragment_student_report_charts_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_164b - - .line 264 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportChartsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportChartsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 266 - :cond_164b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_charts_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 594 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1662 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 595 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1671 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 596 - :cond_1671 - const-string v1, "layout/fragment_student_report_add_note_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_167f - - .line 597 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportAddNoteItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportAddNoteItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 599 - :cond_167f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report_add_note_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 288 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1696 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 289 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_16a5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 290 - :cond_16a5 - const-string v1, "layout/fragment_student_report_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_16b3 - - .line 291 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentReportBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentReportBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 293 - :cond_16b3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_report is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 324 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_16ca - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 325 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_16d9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 326 - :cond_16d9 - const-string v1, "layout/fragment_student_relation_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_16e7 - - .line 327 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentRelationItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentRelationItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 329 - :cond_16e7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_relation_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1908 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_16fe - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1909 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_170d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1910 - :cond_170d - const-string v1, "layout/fragment_student_registration_form_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_171b - - .line 1911 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentRegistrationFormBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentRegistrationFormBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1913 - :cond_171b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_registration_form is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1581 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1732 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1582 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1741 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1583 - :cond_1741 - const-string v1, "layout/fragment_student_profile_date_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_174f - - .line 1584 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentProfileDateBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentProfileDateBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1586 - :cond_174f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_profile_date is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2067 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1766 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2068 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1775 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2069 - :cond_1775 - const-string v1, "layout/fragment_student_login_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1783 - - .line 2070 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentLoginListBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentLoginListBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2072 - :cond_1783 - const-string v1, "layout-sw600dp/fragment_student_login_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1791 - - .line 2073 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentLoginListBindingSw600dpImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentLoginListBindingSw600dpImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2075 - :cond_1791 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_login_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 57 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_17a8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 58 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_17b7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 59 - :cond_17b7 - const-string v1, "layout/fragment_student_drawing_tool_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_17c5 - - .line 60 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentDrawingToolBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentDrawingToolBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 62 - :cond_17c5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_drawing_tool is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 786 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_17dc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 787 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_17eb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 788 - :cond_17eb - const-string v1, "layout/fragment_student_connections_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_17f9 - - .line 789 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentConnectionsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentConnectionsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 791 - :cond_17f9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_connections is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2484 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1810 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2485 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_181f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2486 - :cond_181f - const-string v1, "layout/fragment_student_codes_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_182d - - .line 2487 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCodesItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCodesItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2489 - :cond_182d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_codes_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1707 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1844 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1708 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1853 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1709 - :cond_1853 - const-string v1, "layout/fragment_student_codes_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1861 - - .line 1710 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCodesBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCodesBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1712 - :cond_1861 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_codes is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 684 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1878 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 685 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1887 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 686 - :cond_1887 - const-string v1, "layout/fragment_student_code_form_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1895 - - .line 687 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCodeFormBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCodeFormBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 689 - :cond_1895 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_code_form is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 459 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_18ac - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 460 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_18bb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 461 - :cond_18bb - const-string v1, "layout/fragment_student_capture_student_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_18c9 - - .line 462 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStudentListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStudentListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 464 - :cond_18c9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_student_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1332 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_18e0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1333 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_18ef - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1334 - :cond_18ef - const-string v1, "layout/fragment_student_capture_student_list_home_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_18fd - - .line 1335 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStudentListHomeItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStudentListHomeItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1337 - :cond_18fd - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_student_list_home_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2631 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1914 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2632 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1923 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2633 - :cond_1923 - const-string v1, "layout/fragment_student_capture_story_feed_item_participant_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1931 - - .line 2634 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemParticipantBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemParticipantBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2636 - :cond_1931 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_story_feed_item_participant is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1188 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1948 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1189 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1957 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1190 - :cond_1957 - const-string v1, "layout/fragment_student_capture_story_feed_item_content_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1965 - - .line 1191 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemContentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemContentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1193 - :cond_1965 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_story_feed_item_content is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 693 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_197c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 694 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_198b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 695 - :cond_198b - const-string v1, "layout-sw600dp-land/fragment_student_capture_story_feed_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1999 - - .line 696 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 698 - :cond_1999 - const-string v1, "layout/fragment_student_capture_story_feed_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_19a7 - - .line 699 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureStoryFeedItemBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 701 - :cond_19a7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_story_feed_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 120 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_19be - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 121 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_19cd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 122 - :cond_19cd - const-string v1, "layout-sw600dp/fragment_student_capture_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_19db - - .line 123 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingSw600dpImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingSw600dpImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 125 - :cond_19db - const-string v1, "layout/fragment_student_capture_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_19e9 - - .line 126 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 128 - :cond_19e9 - const-string v1, "layout-sw600dp-land/fragment_student_capture_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_19f7 - - .line 129 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCapturePreviewBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 131 - :cond_19f7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 423 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1a0e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 424 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1a1d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 425 - :cond_1a1d - const-string v1, "layout/fragment_student_capture_mark_students_marked_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1a2b - - .line 426 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureMarkStudentsMarkedItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureMarkStudentsMarkedItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 428 - :cond_1a2b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_mark_students_marked_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 297 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1a42 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 298 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1a51 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 299 - :cond_1a51 - const-string v1, "layout/fragment_student_capture_mark_students_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1a5f - - .line 300 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureMarkStudentsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureMarkStudentsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 302 - :cond_1a5f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_mark_students_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1671 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1a76 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1672 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1a85 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1673 - :cond_1a85 - const-string v1, "layout/fragment_student_capture_home_student_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1a93 - - .line 1674 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureHomeStudentListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureHomeStudentListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1676 - :cond_1a93 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_home_student_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2601 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1aaa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2602 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1ab9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2603 - :cond_1ab9 - const-string v1, "layout/fragment_student_capture_home_story_feed_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1ac7 - - .line 2604 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentCaptureHomeStoryFeedBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentCaptureHomeStoryFeedBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2606 - :cond_1ac7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_capture_home_story_feed is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1854 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1ade - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1855 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1aed - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1856 - :cond_1aed - const-string v1, "layout/fragment_student_avatar_editor_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1afb - - .line 1857 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStudentAvatarEditorBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStudentAvatarEditorBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1859 - :cond_1afb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_student_avatar_editor is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1323 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1b12 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1324 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1b21 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1325 - :cond_1b21 - const-string v1, "layout/fragment_story_share_to_student_header_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1b2f - - .line 1326 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStoryShareToStudentHeaderItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStoryShareToStudentHeaderItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1328 - :cond_1b2f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_story_share_to_student_header_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 252 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1b46 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 253 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1b55 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 254 - :cond_1b55 - const-string v1, "layout/fragment_story_share_to_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1b63 - - .line 255 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStoryShareToItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStoryShareToItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 257 - :cond_1b63 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_story_share_to_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1563 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1b7a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1564 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1b89 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1565 - :cond_1b89 - const-string v1, "layout/fragment_story_share_to_class_header_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1b97 - - .line 1566 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStoryShareToClassHeaderItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStoryShareToClassHeaderItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1568 - :cond_1b97 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_story_share_to_class_header_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1491 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1bae - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1492 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1bbd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1493 - :cond_1bbd - const-string v1, "layout/fragment_story_share_to_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1bcb - - .line 1494 - new-instance v1, Lcom/classdojo/android/databinding/FragmentStoryShareToBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentStoryShareToBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1496 - :cond_1bcb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_story_share_to is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 576 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1be2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 577 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1bf1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 578 - :cond_1bf1 - const-string v1, "layout/fragment_single_notification_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1bff - - .line 579 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSingleNotificationBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSingleNotificationBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 581 - :cond_1bff - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_single_notification is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1035 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1c16 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1036 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1c25 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1037 - :cond_1c25 - const-string v1, "layout/fragment_setup_skills_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1c33 - - .line 1038 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSetupSkillsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSetupSkillsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1040 - :cond_1c33 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_setup_skills is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 432 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1c4a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 433 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1c59 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 434 - :cond_1c59 - const-string v1, "layout/fragment_seen_by_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1c67 - - .line 435 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSeenByItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSeenByItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 437 - :cond_1c67 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_seen_by_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1014 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1c7e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1015 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1c8d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1016 - :cond_1c8d - const-string v1, "layout/fragment_seen_by_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1c9b - - .line 1017 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSeenByBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSeenByBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1019 - :cond_1c9b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_seen_by is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2196 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1cb2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2197 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1cc1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2198 - :cond_1cc1 - const-string v1, "layout/fragment_school_search_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1ccf - - .line 2199 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolSearchItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolSearchItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2201 - :cond_1ccf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_search_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2376 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1ce6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2377 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1cf5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2378 - :cond_1cf5 - const-string v1, "layout/fragment_school_search_adapter_footer_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1d03 - - .line 2379 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolSearchAdapterFooterBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolSearchAdapterFooterBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2381 - :cond_1d03 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_search_adapter_footer is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 144 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1d1a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 145 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1d29 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 146 - :cond_1d29 - const-string v1, "layout/fragment_school_search_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1d37 - - .line 147 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolSearchBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolSearchBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 149 - :cond_1d37 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_search is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 414 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1d4e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 415 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1d5d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 416 - :cond_1d5d - const-string v1, "layout/fragment_school_null_state_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1d6b - - .line 417 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolNullStateBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolNullStateBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 419 - :cond_1d6b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_null_state is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 198 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1d82 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 199 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1d91 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 200 - :cond_1d91 - const-string v1, "layout/fragment_school_directory_item_welcome_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1d9f - - .line 201 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemWelcomeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemWelcomeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 203 - :cond_1d9f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_welcome is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1734 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1db6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1735 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1dc5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1736 - :cond_1dc5 - const-string v1, "layout/fragment_school_directory_item_teacher_request_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1dd3 - - .line 1737 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherRequestBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherRequestBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1739 - :cond_1dd3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_teacher_request is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 378 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1dea - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 379 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1df9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 380 - :cond_1df9 - const-string v1, "layout/fragment_school_directory_item_teacher_pending_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1e07 - - .line 381 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherPendingBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherPendingBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 383 - :cond_1e07 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_teacher_pending is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2331 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1e1e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2332 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1e2d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2333 - :cond_1e2d - const-string v1, "layout/fragment_school_directory_item_teacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1e3b - - .line 2334 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemTeacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2336 - :cond_1e3b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_teacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2448 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1e52 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2449 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1e61 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2450 - :cond_1e61 - const-string v1, "layout/fragment_school_directory_item_student_parent_circle_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1e6f - - .line 2451 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentParentCircleBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentParentCircleBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2453 - :cond_1e6f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_student_parent_circle is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1152 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1e86 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1153 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1e95 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1154 - :cond_1e95 - const-string v1, "layout/fragment_school_directory_item_student_add_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1ea3 - - .line 1155 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentAddBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentAddBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1157 - :cond_1ea3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_student_add is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2313 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1eba - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2314 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1ec9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2315 - :cond_1ec9 - const-string v1, "layout/fragment_school_directory_item_student_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1ed7 - - .line 2316 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemStudentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2318 - :cond_1ed7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_student is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1716 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1eee - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1717 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1efd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1718 - :cond_1efd - const-string v1, "layout/fragment_school_directory_item_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1f0b - - .line 1719 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryItemHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1721 - :cond_1f0b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory_item_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2622 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1f22 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2623 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1f31 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2624 - :cond_1f31 - const-string v1, "layout/fragment_school_directory_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1f3f - - .line 2625 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDirectoryBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2627 - :cond_1f3f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_directory is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 558 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1f56 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 559 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1f65 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 560 - :cond_1f65 - const-string v1, "layout/fragment_school_detail_teacher_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1f73 - - .line 561 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDetailTeacherItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDetailTeacherItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 563 - :cond_1f73 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_detail_teacher_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1134 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1f8a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1135 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1f99 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1136 - :cond_1f99 - const-string v1, "layout/fragment_school_detail_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1fa7 - - .line 1137 - new-instance v1, Lcom/classdojo/android/databinding/FragmentSchoolDetailHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentSchoolDetailHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1139 - :cond_1fa7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_school_detail_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2142 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1fbe - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2143 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_1fcd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2144 - :cond_1fcd - const-string v1, "layout/fragment_scheduled_messages_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_1fdb - - .line 2145 - new-instance v1, Lcom/classdojo/android/databinding/FragmentScheduledMessagesBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentScheduledMessagesBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2147 - :cond_1fdb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_scheduled_messages is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2367 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_1ff2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2368 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2001 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2369 - :cond_2001 - const-string v1, "layout/fragment_scheduled_message_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_200f - - .line 2370 - new-instance v1, Lcom/classdojo/android/databinding/FragmentScheduledMessageItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentScheduledMessageItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2372 - :cond_200f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_scheduled_message_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2268 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2026 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2269 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2035 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2270 - :cond_2035 - const-string v1, "layout/fragment_push_notifications_settings_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2043 - - .line 2271 - new-instance v1, Lcom/classdojo/android/databinding/FragmentPushNotificationsSettingsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentPushNotificationsSettingsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2273 - :cond_2043 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_push_notifications_settings is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2439 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_205a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2440 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2069 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2441 - :cond_2069 - const-string v1, "layout/fragment_push_notifications_quiet_hours_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2077 - - .line 2442 - new-instance v1, Lcom/classdojo/android/databinding/FragmentPushNotificationsQuietHoursBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentPushNotificationsQuietHoursBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2444 - :cond_2077 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_push_notifications_quiet_hours is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 879 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_208e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 880 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_209d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 881 - :cond_209d - const-string v1, "layout/fragment_profile_photo_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_20ab - - .line 882 - new-instance v1, Lcom/classdojo/android/databinding/FragmentProfilePhotoItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentProfilePhotoItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 884 - :cond_20ab - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_profile_photo_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 861 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_20c2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 862 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_20d1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 863 - :cond_20d1 - const-string v1, "layout/fragment_preview_message_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_20df - - .line 864 - new-instance v1, Lcom/classdojo/android/databinding/FragmentPreviewMessageBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentPreviewMessageBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 866 - :cond_20df - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_preview_message is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 102 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_20f6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 103 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2105 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 104 - :cond_2105 - const-string v1, "layout/fragment_photo_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2113 - - .line 105 - new-instance v1, Lcom/classdojo/android/databinding/FragmentPhotoPreviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentPhotoPreviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 107 - :cond_2113 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_photo_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 162 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_212a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 163 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2139 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 164 - :cond_2139 - const-string v1, "layout/fragment_parent_teacher_search_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2147 - - .line 165 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentTeacherSearchBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentTeacherSearchBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 167 - :cond_2147 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_teacher_search is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 675 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_215e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 676 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_216d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 677 - :cond_216d - const-string v1, "layout/fragment_parent_sign_up_credentials_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_217b - - .line 678 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentSignUpCredentialsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentSignUpCredentialsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 680 - :cond_217b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_sign_up_credentials is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2058 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2192 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2059 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_21a1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2060 - :cond_21a1 - const-string v1, "layout/fragment_parent_setup_student_account_qr_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_21af - - .line 2061 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentSetupStudentAccountQrBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentSetupStudentAccountQrBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2063 - :cond_21af - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_setup_student_account_qr is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2583 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_21c6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2584 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_21d5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2585 - :cond_21d5 - const-string v1, "layout/fragment_parent_setup_student_account_ack_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_21e3 - - .line 2586 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentSetupStudentAccountAckBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentSetupStudentAccountAckBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2588 - :cond_21e3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_setup_student_account_ack is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1482 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_21fa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1483 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2209 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1484 - :cond_2209 - const-string v1, "layout/fragment_parent_school_search_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2217 - - .line 1485 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentSchoolSearchItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentSchoolSearchItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1487 - :cond_2217 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_school_search_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 852 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_222e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 853 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_223d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 854 - :cond_223d - const-string v1, "layout/fragment_parent_school_search_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_224b - - .line 855 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentSchoolSearchBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentSchoolSearchBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 857 - :cond_224b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_school_search is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2340 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2262 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2341 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2271 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2342 - :cond_2271 - const-string v1, "layout/fragment_parent_connections_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_227f - - .line 2343 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentConnectionsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentConnectionsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2345 - :cond_227f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_connections is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1269 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2296 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1270 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_22a5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1271 - :cond_22a5 - const-string v1, "layout/fragment_parent_connection_request_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_22b3 - - .line 1272 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentConnectionRequestBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentConnectionRequestBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1274 - :cond_22b3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_connection_request is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1053 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_22ca - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1054 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_22d9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1055 - :cond_22d9 - const-string v1, "layout/fragment_parent_checklist_invite_family_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_22e7 - - .line 1056 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentChecklistInviteFamilyItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentChecklistInviteFamilyItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1058 - :cond_22e7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_checklist_invite_family_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 531 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_22fe - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 532 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_230d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 533 - :cond_230d - const-string v1, "layout/fragment_parent_checklist_birthday_capture_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_231b - - .line 534 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentChecklistBirthdayCaptureItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentChecklistBirthdayCaptureItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 536 - :cond_231b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_checklist_birthday_capture_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2169 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2332 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2170 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2341 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2171 - :cond_2341 - const-string v1, "layout/fragment_parent_channel_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_234f - - .line 2172 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentChannelListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentChannelListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2174 - :cond_234f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_channel_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1437 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2366 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1438 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2375 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1439 - :cond_2375 - const-string v1, "layout/fragment_parent_add_class_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2383 - - .line 1440 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentAddClassBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentAddClassBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1442 - :cond_2383 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_add_class is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2079 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_239a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2080 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_23a9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2081 - :cond_23a9 - const-string v1, "layout/fragment_parent_account_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_23b7 - - .line 2082 - new-instance v1, Lcom/classdojo/android/databinding/FragmentParentAccountBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentParentAccountBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2084 - :cond_23b7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_parent_account is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2457 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_23ce - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2458 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_23dd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2459 - :cond_23dd - const-string v1, "layout/fragment_onboarding_student_avatar_editor_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_23eb - - .line 2460 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingStudentAvatarEditorBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingStudentAvatarEditorBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2462 - :cond_23eb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_student_avatar_editor is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 342 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2402 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 343 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2411 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 344 - :cond_2411 - const-string v1, "layout/fragment_onboarding_splash_user_role_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_241f - - .line 345 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingSplashUserRoleBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingSplashUserRoleBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 347 - :cond_241f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_splash_user_role is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2115 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2436 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2116 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2445 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2117 - :cond_2445 - const-string v1, "layout/fragment_onboarding_sign_up_title_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2453 - - .line 2118 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpTitleBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpTitleBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2120 - :cond_2453 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_sign_up_title is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1464 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_246a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1465 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2479 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1466 - :cond_2479 - const-string v1, "layout/fragment_onboarding_sign_up_parent_anti_abuse_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2487 - - .line 1467 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpParentAntiAbuseBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpParentAntiAbuseBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1469 - :cond_2487 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_sign_up_parent_anti_abuse is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 759 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_249e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 760 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_24ad - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 761 - :cond_24ad - const-string v1, "layout/fragment_onboarding_sign_up_email_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_24bb - - .line 762 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpEmailBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpEmailBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 764 - :cond_24bb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_sign_up_email is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 111 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_24d2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 112 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_24e1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 113 - :cond_24e1 - const-string v1, "layout/fragment_onboarding_sign_up_details_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_24ef - - .line 114 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpDetailsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingSignUpDetailsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 116 - :cond_24ef - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_sign_up_details is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 477 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2506 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 478 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2515 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 479 - :cond_2515 - const-string v1, "layout/fragment_onboarding_enter_code_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2523 - - .line 480 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingEnterCodeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingEnterCodeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 482 - :cond_2523 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_enter_code is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1608 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_253a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1609 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2549 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1610 - :cond_2549 - const-string v1, "layout/fragment_onboarding_enable_camera_primer_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2557 - - .line 1611 - new-instance v1, Lcom/classdojo/android/databinding/FragmentOnboardingEnableCameraPrimerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentOnboardingEnableCameraPrimerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1613 - :cond_2557 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_onboarding_enable_camera_primer is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 612 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_256e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 613 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_257d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 614 - :cond_257d - const-string v1, "layout/fragment_message_recipients_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_258b - - .line 615 - new-instance v1, Lcom/classdojo/android/databinding/FragmentMessageRecipientsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentMessageRecipientsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 617 - :cond_258b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_message_recipients is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2205 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_25a2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2206 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_25b1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2207 - :cond_25b1 - const-string v1, "layout/fragment_meet_teacher_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_25bf - - .line 2208 - new-instance v1, Lcom/classdojo/android/databinding/FragmentMeetTeacherItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentMeetTeacherItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2210 - :cond_25bf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_meet_teacher_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1023 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_25d6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1024 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_25e5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1025 - :cond_25e5 - const-string v1, "layout-sw600dp/fragment_mark_students_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_25f3 - - .line 1026 - new-instance v1, Lcom/classdojo/android/databinding/FragmentMarkStudentsBindingSw600dpImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentMarkStudentsBindingSw600dpImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1028 - :cond_25f3 - const-string v1, "layout/fragment_mark_students_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2601 - - .line 1029 - new-instance v1, Lcom/classdojo/android/databinding/FragmentMarkStudentsBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentMarkStudentsBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1031 - :cond_2601 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_mark_students is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 189 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2618 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 190 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2627 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 191 - :cond_2627 - const-string v1, "layout/fragment_login_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2635 - - .line 192 - new-instance v1, Lcom/classdojo/android/databinding/FragmentLoginBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentLoginBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 194 - :cond_2635 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_login is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2277 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_264c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2278 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_265b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2279 - :cond_265b - const-string v1, "layout/fragment_leader_sign_up_role_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2669 - - .line 2280 - new-instance v1, Lcom/classdojo/android/databinding/FragmentLeaderSignUpRoleBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentLeaderSignUpRoleBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2282 - :cond_2669 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_leader_sign_up_role is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1626 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2680 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1627 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_268f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1628 - :cond_268f - const-string v1, "layout/fragment_kids_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_269d - - .line 1629 - new-instance v1, Lcom/classdojo/android/databinding/FragmentKidsListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentKidsListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1631 - :cond_269d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_kids_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2232 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_26b4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2233 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_26c3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2234 - :cond_26c3 - const-string v1, "layout/fragment_invite_item_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_26d1 - - .line 2235 - new-instance v1, Lcom/classdojo/android/databinding/FragmentInviteItemHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentInviteItemHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2237 - :cond_26d1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_invite_item_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 897 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_26e8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 898 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_26f7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 899 - :cond_26f7 - const-string v1, "layout/fragment_hold_tight_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2705 - - .line 900 - new-instance v1, Lcom/classdojo/android/databinding/FragmentHoldTightItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentHoldTightItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 902 - :cond_2705 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_hold_tight_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2403 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_271c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2404 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_272b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2405 - :cond_272b - const-string v1, "layout/fragment_forgot_password_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2739 - - .line 2406 - new-instance v1, Lcom/classdojo/android/databinding/FragmentForgotPasswordBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentForgotPasswordBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2408 - :cond_2739 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_forgot_password is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2565 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2750 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2566 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_275f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2567 - :cond_275f - const-string v1, "layout/fragment_enter_student_mode_qr_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_276d - - .line 2568 - new-instance v1, Lcom/classdojo/android/databinding/FragmentEnterStudentModeQrBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentEnterStudentModeQrBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2570 - :cond_276d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_enter_student_mode_qr is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1107 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2784 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1108 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2793 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1109 - :cond_2793 - const-string v1, "layout/fragment_edit_students_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_27a1 - - .line 1110 - new-instance v1, Lcom/classdojo/android/databinding/FragmentEditStudentsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentEditStudentsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1112 - :cond_27a1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_edit_students_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1725 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_27b8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1726 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_27c7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1727 - :cond_27c7 - const-string v1, "layout/fragment_edit_students_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_27d5 - - .line 1728 - new-instance v1, Lcom/classdojo/android/databinding/FragmentEditStudentsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentEditStudentsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1730 - :cond_27d5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_edit_students is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1350 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_27ec - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1351 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_27fb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1352 - :cond_27fb - const-string v1, "layout/fragment_edit_behaviours_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2809 - - .line 1353 - new-instance v1, Lcom/classdojo/android/databinding/FragmentEditBehavioursBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentEditBehavioursBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1355 - :cond_2809 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_edit_behaviours is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1089 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2820 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1090 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_282f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1091 - :cond_282f - const-string v1, "layout/fragment_dojo_photo_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_283d - - .line 1092 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoPhotoPreviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoPhotoPreviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1094 - :cond_283d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_photo_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 171 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2854 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 172 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2863 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 173 - :cond_2863 - const-string v1, "layout/fragment_dojo_camera_tooltip_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2871 - - .line 174 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraTooltipBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraTooltipBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 176 - :cond_2871 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera_tooltip is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 360 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2888 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 361 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2897 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 362 - :cond_2897 - const-string v1, "layout-sw600dp/fragment_dojo_camera_controls_90_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_28a5 - - .line 363 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraControls90Binding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraControls90Binding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 365 - :cond_28a5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera_controls_90 is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1179 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_28bc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1180 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_28cb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1181 - :cond_28cb - const-string v1, "layout-sw600dp/fragment_dojo_camera_controls_270_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_28d9 - - .line 1182 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraControls270Binding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraControls270Binding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1184 - :cond_28d9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera_controls_270 is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1956 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_28f0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1957 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_28ff - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1958 - :cond_28ff - const-string v1, "layout-sw600dp/fragment_dojo_camera_controls_180_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_290d - - .line 1959 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraControls180Binding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraControls180Binding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1961 - :cond_290d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera_controls_180 is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2001 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2924 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2002 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2933 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2003 - :cond_2933 - const-string v1, "layout-sw600dp/fragment_dojo_camera_controls_0_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2941 - - .line 2004 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraControls0BindingSw600dpImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraControls0BindingSw600dpImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2006 - :cond_2941 - const-string v1, "layout/fragment_dojo_camera_controls_0_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_294f - - .line 2007 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraControls0BindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraControls0BindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2009 - :cond_294f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera_controls_0 is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2040 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2966 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2041 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2975 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2042 - :cond_2975 - const-string v1, "layout/fragment_dojo_camera_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2983 - - .line 2043 - new-instance v1, Lcom/classdojo/android/databinding/FragmentDojoCameraBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentDojoCameraBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2045 - :cond_2983 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_dojo_camera is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2160 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_299a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2161 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_29a9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2162 - :cond_29a9 - const-string v1, "layout/fragment_create_school_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_29b7 - - .line 2163 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCreateSchoolBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCreateSchoolBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2165 - :cond_29b7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_create_school is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1992 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_29ce - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1993 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_29dd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1994 - :cond_29dd - const-string v1, "layout/fragment_create_account_splash_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_29eb - - .line 1995 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCreateAccountSplashBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCreateAccountSplashBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1997 - :cond_29eb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_create_account_splash is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 39 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2a02 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 40 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2a11 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 41 - :cond_2a11 - const-string v1, "layout/fragment_combined_fullscreen_photo_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2a1f - - .line 42 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedFullscreenPhotoPreviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedFullscreenPhotoPreviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 44 - :cond_2a1f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_fullscreen_photo_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 870 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2a36 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 871 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2a45 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 872 - :cond_2a45 - const-string v1, "layout/fragment_combined_drawing_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2a53 - - .line 873 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedDrawingBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedDrawingBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 875 - :cond_2a53 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_drawing is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1590 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2a6a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1591 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2a79 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1592 - :cond_2a79 - const-string v1, "layout/fragment_combined_camera_preview_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2a87 - - .line 1593 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedCameraPreviewBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedCameraPreviewBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1595 - :cond_2a87 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_camera_preview is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 732 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2a9e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 733 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2aad - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 734 - :cond_2aad - const-string v1, "layout/fragment_combined_camera_controls_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2abb - - .line 735 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedCameraControlsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedCameraControlsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 737 - :cond_2abb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_camera_controls is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 933 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2ad2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 934 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ae1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 935 - :cond_2ae1 - const-string v1, "layout/fragment_combined_camera_compose_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2aef - - .line 936 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedCameraComposeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedCameraComposeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 938 - :cond_2aef - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_camera_compose is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1761 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2b06 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1762 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2b15 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1763 - :cond_2b15 - const-string v1, "layout/fragment_combined_camera_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2b23 - - .line 1764 - new-instance v1, Lcom/classdojo/android/databinding/FragmentCombinedCameraBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentCombinedCameraBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1766 - :cond_2b23 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_combined_camera is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 66 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2b3a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 67 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2b49 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 68 - :cond_2b49 - const-string v1, "layout/fragment_classroom_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2b57 - - .line 69 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassroomBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassroomBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 71 - :cond_2b57 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_classroom is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 21 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2b6e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 22 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2b7d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 23 - :cond_2b7d - const-string v1, "layout/fragment_class_wall_settings_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2b8b - - .line 24 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassWallSettingsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassWallSettingsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 26 - :cond_2b8b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_wall_settings is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 666 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2ba2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 667 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2bb1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 668 - :cond_2bb1 - const-string v1, "layout/fragment_class_wall_compose_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2bbf - - .line 669 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassWallComposeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassWallComposeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 671 - :cond_2bbf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_wall_compose is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1404 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2bd6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1405 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2be5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1406 - :cond_2be5 - const-string v1, "layout/fragment_class_list_item_teacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2bf3 - - .line 1407 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassListItemTeacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassListItemTeacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1409 - :cond_2bf3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_list_item_teacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1653 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2c0a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1654 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2c19 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1655 - :cond_2c19 - const-string v1, "layout/fragment_class_list_item_school_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2c27 - - .line 1656 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassListItemSchoolBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassListItemSchoolBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1658 - :cond_2c27 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_list_item_school is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 135 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2c3e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 136 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2c4d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 137 - :cond_2c4d - const-string v1, "layout/fragment_class_list_item_class_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2c5b - - .line 138 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassListItemClassBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassListItemClassBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 140 - :cond_2c5b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_list_item_class is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1947 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2c72 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1948 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2c81 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1949 - :cond_2c81 - const-string v1, "layout/fragment_class_list_item_add_class_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2c8f - - .line 1950 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassListItemAddClassBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassListItemAddClassBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1952 - :cond_2c8f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_list_item_add_class is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 234 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2ca6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 235 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2cb5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 236 - :cond_2cb5 - const-string v1, "layout/fragment_class_code_student_select_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2cc3 - - .line 237 - new-instance v1, Lcom/classdojo/android/databinding/FragmentClassCodeStudentSelectBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentClassCodeStudentSelectBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 239 - :cond_2cc3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_class_code_student_select is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2547 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2cda - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2548 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ce9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2549 - :cond_2ce9 - const-string v1, "layout/fragment_chat_item_sticker_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2cf7 - - .line 2550 - new-instance v1, Lcom/classdojo/android/databinding/FragmentChatItemStickerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentChatItemStickerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2552 - :cond_2cf7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_chat_item_sticker is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1080 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2d0e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1081 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2d1d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1082 - :cond_2d1d - const-string v1, "layout/fragment_chat_empty_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2d2b - - .line 1083 - new-instance v1, Lcom/classdojo/android/databinding/FragmentChatEmptyBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentChatEmptyBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1085 - :cond_2d2b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_chat_empty is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1536 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2d42 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1537 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2d51 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1538 - :cond_2d51 - const-string v1, "layout/fragment_chat_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2d5f - - .line 1539 - new-instance v1, Lcom/classdojo/android/databinding/FragmentChatBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentChatBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1541 - :cond_2d5f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_chat is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1278 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2d76 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1279 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2d85 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1280 - :cond_2d85 - const-string v1, "layout/fragment_change_password_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2d93 - - .line 1281 - new-instance v1, Lcom/classdojo/android/databinding/FragmentChangePasswordBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentChangePasswordBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1283 - :cond_2d93 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_change_password is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2394 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2daa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2395 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2db9 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2396 - :cond_2db9 - const-string v1, "layout/fragment_award_pager_dialog_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2dc7 - - .line 2397 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAwardPagerDialogBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAwardPagerDialogBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2399 - :cond_2dc7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_award_pager_dialog is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 969 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2dde - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 970 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ded - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 971 - :cond_2ded - const-string v1, "layout/fragment_award_grid_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2dfb - - .line 972 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAwardGridItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAwardGridItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 974 - :cond_2dfb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_award_grid_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1662 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2e12 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1663 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2e21 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1664 - :cond_2e21 - const-string v1, "layout/fragment_award_grid_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2e2f - - .line 1665 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAwardGridBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAwardGridBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1667 - :cond_2e2f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_award_grid is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1500 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2e46 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1501 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2e55 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1502 - :cond_2e55 - const-string v1, "layout/fragment_audience_selector_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2e63 - - .line 1503 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAudienceSelectorItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAudienceSelectorItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1505 - :cond_2e63 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_audience_selector_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2430 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2e7a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2431 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2e89 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2432 - :cond_2e89 - const-string v1, "layout/fragment_attendance_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2e97 - - .line 2433 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAttendanceItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAttendanceItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2435 - :cond_2e97 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_attendance_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 996 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2eae - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 997 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ebd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 998 - :cond_2ebd - const-string v1, "layout/fragment_attendance_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2ecb - - .line 999 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAttendanceBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAttendanceBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1001 - :cond_2ecb - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_attendance is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 75 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2ee2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 76 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ef1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 77 - :cond_2ef1 - const-string v1, "layout/fragment_add_school_student_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2eff - - .line 78 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddSchoolStudentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddSchoolStudentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 80 - :cond_2eff - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_school_student is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2295 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2f16 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2296 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2f25 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2297 - :cond_2f25 - const-string v1, "layout/fragment_add_edit_student_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2f33 - - .line 2298 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddEditStudentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddEditStudentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2300 - :cond_2f33 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_edit_student is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2556 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2f4a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2557 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2f59 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2558 - :cond_2f59 - const-string v1, "layout/fragment_add_edit_group_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2f67 - - .line 2559 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddEditGroupBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddEditGroupBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2561 - :cond_2f67 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_edit_group is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1005 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2f7e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1006 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2f8d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1007 - :cond_2f8d - const-string v1, "layout/fragment_add_edit_class_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2f9b - - .line 1008 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddEditClassBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddEditClassBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1010 - :cond_2f9b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_edit_class is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 243 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2fb2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 244 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2fc1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 245 - :cond_2fc1 - const-string v1, "layout/fragment_add_edit_behaviours_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_2fcf - - .line 246 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddEditBehavioursBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddEditBehavioursBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 248 - :cond_2fcf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_edit_behaviours is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 834 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_2fe6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 835 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_2ff5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 836 - :cond_2ff5 - const-string v1, "layout/fragment_add_coteacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3003 - - .line 837 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddCoteacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddCoteacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 839 - :cond_3003 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_coteacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1413 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_301a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1414 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3029 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1415 - :cond_3029 - const-string v1, "layout-land/fragment_add_class_poster_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3037 - - .line 1416 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddClassPosterBindingLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddClassPosterBindingLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1418 - :cond_3037 - const-string v1, "layout/fragment_add_class_poster_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3045 - - .line 1419 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddClassPosterBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddClassPosterBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1421 - :cond_3045 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_class_poster is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1116 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_305c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1117 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_306b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1118 - :cond_306b - const-string v1, "layout/fragment_add_class_invite_code_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3079 - - .line 1119 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddClassInviteCodeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddClassInviteCodeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1121 - :cond_3079 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_class_invite_code is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1983 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3090 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1984 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_309f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1985 - :cond_309f - const-string v1, "layout/fragment_add_class_invite_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_30ad - - .line 1986 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAddClassInviteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAddClassInviteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1988 - :cond_30ad - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_add_class_invite is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2592 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_30c4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2593 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_30d3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2594 - :cond_30d3 - const-string v1, "layout/fragment_account_switcher_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_30e1 - - .line 2595 - new-instance v1, Lcom/classdojo/android/databinding/FragmentAccountSwitcherItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/FragmentAccountSwitcherItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2597 - :cond_30e1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for fragment_account_switcher_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2031 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_30f8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2032 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3107 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2033 - :cond_3107 - const-string v1, "layout/dialog_unsupported_class_code_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3115 - - .line 2034 - new-instance v1, Lcom/classdojo/android/databinding/DialogUnsupportedClassCodeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogUnsupportedClassCodeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2036 - :cond_3115 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_unsupported_class_code is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 387 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_312c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 388 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_313b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 389 - :cond_313b - const-string v1, "layout/dialog_turn_on_password_lock_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3149 - - .line 390 - new-instance v1, Lcom/classdojo/android/databinding/DialogTurnOnPasswordLockBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogTurnOnPasswordLockBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 392 - :cond_3149 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_turn_on_password_lock is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 513 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3160 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 514 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_316f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 515 - :cond_316f - const-string v1, "layout/dialog_teacher_student_consent_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_317d - - .line 516 - new-instance v1, Lcom/classdojo/android/databinding/DialogTeacherStudentConsentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogTeacherStudentConsentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 518 - :cond_317d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_teacher_student_consent is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1341 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3194 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1342 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_31a3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1343 - :cond_31a3 - const-string v1, "layout/dialog_teacher_new_class_success_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_31b1 - - .line 1344 - new-instance v1, Lcom/classdojo/android/databinding/DialogTeacherNewClassSuccessBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogTeacherNewClassSuccessBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1346 - :cond_31b1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_teacher_new_class_success is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2322 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_31c8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2323 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_31d7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2324 - :cond_31d7 - const-string v1, "layout/dialog_teacher_invitation_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_31e5 - - .line 2325 - new-instance v1, Lcom/classdojo/android/databinding/DialogTeacherInvitationBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogTeacherInvitationBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2327 - :cond_31e5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_teacher_invitation is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2133 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_31fc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2134 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_320b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2135 - :cond_320b - const-string v1, "layout/dialog_student_list_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3219 - - .line 2136 - new-instance v1, Lcom/classdojo/android/databinding/DialogStudentListBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogStudentListBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2138 - :cond_3219 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_student_list is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 84 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3230 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 85 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_323f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 86 - :cond_323f - const-string v1, "layout/dialog_student_capture_student_list_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_324d - - .line 87 - new-instance v1, Lcom/classdojo/android/databinding/DialogStudentCaptureStudentListItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogStudentCaptureStudentListItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 89 - :cond_324d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_student_capture_student_list_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 225 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3264 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 226 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3273 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 227 - :cond_3273 - const-string v1, "layout/dialog_student_age_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3281 - - .line 228 - new-instance v1, Lcom/classdojo/android/databinding/DialogStudentAgeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogStudentAgeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 230 - :cond_3281 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_student_age is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1359 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3298 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1360 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_32a7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1361 - :cond_32a7 - const-string v1, "layout/dialog_schedule_message_time_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_32b5 - - .line 1362 - new-instance v1, Lcom/classdojo/android/databinding/DialogScheduleMessageTimeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogScheduleMessageTimeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1364 - :cond_32b5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_schedule_message_time is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 630 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_32cc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 631 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_32db - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 632 - :cond_32db - const-string v1, "layout/dialog_password_changed_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_32e9 - - .line 633 - new-instance v1, Lcom/classdojo/android/databinding/DialogPasswordChangedBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogPasswordChangedBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 635 - :cond_32e9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_password_changed is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1296 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3300 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1297 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_330f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1298 - :cond_330f - const-string v1, "layout/dialog_parent_teacher_invitation_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_331d - - .line 1299 - new-instance v1, Lcom/classdojo/android/databinding/DialogParentTeacherInvitationBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogParentTeacherInvitationBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1301 - :cond_331d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_parent_teacher_invitation is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2187 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3334 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2188 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3343 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2189 - :cond_3343 - const-string v1, "layout/dialog_parent_invitation_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3351 - - .line 2190 - new-instance v1, Lcom/classdojo/android/databinding/DialogParentInvitationBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogParentInvitationBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2192 - :cond_3351 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_parent_invitation is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1881 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3368 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1882 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3377 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1883 - :cond_3377 - const-string v1, "layout/dialog_parent_delete_connection_request_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3385 - - .line 1884 - new-instance v1, Lcom/classdojo/android/databinding/DialogParentDeleteConnectionRequestBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogParentDeleteConnectionRequestBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1886 - :cond_3385 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_parent_delete_connection_request is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2097 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_339c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2098 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_33ab - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2099 - :cond_33ab - const-string v1, "layout/dialog_invite_student_code_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_33b9 - - .line 2100 - new-instance v1, Lcom/classdojo/android/databinding/DialogInviteStudentCodeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogInviteStudentCodeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2102 - :cond_33b9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_invite_student_code is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2304 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_33d0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2305 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_33df - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2306 - :cond_33df - const-string v1, "layout/dialog_exit_student_mode_password_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_33ed - - .line 2307 - new-instance v1, Lcom/classdojo/android/databinding/DialogExitStudentModePasswordBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogExitStudentModePasswordBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2309 - :cond_33ed - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_exit_student_mode_password is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 549 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3404 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 550 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3413 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 551 - :cond_3413 - const-string v1, "layout/dialog_enter_student_mode_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3421 - - .line 552 - new-instance v1, Lcom/classdojo/android/databinding/DialogEnterStudentModeBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogEnterStudentModeBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 554 - :cond_3421 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_enter_student_mode is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2022 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3438 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2023 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3447 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2024 - :cond_3447 - const-string v1, "layout/dialog_disconnect_student_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3455 - - .line 2025 - new-instance v1, Lcom/classdojo/android/databinding/DialogDisconnectStudentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogDisconnectStudentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2027 - :cond_3455 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_disconnect_student is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1071 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_346c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1072 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_347b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1073 - :cond_347b - const-string v1, "layout/dialog_class_code_student_select_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3489 - - .line 1074 - new-instance v1, Lcom/classdojo/android/databinding/DialogClassCodeStudentSelectBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogClassCodeStudentSelectBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1076 - :cond_3489 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_class_code_student_select is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1917 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_34a0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1918 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_34af - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1919 - :cond_34af - const-string v1, "layout/dialog_class_code_student_blocker_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_34bd - - .line 1920 - new-instance v1, Lcom/classdojo/android/databinding/DialogClassCodeStudentBlockerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogClassCodeStudentBlockerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1922 - :cond_34bd - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_class_code_student_blocker is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1314 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_34d4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1315 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_34e3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1316 - :cond_34e3 - const-string v1, "layout/dialog_change_name_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_34f1 - - .line 1317 - new-instance v1, Lcom/classdojo/android/databinding/DialogChangeNameBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogChangeNameBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1319 - :cond_34f1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_change_name is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 639 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3508 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 640 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3517 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 641 - :cond_3517 - const-string v1, "layout/dialog_base_layout_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3525 - - .line 642 - new-instance v1, Lcom/classdojo/android/databinding/DialogBaseLayoutBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogBaseLayoutBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 644 - :cond_3525 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_base_layout is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 12 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_353c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 13 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_354b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 14 - :cond_354b - const-string v1, "layout/dialog_avatar_grid_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3559 - - .line 15 - new-instance v1, Lcom/classdojo/android/databinding/DialogAvatarGridBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogAvatarGridBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 17 - :cond_3559 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_avatar_grid is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1233 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3570 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1234 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_357f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1235 - :cond_357f - const-string v1, "layout/dialog_add_student_find_teacher_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_358d - - .line 1236 - new-instance v1, Lcom/classdojo/android/databinding/DialogAddStudentFindTeacherBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogAddStudentFindTeacherBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1238 - :cond_358d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_add_student_find_teacher is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1788 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_35a4 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1789 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_35b3 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1790 - :cond_35b3 - const-string v1, "layout/dialog_add_note_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_35c1 - - .line 1791 - new-instance v1, Lcom/classdojo/android/databinding/DialogAddNoteBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/DialogAddNoteBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1793 - :cond_35c1 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for dialog_add_note is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2412 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_35d8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2413 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_35e7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2414 - :cond_35e7 - const-string v1, "layout/connection_type_header_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_35f5 - - .line 2415 - new-instance v1, Lcom/classdojo/android/databinding/ConnectionTypeHeaderItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ConnectionTypeHeaderItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2417 - :cond_35f5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for connection_type_header_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 705 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_360c - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 706 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_361b - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 707 - :cond_361b - const-string v1, "layout/combined_compose_audience_student_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3629 - - .line 708 - new-instance v1, Lcom/classdojo/android/databinding/CombinedComposeAudienceStudentItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/CombinedComposeAudienceStudentItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 710 - :cond_3629 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for combined_compose_audience_student_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1206 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3640 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1207 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_364f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1208 - :cond_364f - const-string v1, "layout/combined_compose_audience_group_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_365d - - .line 1209 - new-instance v1, Lcom/classdojo/android/databinding/CombinedComposeAudienceGroupItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/CombinedComposeAudienceGroupItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1211 - :cond_365d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for combined_compose_audience_group_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1062 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3674 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1063 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3683 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1064 - :cond_3683 - const-string v1, "layout/class_students_item_header_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3691 - - .line 1065 - new-instance v1, Lcom/classdojo/android/databinding/ClassStudentsItemHeaderBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ClassStudentsItemHeaderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1067 - :cond_3691 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for class_students_item_header is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 987 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_36a8 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 988 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_36b7 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 989 - :cond_36b7 - const-string v1, "layout/class_students_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_36c5 - - .line 990 - new-instance v1, Lcom/classdojo/android/databinding/ClassStudentsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ClassStudentsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 992 - :cond_36c5 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for class_students_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 396 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_36dc - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 397 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_36eb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 398 - :cond_36eb - const-string v1, "layout/binding_variable_placeholder_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_36f9 - - .line 399 - new-instance v1, Lcz/kinst/jakub/viewmodelbinding/databinding/BindingVariablePlaceholderBinding; - - invoke-direct {v1, p1, p2}, Lcz/kinst/jakub/viewmodelbinding/databinding/BindingVariablePlaceholderBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 401 - :cond_36f9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for binding_variable_placeholder is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 621 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3710 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 622 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_371f - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 623 - :cond_371f - const-string v1, "layout/add_note_undo_popup_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_372d - - .line 624 - new-instance v1, Lcom/classdojo/android/databinding/AddNoteUndoPopupBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/AddNoteUndoPopupBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 626 - :cond_372d - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for add_note_undo_popup is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 657 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3744 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 658 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3753 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 659 - :cond_3753 - const-string v1, "layout/activity_teacher_onboarding_check_email_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3761 - - .line 660 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherOnboardingCheckEmailBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherOnboardingCheckEmailBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 662 - :cond_3761 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_onboarding_check_email is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1872 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3778 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1873 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3787 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1874 - :cond_3787 - const-string v1, "layout/activity_teacher_home_null_state_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3795 - - .line 1875 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherHomeNullStateBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherHomeNullStateBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1877 - :cond_3795 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_home_null_state is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 777 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_37ac - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 778 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_37bb - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 779 - :cond_37bb - const-string v1, "layout/activity_teacher_home_drawer_header_light_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_37c9 - - .line 780 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherHomeDrawerHeaderLightBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherHomeDrawerHeaderLightBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 782 - :cond_37c9 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_home_drawer_header_light is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 369 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_37e0 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 370 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_37ef - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 371 - :cond_37ef - const-string v1, "layout/activity_teacher_home_drawer_header_dark_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_37fd - - .line 372 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherHomeDrawerHeaderDarkBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherHomeDrawerHeaderDarkBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 374 - :cond_37fd - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_home_drawer_header_dark is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 813 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3814 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 814 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3823 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 815 - :cond_3823 - const-string v1, "layout-sw600dp-land/activity_teacher_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3831 - - .line 816 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherHomeBindingSw600dpLandImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherHomeBindingSw600dpLandImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 818 - :cond_3831 - const-string v1, "layout/activity_teacher_home_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_383f - - .line 819 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherHomeBindingImpl; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherHomeBindingImpl;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 821 - :cond_383f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_home is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1125 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3856 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1126 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3865 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1127 - :cond_3865 - const-string v1, "layout/activity_teacher_behavior_controller_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3873 - - .line 1128 - new-instance v1, Lcom/classdojo/android/databinding/ActivityTeacherBehaviorControllerBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityTeacherBehaviorControllerBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1130 - :cond_3873 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_teacher_behavior_controller is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 741 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_388a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 742 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3899 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 743 - :cond_3899 - const-string v1, "layout/activity_student_settings_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_38a7 - - .line 744 - new-instance v1, Lcom/classdojo/android/databinding/ActivityStudentSettingsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityStudentSettingsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 746 - :cond_38a7 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_student_settings is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1527 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_38be - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1528 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_38cd - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1529 - :cond_38cd - const-string v1, "layout/activity_student_search_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_38db - - .line 1530 - new-instance v1, Lcom/classdojo/android/databinding/ActivityStudentSearchBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityStudentSearchBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1532 - :cond_38db - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_student_search is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1305 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_38f2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1306 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3901 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1307 - :cond_3901 - const-string v1, "layout/activity_share_media_content_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_390f - - .line 1308 - new-instance v1, Lcom/classdojo/android/databinding/ActivityShareMediaContentBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityShareMediaContentBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1310 - :cond_390f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_share_media_content is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 768 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3926 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 769 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3935 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 770 - :cond_3935 - const-string v1, "layout/activity_share_media_audience_selector_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3943 - - .line 771 - new-instance v1, Lcom/classdojo/android/databinding/ActivityShareMediaAudienceSelectorBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityShareMediaAudienceSelectorBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 773 - :cond_3943 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_share_media_audience_selector is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 279 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_395a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 280 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3969 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 281 - :cond_3969 - const-string v1, "layout/activity_share_media_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3977 - - .line 282 - new-instance v1, Lcom/classdojo/android/databinding/ActivityShareMediaBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityShareMediaBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 284 - :cond_3977 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_share_media is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2151 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_398e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2152 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_399d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2153 - :cond_399d - const-string v1, "layout/activity_setup_skills_sharing_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_39ab - - .line 2154 - new-instance v1, Lcom/classdojo/android/databinding/ActivitySetupSkillsSharingBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivitySetupSkillsSharingBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2156 - :cond_39ab - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_setup_skills_sharing is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 48 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_39c2 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 49 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_39d1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 50 - :cond_39d1 - const-string v1, "layout/activity_setup_skills_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_39df - - .line 51 - new-instance v1, Lcom/classdojo/android/databinding/ActivitySetupSkillsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivitySetupSkillsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 53 - :cond_39df - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_setup_skills is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 906 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_39f6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 907 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3a05 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 908 - :cond_3a05 - const-string v1, "layout/activity_onboarding_teacher_sign_up_flow_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3a13 - - .line 909 - new-instance v1, Lcom/classdojo/android/databinding/ActivityOnboardingTeacherSignUpFlowBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityOnboardingTeacherSignUpFlowBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 911 - :cond_3a13 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_onboarding_teacher_sign_up_flow is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2466 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3a2a - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2467 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3a39 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2468 - :cond_3a39 - const-string v1, "layout/activity_onboarding_parent_sign_up_flow_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3a47 - - .line 2469 - new-instance v1, Lcom/classdojo/android/databinding/ActivityOnboardingParentSignUpFlowBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityOnboardingParentSignUpFlowBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2471 - :cond_3a47 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_onboarding_parent_sign_up_flow is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 915 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3a5e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 916 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3a6d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 917 - :cond_3a6d - const-string v1, "layout/activity_dojo_camera_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3a7b - - .line 918 - new-instance v1, Lcom/classdojo/android/databinding/ActivityDojoCameraBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityDojoCameraBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 920 - :cond_3a7b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_dojo_camera is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1242 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3a92 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1243 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3aa1 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1244 - :cond_3aa1 - const-string v1, "layout/activity_debug_urls_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3aaf - - .line 1245 - new-instance v1, Lcom/classdojo/android/databinding/ActivityDebugUrlsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityDebugUrlsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1247 - :cond_3aaf - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_debug_urls is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 951 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3ac6 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 952 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3ad5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 953 - :cond_3ad5 - const-string v1, "layout/activity_debug_deeplinks_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3ae3 - - .line 954 - new-instance v1, Lcom/classdojo/android/databinding/ActivityDebugDeeplinksBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityDebugDeeplinksBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 956 - :cond_3ae3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_debug_deeplinks is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2223 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3afa - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 2224 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3b09 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 2225 - :cond_3b09 - const-string v1, "layout/activity_debug_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3b17 - - .line 2226 - new-instance v1, Lcom/classdojo/android/databinding/ActivityDebugBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityDebugBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 2228 - :cond_3b17 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_debug is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 306 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3b2e - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 307 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3b3d - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 308 - :cond_3b3d - const-string v1, "layout/activity_connection_requests_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3b4b - - .line 309 - new-instance v1, Lcom/classdojo/android/databinding/ActivityConnectionRequestsBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityConnectionRequestsBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 311 - :cond_3b4b - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_connection_requests is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 486 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3b62 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 487 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3b71 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 488 - :cond_3b71 - const-string v1, "layout/activity_connection_reqeusts_item_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3b7f - - .line 489 - new-instance v1, Lcom/classdojo/android/databinding/ActivityConnectionReqeustsItemBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityConnectionReqeustsItemBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 491 - :cond_3b7f - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_connection_reqeusts_item is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1974 - .end local v0 # "tag":Ljava/lang/Object; - :pswitch_3b96 - invoke-virtual {p2}, Landroid/view/View;->getTag()Ljava/lang/Object; - - move-result-object v0 - - .line 1975 - .restart local v0 # "tag":Ljava/lang/Object; - if-nez v0, :cond_3ba5 - - new-instance v1, Ljava/lang/RuntimeException; - - const-string v2, "view must have a tag" - - invoke-direct {v1, v2}, Ljava/lang/RuntimeException;-><init>(Ljava/lang/String;)V - - throw v1 - - .line 1976 - :cond_3ba5 - const-string v1, "layout/activity_combined_camera_text_post_0" - - invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v1 - - if-eqz v1, :cond_3bb3 - - .line 1977 - new-instance v1, Lcom/classdojo/android/databinding/ActivityCombinedCameraTextPostBinding; - - invoke-direct {v1, p1, p2}, Lcom/classdojo/android/databinding/ActivityCombinedCameraTextPostBinding;-><init>(Landroid/databinding/DataBindingComponent;Landroid/view/View;)V - - return-object v1 - - .line 1979 - :cond_3bb3 - new-instance v1, Ljava/lang/IllegalArgumentException; - - new-instance v2, Ljava/lang/StringBuilder; - - invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V - - const-string v3, "The tag for activity_combined_camera_text_post is invalid. Received: " - - invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; - - invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v2 - - invoke-direct {v1, v2}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/String;)V - - throw v1 - - nop - - :pswitch_data_3bcc - .packed-switch 0x7f0c002a - :pswitch_3b96 - :pswitch_3b62 - :pswitch_3b2e - .end packed-switch - - :pswitch_data_3bd6 - .packed-switch 0x7f0c0031 - :pswitch_3afa - :pswitch_3ac6 - :pswitch_3a92 - :pswitch_3a5e - .end packed-switch - - :pswitch_data_3be2 - .packed-switch 0x7f0c0041 - :pswitch_3a2a - :pswitch_39f6 - .end packed-switch - - :pswitch_data_3bea - .packed-switch 0x7f0c0057 - :pswitch_39c2 - :pswitch_398e - :pswitch_395a - :pswitch_3926 - :pswitch_38f2 - .end packed-switch - - :pswitch_data_3bf8 - .packed-switch 0x7f0c0067 - :pswitch_38be - :pswitch_388a - .end packed-switch - - :pswitch_data_3c00 - .packed-switch 0x7f0c006a - :pswitch_3856 - :pswitch_3814 - :pswitch_37e0 - :pswitch_37ac - :pswitch_3778 - :pswitch_3744 - .end packed-switch - - :pswitch_data_3c10 - .packed-switch 0x7f0c0076 - :pswitch_3710 - :pswitch_36dc - .end packed-switch - - :pswitch_data_3c18 - .packed-switch 0x7f0c0084 - :pswitch_36a8 - :pswitch_3674 - :pswitch_3640 - .end packed-switch - - :pswitch_data_3c22 - .packed-switch 0x7f0c0088 - :pswitch_360c - :pswitch_35d8 - .end packed-switch - - :pswitch_data_3c2a - .packed-switch 0x7f0c00a3 - :pswitch_35a4 - :pswitch_3570 - .end packed-switch - - :pswitch_data_3c32 - .packed-switch 0x7f0c00a6 - :pswitch_353c - :pswitch_3508 - :pswitch_34d4 - :pswitch_34a0 - :pswitch_346c - .end packed-switch - - :pswitch_data_3c40 - .packed-switch 0x7f0c00ac - :pswitch_3438 - :pswitch_3404 - :pswitch_33d0 - :pswitch_339c - .end packed-switch - - :pswitch_data_3c4c - .packed-switch 0x7f0c00b1 - :pswitch_3368 - :pswitch_3334 - :pswitch_3300 - :pswitch_32cc - .end packed-switch - - :pswitch_data_3c58 - .packed-switch 0x7f0c00b8 - :pswitch_3298 - :pswitch_3264 - :pswitch_3230 - .end packed-switch - - :pswitch_data_3c62 - .packed-switch 0x7f0c00bc - :pswitch_31fc - :pswitch_31c8 - :pswitch_3194 - :pswitch_3160 - :pswitch_312c - :pswitch_30f8 - .end packed-switch - - :pswitch_data_3c72 - .packed-switch 0x7f0c00cb - :pswitch_30c4 - :pswitch_3090 - :pswitch_305c - :pswitch_301a - :pswitch_2fe6 - :pswitch_2fb2 - :pswitch_2f7e - :pswitch_2f4a - :pswitch_2f16 - :pswitch_2ee2 - .end packed-switch - - :pswitch_data_3c8a - .packed-switch 0x7f0c00d6 - :pswitch_2eae - :pswitch_2e7a - :pswitch_2e46 - :pswitch_2e12 - :pswitch_2dde - :pswitch_2daa - :pswitch_2d76 - :pswitch_2d42 - :pswitch_2d0e - :pswitch_2cda - :pswitch_2ca6 - :pswitch_2c72 - :pswitch_2c3e - :pswitch_2c0a - :pswitch_2bd6 - :pswitch_2ba2 - :pswitch_2b6e - :pswitch_2b3a - :pswitch_2b06 - :pswitch_2ad2 - :pswitch_2a9e - :pswitch_2a6a - :pswitch_2a36 - :pswitch_2a02 - :pswitch_29ce - :pswitch_299a - :pswitch_2966 - :pswitch_2924 - :pswitch_28f0 - :pswitch_28bc - :pswitch_2888 - :pswitch_2854 - :pswitch_2820 - :pswitch_27ec - .end packed-switch - - :pswitch_data_3cd2 - .packed-switch 0x7f0c00f9 - :pswitch_27b8 - :pswitch_2784 - :pswitch_2750 - :pswitch_271c - .end packed-switch - - :pswitch_data_3cde - .packed-switch 0x7f0c0100 - :pswitch_26e8 - :pswitch_26b4 - :pswitch_2680 - :pswitch_264c - :pswitch_2618 - :pswitch_25d6 - :pswitch_25a2 - :pswitch_256e - :pswitch_253a - :pswitch_2506 - :pswitch_24d2 - :pswitch_249e - :pswitch_246a - :pswitch_2436 - :pswitch_2402 - :pswitch_23ce - :pswitch_239a - :pswitch_2366 - :pswitch_2332 - :pswitch_22fe - :pswitch_22ca - :pswitch_2296 - :pswitch_2262 - :pswitch_222e - :pswitch_21fa - :pswitch_21c6 - :pswitch_2192 - :pswitch_215e - :pswitch_212a - :pswitch_20f6 - :pswitch_20c2 - :pswitch_208e - :pswitch_205a - :pswitch_2026 - :pswitch_1ff2 - :pswitch_1fbe - .end packed-switch - - :pswitch_data_3d2a - .packed-switch 0x7f0c0127 - :pswitch_1f8a - :pswitch_1f56 - :pswitch_1f22 - :pswitch_1eee - :pswitch_1eba - :pswitch_1e86 - :pswitch_1e52 - :pswitch_1e1e - :pswitch_1dea - :pswitch_1db6 - :pswitch_1d82 - :pswitch_1d4e - :pswitch_1d1a - :pswitch_1ce6 - :pswitch_1cb2 - :pswitch_1c7e - :pswitch_1c4a - :pswitch_1c16 - :pswitch_1be2 - :pswitch_1bae - :pswitch_1b7a - :pswitch_1b46 - :pswitch_1b12 - :pswitch_1ade - :pswitch_1aaa - :pswitch_1a76 - :pswitch_1a42 - :pswitch_1a0e - :pswitch_19be - :pswitch_197c - :pswitch_1948 - :pswitch_1914 - :pswitch_18e0 - :pswitch_18ac - :pswitch_1878 - :pswitch_1844 - :pswitch_1810 - :pswitch_17dc - :pswitch_17a8 - :pswitch_1766 - :pswitch_1732 - :pswitch_16fe - :pswitch_16ca - :pswitch_1696 - :pswitch_1662 - :pswitch_162e - :pswitch_15fa - :pswitch_15c6 - :pswitch_1592 - :pswitch_155e - .end packed-switch - - :pswitch_data_3d92 - .packed-switch 0x7f0c015f - :pswitch_152a - :pswitch_14f6 - .end packed-switch - - :pswitch_data_3d9a - .packed-switch 0x7f0c0162 - :pswitch_14c2 - :pswitch_148e - :pswitch_145a - :pswitch_1426 - :pswitch_13f2 - .end packed-switch - - :pswitch_data_3da8 - .packed-switch 0x7f0c016e - :pswitch_13be - :pswitch_138a - :pswitch_1356 - .end packed-switch - - :pswitch_data_3db2 - .packed-switch 0x7f0c0174 - :pswitch_1322 - :pswitch_12ee - :pswitch_12ba - :pswitch_1286 - :pswitch_1252 - :pswitch_121e - :pswitch_11dc - :pswitch_11a8 - :pswitch_1174 - :pswitch_1140 - :pswitch_110c - :pswitch_10d8 - :pswitch_10a4 - :pswitch_1070 - .end packed-switch - - :pswitch_data_3dd2 - .packed-switch 0x7f0c0183 - :pswitch_103c - :pswitch_1008 - :pswitch_fd4 - :pswitch_fa0 - :pswitch_f6c - :pswitch_f38 - :pswitch_f04 - :pswitch_ed0 - .end packed-switch - - :pswitch_data_3de6 - .packed-switch 0x7f0c018f - :pswitch_e9c - :pswitch_e68 - :pswitch_e34 - :pswitch_e00 - .end packed-switch - - :pswitch_data_3df2 - .packed-switch 0x7f0c019b - :pswitch_dcc - :pswitch_d98 - :pswitch_d64 - .end packed-switch - - :pswitch_data_3dfc - .packed-switch 0x7f0c01a6 - :pswitch_d30 - :pswitch_cfc - :pswitch_cc8 - :pswitch_c94 - .end packed-switch - - :pswitch_data_3e08 - .packed-switch 0x7f0c01ab - :pswitch_c60 - :pswitch_c2c - :pswitch_bf8 - .end packed-switch - - :pswitch_data_3e12 - .packed-switch 0x7f0c01af - :pswitch_bc4 - :pswitch_b90 - :pswitch_b5c - :pswitch_b28 - :pswitch_af4 - .end packed-switch - - :pswitch_data_3e20 - .packed-switch 0x7f0c01de - :pswitch_ac0 - :pswitch_a8c - :pswitch_a58 - .end packed-switch - - :pswitch_data_3e2a - .packed-switch 0x7f0c01f8 - :pswitch_a24 - :pswitch_9e2 - :pswitch_9ae - .end packed-switch - - :pswitch_data_3e34 - .packed-switch 0x7f0c0208 - :pswitch_97a - :pswitch_946 - :pswitch_912 - :pswitch_8de - :pswitch_8aa - .end packed-switch - - :pswitch_data_3e42 - .packed-switch 0x7f0c0210 - :pswitch_868 - :pswitch_834 - :pswitch_800 - :pswitch_7cc - :pswitch_798 - :pswitch_764 - .end packed-switch - - :pswitch_data_3e52 - .packed-switch 0x7f0c0218 - :pswitch_730 - :pswitch_6fc - :pswitch_6c8 - .end packed-switch - - :sswitch_data_3e5c - .sparse-switch - 0x7f0c001d -> :sswitch_694 - 0x7f0c0026 -> :sswitch_660 - 0x7f0c0037 -> :sswitch_62c - 0x7f0c0046 -> :sswitch_5f8 - 0x7f0c0048 -> :sswitch_5c4 - 0x7f0c004b -> :sswitch_590 - 0x7f0c004d -> :sswitch_55c - 0x7f0c0052 -> :sswitch_528 - 0x7f0c0054 -> :sswitch_4f4 - 0x7f0c005f -> :sswitch_4b2 - 0x7f0c007f -> :sswitch_47e - 0x7f0c0090 -> :sswitch_44a - 0x7f0c00c9 -> :sswitch_416 - 0x7f0c00fe -> :sswitch_3e2 - 0x7f0c0125 -> :sswitch_3ae - 0x7f0c015a -> :sswitch_37a - 0x7f0c016b -> :sswitch_346 - 0x7f0c018c -> :sswitch_312 - 0x7f0c0195 -> :sswitch_2de - 0x7f0c019f -> :sswitch_2aa - 0x7f0c01a2 -> :sswitch_276 - 0x7f0c01a4 -> :sswitch_242 - 0x7f0c01e5 -> :sswitch_20e - 0x7f0c01e7 -> :sswitch_1da - 0x7f0c01e9 -> :sswitch_1a6 - 0x7f0c01f3 -> :sswitch_172 - 0x7f0c01f6 -> :sswitch_13e - 0x7f0c01fe -> :sswitch_10a - 0x7f0c0200 -> :sswitch_d6 - 0x7f0c0202 -> :sswitch_a2 - 0x7f0c0205 -> :sswitch_6e - .end sparse-switch -.end method - -.method public getDataBinder(Landroid/databinding/DataBindingComponent;[Landroid/view/View;I)Landroid/databinding/ViewDataBinding; - .registers 5 - .param p1, "bindingComponent" # Landroid/databinding/DataBindingComponent; - .param p2, "views" # [Landroid/view/View; - .param p3, "layoutId" # I - - .line 2652 - nop - - .line 2654 - const/4 v0, 0x0 - - return-object v0 -.end method - -.method public getLayoutId(Ljava/lang/String;)I - .registers 15 - .param p1, "tag" # Ljava/lang/String; - - .line 2658 - const/4 v0, 0x0 - - if-nez p1, :cond_4 - - .line 2659 - return v0 - - .line 2661 - :cond_4 - invoke-virtual {p1}, Ljava/lang/String;->hashCode()I - - move-result v1 - - .line 2662 - .local v1, "code":I - const v2, 0x7f0c0144 - - const v3, 0x7f0c0105 - - const v4, 0x7f0c00ce - - const v5, 0x7f0c014e - - const v6, 0x7f0c006b - - const v7, 0x7f0c0210 - - const v8, 0x7f0c01f9 - - const v9, 0x7f0c017a - - const v10, 0x7f0c005f - - const v11, 0x7f0c00f1 - - const v12, 0x7f0c0143 - - sparse-switch v1, :sswitch_data_e06 - - goto/16 :goto_e05 - - .line 3798 - :sswitch_2e - const-string v2, "layout/fragment_student_capture_home_student_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3799 - const v0, 0x7f0c0140 - - return v0 - - .line 2670 - :sswitch_3a - const-string v2, "layout/fragment_class_wall_settings_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2671 - const v0, 0x7f0c00e6 - - return v0 - - .line 4410 - :sswitch_46 - const-string v2, "layout/fragment_enter_student_mode_qr_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4411 - const v0, 0x7f0c00fb - - return v0 - - .line 4104 - :sswitch_52 - const-string v2, "layout/item_file_attachment_view_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4105 - const v0, 0x7f0c0191 - - return v0 - - .line 3768 - :sswitch_5e - const-string v2, "layout/fragment_kids_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3769 - const v0, 0x7f0c0102 - - return v0 - - .line 3432 - :sswitch_6a - const-string v2, "layout/fragment_school_detail_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3433 - const v0, 0x7f0c0127 - - return v0 - - .line 2718 - :sswitch_76 - const-string v2, "layout/fragment_tab_notification_pending_posts_item_thumbnail_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2719 - const v0, 0x7f0c0179 - - return v0 - - .line 2982 - :sswitch_82 - const-string v2, "layout/fragment_onboarding_enter_code_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2983 - const v0, 0x7f0c0109 - - return v0 - - .line 3750 - :sswitch_8e - const-string v2, "layout/view_drawing_tool_sticker_drawer_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3751 - const v0, 0x7f0c0212 - - return v0 - - .line 3024 - :sswitch_9a - const-string v2, "layout/fragment_tab_class_wall_item_compose_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3025 - const v0, 0x7f0c015f - - return v0 - - .line 3006 - :sswitch_a6 - const-string v2, "layout/dialog_teacher_student_consent_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3007 - const v0, 0x7f0c00bf - - return v0 - - .line 4374 - :sswitch_b2 - const-string v2, "layout/fragment_teacher_student_connection_class_code_qr_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4375 - const v0, 0x7f0c0184 - - return v0 - - .line 4008 - :sswitch_be - const-string v2, "layout/activity_combined_camera_text_post_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4009 - const v0, 0x7f0c002a - - return v0 - - .line 3018 - :sswitch_ca - const-string v2, "layout/fragment_parent_checklist_birthday_capture_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3019 - const v0, 0x7f0c0113 - - return v0 - - .line 4332 - :sswitch_d6 - const-string v2, "layout/fragment_school_directory_item_student_parent_circle_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4333 - const v0, 0x7f0c012d - - return v0 - - .line 3384 - :sswitch_e2 - const-string v2, "layout/class_students_item_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3385 - const v0, 0x7f0c0085 - - return v0 - - .line 2922 - :sswitch_ee - const-string v2, "layout/dialog_turn_on_password_lock_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2923 - const v0, 0x7f0c00c0 - - return v0 - - .line 4026 - :sswitch_fa - const-string v2, "layout-sw600dp/fragment_dojo_camera_controls_0_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4027 - return v11 - - .line 3762 - :sswitch_103 - const-string v2, "layout/webview_fragment_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3763 - const v0, 0x7f0c021a - - return v0 - - .line 3222 - :sswitch_10f - const-string v2, "layout/toolbar_gray_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3223 - const v0, 0x7f0c0202 - - return v0 - - .line 3402 - :sswitch_11b - const-string v2, "layout/fragment_dojo_photo_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3403 - const v0, 0x7f0c00f6 - - return v0 - - .line 4320 - :sswitch_127 - const-string v2, "layout/fragment_attendance_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4321 - const v0, 0x7f0c00d7 - - return v0 - - .line 4050 - :sswitch_133 - const-string v2, "layout/dialog_unsupported_class_code_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4051 - const v0, 0x7f0c00c1 - - return v0 - - .line 3330 - :sswitch_13f - const-string v2, "layout/class_students_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3331 - const v0, 0x7f0c0084 - - return v0 - - .line 4338 - :sswitch_14b - const-string v2, "layout/fragment_onboarding_student_avatar_editor_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4339 - const v0, 0x7f0c010f - - return v0 - - .line 4128 - :sswitch_157 - const-string v2, "layout/fragment_scheduled_messages_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4129 - const v0, 0x7f0c0123 - - return v0 - - .line 3258 - :sswitch_163 - const-string v2, "layout/fragment_profile_photo_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3259 - const v0, 0x7f0c011f - - return v0 - - .line 3534 - :sswitch_16f - const-string v2, "layout/fragment_tab_class_wall_item_student_avatar_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3535 - const v0, 0x7f0c016b - - return v0 - - .line 4464 - :sswitch_17b - const-string v2, "layout/layout_parent_connections_initial_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4465 - const v0, 0x7f0c01ab - - return v0 - - .line 3936 - :sswitch_187 - const-string v2, "layout/activity_teacher_home_null_state_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3937 - const v0, 0x7f0c006e - - return v0 - - .line 3396 - :sswitch_193 - const-string v2, "layout/fragment_chat_empty_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3397 - const v0, 0x7f0c00de - - return v0 - - .line 4002 - :sswitch_19f - const-string v2, "layout/item_teacher_student_text_code_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4003 - const v0, 0x7f0c01a6 - - return v0 - - .line 4272 - :sswitch_1ab - const-string v2, "layout/layout_progress_footer_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4273 - const v0, 0x7f0c01af - - return v0 - - .line 4200 - :sswitch_1b7 - const-string v2, "layout/view_parent_pending_connection_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4201 - const v0, 0x7f0c0215 - - return v0 - - .line 4140 - :sswitch_1c3 - const-string v2, "layout/fragment_create_school_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4141 - const v0, 0x7f0c00ef - - return v0 - - .line 3522 - :sswitch_1cf - const-string v2, "layout/fragment_parent_connection_request_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3523 - const v0, 0x7f0c0115 - - return v0 - - .line 3576 - :sswitch_1db - const-string v2, "layout/fragment_edit_behaviours_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3577 - const v0, 0x7f0c00f7 - - return v0 - - .line 3390 - :sswitch_1e7 - const-string v2, "layout/dialog_class_code_student_select_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3391 - const v0, 0x7f0c00aa - - return v0 - - .line 3516 - :sswitch_1f3 - const-string v2, "layout/fragment_teacher_channel_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3517 - const v0, 0x7f0c017e - - return v0 - - .line 3264 - :sswitch_1ff - const-string v2, "layout/fragment_tab_class_wall_item_parent_empty_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3265 - const v0, 0x7f0c0165 - - return v0 - - .line 3894 - :sswitch_20b - const-string v2, "layout/fragment_group_students_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3895 - const v0, 0x7f0c00fe - - return v0 - - .line 2886 - :sswitch_217 - const-string v2, "layout/activity_passwordless_login_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2887 - const v0, 0x7f0c004d - - return v0 - - .line 2832 - :sswitch_223 - const-string v2, "layout/fragment_story_share_to_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2833 - const v0, 0x7f0c013c - - return v0 - - .line 3990 - :sswitch_22f - const-string v2, "layout/fragment_class_list_item_add_class_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3991 - const v0, 0x7f0c00e1 - - return v0 - - .line 3606 - :sswitch_23b - const-string v2, "layout/layout_student_connections_invite_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3607 - const v0, 0x7f0c01b1 - - return v0 - - .line 4098 - :sswitch_247 - const-string v2, "layout/dialog_invite_student_code_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4099 - const v0, 0x7f0c00af - - return v0 - - .line 4032 - :sswitch_253 - const-string v2, "layout/fragment_dojo_camera_controls_0_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4033 - return v11 - - .line 3288 - :sswitch_25c - const-string v2, "layout/toolbar_teacher_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3289 - const v0, 0x7f0c0209 - - return v0 - - .line 3834 - :sswitch_268 - const-string v2, "layout/fragment_edit_students_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3835 - const v0, 0x7f0c00f9 - - return v0 - - .line 2856 - :sswitch_274 - const-string v2, "layout/fragment_student_report_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2857 - const v0, 0x7f0c0152 - - return v0 - - .line 3582 - :sswitch_280 - const-string v2, "layout/dialog_schedule_message_time_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3583 - const v0, 0x7f0c00b8 - - return v0 - - .line 4290 - :sswitch_28c - const-string v2, "layout/fragment_teacher_settings_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4291 - const v0, 0x7f0c0181 - - return v0 - - .line 4398 - :sswitch_298 - const-string v2, "layout/fragment_chat_item_sticker_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4399 - const v0, 0x7f0c00df - - return v0 - - .line 2724 - :sswitch_2a4 - const-string v2, "layout/fragment_photo_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2725 - const v0, 0x7f0c011d - - return v0 - - .line 4386 - :sswitch_2b0 - const-string v2, "layout/fragment_teacher_approval_feed_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4387 - const v0, 0x7f0c017c - - return v0 - - .line 3102 - :sswitch_2bc - const-string v2, "layout/activity_teacher_onboarding_check_email_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3103 - const v0, 0x7f0c006f - - return v0 - - .line 2730 - :sswitch_2c8 - const-string v2, "layout/fragment_onboarding_sign_up_details_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2731 - const v0, 0x7f0c010a - - return v0 - - .line 4176 - :sswitch_2d4 - const-string v2, "layout/layout_student_connections_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4177 - const v0, 0x7f0c01b2 - - return v0 - - .line 3666 - :sswitch_2e0 - const-string v2, "layout/item_teacher_add_coteacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3667 - const v0, 0x7f0c01a4 - - return v0 - - .line 2946 - :sswitch_2ec - const-string v2, "layout/fragment_student_capture_mark_students_marked_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2947 - const v0, 0x7f0c0142 - - return v0 - - .line 3240 - :sswitch_2f8 - const-string v2, "layout/fragment_parent_school_search_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3241 - const v0, 0x7f0c0117 - - return v0 - - .line 3540 - :sswitch_304 - const-string v2, "layout/dialog_parent_teacher_invitation_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3541 - const v0, 0x7f0c00b3 - - return v0 - - .line 4116 - :sswitch_310 - const-string v2, "layout/student_connections_individual_codes_invite_section_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4117 - const v0, 0x7f0c01f8 - - return v0 - - .line 3696 - :sswitch_31c - const-string v2, "layout/popup_item_copy_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3697 - const v0, 0x7f0c01e9 - - return v0 - - .line 3858 - :sswitch_328 - const-string v2, "layout/fragment_combined_camera_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3859 - const v0, 0x7f0c00e8 - - return v0 - - .line 4134 - :sswitch_334 - const-string v2, "layout/activity_setup_skills_sharing_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4135 - const v0, 0x7f0c0058 - - return v0 - - .line 3630 - :sswitch_340 - const-string v2, "layout-sw600dp-land/activity_student_capture_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3631 - return v10 - - .line 2754 - :sswitch_349 - const-string v2, "layout/fragment_class_list_item_class_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2755 - const v0, 0x7f0c00e2 - - return v0 - - .line 3312 - :sswitch_355 - const-string v2, "layout/activity_parent_setup_student_account_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3313 - const v0, 0x7f0c004b - - return v0 - - .line 4182 - :sswitch_361 - const-string v2, "layout/activity_debug_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4183 - const v0, 0x7f0c0031 - - return v0 - - .line 3564 - :sswitch_36d - const-string v2, "layout/fragment_student_capture_student_list_home_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3565 - const v0, 0x7f0c0147 - - return v0 - - .line 3054 - :sswitch_379 - const-string v2, "layout/placeholder_offline_with_refresh_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3055 - const v0, 0x7f0c01e7 - - return v0 - - .line 3684 - :sswitch_385 - const-string v2, "layout/fragment_audience_selector_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3685 - const v0, 0x7f0c00d8 - - return v0 - - .line 3732 - :sswitch_391 - const-string v2, "layout/activity_parent_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3733 - const v0, 0x7f0c0048 - - return v0 - - .line 4356 - :sswitch_39d - const-string v2, "layout/fragment_student_codes_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4357 - const v0, 0x7f0c014b - - return v0 - - .line 3654 - :sswitch_3a9 - const-string v2, "layout/fragment_tab_notification_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3655 - const v0, 0x7f0c0175 - - return v0 - - .line 3282 - :sswitch_3b5 - const-string v2, "layout/activity_dojo_camera_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3283 - const v0, 0x7f0c0034 - - return v0 - - .line 3978 - :sswitch_3c1 - const-string v2, "layout-sw600dp-land/fragment_tab_story_feed_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3979 - return v9 - - .line 4044 - :sswitch_3ca - const-string v2, "layout/dialog_disconnect_student_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4045 - const v0, 0x7f0c00ac - - return v0 - - .line 3912 - :sswitch_3d6 - const-string v2, "layout-sw600dp/student_login_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3913 - return v8 - - .line 2970 - :sswitch_3df - const-string v2, "layout/fragment_student_capture_student_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2971 - const v0, 0x7f0c0148 - - return v0 - - .line 3036 - :sswitch_3eb - const-string v2, "layout/fragment_school_detail_teacher_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3037 - const v0, 0x7f0c0128 - - return v0 - - .line 3468 - :sswitch_3f7 - const-string v2, "layout/fragment_student_capture_story_feed_item_content_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3469 - const v0, 0x7f0c0145 - - return v0 - - .line 3876 - :sswitch_403 - const-string v2, "layout/dialog_add_note_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3877 - const v0, 0x7f0c00a3 - - return v0 - - .line 3372 - :sswitch_40f - const-string v2, "layout/item_image_resource_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3373 - const v0, 0x7f0c0195 - - return v0 - - .line 4230 - :sswitch_41b - const-string v2, "layout/fragment_add_edit_student_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4231 - const v0, 0x7f0c00d3 - - return v0 - - .line 3060 - :sswitch_427 - const-string v2, "layout/fragment_student_report_add_note_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3061 - const v0, 0x7f0c0153 - - return v0 - - .line 2682 - :sswitch_433 - const-string v2, "layout/fragment_combined_fullscreen_photo_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2683 - const v0, 0x7f0c00ed - - return v0 - - .line 3108 - :sswitch_43f - const-string v2, "layout/fragment_class_wall_compose_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3109 - const v0, 0x7f0c00e5 - - return v0 - - .line 3966 - :sswitch_44b - const-string v2, "layout/dialog_class_code_student_blocker_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3967 - const v0, 0x7f0c00a9 - - return v0 - - .line 2868 - :sswitch_457 - const-string v2, "layout/activity_connection_requests_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2869 - const v0, 0x7f0c002c - - return v0 - - .line 2988 - :sswitch_463 - const-string v2, "layout/activity_connection_reqeusts_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2989 - const v0, 0x7f0c002b - - return v0 - - .line 2796 - :sswitch_46f - const-string v2, "layout/fragment_school_directory_item_welcome_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2797 - const v0, 0x7f0c0131 - - return v0 - - .line 3726 - :sswitch_47b - const-string v2, "layout/fragment_story_share_to_class_header_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3727 - const v0, 0x7f0c013b - - return v0 - - .line 3888 - :sswitch_487 - const-string v2, "layout/fragment_tab_class_wall_item_parent_empty_checklist_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3889 - const v0, 0x7f0c0166 - - return v0 - - .line 4254 - :sswitch_493 - const-string v2, "layout/fragment_school_directory_item_teacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4255 - const v0, 0x7f0c012e - - return v0 - - .line 2772 - :sswitch_49f - const-string v2, "layout/fragment_parent_teacher_search_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2773 - const v0, 0x7f0c011c - - return v0 - - .line 3450 - :sswitch_4ab - const-string v2, "layout/item_parent_list_new_message_invite_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3451 - const v0, 0x7f0c019f - - return v0 - - .line 3426 - :sswitch_4b7 - const-string v2, "layout/activity_teacher_behavior_controller_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3427 - const v0, 0x7f0c006a - - return v0 - - .line 3090 - :sswitch_4c3 - const-string v2, "layout/dialog_base_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3091 - const v0, 0x7f0c00a7 - - return v0 - - .line 3276 - :sswitch_4cf - const-string v2, "layout/activity_onboarding_teacher_sign_up_flow_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3277 - const v0, 0x7f0c0042 - - return v0 - - .line 2712 - :sswitch_4db - const-string v2, "layout/dialog_student_capture_student_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2713 - const v0, 0x7f0c00ba - - return v0 - - .line 2700 - :sswitch_4e7 - const-string v2, "layout/fragment_classroom_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2701 - const v0, 0x7f0c00e7 - - return v0 - - .line 3096 - :sswitch_4f3 - const-string v2, "layout/fragment_school_detail_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3097 - const v0, 0x7f0c0125 - - return v0 - - .line 3066 - :sswitch_4ff - const-string v2, "layout/layout_create_account_splash_page_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3067 - const v0, 0x7f0c01a7 - - return v0 - - .line 3588 - :sswitch_50b - const-string v2, "layout/story_post_created_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3589 - const v0, 0x7f0c01f6 - - return v0 - - .line 2736 - :sswitch_517 - const-string v2, "layout-sw600dp/fragment_student_capture_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2737 - return v12 - - .line 3864 - :sswitch_520 - const-string v2, "layout/item_class_code_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3865 - const v0, 0x7f0c018f - - return v0 - - .line 2706 - :sswitch_52c - const-string v2, "layout/fragment_add_school_student_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2707 - const v0, 0x7f0c00d4 - - return v0 - - .line 3162 - :sswitch_538 - const-string v2, "layout/activity_student_settings_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3163 - const v0, 0x7f0c0068 - - return v0 - - .line 3930 - :sswitch_544 - const-string v2, "layout/item_add_student_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3931 - const v0, 0x7f0c018c - - return v0 - - .line 3504 - :sswitch_550 - const-string v2, "layout/activity_debug_urls_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3505 - const v0, 0x7f0c0033 - - return v0 - - .line 3456 - :sswitch_55c - const-string v2, "layout/layout_student_connections_initial_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3457 - const v0, 0x7f0c01b0 - - return v0 - - .line 3744 - :sswitch_568 - const-string v2, "layout/fragment_combined_camera_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3745 - const v0, 0x7f0c00eb - - return v0 - - .line 3252 - :sswitch_574 - const-string v2, "layout/fragment_combined_drawing_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3253 - const v0, 0x7f0c00ec - - return v0 - - .line 3000 - :sswitch_580 - const-string v2, "layout/fragment_teacher_connection_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3001 - const v0, 0x7f0c017f - - return v0 - - .line 2760 - :sswitch_58c - const-string v2, "layout/fragment_school_search_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2761 - const v0, 0x7f0c0133 - - return v0 - - .line 4380 - :sswitch_598 - const-string v2, "layout/activity_email_verified_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4381 - const v0, 0x7f0c0037 - - return v0 - - .line 4248 - :sswitch_5a4 - const-string v2, "layout/dialog_teacher_invitation_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4249 - const v0, 0x7f0c00bd - - return v0 - - .line 4440 - :sswitch_5b0 - const-string v2, "layout/view_drawer_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4441 - return v7 - - .line 3084 - :sswitch_5b9 - const-string v2, "layout/dialog_password_changed_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3085 - const v0, 0x7f0c00b4 - - return v0 - - .line 3636 - :sswitch_5c5 - const-string v2, "layout/activity_student_capture_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3637 - return v10 - - .line 4188 - :sswitch_5ce - const-string v2, "layout/fragment_invite_item_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4189 - const v0, 0x7f0c0101 - - return v0 - - .line 4422 - :sswitch_5da - const-string v2, "layout/fragment_parent_setup_student_account_ack_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4423 - const v0, 0x7f0c0119 - - return v0 - - .line 3972 - :sswitch_5e6 - const-string v2, "layout/fragment_teacher_story_feed_approval_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3973 - const v0, 0x7f0c0183 - - return v0 - - .line 3786 - :sswitch_5f2 - const-string v2, "layout/fragment_class_list_item_school_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3787 - const v0, 0x7f0c00e3 - - return v0 - - .line 3570 - :sswitch_5fe - const-string v2, "layout/dialog_teacher_new_class_success_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3571 - const v0, 0x7f0c00be - - return v0 - - .line 3546 - :sswitch_60a - const-string v2, "layout/activity_share_media_content_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3547 - const v0, 0x7f0c005b - - return v0 - - .line 4314 - :sswitch_616 - const-string v2, "layout/fragment_tab_notification_pending_posts_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4315 - const v0, 0x7f0c0178 - - return v0 - - .line 3210 - :sswitch_622 - const-string v2, "layout-sw600dp-land/activity_teacher_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3211 - return v6 - - .line 4110 - :sswitch_62b - const-string v2, "layout/fragment_onboarding_sign_up_title_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4111 - const v0, 0x7f0c010d - - return v0 - - .line 3204 - :sswitch_637 - const-string v2, "layout/fragment_tab_class_wall_item_invite_card_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3205 - const v0, 0x7f0c0164 - - return v0 - - .line 2838 - :sswitch_643 - const-string v2, "layout/fragment_student_report_charts_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2839 - const v0, 0x7f0c0154 - - return v0 - - .line 4080 - :sswitch_64f - const-string v2, "layout-sw600dp/fragment_student_login_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4081 - return v5 - - .line 4224 - :sswitch_658 - const-string v2, "layout/toolbar_text_post_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4225 - const v0, 0x7f0c020c - - return v0 - - .line 3186 - :sswitch_664 - const-string v2, "layout/activity_teacher_home_drawer_header_light_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3187 - const v0, 0x7f0c006d - - return v0 - - .line 3156 - :sswitch_670 - const-string v2, "layout/fragment_combined_camera_controls_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3157 - const v0, 0x7f0c00ea - - return v0 - - .line 2928 - :sswitch_67c - const-string v2, "layout/binding_variable_placeholder_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2929 - const v0, 0x7f0c0077 - - return v0 - - .line 3078 - :sswitch_688 - const-string v2, "layout/add_note_undo_popup_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3079 - const v0, 0x7f0c0076 - - return v0 - - .line 3804 - :sswitch_694 - const-string v2, "layout/item_student_drawing_tool_sticker_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3805 - const v0, 0x7f0c01a2 - - return v0 - - .line 4344 - :sswitch_6a0 - const-string v2, "layout/activity_onboarding_parent_sign_up_flow_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4345 - const v0, 0x7f0c0041 - - return v0 - - .line 3228 - :sswitch_6ac - const-string v2, "layout/fragment_add_coteacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3229 - const v0, 0x7f0c00cf - - return v0 - - .line 3954 - :sswitch_6b8 - const-string v2, "layout/fragment_teacher_search_item_empty_teacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3955 - const v0, 0x7f0c0180 - - return v0 - - .line 4446 - :sswitch_6c4 - const-string v2, "layout-sw600dp-land/view_drawer_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4447 - return v7 - - .line 3462 - :sswitch_6cd - const-string v2, "layout-sw600dp/fragment_dojo_camera_controls_270_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3463 - const v0, 0x7f0c00f3 - - return v0 - - .line 3996 - :sswitch_6d9 - const-string v2, "layout-sw600dp/fragment_dojo_camera_controls_180_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3997 - const v0, 0x7f0c00f2 - - return v0 - - .line 3114 - :sswitch_6e5 - const-string v2, "layout/fragment_parent_sign_up_credentials_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3115 - const v0, 0x7f0c011b - - return v0 - - .line 3924 - :sswitch_6f1 - const-string v2, "layout/fragment_student_avatar_editor_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3925 - const v0, 0x7f0c013e - - return v0 - - .line 4092 - :sswitch_6fd - const-string v2, "layout/fragment_teacher_welcome_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4093 - const v0, 0x7f0c0186 - - return v0 - - .line 3408 - :sswitch_709 - const-string v2, "layout/fragment_teacher_student_connection_text_codes_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3409 - const v0, 0x7f0c0185 - - return v0 - - .line 4458 - :sswitch_715 - const-string v2, "layout/fragment_student_capture_story_feed_item_participant_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4459 - const v0, 0x7f0c0146 - - return v0 - - .line 2880 - :sswitch_721 - const-string v2, "layout/fragment_student_relation_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2881 - const v0, 0x7f0c0151 - - return v0 - - .line 3270 - :sswitch_72d - const-string v2, "layout/fragment_hold_tight_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3271 - const v0, 0x7f0c0100 - - return v0 - - .line 2976 - :sswitch_739 - const-string v2, "layout/layout_parent_connections_invite_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2977 - const v0, 0x7f0c01ac - - return v0 - - .line 4152 - :sswitch_745 - const-string v2, "layout/layout_legacy_video_view_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4153 - const v0, 0x7f0c01a9 - - return v0 - - .line 3294 - :sswitch_751 - const-string v2, "layout/fragment_combined_camera_compose_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3295 - const v0, 0x7f0c00e9 - - return v0 - - .line 2874 - :sswitch_75d - const-string v2, "layout/setup_skills_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2875 - const v0, 0x7f0c01f3 - - return v0 - - .line 3174 - :sswitch_769 - const-string v2, "layout/fragment_onboarding_sign_up_email_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3175 - const v0, 0x7f0c010b - - return v0 - - .line 3138 - :sswitch_775 - const-string v2, "layout/combined_compose_audience_student_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3139 - const v0, 0x7f0c0088 - - return v0 - - .line 3498 - :sswitch_781 - const-string v2, "layout/dialog_add_student_find_teacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3499 - const v0, 0x7f0c00a4 - - return v0 - - .line 3246 - :sswitch_78d - const-string v2, "layout/fragment_preview_message_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3247 - const v0, 0x7f0c011e - - return v0 - - .line 3048 - :sswitch_799 - const-string v2, "layout/fragment_single_notification_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3049 - const v0, 0x7f0c0139 - - return v0 - - .line 3414 - :sswitch_7a5 - const-string v2, "layout/fragment_edit_students_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3415 - const v0, 0x7f0c00fa - - return v0 - - .line 3012 - :sswitch_7b1 - const-string v2, "layout/fragment_tab_class_wall_item_compose_large_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3013 - const v0, 0x7f0c0160 - - return v0 - - .line 4218 - :sswitch_7bd - const-string v2, "layout/fragment_leader_sign_up_role_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4219 - const v0, 0x7f0c0103 - - return v0 - - .line 2820 - :sswitch_7c9 - const-string v2, "layout/fragment_class_code_student_select_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2821 - const v0, 0x7f0c00e0 - - return v0 - - .line 4164 - :sswitch_7d5 - const-string v2, "layout/fragment_school_search_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4165 - const v0, 0x7f0c0135 - - return v0 - - .line 3900 - :sswitch_7e1 - const-string v2, "layout/toolbar_teacher_onboarding_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3901 - const v0, 0x7f0c020a - - return v0 - - .line 3828 - :sswitch_7ed - const-string v2, "layout/fragment_school_directory_item_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3829 - const v0, 0x7f0c012a - - return v0 - - .line 2748 - :sswitch_7f9 - const-string v2, "layout-sw600dp-land/fragment_student_capture_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2749 - return v12 - - .line 4068 - :sswitch_802 - const-string v2, "layout/fragment_parent_setup_student_account_qr_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4069 - const v0, 0x7f0c011a - - return v0 - - .line 3960 - :sswitch_80e - const-string v2, "layout/fragment_student_registration_form_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3961 - const v0, 0x7f0c0150 - - return v0 - - .line 2688 - :sswitch_81a - const-string v2, "layout/activity_setup_skills_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2689 - const v0, 0x7f0c0057 - - return v0 - - .line 4236 - :sswitch_826 - const-string v2, "layout/dialog_exit_student_mode_password_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4237 - const v0, 0x7f0c00ae - - return v0 - - .line 3678 - :sswitch_832 - const-string v2, "layout/fragment_story_share_to_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3679 - const v0, 0x7f0c013a - - return v0 - - .line 3348 - :sswitch_83e - const-string v2, "layout/fragment_seen_by_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3349 - const v0, 0x7f0c0136 - - return v0 - - .line 2826 - :sswitch_84a - const-string v2, "layout/fragment_add_edit_behaviours_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2827 - const v0, 0x7f0c00d0 - - return v0 - - .line 3558 - :sswitch_856 - const-string v2, "layout/fragment_story_share_to_student_header_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3559 - const v0, 0x7f0c013d - - return v0 - - .line 3366 - :sswitch_862 - const-string v2, "layout/fragment_setup_skills_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3367 - const v0, 0x7f0c0138 - - return v0 - - .line 2778 - :sswitch_86e - const-string v2, "layout/fragment_dojo_camera_tooltip_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2779 - const v0, 0x7f0c00f5 - - return v0 - - .line 4284 - :sswitch_87a - const-string v2, "layout/fragment_school_search_adapter_footer_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4285 - const v0, 0x7f0c0134 - - return v0 - - .line 3042 - :sswitch_886 - const-string v2, "layout/fragment_account_switcher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3043 - const v0, 0x7f0c00c9 - - return v0 - - .line 2850 - :sswitch_892 - const-string v2, "layout/activity_share_media_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2851 - const v0, 0x7f0c0059 - - return v0 - - .line 4434 - :sswitch_89e - const-string v2, "layout/fragment_student_capture_home_story_feed_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4435 - const v0, 0x7f0c013f - - return v0 - - .line 4308 - :sswitch_8aa - const-string v2, "layout/connection_type_header_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4309 - const v0, 0x7f0c0089 - - return v0 - - .line 2904 - :sswitch_8b6 - const-string v2, "layout-sw600dp/fragment_dojo_camera_controls_90_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2905 - const v0, 0x7f0c00f4 - - return v0 - - .line 3030 - :sswitch_8c2 - const-string v2, "layout/dialog_enter_student_mode_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3031 - const v0, 0x7f0c00ad - - return v0 - - .line 3324 - :sswitch_8ce - const-string v2, "layout/debug_feature_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3325 - const v0, 0x7f0c0090 - - return v0 - - .line 3342 - :sswitch_8da - const-string v2, "layout/fragment_add_edit_class_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3343 - const v0, 0x7f0c00d1 - - return v0 - - .line 4212 - :sswitch_8e6 - const-string v2, "layout/fragment_push_notifications_settings_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4213 - const v0, 0x7f0c0121 - - return v0 - - .line 4278 - :sswitch_8f2 - const-string v2, "layout/fragment_scheduled_message_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4279 - const v0, 0x7f0c0122 - - return v0 - - .line 3618 - :sswitch_8fe - const-string v2, "layout-land/fragment_add_class_poster_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3619 - return v4 - - .line 3354 - :sswitch_907 - const-string v2, "layout-sw600dp/fragment_mark_students_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3355 - return v3 - - .line 3600 - :sswitch_910 - const-string v2, "layout/fragment_tab_class_wall_item_student_report_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3601 - const v0, 0x7f0c016f - - return v0 - - .line 3510 - :sswitch_91c - const-string v2, "layout/fragment_tab_class_wall_item_invite_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3511 - const v0, 0x7f0c0163 - - return v0 - - .line 2862 - :sswitch_928 - const-string v2, "layout/fragment_student_capture_mark_students_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2863 - const v0, 0x7f0c0141 - - return v0 - - .line 2952 - :sswitch_934 - const-string v2, "layout/fragment_seen_by_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2953 - const v0, 0x7f0c0137 - - return v0 - - .line 3882 - :sswitch_940 - const-string v2, "layout/activity_class_link_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3883 - const v0, 0x7f0c0026 - - return v0 - - .line 2742 - :sswitch_94c - const-string v2, "layout/fragment_student_capture_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2743 - return v12 - - .line 3132 - :sswitch_955 - const-string v3, "layout/fragment_student_capture_story_feed_item_0" - - invoke-virtual {p1, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v3 - - if-eqz v3, :cond_e05 - - .line 3133 - return v2 - - .line 2916 - :sswitch_95e - const-string v2, "layout/fragment_school_directory_item_teacher_pending_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2917 - const v0, 0x7f0c012f - - return v0 - - .line 3192 - :sswitch_96a - const-string v2, "layout/fragment_student_connections_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3193 - const v0, 0x7f0c014c - - return v0 - - .line 2784 - :sswitch_976 - const-string v2, "layout/activity_add_edit_class_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2785 - const v0, 0x7f0c001d - - return v0 - - .line 3624 - :sswitch_982 - const-string v2, "layout/fragment_add_class_poster_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3625 - return v4 - - .line 4242 - :sswitch_98b - const-string v2, "layout/fragment_school_directory_item_student_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4243 - const v0, 0x7f0c012b - - return v0 - - .line 4368 - :sswitch_997 - const-string v2, "layout/item_class_code_student_select_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4369 - const v0, 0x7f0c0190 - - return v0 - - .line 2814 - :sswitch_9a3 - const-string v2, "layout/dialog_student_age_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2815 - const v0, 0x7f0c00b9 - - return v0 - - .line 3150 - :sswitch_9af - const-string v2, "layout/layout_dojo_video_view_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3151 - const v0, 0x7f0c01a8 - - return v0 - - .line 3948 - :sswitch_9bb - const-string v2, "layout/layout_student_list_empty_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3949 - const v0, 0x7f0c01b3 - - return v0 - - .line 3810 - :sswitch_9c7 - const-string v2, "layout/fragment_student_report_selector_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3811 - const v0, 0x7f0c0158 - - return v0 - - .line 4158 - :sswitch_9d3 - const-string v2, "layout/dialog_parent_invitation_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4159 - const v0, 0x7f0c00b2 - - return v0 - - .line 4452 - :sswitch_9df - const-string v2, "layout/fragment_school_directory_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4453 - const v0, 0x7f0c0129 - - return v0 - - .line 2790 - :sswitch_9eb - const-string v2, "layout/fragment_login_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2791 - const v0, 0x7f0c0104 - - return v0 - - .line 3984 - :sswitch_9f7 - const-string v2, "layout/fragment_tab_story_feed_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3985 - return v9 - - .line 4014 - :sswitch_a00 - const-string v2, "layout/fragment_add_class_invite_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4015 - const v0, 0x7f0c00cc - - return v0 - - .line 4350 - :sswitch_a0c - const-string v2, "layout/item_parent_checklist_complete_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4351 - const v0, 0x7f0c019d - - return v0 - - .line 2808 - :sswitch_a18 - const-string v2, "layout/parent_checklist_success_overlay_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2809 - const v0, 0x7f0c01de - - return v0 - - .line 3690 - :sswitch_a24 - const-string v2, "layout/invite_parent_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3691 - const v0, 0x7f0c018a - - return v0 - - .line 3318 - :sswitch_a30 - const-string v2, "layout/fragment_award_grid_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3319 - const v0, 0x7f0c00da - - return v0 - - .line 2766 - :sswitch_a3c - const-string v2, "layout/fragment_tab_class_wall_item_webview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2767 - const v0, 0x7f0c0170 - - return v0 - - .line 3198 - :sswitch_a48 - const-string v2, "layout/placeholder_empty_with_refresh_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3199 - const v0, 0x7f0c01e5 - - return v0 - - .line 4428 - :sswitch_a54 - const-string v2, "layout/fragment_account_switcher_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4429 - const v0, 0x7f0c00cb - - return v0 - - .line 2664 - :sswitch_a60 - const-string v2, "layout/dialog_avatar_grid_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2665 - const v0, 0x7f0c00a6 - - return v0 - - .line 2958 - :sswitch_a6c - const-string v2, "layout/toolbar_text_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2959 - const v0, 0x7f0c020b - - return v0 - - .line 4404 - :sswitch_a78 - const-string v2, "layout/fragment_add_edit_group_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4405 - const v0, 0x7f0c00d2 - - return v0 - - .line 2940 - :sswitch_a84 - const-string v2, "layout/fragment_school_null_state_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2941 - const v0, 0x7f0c0132 - - return v0 - - .line 4020 - :sswitch_a90 - const-string v2, "layout/fragment_create_account_splash_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4021 - const v0, 0x7f0c00ee - - return v0 - - .line 3756 - :sswitch_a9c - const-string v2, "layout/fragment_onboarding_enable_camera_primer_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3757 - const v0, 0x7f0c0108 - - return v0 - - .line 3528 - :sswitch_aa8 - const-string v2, "layout/fragment_change_password_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3529 - const v0, 0x7f0c00dc - - return v0 - - .line 3660 - :sswitch_ab4 - const-string v2, "layout/fragment_onboarding_sign_up_parent_anti_abuse_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3661 - const v0, 0x7f0c010c - - return v0 - - .line 3486 - :sswitch_ac0 - const-string v2, "layout/layout_parent_connections_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3487 - const v0, 0x7f0c01ad - - return v0 - - .line 4362 - :sswitch_acc - const-string v2, "layout/fragment_tab_student_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4363 - const v0, 0x7f0c017b - - return v0 - - .line 4170 - :sswitch_ad8 - const-string v2, "layout/fragment_meet_teacher_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4171 - const v0, 0x7f0c0106 - - return v0 - - .line 2898 - :sswitch_ae4 - const-string v2, "layout/fragment_tab_class_wall_generic_button_icon_text_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2899 - const v0, 0x7f0c015a - - return v0 - - .line 3714 - :sswitch_af0 - const-string v2, "layout/item_parent_checklist_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3715 - const v0, 0x7f0c019c - - return v0 - - .line 3594 - :sswitch_afc - const-string v2, "layout/toolbar_teacher_approval_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3595 - const v0, 0x7f0c0208 - - return v0 - - .line 3840 - :sswitch_b08 - const-string v2, "layout/fragment_school_directory_item_teacher_request_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3841 - const v0, 0x7f0c0130 - - return v0 - - .line 3708 - :sswitch_b14 - const-string v2, "layout/fragment_chat_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3709 - const v0, 0x7f0c00dd - - return v0 - - .line 3438 - :sswitch_b20 - const-string v2, "layout/fragment_tab_notification_list_pending_requests_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3439 - const v0, 0x7f0c0177 - - return v0 - - .line 3552 - :sswitch_b2c - const-string v2, "layout/dialog_change_name_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3553 - const v0, 0x7f0c00a8 - - return v0 - - .line 2844 - :sswitch_b38 - const-string v2, "layout/fragment_student_report_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2845 - const v0, 0x7f0c0155 - - return v0 - - .line 4296 - :sswitch_b44 - const-string v2, "layout/fragment_award_pager_dialog_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4297 - const v0, 0x7f0c00db - - return v0 - - .line 3216 - :sswitch_b50 - const-string v2, "layout/activity_teacher_home_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3217 - return v6 - - .line 3780 - :sswitch_b59 - const-string v2, "layout/chat_empty_broadcasts_view_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3781 - const v0, 0x7f0c007f - - return v0 - - .line 2910 - :sswitch_b65 - const-string v2, "layout/activity_teacher_home_drawer_header_dark_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2911 - const v0, 0x7f0c006c - - return v0 - - .line 3738 - :sswitch_b71 - const-string v2, "layout/fragment_student_profile_date_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3739 - const v0, 0x7f0c014f - - return v0 - - .line 3822 - :sswitch_b7d - const-string v2, "layout/fragment_student_codes_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3823 - const v0, 0x7f0c014a - - return v0 - - .line 4146 - :sswitch_b89 - const-string v2, "layout/fragment_parent_channel_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4147 - const v0, 0x7f0c0112 - - return v0 - - .line 2892 - :sswitch_b95 - const-string v2, "layout/fragment_onboarding_splash_user_role_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2893 - const v0, 0x7f0c010e - - return v0 - - .line 4326 - :sswitch_ba1 - const-string v2, "layout/fragment_push_notifications_quiet_hours_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4327 - const v0, 0x7f0c0120 - - return v0 - - .line 3612 - :sswitch_bad - const-string v2, "layout/fragment_class_list_item_teacher_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3613 - const v0, 0x7f0c00e4 - - return v0 - - .line 3168 - :sswitch_bb9 - const-string v2, "layout/fragment_tab_notification_list_item_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3169 - const v0, 0x7f0c0176 - - return v0 - - .line 4062 - :sswitch_bc5 - const-string v2, "layout/view_list_header_limit_width_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4063 - const v0, 0x7f0c0214 - - return v0 - - .line 2994 - :sswitch_bd1 - const-string v2, "layout/activity_qrcode_scan_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2995 - const v0, 0x7f0c0052 - - return v0 - - .line 3180 - :sswitch_bdd - const-string v2, "layout/activity_share_media_audience_selector_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3181 - const v0, 0x7f0c005a - - return v0 - - .line 3720 - :sswitch_be9 - const-string v2, "layout/fragment_student_report_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3721 - const v0, 0x7f0c0157 - - return v0 - - .line 3918 - :sswitch_bf5 - const-string v2, "layout/student_login_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3919 - return v8 - - .line 4266 - :sswitch_bfe - const-string v2, "layout/activity_school_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4267 - const v0, 0x7f0c0054 - - return v0 - - .line 3672 - :sswitch_c0a - const-string v2, "layout/fragment_parent_school_search_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3673 - const v0, 0x7f0c0118 - - return v0 - - .line 4074 - :sswitch_c16 - const-string v2, "layout/fragment_student_login_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4075 - return v5 - - .line 4260 - :sswitch_c1f - const-string v2, "layout/fragment_parent_connections_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4261 - const v0, 0x7f0c0116 - - return v0 - - .line 4086 - :sswitch_c2b - const-string v2, "layout/fragment_parent_account_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4087 - const v0, 0x7f0c0110 - - return v0 - - .line 3234 - :sswitch_c37 - const-string v2, "layout/fragment_teacher_approval_feed_item_text_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3235 - const v0, 0x7f0c017d - - return v0 - - .line 3126 - :sswitch_c43 - const-string v3, "layout-sw600dp-land/fragment_student_capture_story_feed_item_0" - - invoke-virtual {p1, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v3 - - if-eqz v3, :cond_e05 - - .line 3127 - return v2 - - .line 2694 - :sswitch_c4c - const-string v2, "layout/fragment_student_drawing_tool_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2695 - const v0, 0x7f0c014d - - return v0 - - .line 3492 - :sswitch_c58 - const-string v2, "layout/parent_connections_single_code_invite_section_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3493 - const v0, 0x7f0c01e0 - - return v0 - - .line 4038 - :sswitch_c64 - const-string v2, "layout/fragment_tab_class_wall_item_demo_empty_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4039 - const v0, 0x7f0c0162 - - return v0 - - .line 3300 - :sswitch_c70 - const-string v2, "layout/toolbar_base_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3301 - const v0, 0x7f0c0200 - - return v0 - - .line 3792 - :sswitch_c7c - const-string v2, "layout/fragment_award_grid_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3793 - const v0, 0x7f0c00d9 - - return v0 - - .line 4122 - :sswitch_c88 - const-string v2, "layout/dialog_student_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4123 - const v0, 0x7f0c00bc - - return v0 - - .line 4392 - :sswitch_c94 - const-string v2, "layout/view_drawing_tool_discard_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4393 - const v0, 0x7f0c0211 - - return v0 - - .line 3648 - :sswitch_ca0 - const-string v2, "layout/fragment_tab_class_wall_item_student_permission_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3649 - const v0, 0x7f0c016e - - return v0 - - .line 3642 - :sswitch_cac - const-string v2, "layout/fragment_parent_add_class_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3643 - const v0, 0x7f0c0111 - - return v0 - - .line 3306 - :sswitch_cb8 - const-string v2, "layout/activity_debug_deeplinks_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3307 - const v0, 0x7f0c0032 - - return v0 - - .line 3378 - :sswitch_cc4 - const-string v2, "layout/fragment_parent_checklist_invite_family_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3379 - const v0, 0x7f0c0114 - - return v0 - - .line 3444 - :sswitch_cd0 - const-string v2, "layout/fragment_school_directory_item_student_add_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3445 - const v0, 0x7f0c012c - - return v0 - - .line 3870 - :sswitch_cdc - const-string v2, "layout/toolbar_onboarding_progress_layout_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3871 - const v0, 0x7f0c0205 - - return v0 - - .line 3852 - :sswitch_ce8 - const-string v2, "layout/fragment_tab_notification_list_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3853 - const v0, 0x7f0c0174 - - return v0 - - .line 2964 - :sswitch_cf4 - const-string v2, "layout/invite_list_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2965 - const v0, 0x7f0c0189 - - return v0 - - .line 3360 - :sswitch_d00 - const-string v2, "layout/fragment_mark_students_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3361 - return v3 - - .line 4416 - :sswitch_d09 - const-string v2, "layout/fragment_video_preview_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4417 - const v0, 0x7f0c0187 - - return v0 - - .line 3906 - :sswitch_d15 - const-string v2, "layout/parent_connections_individual_codes_invite_section_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3907 - const v0, 0x7f0c01df - - return v0 - - .line 2934 - :sswitch_d21 - const-string v2, "layout/fragment_student_report_list_dialog_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2935 - const v0, 0x7f0c0156 - - return v0 - - .line 3942 - :sswitch_d2d - const-string v2, "layout/dialog_parent_delete_connection_request_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3943 - const v0, 0x7f0c00b1 - - return v0 - - .line 4056 - :sswitch_d39 - const-string v2, "layout/fragment_dojo_camera_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4057 - const v0, 0x7f0c00f0 - - return v0 - - .line 3480 - :sswitch_d45 - const-string v2, "layout/combined_compose_audience_group_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3481 - const v0, 0x7f0c0086 - - return v0 - - .line 3474 - :sswitch_d51 - const-string v2, "layout/item_grid_teacher_title_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3475 - const v0, 0x7f0c0192 - - return v0 - - .line 3816 - :sswitch_d5d - const-string v2, "layout/student_login_list_not_my_class_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3817 - const v0, 0x7f0c01fa - - return v0 - - .line 3702 - :sswitch_d69 - const-string v2, "layout/activity_student_search_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3703 - const v0, 0x7f0c0067 - - return v0 - - .line 4302 - :sswitch_d75 - const-string v2, "layout/fragment_forgot_password_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4303 - const v0, 0x7f0c00fc - - return v0 - - .line 3846 - :sswitch_d81 - const-string v2, "layout/view_students_moved_tooltip_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3847 - const v0, 0x7f0c0218 - - return v0 - - .line 3120 - :sswitch_d8d - const-string v2, "layout/fragment_student_code_form_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3121 - const v0, 0x7f0c0149 - - return v0 - - .line 3072 - :sswitch_d99 - const-string v2, "layout/fragment_message_recipients_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3073 - const v0, 0x7f0c0107 - - return v0 - - .line 3336 - :sswitch_da5 - const-string v2, "layout/fragment_attendance_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3337 - const v0, 0x7f0c00d6 - - return v0 - - .line 4194 - :sswitch_db1 - const-string v2, "layout/fragment_web_view_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4195 - const v0, 0x7f0c0188 - - return v0 - - .line 2676 - :sswitch_dbd - const-string v2, "layout/view_teacher_student_connection_text_codes_instructions_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2677 - const v0, 0x7f0c0219 - - return v0 - - .line 2802 - :sswitch_dc9 - const-string v2, "layout/view_list_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 2803 - const v0, 0x7f0c0213 - - return v0 - - .line 3774 - :sswitch_dd5 - const-string v2, "layout/activity_parent_checklist_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3775 - const v0, 0x7f0c0046 - - return v0 - - .line 4206 - :sswitch_de1 - const-string v2, "layout/thumbnail_item_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 4207 - const v0, 0x7f0c01fe - - return v0 - - .line 3420 - :sswitch_ded - const-string v2, "layout/fragment_add_class_invite_code_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3421 - const v0, 0x7f0c00cd - - return v0 - - .line 3144 - :sswitch_df9 - const-string v2, "layout/item_onboarding_class_code_header_0" - - invoke-virtual {p1, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v2 - - if-eqz v2, :cond_e05 - - .line 3145 - const v0, 0x7f0c019b - - return v0 - - .line 4470 - :cond_e05 - :goto_e05 - return v0 - - :sswitch_data_e06 - .sparse-switch - -0x7ff1b754 -> :sswitch_df9 - -0x7f0c897b -> :sswitch_ded - -0x7d0aa704 -> :sswitch_de1 - -0x7c6be673 -> :sswitch_dd5 - -0x7c3fe396 -> :sswitch_dc9 - -0x7becf608 -> :sswitch_dbd - -0x7b0a44b5 -> :sswitch_db1 - -0x797d3b3c -> :sswitch_da5 - -0x787ac9b3 -> :sswitch_d99 - -0x770745a7 -> :sswitch_d8d - -0x7647340a -> :sswitch_d81 - -0x75d10002 -> :sswitch_d75 - -0x753a0a98 -> :sswitch_d69 - -0x74899310 -> :sswitch_d5d - -0x73a86b46 -> :sswitch_d51 - -0x73629603 -> :sswitch_d45 - -0x70a04545 -> :sswitch_d39 - -0x70067ff0 -> :sswitch_d2d - -0x6fff2663 -> :sswitch_d21 - -0x6c14d67b -> :sswitch_d15 - -0x6b962df5 -> :sswitch_d09 - -0x6b5b74af -> :sswitch_d00 - -0x6b5a686c -> :sswitch_cf4 - -0x6ae98fb1 -> :sswitch_ce8 - -0x6a5398ee -> :sswitch_cdc - -0x69baa2cb -> :sswitch_cd0 - -0x68770d73 -> :sswitch_cc4 - -0x67f67859 -> :sswitch_cb8 - -0x67a2ada0 -> :sswitch_cac - -0x6629c3ca -> :sswitch_ca0 - -0x660dcd62 -> :sswitch_c94 - -0x660a05fb -> :sswitch_c88 - -0x619ba5fd -> :sswitch_c7c - -0x5fe088e0 -> :sswitch_c70 - -0x5fdd67ac -> :sswitch_c64 - -0x5f10a74b -> :sswitch_c58 - -0x5b084708 -> :sswitch_c4c - -0x5ad2035f -> :sswitch_c43 - -0x59e896a2 -> :sswitch_c37 - -0x596de34d -> :sswitch_c2b - -0x59554ca5 -> :sswitch_c1f - -0x5868dbad -> :sswitch_c16 - -0x581e0245 -> :sswitch_c0a - -0x57f09e50 -> :sswitch_bfe - -0x578acaba -> :sswitch_bf5 - -0x57679658 -> :sswitch_be9 - -0x56d6ec3b -> :sswitch_bdd - -0x547e23ec -> :sswitch_bd1 - -0x53bb8353 -> :sswitch_bc5 - -0x528bcbb7 -> :sswitch_bb9 - -0x524316c9 -> :sswitch_bad - -0x5207f75d -> :sswitch_ba1 - -0x51b92ac3 -> :sswitch_b95 - -0x513d656a -> :sswitch_b89 - -0x50e9d457 -> :sswitch_b7d - -0x5077865d -> :sswitch_b71 - -0x501cc71d -> :sswitch_b65 - -0x4fb86b71 -> :sswitch_b59 - -0x4e4358e8 -> :sswitch_b50 - -0x4e1aab7f -> :sswitch_b44 - -0x4ded10bf -> :sswitch_b38 - -0x4ca00607 -> :sswitch_b2c - -0x4c1d08ea -> :sswitch_b20 - -0x4b74d30d -> :sswitch_b14 - -0x4b6090f6 -> :sswitch_b08 - -0x4b532106 -> :sswitch_afc - -0x48d78f77 -> :sswitch_af0 - -0x476c2da5 -> :sswitch_ae4 - -0x473cf7b1 -> :sswitch_ad8 - -0x470ff9d9 -> :sswitch_acc - -0x464a89e2 -> :sswitch_ac0 - -0x4645e18d -> :sswitch_ab4 - -0x44ce1aaf -> :sswitch_aa8 - -0x43e66da4 -> :sswitch_a9c - -0x4373979d -> :sswitch_a90 - -0x4362a775 -> :sswitch_a84 - -0x4350d07d -> :sswitch_a78 - -0x431e5fbc -> :sswitch_a6c - -0x4265e5d5 -> :sswitch_a60 - -0x4116179a -> :sswitch_a54 - -0x40f419aa -> :sswitch_a48 - -0x3ec87248 -> :sswitch_a3c - -0x3ec71fef -> :sswitch_a30 - -0x3d93bcff -> :sswitch_a24 - -0x3c7a38a4 -> :sswitch_a18 - -0x3b64498f -> :sswitch_a0c - -0x3b4ec057 -> :sswitch_a00 - -0x3afafbd3 -> :sswitch_9f7 - -0x3acbc1d0 -> :sswitch_9eb - -0x3a661c83 -> :sswitch_9df - -0x3a3c34f3 -> :sswitch_9d3 - -0x39befe39 -> :sswitch_9c7 - -0x392524cf -> :sswitch_9bb - -0x3848bc67 -> :sswitch_9af - -0x35732b06 -> :sswitch_9a3 - -0x348d9d2b -> :sswitch_997 - -0x3406792d -> :sswitch_98b - -0x33ca7313 -> :sswitch_982 - -0x337c52a3 -> :sswitch_976 - -0x2f89dc68 -> :sswitch_96a - -0x2f689bee -> :sswitch_95e - -0x2b6cfc6c -> :sswitch_955 - -0x2aed7d6e -> :sswitch_94c - -0x297fd423 -> :sswitch_940 - -0x28b29bee -> :sswitch_934 - -0x27f3f1a0 -> :sswitch_928 - -0x266d0594 -> :sswitch_91c - -0x24f9cea5 -> :sswitch_910 - -0x24dcc0a0 -> :sswitch_907 - -0x2401f98f -> :sswitch_8fe - -0x22c17f88 -> :sswitch_8f2 - -0x22582ada -> :sswitch_8e6 - -0x21ecf7c4 -> :sswitch_8da - -0x21b5e195 -> :sswitch_8ce - -0x218e1b6f -> :sswitch_8c2 - -0x2120b3b5 -> :sswitch_8b6 - -0x20672573 -> :sswitch_8aa - -0x1f9a342e -> :sswitch_89e - -0x1f934e76 -> :sswitch_892 - -0x1d954f72 -> :sswitch_886 - -0x1d93b6ae -> :sswitch_87a - -0x1d7a1981 -> :sswitch_86e - -0x1bdf8f21 -> :sswitch_862 - -0x1b42ca7e -> :sswitch_856 - -0x1b020fac -> :sswitch_84a - -0x19e4669e -> :sswitch_83e - -0x196ed340 -> :sswitch_832 - -0x18f62b4b -> :sswitch_826 - -0x18f615c0 -> :sswitch_81a - -0x187e6ff3 -> :sswitch_80e - -0x1837990b -> :sswitch_802 - -0x18162761 -> :sswitch_7f9 - -0x1711ad89 -> :sswitch_7ed - -0x16e040ae -> :sswitch_7e1 - -0x166f92a6 -> :sswitch_7d5 - -0x14d1edee -> :sswitch_7c9 - -0x12830e6b -> :sswitch_7bd - -0x126b47b3 -> :sswitch_7b1 - -0x11ae6340 -> :sswitch_7a5 - -0x11a7be77 -> :sswitch_799 - -0xf41cfe9 -> :sswitch_78d - -0xf27cc5f -> :sswitch_781 - -0xed1377f -> :sswitch_775 - -0xe96e4cf -> :sswitch_769 - -0xdf0c371 -> :sswitch_75d - -0xa513a07 -> :sswitch_751 - -0x8dc7480 -> :sswitch_745 - -0x86611f7 -> :sswitch_739 - -0x6f11a65 -> :sswitch_72d - -0x609d307 -> :sswitch_721 - -0x5abf878 -> :sswitch_715 - -0x5a60405 -> :sswitch_709 - -0x5058fb4 -> :sswitch_6fd - -0x46586aa -> :sswitch_6f1 - -0x394ee20 -> :sswitch_6e5 - -0x3638689 -> :sswitch_6d9 - -0x355e367 -> :sswitch_6cd - -0x27153f6 -> :sswitch_6c4 - -0x2417edb -> :sswitch_6b8 - -0x1a6bb21 -> :sswitch_6ac - -0xa7e8e3 -> :sswitch_6a0 - -0x9f812d -> :sswitch_694 - -0x25f114 -> :sswitch_688 - 0x532a60 -> :sswitch_67c - 0x8dbe71 -> :sswitch_670 - 0xc0778b -> :sswitch_664 - 0xc87ed1 -> :sswitch_658 - 0x1c1a1a4 -> :sswitch_64f - 0x1effd51 -> :sswitch_643 - 0x2180e05 -> :sswitch_637 - 0x52032ed -> :sswitch_62b - 0x97e972b -> :sswitch_622 - 0xa18dd18 -> :sswitch_616 - 0xcf6bd44 -> :sswitch_60a - 0xdddeeff -> :sswitch_5fe - 0xeff0381 -> :sswitch_5f2 - 0xf5a5f64 -> :sswitch_5e6 - 0x105c60f7 -> :sswitch_5da - 0x10a25a5e -> :sswitch_5ce - 0x11b526b8 -> :sswitch_5c5 - 0x11fbb273 -> :sswitch_5b9 - 0x13379bfd -> :sswitch_5b0 - 0x14318b79 -> :sswitch_5a4 - 0x156bd587 -> :sswitch_598 - 0x1659e31a -> :sswitch_58c - 0x16ddaab6 -> :sswitch_580 - 0x16f2887f -> :sswitch_574 - 0x177c82af -> :sswitch_568 - 0x18fd59f7 -> :sswitch_55c - 0x1a0ec90c -> :sswitch_550 - 0x1b06fbe7 -> :sswitch_544 - 0x1b375163 -> :sswitch_538 - 0x1bdc8269 -> :sswitch_52c - 0x1c98d2a2 -> :sswitch_520 - 0x1d26afe1 -> :sswitch_517 - 0x1dc31e09 -> :sswitch_50b - 0x1dce4e53 -> :sswitch_4ff - 0x1fa78f83 -> :sswitch_4f3 - 0x206b4f9a -> :sswitch_4e7 - 0x20f0f2d2 -> :sswitch_4db - 0x21e07af7 -> :sswitch_4cf - 0x22e0b117 -> :sswitch_4c3 - 0x23e149d2 -> :sswitch_4b7 - 0x255cf0a4 -> :sswitch_4ab - 0x264fdb61 -> :sswitch_49f - 0x268102ba -> :sswitch_493 - 0x27c27982 -> :sswitch_487 - 0x294451ff -> :sswitch_47b - 0x2998f23a -> :sswitch_46f - 0x29fcb069 -> :sswitch_463 - 0x2a7bdccb -> :sswitch_457 - 0x2b45262e -> :sswitch_44b - 0x2c7f409f -> :sswitch_43f - 0x2f1d48f8 -> :sswitch_433 - 0x2fff07b6 -> :sswitch_427 - 0x3068c37f -> :sswitch_41b - 0x307f0c2a -> :sswitch_40f - 0x30f5c833 -> :sswitch_403 - 0x3157654e -> :sswitch_3f7 - 0x317dac8e -> :sswitch_3eb - 0x31c9069a -> :sswitch_3df - 0x31cd0317 -> :sswitch_3d6 - 0x340a387b -> :sswitch_3ca - 0x340b3b80 -> :sswitch_3c1 - 0x34a1113a -> :sswitch_3b5 - 0x3614d945 -> :sswitch_3a9 - 0x3746262b -> :sswitch_39d - 0x3781fd5a -> :sswitch_391 - 0x37ba2393 -> :sswitch_385 - 0x37f13ec0 -> :sswitch_379 - 0x3851a28e -> :sswitch_36d - 0x3958b459 -> :sswitch_361 - 0x3b02790e -> :sswitch_355 - 0x3cf1f24d -> :sswitch_349 - 0x419b53cb -> :sswitch_340 - 0x41bf0f9d -> :sswitch_334 - 0x41d8fb66 -> :sswitch_328 - 0x42bf1dda -> :sswitch_31c - 0x4340426c -> :sswitch_310 - 0x43e2954a -> :sswitch_304 - 0x4435da19 -> :sswitch_2f8 - 0x44c6cd9b -> :sswitch_2ec - 0x456fd6c5 -> :sswitch_2e0 - 0x4785240d -> :sswitch_2d4 - 0x478d8757 -> :sswitch_2c8 - 0x48aa013a -> :sswitch_2bc - 0x4a437870 -> :sswitch_2b0 - 0x4a718302 -> :sswitch_2a4 - 0x4b329b9f -> :sswitch_298 - 0x4b53687b -> :sswitch_28c - 0x4c1d1eac -> :sswitch_280 - 0x4de98cd3 -> :sswitch_274 - 0x4e062bf4 -> :sswitch_268 - 0x4e2b0996 -> :sswitch_25c - 0x4f2fbb6d -> :sswitch_253 - 0x4fbe49e6 -> :sswitch_247 - 0x5035dc38 -> :sswitch_23b - 0x50baaeaf -> :sswitch_22f - 0x50c33b74 -> :sswitch_223 - 0x51e01d5a -> :sswitch_217 - 0x53571c73 -> :sswitch_20b - 0x5375779b -> :sswitch_1ff - 0x563e8572 -> :sswitch_1f3 - 0x5741b64a -> :sswitch_1e7 - 0x5982ef72 -> :sswitch_1db - 0x5983052a -> :sswitch_1cf - 0x59d8095e -> :sswitch_1c3 - 0x5a510cd7 -> :sswitch_1b7 - 0x5b6fb1ce -> :sswitch_1ab - 0x5bbea4e8 -> :sswitch_19f - 0x5d0fc041 -> :sswitch_193 - 0x5d2e5d62 -> :sswitch_187 - 0x5e1b8246 -> :sswitch_17b - 0x5f022840 -> :sswitch_16f - 0x62f04df1 -> :sswitch_163 - 0x63632339 -> :sswitch_157 - 0x636426c6 -> :sswitch_14b - 0x65ba7c9f -> :sswitch_13f - 0x65e59901 -> :sswitch_133 - 0x66e405f0 -> :sswitch_127 - 0x68fafae7 -> :sswitch_11b - 0x6922d7ce -> :sswitch_10f - 0x6a47f10c -> :sswitch_103 - 0x6a49283e -> :sswitch_fa - 0x6c302670 -> :sswitch_ee - 0x6eeaf7af -> :sswitch_e2 - 0x70a4c9d9 -> :sswitch_d6 - 0x71503e9b -> :sswitch_ca - 0x71fd7398 -> :sswitch_be - 0x751e9427 -> :sswitch_b2 - 0x751fff38 -> :sswitch_a6 - 0x76acc111 -> :sswitch_9a - 0x78b8a475 -> :sswitch_8e - 0x79e74a9f -> :sswitch_82 - 0x79f5ac85 -> :sswitch_76 - 0x7a119c4b -> :sswitch_6a - 0x7af58937 -> :sswitch_5e - 0x7b2fc0f6 -> :sswitch_52 - 0x7bb64959 -> :sswitch_46 - 0x7d9266b8 -> :sswitch_3a - 0x7f3d788c -> :sswitch_2e - .end sparse-switch -.end method
diff --git a/src/test/smali/self-is-catch-block/SelfIsCatchBlock.smali b/src/test/smali/self-is-catch-block/SelfIsCatchBlock.smali deleted file mode 100644 index 04f0cf1..0000000 --- a/src/test/smali/self-is-catch-block/SelfIsCatchBlock.smali +++ /dev/null
@@ -1,43 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method private static throwOnPositive(I)V - .registers 2 - if-lez v1, :cond_nothrow - new-instance v0, Ljava/lang/RuntimeException; - invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V - throw v0 - :cond_nothrow - return-void -.end method - -# Tests the flow of values in the pathological case that the block is its own catch handler. -# This tests that the register allocator does not insert moves at the end of the throwing -# block since in the case of a throw the block does not actually complete. -.method static loopWhileThrow(I)I - .registers 4 - :catchall_0 - move v0, p0 - add-int/lit8 p0, p0, -0x1 - :try_start_6 - invoke-static {v0}, LTest;->throwOnPositive(I)V - :try_end_9 - .catchall {:try_start_6 .. :try_end_9} :catchall_0 - return p0 -.end method - -.method public static main([Ljava/lang/String;)V - .registers 2 - const v0, 0x64 - sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream; - invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V - invoke-static {v0}, LTest;->loopWhileThrow(I)I - move-result v0 - invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V - return-void -.end method
diff --git a/src/test/smali/sparse-switch/SparseSwitch.smali b/src/test/smali/sparse-switch/SparseSwitch.smali deleted file mode 100644 index 908220e..0000000 --- a/src/test/smali/sparse-switch/SparseSwitch.smali +++ /dev/null
@@ -1,106 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -# Empty sparse switch -.method public static test1(I)I - .registers 1 - sparse-switch v0, :sparse_switch_data - const/4 v0, 0x1 - return v0 - - :sparse_switch_data - .sparse-switch - .end sparse-switch -.end method - -# Empty sparse switch after data -.method public static test2(I)I - .registers 1 - - goto :sparse_switch - - :sparse_switch_data - .sparse-switch - .end sparse-switch - - :sparse_switch - sparse-switch v0, :sparse_switch_data - const/4 v0, 0x2 - return v0 -.end method - -# Sparse switch after data -.method public static test3(I)I - .registers 1 - - goto :sparse_switch - - :case_2 - const/4 v0, 0x3 - goto :return - - :sparse_switch_data - .sparse-switch - 0x2 -> :case_2 - 0x4 -> :case_4 - .end sparse-switch - - :sparse_switch - sparse-switch v0, :sparse_switch_data - const/4 v0, 0x5 - goto :return - - :case_4 - const/4 v0, 0x4 - - :return - return v0 -.end method - -.method public static main([Ljava/lang/String;)V - .locals 2 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test1(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x0 - invoke-static {v1}, LTest;->test2(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x2 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x4 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - const/4 v1, 0x6 - invoke-static {v1}, LTest;->test3(I)I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - return-void -.end method
diff --git a/src/test/smali/try-catch/TryCatch.smali b/src/test/smali/try-catch/TryCatch.smali deleted file mode 100644 index 8e06c5a..0000000 --- a/src/test/smali/try-catch/TryCatch.smali +++ /dev/null
@@ -1,90 +0,0 @@ -# Copyright (c) 2017, 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. - -.class LTest; -.super Ljava/lang/Object; - -# Fall through to catch block. -.method public test1()V - .registers 1 - :try_start - monitor-enter p0 - monitor-exit p0 - :try_end - return-void - .catchall {:try_start .. :try_end} :try_end -.end method - -.method public static test2()I - .locals 1 - const v0, 0 - :try_start - const v0, 1 - goto :return - :try_end - .catch Ljava/lang/Exception; {:try_start .. :try_end} :return - .catch Ljava/lang/Throwable; {:try_start .. :try_end} :error - :error - move-exception v0 - const v0, 2 - :return - return v0 -.end method - -.method public static test2_throw()I - .locals 1 - const v0, 1 - :try_start - invoke-static {}, Ltest/X;->f()V - const v0, 0 - goto :return - :try_end - .catch Ljava/lang/Exception; {:try_start .. :try_end} :return - .catch Ljava/lang/Throwable; {:try_start .. :try_end} :error - :error - move-exception v0 - throw v0 - :return - return v0 -.end method - -# Dead catch block. -.method public test3()I - .locals 1 - const v0, 0 - return v0 - :start - nop - :end - .catchall {:start .. :end} :catch - nop - :catch - nop -.end method - -.method public static main([Ljava/lang/String;)V - .locals 0 - return-void -.end method - -.method public test4(I)V - .locals 1 - const/4 v0, 0 - if-nez p0, :not_zero - const/4 v0, 1 - goto :try_end - :not_zero - const/4 v0, 2 - :try_start - invoke-static {}, Ltest/X;->f()V - const/4 v0, 3 - :try_end - return-void - .catchall {:try_start .. :try_end} :try_end -.end method - -.method public f()V - .locals 0 - return-void -.end method
diff --git a/src/test/smali/type-confusion-regression/Test.java b/src/test/smali/type-confusion-regression/Test.java deleted file mode 100644 index ef41f6b..0000000 --- a/src/test/smali/type-confusion-regression/Test.java +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright (c) 2016, 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. - -import java.util.ArrayList; -import java.util.List; - -public class Test extends Throwable { - public long[] al = { 1, 2, 3 }; - public int[] ai = null; - public boolean b = false; - public List a = new ArrayList(); - public long l = 1 << 53; - public int i = 32; - public double d = 0.123; - public Test h = null; - - public Test(int i) { - throw new RuntimeException("Test(i)"); - } - - public Test(int i, int j) { - throw new RuntimeException("Test.<init>(II)"); - } - - public Test(String s) { - throw new RuntimeException("Test.<init>(Ljava/lang/String;)"); - } - - public Test() { - throw new RuntimeException("Test.<init>()"); - } - - public static int a(Test t) { - throw new RuntimeException("Test.a(Test)"); - } - - public Test e() { - throw new RuntimeException("Test.e()"); - } - - public static void main(String[] args) { - try { - TestObject.a(new Test(), new Test(), new Test(), new Test()); - } catch (RuntimeException e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/type-confusion-regression/TestObject.java b/src/test/smali/type-confusion-regression/TestObject.java deleted file mode 100644 index ee66c35..0000000 --- a/src/test/smali/type-confusion-regression/TestObject.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public static void a(Test a, Test b, Test c, Test d) { - } -}
diff --git a/src/test/smali/type-confusion-regression/TestObject.smali b/src/test/smali/type-confusion-regression/TestObject.smali deleted file mode 100644 index 832cab9..0000000 --- a/src/test/smali/type-confusion-regression/TestObject.smali +++ /dev/null
@@ -1,385 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.method public static a(LTest;LTest;LTest;LTest;)V - .registers 40 - .prologue - invoke-virtual/range {p2 .. p2}, LTest;->e()LTest; - move-result-object v2 - iget-wide v0, v2, LTest;->l:J - move-wide/from16 v22, v0 - invoke-virtual/range {p2 .. p2}, LTest;->e()LTest; - move-result-object v2 - iget-wide v2, v2, LTest;->l:J - const-wide/16 v4, 0x3e8 - mul-long/2addr v2, v4 - const-wide/16 v4, 0x3e8 - mul-long/2addr v2, v4 - div-long v2, v2, v22 - move-object/from16 v0, p0 - iput-wide v2, v0, LTest;->l:J - invoke-virtual/range {p1 .. p1}, LTest;->e()LTest; - move-result-object v2 - iget-wide v4, v2, LTest;->d:D - double-to-int v3, v4 - move-object/from16 v0, p0 - iput v3, v0, LTest;->i:I - iget-wide v4, v2, LTest;->d:D - double-to-int v3, v4 - move-object/from16 v0, p0 - iput v3, v0, LTest;->i:I - iget-object v2, v2, LTest;->h:LTest; - invoke-static {v2}, LTest;->a(LTest;)I - move-result v2 - move-object/from16 v0, p0 - iput v2, v0, LTest;->i:I - const/4 v3, 0x0 - invoke-virtual/range {p3 .. p3}, LTest;->e()LTest; - move-result-object v2 - if-eqz v2, :cond_59 - invoke-virtual/range {p3 .. p3}, LTest;->e()LTest; - move-result-object v2 - iget-object v2, v2, LTest;->a:Ljava/util/List; - invoke-interface {v2}, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v4 - :cond_47 - invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z - move-result v2 - if-eqz v2, :cond_59 - invoke-interface {v4}, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v2 - check-cast v2, LTest; - iget v2, v2, LTest;->i:I - if-eqz v2, :cond_47 - const/4 v2, 0x1 - move v3, v2 - :cond_59 - move-object/from16 v0, p0 - iput-boolean v3, v0, LTest;->b:Z - invoke-virtual/range {p3 .. p3}, LTest;->e()LTest; - move-result-object v2 - iget-object v0, v2, LTest;->a:Ljava/util/List; - move-object/from16 v17, v0 - const/4 v2, 0x0 - invoke-interface/range {v17 .. v17}, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v5 - move v4, v2 - :goto_6b - invoke-interface {v5}, Ljava/util/Iterator;->hasNext()Z - move-result v2 - if-eqz v2, :cond_8c - invoke-interface {v5}, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v2 - check-cast v2, LTest; - iget-wide v6, v2, LTest;->l:J - const-wide/16 v8, 0x0 - cmp-long v2, v6, v8 - if-gez v2, :cond_87 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_87 - int-to-long v8, v4 - add-long/2addr v6, v8 - long-to-int v2, v6 - move v4, v2 - goto :goto_6b - :cond_8c - if-gtz v4, :cond_96 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_96 - invoke-virtual/range {p3 .. p3}, LTest;->e()LTest; - move-result-object v5 - const/4 v2, 0x0 - if-eqz v5, :cond_260 - iget-object v2, v5, LTest;->al:[J - if-eqz v2, :cond_a4 - array-length v5, v2 - if-nez v5, :cond_ac - :cond_a4 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_ac - array-length v5, v2 - add-int/lit8 v5, v5, -0x1 - aget-wide v6, v2, v5 - int-to-long v8, v4 - cmp-long v5, v6, v8 - if-lez v5, :cond_be - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_be - move-object v5, v2 - :goto_bf - const/4 v2, 0x0 - const/4 v6, 0x0 - invoke-virtual/range {p3 .. p3}, LTest;->e()LTest; - move-result-object v7 - if-eqz v7, :cond_f2 - iget-object v7, v7, LTest;->a:Ljava/util/List; - invoke-interface {v7}, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v8 - move v6, v2 - :goto_ce - invoke-interface {v8}, Ljava/util/Iterator;->hasNext()Z - move-result v2 - if-eqz v2, :cond_f0 - invoke-interface {v8}, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v2 - check-cast v2, LTest; - iget v2, v2, LTest;->i:I - int-to-long v10, v2 - const-wide/16 v12, 0x0 - cmp-long v2, v10, v12 - if-gez v2, :cond_eb - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_eb - int-to-long v12, v6 - add-long/2addr v10, v12 - long-to-int v2, v10 - move v6, v2 - goto :goto_ce - :cond_f0 - move v2, v6 - move-object v6, v7 - :cond_f2 - if-eqz v2, :cond_fe - if-eq v2, v4, :cond_fe - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_fe - if-eqz v5, :cond_149 - new-instance v2, LTest; - array-length v7, v5 - invoke-direct {v2, v4, v7}, LTest;-><init>(II)V - move-object v4, v2 - :goto_107 - iget-object v0, v4, LTest;->al:[J - move-object/from16 v24, v0 - iget-object v0, v4, LTest;->ai:[I - move-object/from16 v25, v0 - const/16 v16, 0x0 - const/4 v7, -0x1 - const-wide/16 v14, 0x0 - if-eqz v6, :cond_150 - invoke-interface {v6}, Ljava/util/List;->size()I - move-result v2 - if-lez v2, :cond_150 - invoke-interface {v6}, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v2 - move-object v6, v2 - :goto_121 - const-wide/16 v12, 0x0 - const-wide/16 v10, 0x0 - const-wide/16 v8, 0x0 - invoke-interface/range {v17 .. v17}, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v26 - :cond_12b - invoke-interface/range {v26 .. v26}, Ljava/util/Iterator;->hasNext()Z - move-result v2 - if-eqz v2, :cond_22d - invoke-interface/range {v26 .. v26}, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v2 - check-cast v2, LTest; - iget-wide v0, v2, LTest;->l:J - move-wide/from16 v28, v0 - const-wide/16 v18, 0x0 - cmp-long v17, v28, v18 - if-gez v17, :cond_153 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_149 - new-instance v2, LTest; - invoke-direct {v2, v4}, LTest;-><init>(I)V - move-object v4, v2 - goto :goto_107 - :cond_150 - const/4 v2, 0x0 - move-object v6, v2 - goto :goto_121 - :cond_153 - iget-wide v0, v2, LTest;->l:J - move-wide/from16 v18, v0 - move-wide/from16 v20, v18 - :goto_159 - const-wide/16 v18, 0x0 - cmp-long v2, v20, v18 - if-lez v2, :cond_12b - if-eqz v6, :cond_192 - move-wide/from16 v18, v12 - :goto_163 - const-wide/16 v12, 0x0 - cmp-long v2, v18, v12 - if-gtz v2, :cond_178 - invoke-interface {v6}, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v2 - check-cast v2, LTest; - iget v10, v2, LTest;->i:I - int-to-long v0, v10 - move-wide/from16 v18, v0 - iget v2, v2, LTest;->i:I - int-to-long v10, v2 - goto :goto_163 - :cond_178 - if-nez v16, :cond_17b - move-wide v8, v10 - :cond_17b - add-long v12, v14, v10 - sub-long/2addr v12, v8 - move-wide/from16 v34, v12 - move-wide v12, v10 - move-wide v10, v8 - move-wide/from16 v8, v34 - :goto_184 - const-wide/16 v30, 0x0 - cmp-long v2, v8, v30 - if-gez v2, :cond_198 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_192 - move-wide/from16 v18, v12 - move-wide v12, v10 - move-wide v10, v8 - move-wide v8, v14 - goto :goto_184 - :cond_198 - const-wide/16 v30, 0x3e8 - mul-long v8, v8, v30 - const-wide/16 v30, 0x3e8 - mul-long v8, v8, v30 - div-long v8, v8, v22 - move/from16 v2, v16 - :goto_1a4 - if-lez v2, :cond_1cb - add-int/lit8 v17, v2, -0x1 - aget-wide v30, v24, v17 - cmp-long v17, v30, v8 - if-lez v17, :cond_1cb - add-int/lit8 v17, v2, -0x1 - aget-wide v30, v24, v17 - aput-wide v30, v24, v2 - if-eqz v25, :cond_1c8 - if-ltz v7, :cond_1c8 - add-int/lit8 v17, v2, -0x1 - aget v27, v25, v7 - move/from16 v0, v17 - move/from16 v1, v27 - if-ne v0, v1, :cond_1c8 - aget v17, v25, v7 - add-int/lit8 v17, v17, 0x1 - aput v17, v25, v7 - :cond_1c8 - add-int/lit8 v2, v2, -0x1 - goto :goto_1a4 - :cond_1cb - aput-wide v8, v24, v2 - if-lez v2, :cond_1ea - add-int/lit8 v17, v2, -0x1 - aget-wide v30, v24, v17 - cmp-long v8, v30, v8 - if-nez v8, :cond_1ea - const/4 v3, 0x1 - if-ne v2, v3, :cond_1e2 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_1e2 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_1ea - if-eqz v5, :cond_216 - add-int/lit8 v8, v7, 0x1 - array-length v9, v5 - if-ge v8, v9, :cond_216 - move/from16 v0, v16 - int-to-long v8, v0 - add-int/lit8 v17, v7, 0x1 - aget-wide v30, v5, v17 - const-wide/16 v32, 0x1 - sub-long v30, v30, v32 - cmp-long v8, v8, v30 - if-nez v8, :cond_216 - add-int/lit8 v7, v7, 0x1 - aput v2, v25, v7 - if-lez v7, :cond_216 - add-int/lit8 v2, v7, -0x1 - aget v2, v25, v2 - aget v8, v25, v7 - if-lt v2, v8, :cond_216 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_216 - add-int/lit8 v2, v16, 0x1 - add-long v16, v14, v28 - const-wide/16 v8, 0x1 - sub-long v14, v18, v8 - const-wide/16 v8, 0x1 - sub-long v8, v20, v8 - move-wide/from16 v20, v8 - move-wide v8, v10 - move-wide v10, v12 - move-wide v12, v14 - move-wide/from16 v14, v16 - move/from16 v16, v2 - goto/16 :goto_159 - :cond_22d - iget-object v2, v4, LTest;->al:[J - move-object/from16 v0, p0 - iput-object v2, v0, LTest;->al:[J - iget-object v2, v4, LTest;->ai:[I - if-eqz v3, :cond_241 - if-nez v2, :cond_241 - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_241 - if-eqz v2, :cond_25b - array-length v3, v2 - if-gtz v3, :cond_24e - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_24e - const/4 v3, 0x0 - aget v3, v2, v3 - if-eqz v3, :cond_25b - new-instance v2, LTest; - const-string v3, "string" - invoke-direct {v2, v3}, LTest;-><init>(Ljava/lang/String;)V - throw v2 - :cond_25b - move-object/from16 v0, p0 - iput-object v2, v0, LTest;->ai:[I - return-void - :cond_260 - move-object v5, v2 - goto/16 :goto_bf -.end method \ No newline at end of file
diff --git a/src/test/smali/type-confusion-regression2/Test.java b/src/test/smali/type-confusion-regression2/Test.java deleted file mode 100644 index 4caa81b..0000000 --- a/src/test/smali/type-confusion-regression2/Test.java +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - public static void main(String[] args) { - try { - new TestObject().b(); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/type-confusion-regression2/TestObject.java b/src/test/smali/type-confusion-regression2/TestObject.java deleted file mode 100644 index 677b429..0000000 --- a/src/test/smali/type-confusion-regression2/TestObject.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public void b() { - } -}
diff --git a/src/test/smali/type-confusion-regression2/TestObject.smali b/src/test/smali/type-confusion-regression2/TestObject.smali deleted file mode 100644 index a12bd4f..0000000 --- a/src/test/smali/type-confusion-regression2/TestObject.smali +++ /dev/null
@@ -1,193 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field private static final l:[I - -.field public a:I -.field public b:I -.field public c:[I -.field public d:[D -.field public e:I -.field public f:I -.field public g:[D -.field public h:[D -.field public i:[D -.field public j:I -.field private k:[D - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final b()V - .registers 29 - move-object/from16 v0, p0 - iget v2, v0, LTestObject;->a:I - const/4 v3, 0x1 - if-ne v2, v3, :cond_8 - :cond_7 - return-void - :cond_8 - move-object/from16 v0, p0 - iget v2, v0, LTestObject;->a:I - mul-int/lit8 v12, v2, 0x2 - const/4 v5, 0x0 - move-object/from16 v0, p0 - iget v2, v0, LTestObject;->a:I - const/4 v3, 0x0 - const/4 v4, 0x0 - :goto_15 - add-int/lit8 v6, v4, 0x1 - const/4 v4, 0x4 - if-gt v6, v4, :cond_55 - sget-object v4, LTestObject;->l:[I - add-int/lit8 v5, v6, -0x1 - aget v4, v4, v5 - move v5, v4 - move v4, v3 - :goto_22 - div-int v3, v2, v5 - mul-int v7, v5, v3 - sub-int v7, v2, v7 - if-nez v7, :cond_f9 - add-int/lit8 v2, v4, 0x1 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->g:[D - add-int/lit8 v7, v2, 0x1 - add-int/2addr v7, v12 - int-to-double v8, v5 - aput-wide v8, v4, v7 - const/4 v4, 0x2 - if-ne v5, v4, :cond_64 - const/4 v4, 0x1 - if-eq v2, v4, :cond_64 - const/4 v4, 0x2 - :goto_3d - if-gt v4, v2, :cond_5a - sub-int v7, v2, v4 - add-int/lit8 v7, v7, 0x2 - add-int/2addr v7, v12 - move-object/from16 v0, p0 - iget-object v8, v0, LTestObject;->g:[D - add-int/lit8 v9, v7, 0x1 - move-object/from16 v0, p0 - iget-object v10, v0, LTestObject;->g:[D - aget-wide v10, v10, v7 - aput-wide v10, v8, v9 - add-int/lit8 v4, v4, 0x1 - goto :goto_3d - :cond_55 - add-int/lit8 v4, v5, 0x2 - move v5, v4 - move v4, v3 - goto :goto_22 - :cond_5a - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->g:[D - add-int/lit8 v7, v12, 0x2 - const-wide/high16 v8, 0x4000000000000000L - aput-wide v8, v4, v7 - :cond_64 - const/4 v4, 0x1 - if-ne v3, v4, :cond_f5 - move-object/from16 v0, p0 - iget-object v3, v0, LTestObject;->g:[D - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->a:I - int-to-double v4, v4 - aput-wide v4, v3, v12 - move-object/from16 v0, p0 - iget-object v3, v0, LTestObject;->g:[D - add-int/lit8 v4, v12, 0x1 - int-to-double v6, v2 - aput-wide v6, v3, v4 - const-wide v4, 0x401921fb54442d18L - move-object/from16 v0, p0 - iget v3, v0, LTestObject;->a:I - int-to-double v6, v3 - div-double v14, v4, v6 - const/4 v6, 0x0 - add-int/lit8 v13, v2, -0x1 - const/4 v2, 0x1 - if-eqz v13, :cond_7 - const/4 v3, 0x1 - move v9, v2 - move v11, v3 - :goto_90 - if-gt v11, v13, :cond_7 - move-object/from16 v0, p0 - iget-object v2, v0, LTestObject;->g:[D - add-int/lit8 v3, v11, 0x1 - add-int/2addr v3, v12 - aget-wide v2, v2, v3 - double-to-int v3, v2 - const/4 v2, 0x0 - mul-int v10, v9, v3 - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->a:I - div-int v16, v4, v10 - add-int/lit8 v17, v3, -0x1 - const/4 v3, 0x1 - move v8, v3 - :goto_a9 - move/from16 v0, v17 - if-gt v8, v0, :cond_f0 - add-int v7, v2, v9 - int-to-double v2, v7 - mul-double v18, v2, v14 - const-wide/16 v4, 0x0 - const/4 v2, 0x3 - move v3, v6 - :goto_b6 - move/from16 v0, v16 - if-gt v2, v0, :cond_e9 - add-int/lit8 v3, v3, 0x2 - const-wide/high16 v20, 0x3ff0000000000000L - add-double v4, v4, v20 - mul-double v20, v4, v18 - move-object/from16 v0, p0 - iget v0, v0, LTestObject;->a:I - move/from16 v22, v0 - add-int v22, v22, v3 - move-object/from16 v0, p0 - iget-object v0, v0, LTestObject;->g:[D - move-object/from16 v23, v0 - add-int/lit8 v24, v22, -0x2 - invoke-static/range {v20 .. v21}, Ljava/lang/Math;->cos(D)D - move-result-wide v26 - aput-wide v26, v23, v24 - move-object/from16 v0, p0 - iget-object v0, v0, LTestObject;->g:[D - move-object/from16 v23, v0 - add-int/lit8 v22, v22, -0x1 - invoke-static/range {v20 .. v21}, Ljava/lang/Math;->sin(D)D - move-result-wide v20 - aput-wide v20, v23, v22 - add-int/lit8 v2, v2, 0x2 - goto :goto_b6 - :cond_e9 - add-int v6, v6, v16 - add-int/lit8 v2, v8, 0x1 - move v8, v2 - move v2, v7 - goto :goto_a9 - :cond_f0 - add-int/lit8 v2, v11, 0x1 - move v9, v10 - move v11, v2 - goto :goto_90 - :cond_f5 - move v4, v2 - move v2, v3 - goto/16 :goto_22 - :cond_f9 - move v3, v4 - move v4, v6 - goto/16 :goto_15 -.end method \ No newline at end of file
diff --git a/src/test/smali/type-confusion-regression3/Test.java b/src/test/smali/type-confusion-regression3/Test.java deleted file mode 100644 index 0f1f0f2..0000000 --- a/src/test/smali/type-confusion-regression3/Test.java +++ /dev/null
@@ -1,74 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test extends Throwable { - public byte[] a; - - public Test(String s) { - throw new RuntimeException("Test(Ljava/lang/String;"); - } - - public Test(int a, Test b) { - throw new RuntimeException("Test(ILTest;)"); - } - - public Test() { - } - - public long c() { - throw new RuntimeException("Test.c()"); - } - - public Object valueAt(int i) { - throw new RuntimeException("Test.valueAt(I)"); - } - - public void b(int i) { - throw new RuntimeException("Test.b(I)"); - } - - public void b(byte[] a, int b, int c) { - throw new RuntimeException("Test.b([BII)"); - } - - public void a() { - throw new RuntimeException("Test.a()"); - } - - public void a(Test a) { - throw new RuntimeException("Test.a(LTest;)"); - } - - public void a(Test a, int i) { - throw new RuntimeException("Test.a(LTest;I)"); - } - - public boolean a(byte[] a, int b, int c, boolean d) { - throw new RuntimeException("Test.a"); - } - - public void a(long a, int b, int c, int d, byte[] e) { - throw new RuntimeException("Test.a(JIII[B)"); - } - - public void c(int i) { - throw new RuntimeException("Test.c(I)"); - } - - public int n() { - throw new RuntimeException("Test.n()"); - } - - public int size() { - throw new RuntimeException("Test.size"); - } - - public static void main(String[] args) { - try { - new TestObject().a(new Test(), new Test()); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/type-confusion-regression3/TestObject.java b/src/test/smali/type-confusion-regression3/TestObject.java deleted file mode 100644 index f20168c..0000000 --- a/src/test/smali/type-confusion-regression3/TestObject.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public int a(Test a, Test b) { - return 0; - } -}
diff --git a/src/test/smali/type-confusion-regression3/TestObject.smali b/src/test/smali/type-confusion-regression3/TestObject.smali deleted file mode 100644 index 5b87a27..0000000 --- a/src/test/smali/type-confusion-regression3/TestObject.smali +++ /dev/null
@@ -1,924 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field private i:I -.field private o:LTest; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final a(LTest;LTest;)I - .registers 28 - .prologue - :cond_0 - :goto_0 - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - packed-switch v4, :pswitch_data_60a - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - const/4 v5, 0x3 - if-ne v4, v5, :cond_4ac - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - if-nez v4, :cond_431 - move-object/from16 v0, p0 - iget-object v11, v0, LTestObject;->o:LTest; - const/4 v5, 0x0 - const-wide v8, 0x7fffffffffffffffL - invoke-virtual {v11}, LTest;->size()I - move-result v12 - const/4 v4, 0x0 - move v10, v4 - :goto_24 - if-ge v10, v12, :cond_3e8 - invoke-virtual {v11, v10}, LTest;->valueAt(I)Ljava/lang/Object; - move-result-object v4 - check-cast v4, LTest; - iget v6, v4, LTest;->e:I - iget-object v7, v4, LTest;->a:LTest; - iget v7, v7, LTest;->d:I - if-eq v6, v7, :cond_5fe - iget-object v6, v4, LTest;->a:LTest; - iget-wide v6, v6, LTest;->b:J - cmp-long v13, v6, v8 - if-gez v13, :cond_5fe - move-wide/from16 v23, v6 - move-object v6, v4 - move-wide/from16 v4, v23 - :goto_41 - add-int/lit8 v7, v10, 0x1 - move v10, v7 - move-wide v8, v4 - move-object v5, v6 - goto :goto_24 - :pswitch_47 - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - if-nez v4, :cond_8a - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:[B - const/4 v5, 0x0 - const/16 v6, 0x8 - const/4 v7, 0x1 - move-object/from16 v0, p1 - invoke-virtual {v0, v4, v5, v6, v7}, LTest;->a([BIIZ)Z - move-result v4 - if-nez v4, :cond_64 - const/4 v4, 0x0 - :goto_60 - if-nez v4, :cond_0 - const/4 v4, -0x1 - :goto_63 - return v4 - :cond_64 - const/16 v4, 0x8 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - const/4 v5, 0x0 - invoke-virtual {v4, v5}, LTest;->c(I)V - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4}, LTest;->h()J - move-result-wide v4 - move-object/from16 v0, p0 - iput-wide v4, v0, LTestObject;->n:J - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4}, LTest;->j()I - move-result v4 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - :cond_8a - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->n:J - const-wide/16 v6, 0x1 - cmp-long v4, v4, v6 - if-nez v4, :cond_b9 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:[B - const/16 v5, 0x8 - const/16 v6, 0x8 - move-object/from16 v0, p1 - invoke-virtual {v0, v4, v5, v6}, LTest;->b([BII)V - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - add-int/lit8 v4, v4, 0x8 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4}, LTest;->p()J - move-result-wide v4 - move-object/from16 v0, p0 - iput-wide v4, v0, LTestObject;->n:J - :cond_b9 - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v4 - move-object/from16 v0, p0 - iget v6, v0, LTestObject;->i:I - int-to-long v6, v6 - sub-long v6, v4, v6 - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - sget v5, LTest;->J:I - if-ne v4, v5, :cond_ec - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4}, LTest;->size()I - move-result v8 - const/4 v4, 0x0 - move v5, v4 - :goto_d6 - if-ge v5, v8, :cond_ec - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4, v5}, LTest;->valueAt(I)Ljava/lang/Object; - move-result-object v4 - check-cast v4, LTest; - iget-object v4, v4, LTest;->a:LTest; - iput-wide v6, v4, LTest;->c:J - iput-wide v6, v4, LTest;->b:J - add-int/lit8 v4, v5, 0x1 - move v5, v4 - goto :goto_d6 - :cond_ec - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - sget v5, LTest;->h:I - if-ne v4, v5, :cond_11e - const/4 v4, 0x0 - move-object/from16 v0, p0 - iput-object v4, v0, LTestObject;->o:LTest; - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->n:J - add-long/2addr v4, v6 - move-object/from16 v0, p0 - iput-wide v4, v0, LTestObject;->q:J - move-object/from16 v0, p0 - iget-boolean v4, v0, LTestObject;->w:Z - if-nez v4, :cond_116 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - sget-object v5, LTest;->f:LTest; - invoke-virtual {v4, v5}, LTest;->a(LTest;)V - const/4 v4, 0x1 - move-object/from16 v0, p0 - iput-boolean v4, v0, LTestObject;->w:Z - :cond_116 - const/4 v4, 0x2 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - :goto_11b - const/4 v4, 0x1 - goto/16 :goto_60 - :cond_11e - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - sget v5, LTest;->A:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->C:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->D:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->E:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->F:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->J:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->K:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->L:I - if-eq v4, v5, :cond_146 - sget v5, LTest;->O:I - if-ne v4, v5, :cond_178 - :cond_146 - const/4 v4, 0x1 - :goto_147 - if-eqz v4, :cond_17e - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v4 - move-object/from16 v0, p0 - iget-wide v6, v0, LTestObject;->n:J - add-long/2addr v4, v6 - const-wide/16 v6, 0x8 - sub-long/2addr v4, v6 - move-object/from16 v0, p0 - iget-object v6, v0, LTestObject;->k:Ljava/util/Stack; - new-instance v7, LTest; - move-object/from16 v0, p0 - iget v8, v0, LTestObject;->i:I - invoke-direct {v7, v8, v4, v5}, LTest;-><init>(IJ)V - invoke-virtual {v6, v7}, Ljava/util/Stack;->add(Ljava/lang/Object;)Z - move-object/from16 v0, p0 - iget-wide v6, v0, LTestObject;->n:J - move-object/from16 v0, p0 - iget v8, v0, LTestObject;->i:I - int-to-long v8, v8 - cmp-long v6, v6, v8 - if-nez v6, :cond_17a - move-object/from16 v0, p0 - invoke-direct {v0, v4, v5}, LTestObject;->a(J)V - goto :goto_11b - :cond_178 - const/4 v4, 0x0 - goto :goto_147 - :cond_17a - invoke-direct/range {p0 .. p0}, LTestObject;->a()V - goto :goto_11b - :cond_17e - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - sget v5, LTest;->R:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->Q:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->B:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->z:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->S:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->v:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->w:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->N:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->x:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->y:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->T:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->ab:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->ac:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->ag:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->ad:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->ae:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->af:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->P:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->M:I - if-eq v4, v5, :cond_1d2 - sget v5, LTest;->aD:I - if-ne v4, v5, :cond_1e5 - :cond_1d2 - const/4 v4, 0x1 - :goto_1d3 - if-eqz v4, :cond_222 - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - const/16 v5, 0x8 - if-eq v4, v5, :cond_1e7 - new-instance v4, LTest; - const-string v5, "a" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_1e5 - const/4 v4, 0x0 - goto :goto_1d3 - :cond_1e7 - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->n:J - const-wide/32 v6, 0x7fffffff - cmp-long v4, v4, v6 - if-lez v4, :cond_1fa - new-instance v4, LTest; - const-string v5, "a" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_1fa - new-instance v4, LTest; - move-object/from16 v0, p0 - iget-wide v6, v0, LTestObject;->n:J - long-to-int v5, v6 - invoke-direct {v4, v5}, LTest;-><init>(I)V - move-object/from16 v0, p0 - iput-object v4, v0, LTestObject;->o:LTest; - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:[B - const/4 v5, 0x0 - move-object/from16 v0, p0 - iget-object v6, v0, LTestObject;->o:LTest; - iget-object v6, v6, LTest;->a:[B - const/4 v7, 0x0 - const/16 v8, 0x8 - invoke-static {v4, v5, v6, v7, v8}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V - const/4 v4, 0x1 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - goto/16 :goto_11b - :cond_222 - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->n:J - const-wide/32 v6, 0x7fffffff - cmp-long v4, v4, v6 - if-lez v4, :cond_235 - new-instance v4, LTest; - const-string v5, "a" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_235 - const/4 v4, 0x0 - move-object/from16 v0, p0 - iput-object v4, v0, LTestObject;->o:LTest; - const/4 v4, 0x1 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - goto/16 :goto_11b - :pswitch_241 - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->n:J - long-to-int v4, v4 - move-object/from16 v0, p0 - iget v5, v0, LTestObject;->i:I - sub-int/2addr v4, v5 - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - if-eqz v5, :cond_368 - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - iget-object v5, v5, LTest;->a:[B - const/16 v6, 0x8 - move-object/from16 v0, p1 - invoke-virtual {v0, v5, v6, v4}, LTest;->b([BII)V - new-instance v5, LTest; - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget-object v6, v0, LTestObject;->o:LTest; - invoke-direct {v5, v4, v6}, LTest;-><init>(ILTest;)V - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v10 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->k:Ljava/util/Stack; - invoke-virtual {v4}, Ljava/util/Stack;->isEmpty()Z - move-result v4 - if-nez v4, :cond_291 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->k:Ljava/util/Stack; - invoke-virtual {v4}, Ljava/util/Stack;->peek()Ljava/lang/Object; - move-result-object v4 - check-cast v4, LTest; - invoke-virtual {v4, v5}, LTest;->a(LTest;)V - :cond_286 - :goto_286 - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v4 - move-object/from16 v0, p0 - invoke-direct {v0, v4, v5}, LTestObject;->a(J)V - goto/16 :goto_0 - :cond_291 - iget v4, v5, LTest;->aL:I - sget v6, LTest;->z:I - if-ne v4, v6, :cond_359 - iget-object v0, v5, LTest;->aM:LTest; - move-object/from16 v16, v0 - const/16 v4, 0x8 - move-object/from16 v0, v16 - invoke-virtual {v0, v4}, LTest;->c(I)V - invoke-virtual/range {v16 .. v16}, LTest;->j()I - move-result v4 - invoke-static {v4}, LTest;->a(I)I - move-result v4 - const/4 v5, 0x4 - move-object/from16 v0, v16 - invoke-virtual {v0, v5}, LTest;->d(I)V - invoke-virtual/range {v16 .. v16}, LTest;->h()J - move-result-wide v8 - if-nez v4, :cond_304 - invoke-virtual/range {v16 .. v16}, LTest;->h()J - move-result-wide v6 - invoke-virtual/range {v16 .. v16}, LTest;->h()J - move-result-wide v4 - add-long/2addr v4, v10 - move-wide v10, v4 - move-wide v4, v6 - :goto_2c1 - const/4 v6, 0x2 - move-object/from16 v0, v16 - invoke-virtual {v0, v6}, LTest;->d(I)V - invoke-virtual/range {v16 .. v16}, LTest;->e()I - move-result v17 - move/from16 v0, v17 - new-array v0, v0, [I - move-object/from16 v18, v0 - move/from16 v0, v17 - new-array v0, v0, [J - move-object/from16 v19, v0 - move/from16 v0, v17 - new-array v0, v0, [J - move-object/from16 v20, v0 - move/from16 v0, v17 - new-array v0, v0, [J - move-object/from16 v21, v0 - const-wide/32 v6, 0xf4240 - invoke-static/range {v4 .. v9}, LTest;->a(JJJ)J - move-result-wide v12 - const/4 v6, 0x0 - move-wide v14, v10 - move v10, v6 - move-wide v6, v4 - move-wide v4, v12 - :goto_2ef - move/from16 v0, v17 - if-ge v10, v0, :cond_33e - invoke-virtual/range {v16 .. v16}, LTest;->j()I - move-result v11 - const/high16 v12, -0x80000000 - and-int/2addr v12, v11 - if-eqz v12, :cond_310 - new-instance v4, LTest; - const-string v5, "a" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_304 - invoke-virtual/range {v16 .. v16}, LTest;->p()J - move-result-wide v6 - invoke-virtual/range {v16 .. v16}, LTest;->p()J - move-result-wide v4 - add-long/2addr v4, v10 - move-wide v10, v4 - move-wide v4, v6 - goto :goto_2c1 - :cond_310 - invoke-virtual/range {v16 .. v16}, LTest;->h()J - move-result-wide v12 - const v22, 0x7fffffff - and-int v11, v11, v22 - aput v11, v18, v10 - aput-wide v14, v19, v10 - aput-wide v4, v21, v10 - add-long v4, v6, v12 - const-wide/32 v6, 0xf4240 - invoke-static/range {v4 .. v9}, LTest;->a(JJJ)J - move-result-wide v12 - aget-wide v6, v21, v10 - sub-long v6, v12, v6 - aput-wide v6, v20, v10 - const/4 v6, 0x4 - move-object/from16 v0, v16 - invoke-virtual {v0, v6}, LTest;->d(I)V - aget v6, v18, v10 - int-to-long v6, v6 - add-long/2addr v14, v6 - add-int/lit8 v6, v10, 0x1 - move v10, v6 - move-wide v6, v4 - move-wide v4, v12 - goto :goto_2ef - :cond_33e - new-instance v4, LTest; - move-object/from16 v0, v18 - move-object/from16 v1, v19 - move-object/from16 v2, v20 - move-object/from16 v3, v21 - invoke-direct {v4, v0, v1, v2, v3}, LTest;-><init>([I[J[J[J)V - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - invoke-virtual {v5, v4}, LTest;->a(LTest;)V - const/4 v4, 0x1 - move-object/from16 v0, p0 - iput-boolean v4, v0, LTestObject;->w:Z - goto/16 :goto_286 - :cond_359 - iget v4, v5, LTest;->aL:I - sget v6, LTest;->aD:I - if-ne v4, v6, :cond_286 - iget-object v4, v5, LTest;->aM:LTest; - move-object/from16 v0, p0 - invoke-virtual {v0, v4}, LTestObject;->a(LTest;)V - goto/16 :goto_286 - :cond_368 - move-object/from16 v0, p1 - invoke-virtual {v0, v4}, LTest;->b(I)V - goto/16 :goto_286 - :pswitch_36f - const/4 v5, 0x0 - const-wide v6, 0x7fffffffffffffffL - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4}, LTest;->size()I - move-result v9 - const/4 v4, 0x0 - move v8, v4 - :goto_37f - if-ge v8, v9, :cond_3b1 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4, v8}, LTest;->valueAt(I)Ljava/lang/Object; - move-result-object v4 - check-cast v4, LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-boolean v10, v4, LTest;->m:Z - if-eqz v10, :cond_602 - iget-wide v10, v4, LTest;->c:J - cmp-long v10, v10, v6 - if-gez v10, :cond_602 - iget-wide v6, v4, LTest;->c:J - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - invoke-virtual {v4, v8}, LTest;->valueAt(I)Ljava/lang/Object; - move-result-object v4 - check-cast v4, LTest; - move-wide/from16 v23, v6 - move-object v6, v4 - move-wide/from16 v4, v23 - :goto_3a8 - add-int/lit8 v7, v8, 0x1 - move v8, v7 - move-wide/from16 v23, v4 - move-object v5, v6 - move-wide/from16 v6, v23 - goto :goto_37f - :cond_3b1 - if-nez v5, :cond_3ba - const/4 v4, 0x3 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - goto/16 :goto_0 - :cond_3ba - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v8 - sub-long/2addr v6, v8 - long-to-int v4, v6 - if-gez v4, :cond_3ca - new-instance v4, LTest; - const-string v5, "a" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_3ca - move-object/from16 v0, p1 - invoke-virtual {v0, v4}, LTest;->b(I)V - iget-object v4, v5, LTest;->a:LTest; - iget-object v5, v4, LTest;->l:LTest; - iget-object v5, v5, LTest;->a:[B - const/4 v6, 0x0 - iget v7, v4, LTest;->k:I - move-object/from16 v0, p1 - invoke-virtual {v0, v5, v6, v7}, LTest;->b([BII)V - iget-object v5, v4, LTest;->l:LTest; - const/4 v6, 0x0 - invoke-virtual {v5, v6}, LTest;->c(I)V - const/4 v5, 0x0 - iput-boolean v5, v4, LTest;->m:Z - goto/16 :goto_0 - :cond_3e8 - move-object/from16 v0, p0 - iput-object v5, v0, LTestObject;->o:LTest; - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - if-nez v4, :cond_414 - move-object/from16 v0, p0 - iget-wide v4, v0, LTestObject;->q:J - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v6 - sub-long/2addr v4, v6 - long-to-int v4, v4 - if-gez v4, :cond_406 - new-instance v4, LTest; - const-string v5, "" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_406 - move-object/from16 v0, p1 - invoke-virtual {v0, v4}, LTest;->b(I)V - invoke-direct/range {p0 .. p0}, LTestObject;->a()V - const/4 v4, 0x0 - :goto_40f - if-eqz v4, :cond_0 - const/4 v4, 0x0 - goto/16 :goto_63 - :cond_414 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-wide v4, v4, LTest;->b:J - invoke-virtual/range {p1 .. p1}, LTest;->c()J - move-result-wide v6 - sub-long/2addr v4, v6 - long-to-int v4, v4 - if-gez v4, :cond_42c - new-instance v4, LTest; - const-string v5, "" - invoke-direct {v4, v5}, LTest;-><init>(Ljava/lang/String;)V - throw v4 - :cond_42c - move-object/from16 v0, p1 - invoke-virtual {v0, v4}, LTest;->b(I)V - :cond_431 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-object v4, v4, LTest;->e:[I - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - iget v5, v5, LTest;->e:I - aget v4, v4, v5 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:LTest; - iget-boolean v4, v4, LTest;->i:Z - if-eqz v4, :cond_553 - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - iget-object v6, v5, LTest;->a:LTest; - iget-object v7, v6, LTest;->l:LTest; - iget-object v4, v6, LTest;->a:LTest; - iget v4, v4, LTest;->a:I - iget-object v8, v6, LTest;->n:LTest; - if-eqz v8, :cond_534 - iget-object v4, v6, LTest;->n:LTest; - :goto_461 - iget v8, v4, LTest;->a:I - iget-object v4, v6, LTest;->j:[Z - iget v6, v5, LTest;->e:I - aget-boolean v6, v4, v6 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v9, v4, LTest;->a:[B - const/4 v10, 0x0 - if-eqz v6, :cond_53c - const/16 v4, 0x80 - :goto_474 - or-int/2addr v4, v8 - int-to-byte v4, v4 - aput-byte v4, v9, v10 - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - const/4 v9, 0x0 - invoke-virtual {v4, v9}, LTest;->c(I)V - iget-object v4, v5, LTest;->b:LTest; - move-object/from16 v0, p0 - iget-object v5, v0, LTestObject;->o:LTest; - const/4 v9, 0x1 - invoke-virtual {v4, v5, v9}, LTest;->a(LTest;I)V - invoke-virtual {v4, v7, v8}, LTest;->a(LTest;I)V - if-nez v6, :cond_53f - add-int/lit8 v4, v8, 0x1 - :goto_491 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v5, v0, LTestObject;->i:I - add-int/2addr v4, v5 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - :goto_4a2 - const/4 v4, 0x4 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - const/4 v4, 0x0 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - :cond_4ac - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v12, v4, LTest;->a:LTest; - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v9, v4, LTest;->c:LTest; - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v5, v4, LTest;->b:LTest; - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget v8, v4, LTest;->e:I - iget v4, v9, LTest;->n:I - const/4 v6, -0x1 - if-eq v4, v6, :cond_57a - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget-object v4, v4, LTest;->a:[B - const/4 v6, 0x0 - const/4 v7, 0x0 - aput-byte v7, v4, v6 - const/4 v6, 0x1 - const/4 v7, 0x0 - aput-byte v7, v4, v6 - const/4 v6, 0x2 - const/4 v7, 0x0 - aput-byte v7, v4, v6 - iget v4, v9, LTest;->n:I - iget v6, v9, LTest;->n:I - rsub-int/lit8 v6, v6, 0x4 - :goto_4e1 - move-object/from16 v0, p0 - iget v7, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v10, v0, LTestObject;->i:I - if-ge v7, v10, :cond_59e - move-object/from16 v0, p0 - iget v7, v0, LTestObject;->i:I - if-nez v7, :cond_55a - move-object/from16 v0, p0 - iget-object v7, v0, LTestObject;->o:LTest; - iget-object v7, v7, LTest;->a:[B - move-object/from16 v0, p1 - invoke-virtual {v0, v7, v6, v4}, LTest;->b([BII)V - move-object/from16 v0, p0 - iget-object v7, v0, LTestObject;->o:LTest; - const/4 v10, 0x0 - invoke-virtual {v7, v10}, LTest;->c(I)V - move-object/from16 v0, p0 - iget-object v7, v0, LTestObject;->o:LTest; - invoke-virtual {v7}, LTest;->n()I - move-result v7 - move-object/from16 v0, p0 - iput v7, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget-object v7, v0, LTestObject;->o:LTest; - const/4 v10, 0x0 - invoke-virtual {v7, v10}, LTest;->c(I)V - move-object/from16 v0, p0 - iget-object v7, v0, LTestObject;->o:LTest; - const/4 v10, 0x4 - invoke-virtual {v5, v7, v10}, LTest;->a(LTest;I)V - move-object/from16 v0, p0 - iget v7, v0, LTestObject;->i:I - add-int/lit8 v7, v7, 0x4 - move-object/from16 v0, p0 - iput v7, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v7, v0, LTestObject;->i:I - add-int/2addr v7, v6 - move-object/from16 v0, p0 - iput v7, v0, LTestObject;->i:I - goto :goto_4e1 - :cond_534 - iget-object v8, v5, LTest;->c:LTest; - iget-object v8, v8, LTest;->k:[LTest; - aget-object v4, v8, v4 - goto/16 :goto_461 - :cond_53c - const/4 v4, 0x0 - goto/16 :goto_474 - :cond_53f - invoke-virtual {v7}, LTest;->e()I - move-result v5 - const/4 v6, -0x2 - invoke-virtual {v7, v6}, LTest;->d(I)V - mul-int/lit8 v5, v5, 0x6 - add-int/lit8 v5, v5, 0x2 - invoke-virtual {v4, v7, v5}, LTest;->a(LTest;I)V - add-int/lit8 v4, v8, 0x1 - add-int/2addr v4, v5 - goto/16 :goto_491 - :cond_553 - const/4 v4, 0x0 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - goto/16 :goto_4a2 - :cond_55a - move-object/from16 v0, p0 - iget v7, v0, LTestObject;->i:I - const/4 v10, 0x0 - move-object/from16 v0, p1 - invoke-virtual {v5, v0, v7, v10}, LTest;->a(LTest;IZ)I - move-result v7 - move-object/from16 v0, p0 - iget v10, v0, LTestObject;->i:I - add-int/2addr v10, v7 - move-object/from16 v0, p0 - iput v10, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v10, v0, LTestObject;->i:I - sub-int v7, v10, v7 - move-object/from16 v0, p0 - iput v7, v0, LTestObject;->i:I - goto/16 :goto_4e1 - :cond_57a - :goto_57a - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v6, v0, LTestObject;->i:I - if-ge v4, v6, :cond_59e - move-object/from16 v0, p0 - iget v4, v0, LTestObject;->i:I - move-object/from16 v0, p0 - iget v6, v0, LTestObject;->i:I - sub-int/2addr v4, v6 - const/4 v6, 0x0 - move-object/from16 v0, p1 - invoke-virtual {v5, v0, v4, v6}, LTest;->a(LTest;IZ)I - move-result v4 - move-object/from16 v0, p0 - iget v6, v0, LTestObject;->i:I - add-int/2addr v4, v6 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - goto :goto_57a - :cond_59e - iget-object v4, v12, LTest;->g:[J - aget-wide v6, v4, v8 - iget-object v4, v12, LTest;->f:[I - aget v4, v4, v8 - int-to-long v10, v4 - add-long/2addr v6, v10 - const-wide/16 v10, 0x3e8 - mul-long/2addr v6, v10 - iget-boolean v4, v12, LTest;->i:Z - if-eqz v4, :cond_5f3 - const/4 v4, 0x2 - :goto_5b0 - iget-object v10, v12, LTest;->h:[Z - aget-boolean v8, v10, v8 - if-eqz v8, :cond_5f5 - const/4 v8, 0x1 - :goto_5b7 - or-int/2addr v8, v4 - iget-object v4, v12, LTest;->a:LTest; - iget v4, v4, LTest;->a:I - const/4 v11, 0x0 - iget-boolean v10, v12, LTest;->i:Z - if-eqz v10, :cond_5ca - iget-object v10, v12, LTest;->n:LTest; - if-eqz v10, :cond_5f7 - iget-object v4, v12, LTest;->n:LTest; - iget-object v4, v4, LTest;->b:[B - :goto_5c9 - move-object v11, v4 - :cond_5ca - move-object/from16 v0, p0 - iget v9, v0, LTestObject;->i:I - const/4 v10, 0x0 - invoke-virtual/range {v5 .. v11}, LTest;->a(JIII[B)V - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget v5, v4, LTest;->e:I - add-int/lit8 v5, v5, 0x1 - iput v5, v4, LTest;->e:I - move-object/from16 v0, p0 - iget-object v4, v0, LTestObject;->o:LTest; - iget v4, v4, LTest;->e:I - iget v5, v12, LTest;->d:I - if-ne v4, v5, :cond_5eb - const/4 v4, 0x0 - move-object/from16 v0, p0 - iput-object v4, v0, LTestObject;->o:LTest; - :cond_5eb - const/4 v4, 0x3 - move-object/from16 v0, p0 - iput v4, v0, LTestObject;->i:I - const/4 v4, 0x1 - goto/16 :goto_40f - :cond_5f3 - const/4 v4, 0x0 - goto :goto_5b0 - :cond_5f5 - const/4 v8, 0x0 - goto :goto_5b7 - :cond_5f7 - iget-object v9, v9, LTest;->k:[LTest; - aget-object v4, v9, v4 - iget-object v4, v4, LTest;->b:[B - goto :goto_5c9 - :cond_5fe - move-object v6, v5 - move-wide v4, v8 - goto/16 :goto_41 - :cond_602 - move-wide/from16 v23, v6 - move-object v6, v5 - move-wide/from16 v4, v23 - goto/16 :goto_3a8 - nop - :pswitch_data_60a - .packed-switch 0x0 - :pswitch_47 - :pswitch_241 - :pswitch_36f - .end packed-switch -.end method - -.method private final a(J)V - .registers 3 - .prologue - return-void -.end method -
diff --git a/src/test/smali/type-confusion-regression4/Test.java b/src/test/smali/type-confusion-regression4/Test.java deleted file mode 100644 index 252d6c8..0000000 --- a/src/test/smali/type-confusion-regression4/Test.java +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - - public boolean b = false; - public Test a = null; - - public Test() { - } - - public Test(int i, Test a) { - throw new RuntimeException("Test(ILTest;)"); - } - - public int nextIndex() { - throw new RuntimeException("nextIndex()"); - } - - public int previousIndex() { - throw new RuntimeException("previousIndex()"); - } - - public boolean hasNext() { - throw new RuntimeException("hasNext()"); - } - - public boolean hasPrevious() { - throw new RuntimeException("hasPrevious()"); - } - - public static void main(String[] args) { - try { - new TestObject().a(new Test(), new Test()); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/type-confusion-regression4/TestObject.java b/src/test/smali/type-confusion-regression4/TestObject.java deleted file mode 100644 index 340e820..0000000 --- a/src/test/smali/type-confusion-regression4/TestObject.java +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public final Test a(Test t0, Test t1) { - return null; - } -}
diff --git a/src/test/smali/type-confusion-regression4/TestObject.smali b/src/test/smali/type-confusion-regression4/TestObject.smali deleted file mode 100644 index 7c84a9e..0000000 --- a/src/test/smali/type-confusion-regression4/TestObject.smali +++ /dev/null
@@ -1,88 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public final a(LTest;LTest;)LTest; - .registers 7 - .prologue - const/4 v0, 0x0 - if-eqz p1, :cond_23 - iget-boolean v1, p1, LTest;->b:Z - if-eqz v1, :cond_35 - iget-object v1, p0, LTest;->f:LTest; - iget-object v1, v1, LTest;->b:LTest; - invoke-virtual {v1}, LTest;->hasPrevious()Z - move-result v1 - if-eqz v1, :cond_35 - new-instance p2, LTest; - const/4 v1, 0x1 - iget-object v2, p0, LTest;->f:LTest; - iget-object v3, v2, LTest;->b:LTest; - invoke-virtual {v3}, LTest;->hasPrevious()Z - move-result v3 - if-nez v3, :cond_24 - :goto_1e - iget-object v0, v0, LTest;->a:LTest; - invoke-direct {p2, v1, v0}, LTest;-><init>(ILTest;)V - :cond_23 - :goto_23 - return-object p2 - :cond_24 - iget-object v0, v2, LTest;->b:LTest; - iget-object v0, v0, LTest;->a:Ljava/util/ArrayList; - iget-object v2, v2, LTest;->b:LTest; - invoke-virtual {v2}, LTest;->previousIndex()I - move-result v2 - invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object; - move-result-object v0 - check-cast v0, LTest; - goto :goto_1e - :cond_35 - iget-boolean v1, p1, LTest;->b:Z - if-eqz v1, :cond_67 - iget-object v1, p0, LTest;->f:LTest; - iget-object v1, v1, LTest;->b:LTest; - invoke-virtual {v1}, LTest;->hasNext()Z - move-result v1 - if-eqz v1, :cond_67 - new-instance p2, LTest; - const/4 v1, 0x2 - iget-object v2, p0, LTest;->f:LTest; - iget-object v3, v2, LTest;->b:LTest; - invoke-virtual {v3}, LTest;->hasNext()Z - move-result v3 - if-nez v3, :cond_56 - :goto_50 - iget-object v0, v0, LTest;->a:LTest; - invoke-direct {p2, v1, v0}, LTest;-><init>(ILTest;)V - goto :goto_23 - :cond_56 - iget-object v0, v2, LTest;->b:LTest; - iget-object v0, v0, LTest;->a:Ljava/util/ArrayList; - iget-object v2, v2, LTest;->b:LTest; - invoke-virtual {v2}, LTest;->nextIndex()I - move-result v2 - invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object; - move-result-object v0 - check-cast v0, LTest; - goto :goto_50 - :cond_67 - iget-object v0, p1, LTest;->a:LTest; - if-eqz v0, :cond_23 - new-instance p2, LTest; - const/4 v0, 0x0 - new-instance v1, LTest; - iget-object v2, p1, LTest;->a:LTest; - invoke-direct {v1, v2}, LTest;-><init>(LTest;)V - invoke-direct {p2, v0, v1}, LTest;-><init>(ILTest;)V - goto :goto_23 -.end method \ No newline at end of file
diff --git a/src/test/smali/type-confusion-regression5/Test.java b/src/test/smali/type-confusion-regression5/Test.java deleted file mode 100644 index e450d6b..0000000 --- a/src/test/smali/type-confusion-regression5/Test.java +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright (c) 2016, 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. - -public class Test { - - public int getId() { - throw new RuntimeException("getId()I"); - } - - public boolean a() { - throw new RuntimeException("a()Z"); - } - - public void a(Test t0) { - throw new RuntimeException("a(LTest;)V"); - } - - public void a(Test t0, Test t1) { - throw new RuntimeException("a(LTest;LTest;)V"); - } - - public static boolean b(Test t0, Test t1) { - throw new RuntimeException("b()Z"); - } - - public Test c() { - throw new RuntimeException("c()LTest;"); - } - - public static boolean c(Test t) { - throw new RuntimeException("c(LTest;)Z"); - } - - public void g() { - throw new RuntimeException("g()V"); - } - - public boolean pageScroll(int i) { - throw new RuntimeException("pageScroll(I)Z"); - } - - public static void main(String[] args) { - try { - new TestObject().onClick(new Test()); - } catch (Exception e) { - System.out.println(e); - } - } -}
diff --git a/src/test/smali/type-confusion-regression5/TestObject.java b/src/test/smali/type-confusion-regression5/TestObject.java deleted file mode 100644 index a3cc1f9..0000000 --- a/src/test/smali/type-confusion-regression5/TestObject.java +++ /dev/null
@@ -1,8 +0,0 @@ -// Copyright (c) 2016, 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. - -public class TestObject { - public final void onClick(Test t) { - } -}
diff --git a/src/test/smali/type-confusion-regression5/TestObject.smali b/src/test/smali/type-confusion-regression5/TestObject.smali deleted file mode 100644 index 18a1fc1..0000000 --- a/src/test/smali/type-confusion-regression5/TestObject.smali +++ /dev/null
@@ -1,177 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public final LTestObject; -.super Ljava/lang/Object; - -.field private c:LTest; - -.method public constructor <init>()V - .registers 1 - invoke-direct {p0}, Ljava/lang/Object;-><init>()V - return-void -.end method - -.method public onClick(LTest;)V - .registers 10 - const/4 v2, 0x00 # 0 - invoke-virtual { v9 }, LTest;->getId()I - move-result v0 - const v1, 0x7f0f01bf # 2131689919 - if-ne v0, v1, :label_247 - invoke-virtual { v8 }, LTestObject;->getActivity()LTest; - move-result-object v0 - invoke-static { v0, v9 }, LTest;->b(LTest;LTest;)Z - iget-object v0, v8, LTestObject;->c:LTest; - invoke-virtual { v0 }, LTest;->a()Z - move-result v0 - if-eqz v0, :label_231 - iget-object v0, v8, LTestObject;->d:Landroid/widget/Button; - const/4 v1, 0x00 # 0 - invoke-virtual { v0, v1 }, Landroid/widget/Button;->setEnabled(Z)V - iget-object v0, v8, LTestObject;->b:Landroid/widget/LinearLayout; - if-nez v0, :label_72 - const-string v0, "a" - const/4 v1, 0x05 # 5 - invoke-static { v0, v1 }, Landroid/util/Log;->isLoggable(Ljava/lang/String;I)Z - move-result v0 - if-eqz v0, :label_51 - const-string v0, "b" - const-string v1, "c" - invoke-static { v0, v1 }, Landroid/util/Log;->w(Ljava/lang/String;Ljava/lang/String;)I - :label_51 - invoke-static { v2 }, LTest;->c(LTest;)Z - move-result v0 - if-eqz v0, :label_66 - iget-object v0, v8, LTestObject;->a:LTest; - sget-object v1, Ljok;->d:LTest; - sget-object v3, Ljol;->c:LTest; - invoke-virtual { v0, v1, v3 }, LTest;->a(LTest;LTest;)V - :label_66 - iget-object v0, v8, LTestObject;->g:LTest; - invoke-virtual { v0, v2 }, LTest;->a(LTest;)V - :label_71 - return-void - :label_72 - new-instance v5, Ljava/util/ArrayList; - invoke-direct { v5 }, Ljava/util/ArrayList;-><init>()V - iget-object v0, v8, LTestObject;->b:Landroid/widget/LinearLayout; - invoke-direct { v8, v0 }, LTestObject;->a(Landroid/widget/LinearLayout;)Ljava/util/List; - move-result-object v0 - invoke-interface { v0 }, Ljava/util/List;->iterator()Ljava/util/Iterator; - move-result-object v6 - move-object v1, v2 - move-object v4, v2 - :label_89 - invoke-interface { v6 }, Ljava/util/Iterator;->hasNext()Z - move-result v0 - if-eqz v0, :label_151 - invoke-interface { v6 }, Ljava/util/Iterator;->next()Ljava/lang/Object; - move-result-object v0 - check-cast v0, LTest; - invoke-virtual { v0 }, LTest;->c()LTest; - move-result-object v3 - if-eqz v3, :label_148 - instance-of v7, v0, LTest; - if-eqz v7, :label_127 - if-eqz v1, :label_116 - invoke-virtual { v5, v1 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - :label_116 - invoke-virtual { v5, v3 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - if-eqz v4, :label_124 - invoke-virtual { v5, v4 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - :label_124 - move-object v1, v2 - move-object v4, v2 - goto :label_89 - :label_127 - instance-of v7, v0, LTest; - if-eqz v7, :label_133 - move-object v1, v3 - goto :label_89 - :label_133 - instance-of v0, v0, LTest; - if-eqz v0, :label_139 - move-object v4, v3 - goto :label_89 - :label_139 - if-eqz v4, :label_145 - invoke-virtual { v5, v4 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - move-object v4, v2 - :label_145 - invoke-virtual { v5, v3 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - :label_148 - move-object v3, v4 - move-object v4, v3 - goto :label_89 - :label_151 - if-eqz v4, :label_156 - invoke-virtual { v5, v4 }, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - :label_156 - new-instance v1, LTest; - invoke-direct { v1 }, LTest;-><init>()V - const-string v0, "d" - iput-object v0, v1, LTest;->b:Ljava/lang/String; - iget-object v0, v1, LTest;->c:Ljava/util/Set; - const/4 v3, 0x06 # 6 - invoke-static { v3 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; - move-result-object v3 - invoke-interface { v0, v3 }, Ljava/util/Set;->add(Ljava/lang/Object;)Z - new-instance v3, LTest; - invoke-direct { v3 }, LTest;-><init>()V - iput-object v5, v3, LTest;->a:Ljava/util/List; - iget-object v0, v3, LTest;->b:Ljava/util/Set; - const/4 v4, 0x02 # 2 - invoke-static { v4 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; - move-result-object v4 - invoke-interface { v0, v4 }, Ljava/util/Set;->add(Ljava/lang/Object;)Z - new-instance v0, LTest; - iget-object v4, v3, LTest;->b:Ljava/util/Set; - iget-object v3, v3, LTest;->a:Ljava/util/List; - invoke-direct { v0, v4, v3 }, LTest;-><init>(Ljava/util/Set;Ljava/util/List;)V - check-cast v0, LTest; - iput-object v0, v1, LTest;->a:LTest; - iget-object v0, v1, LTest;->c:Ljava/util/Set; - const/4 v3, 0x04 # 4 - invoke-static { v3 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer; - move-result-object v3 - invoke-interface { v0, v3 }, Ljava/util/Set;->add(Ljava/lang/Object;)Z - new-instance v0, LTest; - iget-object v3, v1, LTest;->c:Ljava/util/Set; - iget-object v4, v1, LTest;->a:LTest; - iget-object v1, v1, LTest;->b:Ljava/lang/String; - invoke-direct { v0, v3, v2, v4, v1 }, LTest;-><init>(Ljava/util/Set;LTest;LTest;Ljava/lang/String;)V - check-cast v0, LTest; - move-object v2, v0 - goto/16 :label_51 - :label_231 - iget-object v0, v8, LTestObject;->c:LTest; - const/16 v1, 0x0082 # 130 - invoke-virtual { v0, v1 }, LTest;->pageScroll(I)Z - iget-object v0, v8, LTestObject;->a:LTest; - sget-object v1, Ljok;->k:LTest; - invoke-virtual { v0, v1 }, LTest;->a(LTest;)V - goto/16 :label_71 - :label_247 - const v1, 0x7f0f0204 # 2131689988 - if-ne v0, v1, :label_71 - iget-object v0, v8, LTestObject;->a:LTest; - sget-object v1, Ljok;->q:LTest; - invoke-virtual { v0, v1 }, LTest;->a(LTest;)V - iget-object v0, v8, LTestObject;->g:LTest; - invoke-virtual { v0 }, LTest;->g()V - goto/16 :label_71 -.end method - -.method public getActivity()LTest; - .registers 1 - const/4 v0, 0x00 - return-object v0 -.end method - -.method private a(Landroid/widget/LinearLayout;)Ljava/util/List; - .registers 2 - const/4 v0, 0x00 - return-object v0 -.end method
diff --git a/src/test/smali/unreachable-code-1/UnreachableCode1.smali b/src/test/smali/unreachable-code-1/UnreachableCode1.smali deleted file mode 100644 index a7ba2f1..0000000 --- a/src/test/smali/unreachable-code-1/UnreachableCode1.smali +++ /dev/null
@@ -1,87 +0,0 @@ -# Copyright (c) 2016, 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. - -.class public LTest; - -.super Ljava/lang/Object; - -.method public static test1()I - .registers 1 - goto :return - - :dummy - const/4 v0, 0x1 - - :return - const/4 v0, 0x7 - return v0 - -.end method - -.method public static test2()I - .registers 1 - goto :return - - :dummy1 - const/4 v0, 0x1 - - :dummy2 - const/4 v0, 0x2 - - :return - const/4 v0, 0x7 - return v0 - -.end method - -.method public static test3()I - .registers 1 - goto :return - - :dummy1 - const/4 v0, 0x1 - goto :dummy3 - - :dummy2 - const/4 v0, 0x2 - goto :return - - :dummy3 - const/4 v0, 0x3 - goto :return - - :dummy4 - const/4 v0, 0x4 - - :return - const/4 v0, 0x7 - return v0 - -.end method - -.method public static main([Ljava/lang/String;)V - .locals 2 - - sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; - - invoke-static {}, LTest;->test1()I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-static {}, LTest;->test2()I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - invoke-static {}, LTest;->test3()I - move-result v1 - invoke-static {v1}, Ljava/lang/Integer;->toString(I)Ljava/lang/String; - move-result-object v1 - invoke-virtual {v0, v1}, Ljava/io/PrintStream;->print(Ljava/lang/Object;)V - - return-void -.end method
diff --git a/third_party/smali.tar.gz.sha1 b/third_party/smali.tar.gz.sha1 new file mode 100644 index 0000000..19edeb3 --- /dev/null +++ b/third_party/smali.tar.gz.sha1
@@ -0,0 +1 @@ +dbe8218edb1e2555e728edaa52d845ca1e4ceb25 \ No newline at end of file
diff --git a/tools/chrome_data.py b/tools/chrome_data.py index ebae542..55ac69a 100644 --- a/tools/chrome_data.py +++ b/tools/chrome_data.py
@@ -256,7 +256,7 @@ 'inputs': [os.path.join(V200430_BASE, 'program.jar')], 'pgconf': [os.path.join(V200430_BASE, 'proguard.config')], 'libraries': [os.path.join(V200430_BASE, 'library.jar')], - 'min-api': ANDROID_N_API + 'min-api': ANDROID_N_API, }, }, '200520-monochrome_public_minimal_apks': {