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

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

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

/**
 * Constant pool entry that represents method refs.
 *
 * The created `MethodRef` is cached.
 *
 * @author Michael Eichberg
 * @author Andre Pacak
 */
trait AsMethodref extends Constant_Pool_Entry {

    def class_index: Constant_Pool_Index

    def name_and_type_index: Constant_Pool_Index

    def isInterfaceMethodRef: Boolean

    // to cache the result
    @volatile private[this] var methodref: (ReferenceType, Boolean, String, MethodDescriptor) = null
    override def asMethodref(
        cp: Constant_Pool
    ): (ReferenceType, Boolean /* isInterface*/ , String, MethodDescriptor) = {
        // The following solution is sufficiently thread safe; i.e.,
        // it may happen that two or more methodref instances
        // are created, but these instances are guaranteed to
        // be equal (`==`).

        var methodref = this.methodref
        if (methodref eq null) {
            val nameAndType = cp(name_and_type_index).asNameAndType
            methodref =
                (
                    cp(class_index).asReferenceType(cp),
                    isInterfaceMethodRef,
                    nameAndType.name(cp),
                    nameAndType.methodDescriptor(cp)
                )
            this.methodref = methodref
        }
        methodref
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy