| // 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 -> { |
| diagnostics.assertNoWarningsMatch( |
| 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(); |
| } |
| } |
| } |