| // 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. |
| package com.android.tools.r8.debug; |
| |
| import com.android.tools.r8.ToolHelper; |
| import com.android.tools.r8.jasmin.JasminBuilder; |
| import com.google.common.collect.ImmutableList; |
| import java.nio.file.Path; |
| import java.util.List; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.rules.TemporaryFolder; |
| |
| public class JasminDebugTest extends DebugTestBase { |
| |
| final String className = "UselessCheckCast"; |
| final String sourcefile = className + ".j"; |
| final String methodName = "test"; |
| |
| @Rule |
| public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest(); |
| |
| @Test |
| public void testUselessCheckcastCF() throws Throwable { |
| JasminBuilder builder = getBuilderForUselessCheckcast(className, methodName); |
| Path outdir = temp.newFolder().toPath(); |
| builder.writeClassFiles(outdir); |
| CfDebugTestConfig config = new CfDebugTestConfig(); |
| config.addPaths(outdir); |
| runUselessCheckcast(config); |
| } |
| |
| @Test |
| public void testUselessCheckcastD8() throws Throwable { |
| JasminBuilder builder = getBuilderForUselessCheckcast(className, methodName); |
| List<Path> outputs = builder.writeClassFiles(temp.newFolder().toPath()); |
| runUselessCheckcast(new D8DebugTestConfig().compileAndAdd(temp, outputs)); |
| } |
| |
| private void runUselessCheckcast(DebugTestConfig config) throws Throwable { |
| runDebugTest( |
| config, |
| className, |
| breakpoint(className, methodName), |
| run(), |
| checkLine(sourcefile, 1), |
| stepOver(), |
| checkLine(sourcefile, 2), |
| checkLocal("local"), |
| stepOver(), |
| checkLine(sourcefile, 3), |
| checkNoLocal("local"), |
| stepOver(), |
| checkLine(sourcefile, 4), |
| run()); |
| } |
| |
| private JasminBuilder getBuilderForUselessCheckcast(String testClassName, String testMethodName) { |
| JasminBuilder builder = new JasminBuilder(); |
| JasminBuilder.ClassBuilder clazz = builder.addClass(testClassName); |
| |
| clazz.addStaticMethod(testMethodName, ImmutableList.of("Ljava/lang/Object;"), "V", |
| ".limit stack 2", |
| ".limit locals 3", |
| ".var 1 is local Ljava/lang/Object; from Label1 to Label2", |
| ".line 1", |
| " aload 0", |
| " dup", |
| " astore 1", |
| " Label1:", |
| ".line 2", |
| " checkcast " + testClassName, |
| " Label2:", |
| ".line 3", |
| " checkcast " + testClassName, |
| ".line 4", |
| "return"); |
| |
| clazz.addMainMethod( |
| ".limit stack 2", |
| ".limit locals 1", |
| "aconst_null", |
| "invokestatic " + testClassName + "/" + testMethodName + "(Ljava/lang/Object;)V", |
| "return"); |
| |
| return builder; |
| } |
| } |