| // 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 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; |
| import org.objectweb.asm.Type; |
| |
| @RunWith(Parameterized.class) |
| public class DebugLocalStartRangeInLinearBlockWithFrameTest extends TestBase { |
| |
| private final TestParameters parameters; |
| |
| @Parameters(name = "{0}") |
| public static TestParametersCollection data() { |
| return getTestParameters().withDexRuntimes().withAllApiLevels().build(); |
| } |
| |
| public DebugLocalStartRangeInLinearBlockWithFrameTest(TestParameters parameters) { |
| this.parameters = parameters; |
| } |
| |
| @Test |
| public void testD8() throws Exception { |
| testForD8(parameters.getBackend()) |
| .addProgramClassFileData(AbstractAjaxCallbackDump.dump()) |
| .setMinApi(parameters.getApiLevel()) |
| .compile(); |
| } |
| |
| public static class AbstractAjaxCallbackDump implements Opcodes { |
| |
| public static byte[] dump() { |
| |
| ClassWriter classWriter = new ClassWriter(0); |
| FieldVisitor fieldVisitor; |
| MethodVisitor methodVisitor; |
| |
| classWriter.visit( |
| V1_6, |
| ACC_PUBLIC | ACC_SUPER | ACC_ABSTRACT, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "<T:Ljava/lang/Object;K:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/Runnable;", |
| "java/lang/Object", |
| new String[] {"java/lang/Runnable"}); |
| |
| classWriter.visitSource("AbstractAjaxCallback.java", null); |
| |
| classWriter.visitInnerClass( |
| "android/os/Build$VERSION", "android/os/Build", "VERSION", ACC_PUBLIC | ACC_STATIC); |
| |
| classWriter.visitInnerClass( |
| "com/androidquery/callback/AbstractAjaxCallback$1", null, null, 0); |
| |
| classWriter.visitInnerClass( |
| "java/net/Proxy$Type", |
| "java/net/Proxy", |
| "Type", |
| ACC_PUBLIC | ACC_FINAL | ACC_STATIC | ACC_ENUM); |
| |
| classWriter.visitInnerClass( |
| "java/util/Map$Entry", |
| "java/util/Map", |
| "Entry", |
| ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE); |
| |
| { |
| fieldVisitor = |
| classWriter.visitField( |
| ACC_PRIVATE, "type", "Ljava/lang/Class;", "Ljava/lang/Class<TT;>;", null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = |
| classWriter.visitField(ACC_PRIVATE, "handler", "Ljava/lang/Object;", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = |
| classWriter.visitField(ACC_PRIVATE, "callback", "Ljava/lang/String;", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = classWriter.visitField(ACC_PRIVATE, "url", "Ljava/lang/String;", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = |
| classWriter.visitField(ACC_PROTECTED, "result", "Ljava/lang/Object;", "TT;", null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = |
| classWriter.visitField( |
| ACC_PROTECTED, "status", "Lcom/androidquery/callback/AjaxStatus;", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = classWriter.visitField(ACC_PRIVATE, "completed", "Z", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| fieldVisitor = classWriter.visitField(ACC_PRIVATE, "blocked", "Z", null, null); |
| fieldVisitor.visitEnd(); |
| } |
| { |
| methodVisitor = classWriter.visitMethod(0, "callback", "()V", null, null); |
| methodVisitor.visitCode(); |
| Label label0 = new Label(); |
| Label label1 = new Label(); |
| Label label2 = new Label(); |
| methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Exception"); |
| Label label3 = new Label(); |
| methodVisitor.visitLabel(label3); |
| methodVisitor.visitLineNumber(568, label3); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitInsn(ICONST_0); |
| methodVisitor.visitMethodInsn( |
| INVOKEVIRTUAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "showProgress", |
| "(Z)V", |
| false); |
| Label label4 = new Label(); |
| methodVisitor.visitLabel(label4); |
| methodVisitor.visitLineNumber(570, label4); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitInsn(ICONST_1); |
| methodVisitor.visitFieldInsn( |
| PUTFIELD, "com/androidquery/callback/AbstractAjaxCallback", "completed", "Z"); |
| Label label5 = new Label(); |
| methodVisitor.visitLabel(label5); |
| methodVisitor.visitLineNumber(572, label5); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitMethodInsn( |
| INVOKESPECIAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "isActive", |
| "()Z", |
| false); |
| Label label6 = new Label(); |
| methodVisitor.visitJumpInsn(IFEQ, label6); |
| Label label7 = new Label(); |
| methodVisitor.visitLabel(label7); |
| methodVisitor.visitLineNumber(574, label7); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "callback", |
| "Ljava/lang/String;"); |
| methodVisitor.visitJumpInsn(IFNULL, label0); |
| Label label8 = new Label(); |
| methodVisitor.visitLabel(label8); |
| methodVisitor.visitLineNumber(575, label8); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitMethodInsn( |
| INVOKEVIRTUAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "getHandler", |
| "()Ljava/lang/Object;", |
| false); |
| methodVisitor.visitVarInsn(ASTORE, 1); |
| Label label9 = new Label(); |
| methodVisitor.visitLabel(label9); |
| methodVisitor.visitLineNumber(576, label9); |
| methodVisitor.visitInsn(ICONST_3); |
| methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Class"); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_0); |
| methodVisitor.visitLdcInsn(Type.getType("Ljava/lang/String;")); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_1); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "type", |
| "Ljava/lang/Class;"); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_2); |
| methodVisitor.visitLdcInsn(Type.getType("Lcom/androidquery/callback/AjaxStatus;")); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitVarInsn(ASTORE, 2); |
| Label label10 = new Label(); |
| methodVisitor.visitLabel(label10); |
| methodVisitor.visitLineNumber(577, label10); |
| methodVisitor.visitVarInsn(ALOAD, 1); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "callback", |
| "Ljava/lang/String;"); |
| methodVisitor.visitInsn(ICONST_1); |
| methodVisitor.visitInsn(ICONST_1); |
| methodVisitor.visitVarInsn(ALOAD, 2); |
| methodVisitor.visitFieldInsn( |
| GETSTATIC, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "DEFAULT_SIG", |
| "[Ljava/lang/Class;"); |
| methodVisitor.visitInsn(ICONST_3); |
| methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Object"); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_0); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "url", |
| "Ljava/lang/String;"); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_1); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "result", |
| "Ljava/lang/Object;"); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitInsn(DUP); |
| methodVisitor.visitInsn(ICONST_2); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "status", |
| "Lcom/androidquery/callback/AjaxStatus;"); |
| methodVisitor.visitInsn(AASTORE); |
| methodVisitor.visitMethodInsn( |
| INVOKESTATIC, |
| "com/androidquery/util/AQUtility", |
| "invokeHandler", |
| "(Ljava/lang/Object;Ljava/lang/String;ZZ[Ljava/lang/Class;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object;", |
| false); |
| methodVisitor.visitInsn(POP); |
| Label label11 = new Label(); |
| methodVisitor.visitLabel(label11); |
| methodVisitor.visitLineNumber(578, label11); |
| Label label12 = new Label(); |
| methodVisitor.visitJumpInsn(GOTO, label12); |
| methodVisitor.visitLabel(label0); |
| methodVisitor.visitLineNumber(580, label0); |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "url", |
| "Ljava/lang/String;"); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "result", |
| "Ljava/lang/Object;"); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "status", |
| "Lcom/androidquery/callback/AjaxStatus;"); |
| methodVisitor.visitMethodInsn( |
| INVOKEVIRTUAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "callback", |
| "(Ljava/lang/String;Ljava/lang/Object;Lcom/androidquery/callback/AjaxStatus;)V", |
| false); |
| methodVisitor.visitLabel(label1); |
| methodVisitor.visitLineNumber(581, label1); |
| methodVisitor.visitJumpInsn(GOTO, label12); |
| methodVisitor.visitLabel(label2); |
| methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"}); |
| methodVisitor.visitVarInsn(ASTORE, 1); |
| Label label13 = new Label(); |
| methodVisitor.visitLabel(label13); |
| methodVisitor.visitLineNumber(582, label13); |
| methodVisitor.visitVarInsn(ALOAD, 1); |
| methodVisitor.visitMethodInsn( |
| INVOKESTATIC, |
| "com/androidquery/util/AQUtility", |
| "report", |
| "(Ljava/lang/Throwable;)V", |
| false); |
| Label label14 = new Label(); |
| methodVisitor.visitLabel(label14); |
| methodVisitor.visitLineNumber(586, label14); |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
| methodVisitor.visitJumpInsn(GOTO, label12); |
| methodVisitor.visitLabel(label6); |
| methodVisitor.visitLineNumber(587, label6); |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "url", |
| "Ljava/lang/String;"); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "result", |
| "Ljava/lang/Object;"); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "status", |
| "Lcom/androidquery/callback/AjaxStatus;"); |
| methodVisitor.visitMethodInsn( |
| INVOKEVIRTUAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "skip", |
| "(Ljava/lang/String;Ljava/lang/Object;Lcom/androidquery/callback/AjaxStatus;)V", |
| false); |
| methodVisitor.visitLabel(label12); |
| methodVisitor.visitLineNumber(591, label12); |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitMethodInsn( |
| INVOKESPECIAL, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "filePut", |
| "()V", |
| false); |
| Label label15 = new Label(); |
| methodVisitor.visitLabel(label15); |
| methodVisitor.visitLineNumber(593, label15); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, "com/androidquery/callback/AbstractAjaxCallback", "blocked", "Z"); |
| Label label16 = new Label(); |
| methodVisitor.visitJumpInsn(IFNE, label16); |
| Label label17 = new Label(); |
| methodVisitor.visitLabel(label17); |
| methodVisitor.visitLineNumber(594, label17); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitFieldInsn( |
| GETFIELD, |
| "com/androidquery/callback/AbstractAjaxCallback", |
| "status", |
| "Lcom/androidquery/callback/AjaxStatus;"); |
| methodVisitor.visitMethodInsn( |
| INVOKEVIRTUAL, "com/androidquery/callback/AjaxStatus", "close", "()V", false); |
| methodVisitor.visitLabel(label16); |
| methodVisitor.visitLineNumber(597, label16); |
| methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null); |
| methodVisitor.visitVarInsn(ALOAD, 0); |
| methodVisitor.visitMethodInsn( |
| INVOKESPECIAL, "com/androidquery/callback/AbstractAjaxCallback", "wake", "()V", false); |
| Label label18 = new Label(); |
| methodVisitor.visitLabel(label18); |
| methodVisitor.visitLineNumber(598, label18); |
| methodVisitor.visitMethodInsn( |
| INVOKESTATIC, "com/androidquery/util/AQUtility", "debugNotify", "()V", false); |
| Label label19 = new Label(); |
| methodVisitor.visitLabel(label19); |
| methodVisitor.visitLineNumber(599, label19); |
| methodVisitor.visitInsn(RETURN); |
| Label label20 = new Label(); |
| methodVisitor.visitLabel(label20); |
| methodVisitor.visitLocalVariable( |
| "this", |
| "Lcom/androidquery/callback/AbstractAjaxCallback;", |
| "Lcom/androidquery/callback/AbstractAjaxCallback<TT;TK;>;", |
| label3, |
| label20, |
| 0); |
| methodVisitor.visitLocalVariable("handler", "Ljava/lang/Object;", null, label9, label11, 1); |
| methodVisitor.visitLocalVariable( |
| "AJAX_SIG", "[Ljava/lang/Class;", null, label10, label11, 2); |
| methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label13, label14, 1); |
| methodVisitor.visitMaxs(10, 3); |
| methodVisitor.visitEnd(); |
| } |
| classWriter.visitEnd(); |
| |
| return classWriter.toByteArray(); |
| } |
| } |
| } |