Class ModifiedSystemClassRuntime

java.lang.Object
org.jacoco.core.runtime.AbstractRuntime
org.jacoco.core.runtime.ModifiedSystemClassRuntime
All Implemented Interfaces:
IExecutionDataAccessorGenerator, IRuntime

public class ModifiedSystemClassRuntime extends AbstractRuntime
This IRuntime implementation works with a modified system class. A new static field is added to a bootstrap class that will be used by instrumented classes. As the system class itself needs to be instrumented this runtime requires a Java agent.
  • Field Details

    • ACCESS_FIELD_TYPE

      private static final String ACCESS_FIELD_TYPE
      See Also:
    • systemClass

      private final Class<?> systemClass
    • systemClassName

      private final String systemClassName
    • accessFieldName

      private final String accessFieldName
  • Constructor Details

    • ModifiedSystemClassRuntime

      public ModifiedSystemClassRuntime(Class<?> systemClass, String accessFieldName)
      Creates a new runtime based on the given class and members.
      Parameters:
      systemClass - system class that contains the execution data
      accessFieldName - name of the public static runtime access field
  • Method Details

    • startup

      public void startup(RuntimeData data) throws Exception
      Description copied from class: AbstractRuntime
      Subclasses must call this method when overwriting it.
      Specified by:
      startup in interface IRuntime
      Overrides:
      startup in class AbstractRuntime
      Parameters:
      data - the execution data for this runtime
      Throws:
      Exception - any internal problem during startup
    • shutdown

      public void shutdown()
      Description copied from interface: IRuntime
      Allows the coverage runtime to cleanup internals. This class should be called when classes instrumented for this runtime are not used any more.
    • generateDataAccessor

      public int generateDataAccessor(long classid, String classname, int probecount, org.objectweb.asm.MethodVisitor mv)
      Description copied from interface: IExecutionDataAccessorGenerator
      This method generates the byte code required to obtain the coverage data structure for the class with the given id. Typically the instrumentation process will embed this code into a method that is called on class initialization. This method can be called at any time even outside the target VM. The generated code must push a boolean[] instance to the operand stack. Except this result object the generated code must not make any assumptions about the structure of the embedding method or class. The generated code must not use or allocate local variables.
      Parameters:
      classid - identifier of the class
      classname - VM class name
      probecount - probe count for this class
      mv - code output
      Returns:
      additional stack size required by the implementation, including the instance pushed to the stack
    • createFor

      public static IRuntime createFor(Instrumentation inst, String className) throws ClassNotFoundException
      Creates a new ModifiedSystemClassRuntime using the given class as the data container. Member is created with internal default name. The given class must not have been loaded before by the agent.
      Parameters:
      inst - instrumentation interface
      className - VM name of the class to use
      Returns:
      new runtime instance
      Throws:
      ClassNotFoundException - id the given class can not be found
    • createFor

      public static IRuntime createFor(Instrumentation inst, String className, String accessFieldName) throws ClassNotFoundException
      Creates a new ModifiedSystemClassRuntime using the given class as the data container. The given class must not have been loaded before by the agent.
      Parameters:
      inst - instrumentation interface
      className - VM name of the class to use
      accessFieldName - name of the added runtime access field
      Returns:
      new runtime instance
      Throws:
      ClassNotFoundException - if the given class can not be found
    • instrument

      public static byte[] instrument(byte[] source, String accessFieldName)
      Adds the static data field to the given class definition.
      Parameters:
      source - class definition source
      accessFieldName - name of the runtime access field
      Returns:
      instrumented version with added members
    • createDataField

      private static void createDataField(org.objectweb.asm.ClassVisitor visitor, String dataField)