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

org.opalj.br.instructions.MethodInvocationInstruction.scala Maven / Gradle / Ivy

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

/**
 * An instruction that invokes another method (does not consider invokedynamic
 * instructions).
 *
 * @author Michael Eichberg
 */
abstract class MethodInvocationInstruction extends InvocationInstruction {

    final override def isMethodInvocationInstruction: Boolean = true
    final override def asMethodInvocationInstruction: MethodInvocationInstruction = this

    /* abstract */ def declaringClass: ReferenceType

    def isInterfaceCall: Boolean

    /**
     * Returns the number of registers required to store the method's arguments
     * including (if required) the self reference "this".
     */
    def count: Int = {
        // c.f. JVM 8 Spec. Section 6.5.
        (if (isInstanceMethod) 1 else 0) + methodDescriptor.requiredRegisters
    }

    /**
     * Returns `true` if the called method is an instance method and virtual method
     * call resolution has to take place. I.e., if the underlying instruction is an
     * invokevirtual or an invokeinterface instruction.
     */
    /* abstract */ def isVirtualMethodCall: Boolean

    def asVirtualMethod: VirtualMethod = VirtualMethod(declaringClass, name, methodDescriptor)

    override def toString: String = {
        s"${this.getClass.getSimpleName}(${methodDescriptor.toJava(declaringClass.toJava, name)})"
    }

}

/**
 * Defines commonly used constants and an extractor method to match [[MethodInvocationInstruction]]
 * instructions.
 */
object MethodInvocationInstruction {

    def unapply(
        instruction: MethodInvocationInstruction
    ): Option[(ReferenceType, Boolean, String, MethodDescriptor)] = {
        Some((
            instruction.declaringClass,
            instruction.isInterfaceCall,
            instruction.name,
            instruction.methodDescriptor
        ))
    }

    val jvmExceptions = List(ObjectType.NullPointerException)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy