/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package da
import scala.xml.Node
import scala.xml.NodeSeq
import org.opalj.bi.ConstantPoolTag
/**
*
* @author Michael Eichberg
*/
case class CONSTANT_MethodHandle_info(
reference_kind: Int,
reference_index: Constant_Pool_Index
) extends Constant_Pool_Entry {
final override def size: Int = 1 + 1 + 2
override def Constant_Type_Value: ConstantPoolTag = bi.ConstantPoolTags.CONSTANT_MethodHandle
def refrenceKindAsNode(implicit cp: Constant_Pool): Node = {
{
reference_kind match {
case 1 => "REF_getField getfield C.f: T"
case 2 => "REF_getStatic getstatic C.f:T"
case 3 => "REF_putField putfield C.f:T"
case 4 => "REF_putStatic putstatic C.f:T"
case 5 => "REF_invokeVirtual invokevirtual C.m:(A*)T"
case 6 =>
cp(reference_index) match {
case _: CONSTANT_InterfaceMethodref_info =>
"REF_invokeStatic(interface) invokestatic C.m:(A*)T"
case _: CONSTANT_Methodref_info =>
"REF_invokeStatic(class) invokestatic C.m:(A*)T"
}
case 7 =>
cp(reference_index) match {
case _: CONSTANT_InterfaceMethodref_info =>
"REF_invokeSpecial(interface) invokeSpecial C.m:(A*)T"
case _: CONSTANT_Methodref_info =>
"REF_invokeSpecial(class) invokeSpecial C.m:(A*)T"
}
case 8 => "REF_newInvokeSpecial new C; dup; invokespecial C.:(A*)V"
case 9 => "REF_invokeInterface invokeinterface C.m:(A*)T"
}
}
}
override def asCPNode(implicit cp: Constant_Pool): Node =
{ this.getClass.getSimpleName }
(reference_kind={ reference_kind }
/*
{ refrenceKindAsNode }
*/,
reference_index={ reference_index }
/*
{ cp(reference_index).asCPNode }
*/)
override def asInstructionParameter(implicit cp: Constant_Pool): NodeSeq =
MethodHandle(kind={
refrenceKindAsNode
}, {
cp(reference_index).asInstructionParameter
})
override def toString(implicit cp: Constant_Pool): String = {
val reference_indexAsString = cp(reference_index).toString(cp)
s"CONSTANT_MethodHandle_info($reference_kind, $reference_indexAsString/*$reference_index */)"
}
}