// Copyright (c) 2018, 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 org.objectweb.asm.AnnotationVisitor;
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;

public class PhiDefinitionsTestDump implements Opcodes {

  private static final String SIMPLE_NAME = "PhiDefinitionsTest";
  static final String INTERNAL_NAME = "com/android/tools/r8/ir/" + SIMPLE_NAME;
  private static final String INNER_SIMPLE_NAME = "MethodWriter";
  static final String INNER_INTERNAL_NAME = INTERNAL_NAME + "$" + INNER_SIMPLE_NAME;

  // static String INTERNAL_NAME = "com/android/tools/r8/ir/PhiDefinitionsTest";
  // private static String INNER_SIMPLE_NAME = "MethodWriter";
  // static String INNER_INTERNAL_NAME = INTERNAL_NAME + '$' + INNER_SIMPLE_NAME;

  public static byte[] dump() {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;
    AnnotationVisitor av0;

    cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, INTERNAL_NAME, null, "java/lang/Object", null);

    cw.visitSource(SIMPLE_NAME + ".java", null);

    cw.visitInnerClass(INNER_INTERNAL_NAME, INTERNAL_NAME, INNER_SIMPLE_NAME, ACC_STATIC);

    method0(cw);
    method1(cw);
    method2(cw);
    nativeMethod(cw, "visitMethod", "()L" + INTERNAL_NAME + "$" + INNER_SIMPLE_NAME + ";");
    nativeMethod(cw, "cond", "()Z");
    nativeMethod(cw, "read", "(I)Ljava/lang/String;");
    nativeMethod(cw, "count", "(I)I");
    nativeMethod(cw, "count", "()I");
    cw.visitEnd();

