// 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.debug;

import org.objectweb.asm.*;

public class IincDebugTestDump implements Opcodes {

  public static final String CLASS_NAME = "IincDebugTest";
  public static final String DESCRIPTOR = "L" + CLASS_NAME + ";";

  public static byte[] dump(int iRegister, int jRegister, boolean useInc) {

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;

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

    {
      mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
      mv.visitCode();
      Label methodStart = new Label();
      mv.visitLabel(methodStart);
      mv.visitLineNumber(12, methodStart);
      mv.visitInsn(ICONST_1);
      mv.visitVarInsn(ISTORE, iRegister);
      Label iStart = new Label();
      mv.visitLabel(iStart);
      mv.visitLineNumber(13, iStart);
      if (useInc) {
        assert iRegister == jRegister;
        mv.visitIincInsn(iRegister, 1);
      } else {
        mv.visitVarInsn(ILOAD, iRegister);
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IADD);
        mv.visitVarInsn(ISTORE, jRegister);
      }
      Label iEnd = new Label();
      mv.visitLabel(iEnd);
      mv.visitLineNumber(15, iEnd);
      mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
      mv.visitVarInsn(ILOAD, jRegister);
      mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(I)V", false);
      Label l3 = new Label();
      mv.visitLabel(l3);
      mv.visitLineNumber(16, l3);
      mv.visitInsn(RETURN);
      Label jEnd = new Label();
      mv.visitLabel(jEnd);
      mv.visitLocalVariable("i", "I", null, iStart, iEnd, iRegister);
      mv.visitLocalVariable("args", "[Ljava/lang/String;", null, methodStart, jEnd, 0);
      mv.visitLocalVariable("j", "I", null, iEnd, jEnd, jRegister);
      mv.visitMaxs(-1, -1);
      mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
  }
}
