| // 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.jasmin; | |
| import static org.junit.Assert.assertEquals; | |
| import com.android.tools.r8.debuginfo.DebugInfoInspector; | |
| import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion; | |
| import com.android.tools.r8.naming.MemberNaming.MethodSignature; | |
| import com.android.tools.r8.utils.AndroidApp; | |
| import com.google.common.collect.ImmutableList; | |
| import org.junit.Test; | |
| public class JumpSubroutineDebugInfoTests extends JasminTestBase { | |
| @Test | |
| public void testJsrWithStraightlineAndDebugInfoCode() throws Exception { | |
| JasminBuilder builder = new JasminBuilder(ClassFileVersion.JDK_1_4); | |
| JasminBuilder.ClassBuilder clazz = builder.addClass("Test"); | |
| MethodSignature foo = clazz.addStaticMethod("foo", ImmutableList.of("I"), "I", | |
| ".limit stack 3", | |
| ".limit locals 3", | |
| ".var 0 is x I from LabelInit to LabelExit", | |
| "LabelInit:", | |
| ".line 1", | |
| " ldc 0", | |
| " ldc 1", | |
| " jsr LabelSub", | |
| " ldc 2", | |
| " jsr LabelSub", | |
| " ldc 3", | |
| " jsr LabelSub", | |
| ".line 2", | |
| " ireturn", | |
| "LabelSub:", | |
| ".line 3", | |
| " astore 1", | |
| " iadd", | |
| " istore 0", // store and load in local 'x' to ensure we don't optimize out the subroutine. | |
| ".line 4", | |
| " iload 0", | |
| " ret 1", | |
| "LabelExit:"); | |
| clazz.addMainMethod( | |
| ".limit stack 3", | |
| ".limit locals 1", | |
| " getstatic java/lang/System/out Ljava/io/PrintStream;", | |
| " ldc 1", | |
| " invokestatic Test/foo(I)I", | |
| " invokevirtual java/io/PrintStream/print(I)V", | |
| " return"); | |
| String expected = "6"; | |
| String javaResult = runOnJava(builder, clazz.name); | |
| assertEquals(expected, javaResult); | |
| AndroidApp d8App = compileWithD8(builder); | |
| String artResult = runOnArt(d8App, clazz.name); | |
| assertEquals(expected, artResult); | |
| DebugInfoInspector info = new DebugInfoInspector(d8App, clazz.name, foo); | |
| info.checkStartLine(1); | |
| // Check the subroutine line is duplicated 3 times. | |
| assertEquals(3, info.checkLineHasExactLocals(3, "x", "int")); | |
| } | |
| } |