    return cw.toByteArray();
  }

  private static void nativeMethod(ClassWriter cw, String name, String desc) {
    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PRIVATE + ACC_NATIVE, name, desc, null, null);
    mv.visitEnd();
  }

  private static void method0(ClassWriter cw) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    Label[] labels = new Label[2];
    for (int i = 0; i < labels.length; i++) {
      labels[i] = new Label();
    }
    mv.visitCode();
    mv.visitLabel(labels[0]);
    mv.visitLineNumber(6, labels[0]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(RETURN);
    mv.visitLabel(labels[1]);
    mv.visitLocalVariable("this", "L" + INTERNAL_NAME + ";", null, labels[0], labels[1], 0);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
  }

  private static void method1(ClassWriter cw) {
    MethodVisitor mv =
        cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
    Label[] labels = new Label[4];
    for (int i = 0; i < labels.length; i++) {
      labels[i] = new Label();
    }
    mv.visitCode();
    mv.visitLabel(labels[0]);
    mv.visitLineNumber(18, labels[0]);
    mv.visitLdcInsn(new Integer(42));
    mv.visitVarInsn(ISTORE, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitInsn(ARRAYLENGTH);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IF_ICMPLT, labels[1]);
    mv.visitLabel(labels[2]);
    mv.visitLineNumber(19, labels[2]);
    mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
    mv.visitVarInsn(ASTORE, 1);
    mv.visitTypeInsn(NEW, INTERNAL_NAME);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "<init>", "()V", false);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitInsn(ARRAYLENGTH);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "readMethod", "(I)I", false);
    mv.visitVarInsn(ISTORE, 2);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(I)V", false);
    mv.visitLabel(labels[1]);
    mv.visitLineNumber(21, labels[1]);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitInsn(RETURN);
    mv.visitLabel(labels[3]);
    mv.visitLocalVariable("args", "[Ljava/lang/String;", null, labels[0], labels[3], 0);
    mv.visitMaxs(2, 4);
    mv.visitEnd();
  }

  private static void method2(ClassWriter cw) {
    MethodVisitor mv = cw.visitMethod(ACC_PRIVATE, "readMethod", "(I)I", null, null);
    Label[] labels = new Label[31];
    for (int i = 0; i < labels.length; i++) {
      labels[i] = new Label();
    }
    mv.visitCode();
    mv.visitLabel(labels[0]);
    mv.visitLineNumber(24, labels[0]);
    mv.visitLdcInsn(new Integer(6));
    mv.visitInsn(POP);
    mv.visitLdcInsn(new Integer(6));
    mv.visitVarInsn(ISTORE, 2);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitLabel(labels[1]);
    mv.visitLineNumber(25, labels[1]);
    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitLabel(labels[2]);
    mv.visitLineNumber(26, labels[2]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "(I)I", false);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitLabel(labels[3]);
    mv.visitFrame(
        Opcodes.F_APPEND,
        3,
        new Object[] {Opcodes.INTEGER, Opcodes.INTEGER, Opcodes.INTEGER},
        0,
        null);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitJumpInsn(IFLE, labels[4]);
    mv.visitLabel(labels[5]);
    mv.visitLineNumber(27, labels[5]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "(I)I", false);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitLabel(labels[6]);
    mv.visitLineNumber(28, labels[6]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "()I", false);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitLabel(labels[7]);
    mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] {Opcodes.INTEGER}, 0, null);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitJumpInsn(IFLE, labels[8]);
    mv.visitLabel(labels[9]);
    mv.visitLineNumber(29, labels[9]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ILOAD, 5);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "read", "(I)Ljava/lang/String;", false);
    mv.visitInsn(POP);
    mv.visitLabel(labels[10]);
    mv.visitLineNumber(30, labels[10]);
    mv.visitInsn(ICONST_2);
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_2);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitLabel(labels[11]);
    mv.visitLineNumber(28, labels[11]);
    mv.visitInsn(ICONST_M1);
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_M1);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitJumpInsn(GOTO, labels[7]);
    mv.visitLabel(labels[8]);
    mv.visitLineNumber(32, labels[8]);
    mv.visitFrame(
        Opcodes.F_FULL,
        6,
        new Object[] {
          INTERNAL_NAME,
          Opcodes.INTEGER,
          Opcodes.INTEGER,
          Opcodes.INTEGER,
          Opcodes.TOP,
          Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitLdcInsn(new Integer(6));
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_4);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "(I)I", false);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 2);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitLabel(labels[12]);
    mv.visitLineNumber(26, labels[12]);
    mv.visitInsn(ICONST_M1);
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_M1);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitJumpInsn(GOTO, labels[3]);
    mv.visitLabel(labels[4]);
    mv.visitLineNumber(34, labels[4]);
    mv.visitFrame(
        Opcodes.F_FULL,
        5,
        new Object[] {INTERNAL_NAME, Opcodes.TOP, Opcodes.TOP, Opcodes.INTEGER, Opcodes.INTEGER},
        0,
        new Object[] {});
    mv.visitInsn(ICONST_2);
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_2);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitVarInsn(ILOAD, 3);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitLabel(labels[13]);
    mv.visitLineNumber(35, labels[13]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(
        INVOKESPECIAL,
        INTERNAL_NAME,
        "visitMethod",
        "()L" + INTERNAL_NAME + "$" + INNER_SIMPLE_NAME + ";",
        false);
    mv.visitVarInsn(ASTORE, 2);
    mv.visitLabel(labels[14]);
    mv.visitLineNumber(36, labels[14]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "cond", "()Z", false);
    mv.visitJumpInsn(IFEQ, labels[15]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "cond", "()Z", false);
    mv.visitJumpInsn(IFEQ, labels[15]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "cond", "()Z", false);
    mv.visitJumpInsn(IFEQ, labels[15]);
    mv.visitLabel(labels[16]);
    mv.visitLineNumber(37, labels[16]);
    mv.visitVarInsn(ALOAD, 2);
    mv.visitVarInsn(ASTORE, 3);
    mv.visitLabel(labels[17]);
    mv.visitLineNumber(38, labels[17]);
    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitLabel(labels[18]);
    mv.visitLineNumber(39, labels[18]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "()I", false);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitVarInsn(ALOAD, 3);
    mv.visitFieldInsn(GETFIELD, INNER_INTERNAL_NAME, "exceptionCount", "I");
    mv.visitVarInsn(ISTORE, 7);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitVarInsn(ILOAD, 7);
    mv.visitJumpInsn(IF_ICMPNE, labels[19]);
    mv.visitLabel(labels[20]);
    mv.visitLineNumber(40, labels[20]);
    mv.visitInsn(ICONST_1);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitLabel(labels[21]);
    mv.visitLineNumber(41, labels[21]);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "count", "()I", false);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitLabel(labels[22]);
    mv.visitFrame(
        Opcodes.F_FULL,
        7,
        new Object[] {
          INTERNAL_NAME,
          Opcodes.INTEGER,
          INNER_INTERNAL_NAME,
          INNER_INTERNAL_NAME,
          Opcodes.INTEGER,
          Opcodes.INTEGER,
          Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitJumpInsn(IFLT, labels[23]);
    mv.visitLabel(labels[24]);
    mv.visitLineNumber(42, labels[24]);
    mv.visitLdcInsn(new Integer(-2));
    mv.visitVarInsn(ISTORE, 7);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitVarInsn(ILOAD, 7);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 6);
    mv.visitLabel(labels[25]);
    mv.visitLineNumber(41, labels[25]);
    mv.visitInsn(ICONST_M1);
    mv.visitInsn(POP);
    mv.visitInsn(ICONST_M1);
    mv.visitVarInsn(ISTORE, 7);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ILOAD, 7);
    mv.visitInsn(IADD);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitJumpInsn(GOTO, labels[22]);
    mv.visitLabel(labels[23]);
    mv.visitFrame(
        Opcodes.F_FULL,
        7,
        new Object[] {
          INTERNAL_NAME,
          Opcodes.INTEGER,
          INNER_INTERNAL_NAME,
          INNER_INTERNAL_NAME,
          Opcodes.TOP,
          Opcodes.INTEGER,
          Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ILOAD, 6);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitJumpInsn(GOTO, labels[26]);
    mv.visitLabel(labels[19]);
    mv.visitFrame(
        Opcodes.F_FULL,
        6,
        new Object[] {
          INTERNAL_NAME,
          Opcodes.INTEGER,
          INNER_INTERNAL_NAME,
          INNER_INTERNAL_NAME,
          Opcodes.INTEGER,
          Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 5);
    mv.visitVarInsn(ISTORE, 4);
    mv.visitLabel(labels[26]);
    mv.visitLineNumber(45, labels[26]);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, INTERNAL_NAME, "cond", "()Z", false);
    mv.visitJumpInsn(IFEQ, labels[27]);
    mv.visitLabel(labels[28]);
    mv.visitLineNumber(46, labels[28]);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(labels[27]);
    mv.visitFrame(
        Opcodes.F_FULL,
        6,
        new Object[] {
          INTERNAL_NAME,
          Opcodes.INTEGER,
          INNER_INTERNAL_NAME,
          Opcodes.TOP,
          Opcodes.TOP,
          Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 5);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitJumpInsn(GOTO, labels[29]);
    mv.visitLabel(labels[15]);
    mv.visitFrame(
        Opcodes.F_FULL,
        5,
        new Object[] {
          INTERNAL_NAME, Opcodes.INTEGER, INNER_INTERNAL_NAME, Opcodes.TOP, Opcodes.INTEGER
        },
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 4);
    mv.visitVarInsn(ISTORE, 3);
    mv.visitLabel(labels[29]);
    mv.visitLineNumber(49, labels[29]);
    mv.visitFrame(
        Opcodes.F_FULL,
        4,
        new Object[] {INTERNAL_NAME, Opcodes.INTEGER, INNER_INTERNAL_NAME, Opcodes.INTEGER},
        0,
        new Object[] {});
    mv.visitVarInsn(ILOAD, 1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(labels[30]);
    mv.visitLocalVariable("u", "I", null, labels[0], labels[3], 1);
    mv.visitLocalVariable("exception", "I", null, labels[2], labels[3], 3);
    mv.visitLocalVariable("exception", "I", null, labels[3], labels[7], 4);
    mv.visitLocalVariable("j", "I", null, labels[7], labels[8], 4);
    mv.visitLocalVariable("i", "I", null, labels[3], labels[4], 1);
    mv.visitLocalVariable("exception", "I", null, labels[7], labels[4], 5);
    mv.visitLocalVariable("u", "I", null, labels[3], labels[13], 3);
    mv.visitLocalVariable("exception", "I", null, labels[4], labels[22], 4);
    mv.visitLocalVariable("j", "I", null, labels[22], labels[23], 4);
    mv.visitLocalVariable("exception", "I", null, labels[22], labels[19], 6);
    mv.visitLocalVariable("exception", "I", null, labels[19], labels[26], 4);
    mv.visitLocalVariable("sameExceptions", "Z", null, labels[18], labels[26], 5);
    mv.visitLocalVariable(
        "mw", "L" + INTERNAL_NAME + "$" + INNER_SIMPLE_NAME + ";", null, labels[17], labels[27], 3);
    mv.visitLocalVariable("sameExceptions", "Z", null, labels[26], labels[27], 4);
    mv.visitLocalVariable("exception", "I", null, labels[26], labels[15], 5);
    mv.visitLocalVariable("exception", "I", null, labels[15], labels[29], 4);
    mv.visitLocalVariable("this", "L" + INTERNAL_NAME + ";", null, labels[0], labels[30], 0);
    mv.visitLocalVariable("u", "I", null, labels[13], labels[30], 1);
    mv.visitLocalVariable("exception", "I", null, labels[29], labels[30], 3);
    mv.visitLocalVariable(
        "mv", "L" + INTERNAL_NAME + "$" + INNER_SIMPLE_NAME + ";", null, labels[14], labels[30], 2);
    mv.visitMaxs(3, 8);
    mv.visitEnd();
  }

  public static byte[] dumpInner() {

    ClassWriter cw = new ClassWriter(0);
    FieldVisitor fv;
    MethodVisitor mv;
    AnnotationVisitor av0;

    cw.visit(V1_8, ACC_SUPER, INNER_INTERNAL_NAME, null, "java/lang/Object", null);

    cw.visitSource(SIMPLE_NAME + ".java", null);

    cw.visitInnerClass(INNER_INTERNAL_NAME, INTERNAL_NAME, INNER_SIMPLE_NAME, ACC_STATIC);

    {
      fv = cw.visitField(ACC_PUBLIC, "exceptionCount", "I", null, null);
      fv.visitEnd();
    }
    {
      mv = cw.visitMethod(0, "<init>", "()V", null, null);
      mv.visitCode();
      Label l0 = new Label();
      mv.visitLabel(l0);
      mv.visitLineNumber(13, l0);
      mv.visitVarInsn(ALOAD, 0);
      mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
      mv.visitInsn(RETURN);
      Label l1 = new Label();
      mv.visitLabel(l1);
      mv.visitLocalVariable(
          "this", "L" + INTERNAL_NAME + "$" + INNER_SIMPLE_NAME + ";", null, l0, l1, 0);
      mv.visitMaxs(1, 1);
      mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
  }
}
