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

org.opalj.bi.reader.Signature_attributeReader.scala Maven / Gradle / Ivy

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

import java.io.DataInputStream

import org.opalj.log.OPALLogger

/**
 * Implements the template method to read signature attributes.
 *
 * The Signature attribute is an optional attribute in the
 * attributes table of a ClassFile, field_info or method_info structure.
 */
trait Signature_attributeReader extends AttributeReader with ClassFileReaderConfiguration {

    //
    // TYPE DEFINITIONS AND FACTORY METHODS
    //

    type Signature_attribute >: Null <: Attribute

    /**
     * Returns `true` if an exception is to be raised if an invalid signature is found.
     * The default is to just log the invalid signature and to otherwise ignore it.
     *
     * This method is intended to be overridden.
     *
     * @note This method was primarily introduced because we found many class files with
     *       invalid signatures AND the JVM also handles this case gracefully!
     *
     * @return `false`.
     */
    def throwIllegalArgumentException: Boolean = false

    /**
     * Creates a `Signature_attribute`.
     *
     * '''From the Specification'''
     *
     * The constant pool entry at signature_index must be a CONSTANT_Utf8_info
     * structure representing either a class signature, if this signature
     * attribute is an attribute of a ClassFile structure, a method type
     * signature, if this signature is an attribute of a method_info structure,
     * or a field type signature otherwise.
     */
    def Signature_attribute(
        constant_pool:        Constant_Pool,
        ap:                   AttributeParent,
        ap_name_index:        Constant_Pool_Index,
        ap_descriptor_index:  Constant_Pool_Index,
        attribute_name_index: Constant_Pool_Index,
        signature_index:      Constant_Pool_Index
    ): Signature_attribute

    //
    // IMPLEMENTATION
    //

    /**
     * The Signature attribute is an optional attribute in the
     * attributes table of a ClassFile, field_info or method_info structure.
     *
     * 
     * Signature_attribute {
     *    u2 attribute_name_index;
     *    u4 attribute_length;
     *    u2 signature_index;
     * }
     * 
* * Given that the Java Reflection API has extensive exception handling support * for handling wrong signatures, we at least provide support for the case * where the signature is syntactically invalid. In this case the attribute * is skipped. */ private[this] def parser( cp: Constant_Pool, ap: AttributeParent, ap_name_index: Constant_Pool_Index, ap_descriptor_index: Constant_Pool_Index, attribute_name_index: Constant_Pool_Index, in: DataInputStream ): Signature_attribute = { /*val attribute_length =*/ in.readInt val signature_index = in.readUnsignedShort try { Signature_attribute( cp, ap, ap_name_index, ap_descriptor_index, attribute_name_index, signature_index ) } catch { case iae: IllegalArgumentException ⇒ OPALLogger.error( "parsing bytecode", s"skipping ${ap.toString().toLowerCase()} signature: "+iae.getMessage ) if (throwIllegalArgumentException) throw iae else null } } registerAttributeReader(SignatureAttribute.Name → parser) }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy