All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opalj.br.cp.CONSTANT_MethodHandle_info.scala Maven / Gradle / Ivy

The newest version!
/* BSD 2-Clause License - see OPAL/LICENSE for details. */
package org.opalj
package br
package cp

import org.opalj.bi.ConstantPoolTags

/**
 * Represents a method handle.
 *
 * @author Michael Eichberg
 * @author Andre Pacak
 */
case class CONSTANT_MethodHandle_info(
        referenceKind:  Int,
        referenceIndex: Constant_Pool_Index
) extends Constant_Pool_Entry {

    override def tag: Int = ConstantPoolTags.CONSTANT_MethodHandle_ID

    override def asBootstrapArgument(cp: Constant_Pool): BootstrapArgument = asMethodHandle(cp)

    override def asConstantValue(cp: Constant_Pool): MethodHandle = asMethodHandle(cp)

    override def asMethodHandle(cp: Constant_Pool): MethodHandle = {
        (this.referenceKind: @scala.annotation.switch) match {

            case bi.REF_getField.referenceKind =>
                val (declaringType, name, fieldType) = cp(referenceIndex).asFieldref(cp)
                GetFieldMethodHandle(declaringType, name, fieldType)

            case bi.REF_getStatic.referenceKind =>
                val (declaringType, name, fieldType) = cp(referenceIndex).asFieldref(cp)
                GetStaticMethodHandle(declaringType, name, fieldType)

            case bi.REF_putField.referenceKind =>
                val (declaringType, name, fieldType) = cp(referenceIndex).asFieldref(cp)
                PutFieldMethodHandle(declaringType, name, fieldType)

            case bi.REF_putStatic.referenceKind =>
                val (declaringType, name, fieldType) = cp(referenceIndex).asFieldref(cp)
                PutStaticMethodHandle(declaringType, name, fieldType)

            case bi.REF_invokeVirtual.referenceKind =>
                val (receiverType, _, name, methodDescriptor) = cp(referenceIndex).asMethodref(cp)
                InvokeVirtualMethodHandle(receiverType, name, methodDescriptor)

            case bi.REF_invokeStatic.referenceKind =>
                val (receiverType, isInterface, name, methodDescriptor) = cp(referenceIndex).asMethodref(cp)
                InvokeStaticMethodHandle(receiverType, isInterface, name, methodDescriptor)

            case bi.REF_invokeSpecial.referenceKind =>
                val (receiverType, isInterface, name, methodDescriptor) = cp(referenceIndex).asMethodref(cp)
                InvokeSpecialMethodHandle(receiverType, isInterface, name, methodDescriptor)

            case bi.REF_newInvokeSpecial.referenceKind =>
                val (receiverType, _, name, methodDescriptor) = cp(referenceIndex).asMethodref(cp)
                assert(
                    receiverType.isObjectType,
                    "receiver for newInvokeSpecial must be objecttype"
                )
                assert(
                    name == "",
                    "invalid bytecode: newInvokeSpecial name must be  (see JVM spc 4.4.8)"
                )
                NewInvokeSpecialMethodHandle(receiverType.asObjectType, methodDescriptor)

            case bi.REF_invokeInterface.referenceKind =>
                val (receiverType, _, name, methodDescriptor) = cp(referenceIndex).asMethodref(cp)
                InvokeInterfaceMethodHandle(receiverType, name, methodDescriptor)

        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy