Class InstrSupport

java.lang.Object
org.jacoco.core.internal.instr.InstrSupport

public final class InstrSupport extends Object
Constants and utilities for byte code instrumentation.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    ASM API version
    (package private) static final int
    Access flags of the interface initialization method generated by JaCoCo.
    (package private) static final String
    Descriptor of the interface initialization method.
    (package private) static final String
    Name of the interface initialization method.
    static final int
    Access modifiers of the field that stores coverage information of a class.
    static final String
    Data type of the field that stores coverage information for a class ( boolean[]).
    static final int
    Access modifiers of the field that stores coverage information of a Java 8 interface.
    static final String
    Name of the field that stores coverage information of a class.
    static final int
    Access modifiers of the initialization method.
    static final String
    Descriptor of the initialization method.
    static final String
    Name of the initialization method.
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    private
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static void
    Ensures that the given member does not correspond to a internal member created by the instrumentation process.
    static org.objectweb.asm.ClassReader
    classReaderFor(byte[] b)
    Creates a ClassReader instance for given bytes of class even if its version not yet supported by ASM.
    static int
    getMajorVersion(byte[] b)
    Gets major version number from given bytes of class (unsigned two bytes at offset 6).
    static int
    getMajorVersion(org.objectweb.asm.ClassReader reader)
    Gets major version number from given ClassReader.
    static boolean
    needsFrames(int version)
    Determines whether the given class file version requires stackmap frames.
    static void
    push(org.objectweb.asm.MethodVisitor mv, int value)
    Generates the instruction to push the given int value on the stack.
    static void
    setMajorVersion(int majorVersion, byte[] b)
    Sets major version number in given bytes of class (unsigned two bytes at offset 6).

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • ASM_API_VERSION

      public static final int ASM_API_VERSION
      ASM API version
      See Also:
    • DATAFIELD_NAME

      public static final String DATAFIELD_NAME
      Name of the field that stores coverage information of a class.
      See Also:
    • DATAFIELD_ACC

      public static final int DATAFIELD_ACC
      Access modifiers of the field that stores coverage information of a class. According to Java Virtual Machine Specification §6.5.putstatic this field must not be final:

      if the field is final, it must be declared in the current class, and the instruction must occur in the <clinit> method of the current class.

      See Also:
    • DATAFIELD_INTF_ACC

      public static final int DATAFIELD_INTF_ACC
      Access modifiers of the field that stores coverage information of a Java 8 interface. According to Java Virtual Machine Specification §4.5:

      Fields of interfaces must have their ACC_PUBLIC, ACC_STATIC, and ACC_FINAL flags set; they may have their ACC_SYNTHETIC flag set and must not have any of the other flags.

      See Also:
    • DATAFIELD_DESC

      public static final String DATAFIELD_DESC
      Data type of the field that stores coverage information for a class ( boolean[]).
      See Also:
    • INITMETHOD_NAME

      public static final String INITMETHOD_NAME
      Name of the initialization method.
      See Also:
    • INITMETHOD_DESC

      public static final String INITMETHOD_DESC
      Descriptor of the initialization method.
      See Also:
    • INITMETHOD_ACC

      public static final int INITMETHOD_ACC
      Access modifiers of the initialization method.
      See Also:
    • CLINIT_NAME

      static final String CLINIT_NAME
      Name of the interface initialization method. According to Java Virtual Machine Specification §2.9:

      A class or interface has at most one class or interface initialization method and is initialized by invoking that method. The initialization method of a class or interface has the special name <clinit>, takes no arguments, and is void.

      Other methods named <clinit> in a class file are of no consequence. They are not class or interface initialization methods. They cannot be invoked by any Java Virtual Machine instruction and are never invoked by the Java Virtual Machine itself.

      In a class file whose version number is 51.0 or above, the method must additionally have its ACC_STATIC flag set in order to be the class or interface initialization method.

      This requirement was introduced in Java SE 7. In a class file whose version number is 50.0 or below, a method named <clinit> that is void and takes no arguments is considered the class or interface initialization method regardless of the setting of its ACC_STATIC flag.

      And §4.6:

      Class and interface initialization methods are called implicitly by the Java Virtual Machine. The value of their access_flags item is ignored except for the setting of the ACC_STRICT flag.

      See Also:
    • CLINIT_DESC

      static final String CLINIT_DESC
      Descriptor of the interface initialization method.
      See Also:
    • CLINIT_ACC

      static final int CLINIT_ACC
      Access flags of the interface initialization method generated by JaCoCo.
      See Also:
  • Constructor Details

    • InstrSupport

      private InstrSupport()
  • Method Details

    • getMajorVersion

      public static int getMajorVersion(byte[] b)
      Gets major version number from given bytes of class (unsigned two bytes at offset 6).
      Parameters:
      b - bytes of class
      Returns:
      major version of bytecode
      See Also:
    • setMajorVersion

      public static void setMajorVersion(int majorVersion, byte[] b)
      Sets major version number in given bytes of class (unsigned two bytes at offset 6).
      Parameters:
      majorVersion - major version of bytecode to set
      b - bytes of class
      See Also:
    • getMajorVersion

      public static int getMajorVersion(org.objectweb.asm.ClassReader reader)
      Gets major version number from given ClassReader.
      Parameters:
      reader - reader to get information about the class
      Returns:
      major version of bytecode
      See Also:
    • needsFrames

      public static boolean needsFrames(int version)
      Determines whether the given class file version requires stackmap frames.
      Parameters:
      version - class file version
      Returns:
      true if frames are required
    • assertNotInstrumented

      public static void assertNotInstrumented(String member, String owner) throws IllegalStateException
      Ensures that the given member does not correspond to a internal member created by the instrumentation process. This would mean that the class is already instrumented.
      Parameters:
      member - name of the member to check
      owner - name of the class owning the member
      Throws:
      IllegalStateException - thrown if the member has the same name than the instrumentation member
    • push

      public static void push(org.objectweb.asm.MethodVisitor mv, int value)
      Generates the instruction to push the given int value on the stack. Implementation taken from GeneratorAdapter.push(int).
      Parameters:
      mv - visitor to emit the instruction
      value - the value to be pushed on the stack.
    • classReaderFor

      public static org.objectweb.asm.ClassReader classReaderFor(byte[] b)
      Creates a ClassReader instance for given bytes of class even if its version not yet supported by ASM.
      Parameters:
      b - bytes of class
      Returns:
      ClassReader