Add test for starting debug local range outside range
Bug: 169346184
Change-Id: I2c9890bb68537bb63a766abb51524ef62d10e0ee
diff --git a/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java b/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java
new file mode 100644
index 0000000..cfd20ab
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java
@@ -0,0 +1,495 @@
+// Copyright (c) 2020, 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;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.ir.DebugLocalStartOutsideRangeTest.PrintHelper$PrintUriAdapter$1Dump.dump;
+import static org.hamcrest.CoreMatchers.containsString;
+
+import com.android.tools.r8.CompilationFailedException;
+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.Parameters;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class DebugLocalStartOutsideRangeTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
+ }
+
+ public DebugLocalStartOutsideRangeTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testD8() throws CompilationFailedException {
+ testForD8(parameters.getBackend())
+ .addProgramClassFileData(dump())
+ .setMinApi(parameters.getApiLevel())
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ if (parameters.isDexRuntime()) {
+ diagnostics.assertWarningThatMatches(
+ diagnosticMessage(containsString("Could not find phi type for register")));
+ }
+ });
+ }
+
+ public static class PrintHelper$PrintUriAdapter$1Dump implements Opcodes {
+
+ public static byte[] dump() {
+
+ ClassWriter classWriter = new ClassWriter(0);
+ FieldVisitor fieldVisitor;
+ MethodVisitor methodVisitor;
+
+ classWriter.visit(
+ V1_7,
+ ACC_SUPER,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "Landroid/os/AsyncTask<Landroid/net/Uri;Ljava/lang/Boolean;Landroid/graphics/Bitmap;>;",
+ "android/os/AsyncTask",
+ null);
+
+ classWriter.visitSource("PrintHelper.java", null);
+
+ classWriter.visitOuterClass(
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "onLayout",
+ "(Landroid/print/PrintAttributes;Landroid/print/PrintAttributes;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$LayoutResultCallback;Landroid/os/Bundle;)V");
+
+ classWriter.visitInnerClass(
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "androidx/print/PrintHelper",
+ "PrintUriAdapter",
+ ACC_PRIVATE);
+
+ classWriter.visitInnerClass("androidx/print/PrintHelper$PrintUriAdapter$1", null, null, 0);
+
+ classWriter.visitInnerClass(
+ "android/print/PrintAttributes$MediaSize",
+ "android/print/PrintAttributes",
+ "MediaSize",
+ ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+ classWriter.visitInnerClass(
+ "android/print/PrintDocumentInfo$Builder",
+ "android/print/PrintDocumentInfo",
+ "Builder",
+ ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "val$cancellationSignal",
+ "Landroid/os/CancellationSignal;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "val$newPrintAttributes",
+ "Landroid/print/PrintAttributes;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "val$oldPrintAttributes",
+ "Landroid/print/PrintAttributes;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "val$layoutResultCallback",
+ "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ fieldVisitor =
+ classWriter.visitField(
+ ACC_FINAL | ACC_SYNTHETIC,
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;",
+ null,
+ null);
+ fieldVisitor.visitEnd();
+ }
+ {
+ methodVisitor =
+ classWriter.visitMethod(
+ ACC_PROTECTED, "onPostExecute", "(Landroid/graphics/Bitmap;)V", null, null);
+ methodVisitor.visitCode();
+ Label label0 = new Label();
+ Label label1 = new Label();
+ Label label2 = new Label();
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, null);
+ Label label3 = new Label();
+ methodVisitor.visitTryCatchBlock(label2, label3, label2, null);
+ Label label4 = new Label();
+ methodVisitor.visitLabel(label4);
+ methodVisitor.visitLineNumber(450, label4);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "android/os/AsyncTask", "onPostExecute", "(Ljava/lang/Object;)V", false);
+ Label label5 = new Label();
+ methodVisitor.visitLabel(label5);
+ methodVisitor.visitLineNumber(454, label5);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ Label label6 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label6);
+ methodVisitor.visitFieldInsn(
+ GETSTATIC, "androidx/print/PrintHelper", "PRINT_ACTIVITY_RESPECTS_ORIENTATION", "Z");
+ Label label7 = new Label();
+ methodVisitor.visitJumpInsn(IFEQ, label7);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;");
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "this$0",
+ "Landroidx/print/PrintHelper;");
+ methodVisitor.visitFieldInsn(GETFIELD, "androidx/print/PrintHelper", "mOrientation", "I");
+ methodVisitor.visitJumpInsn(IFNE, label6);
+ methodVisitor.visitLabel(label7);
+ methodVisitor.visitLineNumber(458, label7);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ methodVisitor.visitInsn(MONITORENTER);
+ methodVisitor.visitLabel(label0);
+ methodVisitor.visitLineNumber(459, label0);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;");
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "mAttributes",
+ "Landroid/print/PrintAttributes;");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintAttributes",
+ "getMediaSize",
+ "()Landroid/print/PrintAttributes$MediaSize;",
+ false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label8 = new Label();
+ methodVisitor.visitLabel(label8);
+ methodVisitor.visitLineNumber(460, label8);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(MONITOREXIT);
+ methodVisitor.visitLabel(label1);
+ Label label9 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label9);
+ methodVisitor.visitLabel(label2);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 4,
+ new Object[] {
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "android/graphics/Bitmap",
+ Opcodes.TOP,
+ "java/lang/Object"
+ },
+ 1,
+ new Object[] {"java/lang/Throwable"});
+ methodVisitor.visitVarInsn(ASTORE, 4);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(MONITOREXIT);
+ methodVisitor.visitLabel(label3);
+ methodVisitor.visitVarInsn(ALOAD, 4);
+ methodVisitor.visitInsn(ATHROW);
+ methodVisitor.visitLabel(label9);
+ methodVisitor.visitLineNumber(462, label9);
+ methodVisitor.visitFrame(
+ Opcodes.F_FULL,
+ 3,
+ new Object[] {
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "android/graphics/Bitmap",
+ "android/print/PrintAttributes$MediaSize"
+ },
+ 0,
+ new Object[] {});
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitJumpInsn(IFNULL, label6);
+ Label label10 = new Label();
+ methodVisitor.visitLabel(label10);
+ methodVisitor.visitLineNumber(463, label10);
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "android/print/PrintAttributes$MediaSize", "isPortrait", "()Z", false);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "androidx/print/PrintHelper",
+ "isPortrait",
+ "(Landroid/graphics/Bitmap;)Z",
+ false);
+ methodVisitor.visitJumpInsn(IF_ICMPEQ, label6);
+ Label label11 = new Label();
+ methodVisitor.visitLabel(label11);
+ methodVisitor.visitLineNumber(464, label11);
+ methodVisitor.visitTypeInsn(NEW, "android/graphics/Matrix");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL, "android/graphics/Matrix", "<init>", "()V", false);
+ methodVisitor.visitVarInsn(ASTORE, 3);
+ Label label12 = new Label();
+ methodVisitor.visitLabel(label12);
+ methodVisitor.visitLineNumber(466, label12);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitLdcInsn(new Float("90.0"));
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "android/graphics/Matrix", "postRotate", "(F)Z", false);
+ methodVisitor.visitInsn(POP);
+ Label label13 = new Label();
+ methodVisitor.visitLabel(label13);
+ methodVisitor.visitLineNumber(467, label13);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ Label label14 = new Label();
+ methodVisitor.visitLabel(label14);
+ methodVisitor.visitLineNumber(468, label14);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "android/graphics/Bitmap", "getWidth", "()I", false);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL, "android/graphics/Bitmap", "getHeight", "()I", false);
+ methodVisitor.visitVarInsn(ALOAD, 3);
+ methodVisitor.visitInsn(ICONST_1);
+ Label label15 = new Label();
+ methodVisitor.visitLabel(label15);
+ methodVisitor.visitLineNumber(467, label15);
+ methodVisitor.visitMethodInsn(
+ INVOKESTATIC,
+ "android/graphics/Bitmap",
+ "createBitmap",
+ "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;",
+ false);
+ methodVisitor.visitVarInsn(ASTORE, 1);
+ methodVisitor.visitLabel(label6);
+ methodVisitor.visitLineNumber(474, label6);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;");
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ methodVisitor.visitFieldInsn(
+ PUTFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "mBitmap",
+ "Landroid/graphics/Bitmap;");
+ Label label16 = new Label();
+ methodVisitor.visitLabel(label16);
+ methodVisitor.visitLineNumber(475, label16);
+ methodVisitor.visitVarInsn(ALOAD, 1);
+ Label label17 = new Label();
+ methodVisitor.visitJumpInsn(IFNULL, label17);
+ Label label18 = new Label();
+ methodVisitor.visitLabel(label18);
+ methodVisitor.visitLineNumber(476, label18);
+ methodVisitor.visitTypeInsn(NEW, "android/print/PrintDocumentInfo$Builder");
+ methodVisitor.visitInsn(DUP);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;");
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "mJobName",
+ "Ljava/lang/String;");
+ methodVisitor.visitMethodInsn(
+ INVOKESPECIAL,
+ "android/print/PrintDocumentInfo$Builder",
+ "<init>",
+ "(Ljava/lang/String;)V",
+ false);
+ methodVisitor.visitInsn(ICONST_1);
+ Label label19 = new Label();
+ methodVisitor.visitLabel(label19);
+ methodVisitor.visitLineNumber(477, label19);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintDocumentInfo$Builder",
+ "setContentType",
+ "(I)Landroid/print/PrintDocumentInfo$Builder;",
+ false);
+ methodVisitor.visitInsn(ICONST_1);
+ Label label20 = new Label();
+ methodVisitor.visitLabel(label20);
+ methodVisitor.visitLineNumber(478, label20);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintDocumentInfo$Builder",
+ "setPageCount",
+ "(I)Landroid/print/PrintDocumentInfo$Builder;",
+ false);
+ Label label21 = new Label();
+ methodVisitor.visitLabel(label21);
+ methodVisitor.visitLineNumber(479, label21);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintDocumentInfo$Builder",
+ "build",
+ "()Landroid/print/PrintDocumentInfo;",
+ false);
+ methodVisitor.visitVarInsn(ASTORE, 2);
+ Label label22 = new Label();
+ methodVisitor.visitLabel(label22);
+ methodVisitor.visitLineNumber(481, label22);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "val$newPrintAttributes",
+ "Landroid/print/PrintAttributes;");
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "val$oldPrintAttributes",
+ "Landroid/print/PrintAttributes;");
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintAttributes",
+ "equals",
+ "(Ljava/lang/Object;)Z",
+ false);
+ Label label23 = new Label();
+ methodVisitor.visitJumpInsn(IFNE, label23);
+ methodVisitor.visitInsn(ICONST_1);
+ Label label24 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label24);
+ methodVisitor.visitLabel(label23);
+ methodVisitor.visitFrame(
+ Opcodes.F_APPEND, 1, new Object[] {"android/print/PrintDocumentInfo"}, 0, null);
+ methodVisitor.visitInsn(ICONST_0);
+ methodVisitor.visitLabel(label24);
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {Opcodes.INTEGER});
+ methodVisitor.visitVarInsn(ISTORE, 3);
+ Label label25 = new Label();
+ methodVisitor.visitLabel(label25);
+ methodVisitor.visitLineNumber(483, label25);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "val$layoutResultCallback",
+ "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;");
+ methodVisitor.visitVarInsn(ALOAD, 2);
+ methodVisitor.visitVarInsn(ILOAD, 3);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintDocumentAdapter$LayoutResultCallback",
+ "onLayoutFinished",
+ "(Landroid/print/PrintDocumentInfo;Z)V",
+ false);
+ Label label26 = new Label();
+ methodVisitor.visitLabel(label26);
+ methodVisitor.visitLineNumber(485, label26);
+ Label label27 = new Label();
+ methodVisitor.visitJumpInsn(GOTO, label27);
+ methodVisitor.visitLabel(label17);
+ methodVisitor.visitLineNumber(486, label17);
+ methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "val$layoutResultCallback",
+ "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;");
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitMethodInsn(
+ INVOKEVIRTUAL,
+ "android/print/PrintDocumentAdapter$LayoutResultCallback",
+ "onLayoutFailed",
+ "(Ljava/lang/CharSequence;)V",
+ false);
+ methodVisitor.visitLabel(label27);
+ methodVisitor.visitLineNumber(488, label27);
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+ methodVisitor.visitVarInsn(ALOAD, 0);
+ methodVisitor.visitFieldInsn(
+ GETFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter$1",
+ "this$1",
+ "Landroidx/print/PrintHelper$PrintUriAdapter;");
+ methodVisitor.visitInsn(ACONST_NULL);
+ methodVisitor.visitFieldInsn(
+ PUTFIELD,
+ "androidx/print/PrintHelper$PrintUriAdapter",
+ "mLoadBitmap",
+ "Landroid/os/AsyncTask;");
+ Label label28 = new Label();
+ methodVisitor.visitLabel(label28);
+ methodVisitor.visitLineNumber(489, label28);
+ methodVisitor.visitInsn(RETURN);
+ Label label29 = new Label();
+ methodVisitor.visitLabel(label29);
+ methodVisitor.visitLocalVariable(
+ "rotation", "Landroid/graphics/Matrix;", null, label12, label6, 3);
+ methodVisitor.visitLocalVariable(
+ "mediaSize", "Landroid/print/PrintAttributes$MediaSize;", null, label8, label6, 2);
+ methodVisitor.visitLocalVariable(
+ "info", "Landroid/print/PrintDocumentInfo;", null, label22, label26, 2);
+ methodVisitor.visitLocalVariable("changed", "Z", null, label25, label26, 3);
+ methodVisitor.visitLocalVariable(
+ "this", "Landroidx/print/PrintHelper$PrintUriAdapter$1;", null, label4, label29, 0);
+ methodVisitor.visitLocalVariable(
+ "bitmap", "Landroid/graphics/Bitmap;", null, label4, label29, 1);
+ methodVisitor.visitMaxs(7, 5);
+ methodVisitor.visitEnd();
+ }
+ classWriter.visitEnd();
+
+ return classWriter.toByteArray();
+ }
+ }
+}