blob: 1c811da0e76ecc2f3b92bb5e0170870668bf263e [file] [log] [blame]
// 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;
}
}