// Copyright (c) 2017, 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.code;

import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.OffsetToObjectMapping;
import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.conversion.IRBuilder;

/**
 * An invoke-polymorphic instruction used to invoke a method in a MethodHandle using either
 * MethodHandle.invoke or MethodHandle.invokeExact.
 */
public class InvokePolymorphic extends Format45cc {

  public static final int OPCODE = 0xfa;
  public static final String NAME = "InvokePolymorphic";
  public static final String SMALI_NAME = "invoke-polymorphic";

  InvokePolymorphic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) {
    super(high, stream, mapping.getMethodMap(), mapping.getProtosMap());
  }

  public InvokePolymorphic(
      int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) {
    super(A, BBBB, HHHH, C, D, E, F, G);
  }

  @Override
  public void buildIR(IRBuilder builder) {
    builder.addInvokeRegisters(
        Type.POLYMORPHIC, getMethod(), getProto(), A, new int[] {C, D, E, F, G});
  }

  @Override
  public String getName() {
    return NAME;
  }

  @Override
  public String getSmaliName() {
    return SMALI_NAME;
  }

  @Override
  public int getOpcode() {
    return OPCODE;
  }

  @Override
  public boolean canThrow() {
    return true;
  }
}
