Packages

trait InvokedynamicRewriting extends DeferredInvokedynamicResolution with BootstrapArgumentLoading

Provides support for rewriting Java 8/Scala lambda or method reference expressions that were compiled to org.opalj.br.instructions.INVOKEDYNAMIC instructions. This trait should be mixed in alongside a BytecodeReaderAndBinding, which extracts basic invokedynamic information from the BootstrapMethodTable.

Specifically, whenever an invokedynamic instruction is encountered that is the result of a lambda/method reference expression compiled by Oracle's JDK8, it creates a proxy class file that represents the synthetic object that the JVM generates after executing the invokedynamic call site. This proxy is then stored in the temporary ClassFile attribute SynthesizedClassFiles. All such ClassFiles will be picked up later for inclusion in the project.

Self Type
InvokedynamicRewriting with ClassFileBinding
Source
InvokedynamicRewriting.scala
See also

DismantlingInvokeDynamic for further information.

Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. InvokedynamicRewriting
  2. BootstrapArgumentLoading
  3. DeferredInvokedynamicResolution
  4. CodeBinding
  5. ConstantPoolBinding
  6. Constant_PoolReader
  7. Constant_PoolAbstractions
  8. AnyRef
  9. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. Protected

Type Members

  1. type CONSTANT_Class_info = cp.CONSTANT_Class_info
  2. type CONSTANT_Double_info = cp.CONSTANT_Double_info
  3. type CONSTANT_Dynamic_info = cp.CONSTANT_Dynamic_info
  4. type CONSTANT_Fieldref_info = cp.CONSTANT_Fieldref_info
  5. type CONSTANT_Float_info = cp.CONSTANT_Float_info
  6. type CONSTANT_Integer_info = cp.CONSTANT_Integer_info
  7. type CONSTANT_InterfaceMethodref_info = cp.CONSTANT_InterfaceMethodref_info
  8. type CONSTANT_InvokeDynamic_info = cp.CONSTANT_InvokeDynamic_info
  9. type CONSTANT_Long_info = cp.CONSTANT_Long_info
  10. type CONSTANT_MethodHandle_info = cp.CONSTANT_MethodHandle_info
  11. type CONSTANT_MethodType_info = cp.CONSTANT_MethodType_info
  12. type CONSTANT_Methodref_info = cp.CONSTANT_Methodref_info
  13. type CONSTANT_Module_info = cp.CONSTANT_Module_info
  14. type CONSTANT_NameAndType_info = cp.CONSTANT_NameAndType_info
  15. type CONSTANT_Package_info = cp.CONSTANT_Package_info
  16. type CONSTANT_String_info = cp.CONSTANT_String_info
  17. type CONSTANT_Utf8_info = cp.CONSTANT_Utf8_info
  18. abstract type ClassFile <: br.ClassFile
  19. final type Constant_Pool = Array[(InvokedynamicRewriting.this)#Constant_Pool_Entry]
    Definition Classes
    Constant_PoolAbstractions
  20. type Constant_Pool_Entry = cp.Constant_Pool_Entry
  21. final type Constant_Pool_Index = Int
    Definition Classes
    Constant_PoolAbstractions
  22. type DeferredActionsStore = Buffer[((InvokedynamicRewriting.this)#ClassFile) => (InvokedynamicRewriting.this)#ClassFile] with (InvokedynamicRewriting.this)#Constant_Pool_Entry

    A DeferredActionsStore stores all functions that need to perform post load actions.

    A DeferredActionsStore stores all functions that need to perform post load actions.

    One example is the resolution of references to attributes. (The constant pool is the only structure that is passed around and hence it is the only place where to store information/functions related to a specific class file).

    Definition Classes
    Constant_PoolAbstractions
  23. type Instructions = Array[Instruction]
    Definition Classes
    CodeBinding

Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##: Int
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  4. def CONSTANT_Class_info(i: Int): (InvokedynamicRewriting.this)#CONSTANT_Class_info
  5. def CONSTANT_Double_info(d: Double): (InvokedynamicRewriting.this)#CONSTANT_Double_info
  6. def CONSTANT_Dynamic_info(bootstrap_method_attr_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, name_and_type_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_Dynamic_info
  7. def CONSTANT_Fieldref_info(class_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, name_and_type_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_Fieldref_info
  8. def CONSTANT_Float_info(f: Float): (InvokedynamicRewriting.this)#CONSTANT_Float_info
  9. def CONSTANT_Integer_info(i: Int): (InvokedynamicRewriting.this)#CONSTANT_Integer_info
  10. def CONSTANT_InterfaceMethodref_info(class_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, name_and_type_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_InterfaceMethodref_info
  11. def CONSTANT_InvokeDynamic_info(bootstrap_method_attr_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, name_and_type_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_InvokeDynamic_info
  12. def CONSTANT_Long_info(l: Long): (InvokedynamicRewriting.this)#CONSTANT_Long_info
  13. def CONSTANT_MethodHandle_info(reference_kind: Int, reference_index: Int): (InvokedynamicRewriting.this)#CONSTANT_MethodHandle_info
  14. def CONSTANT_MethodType_info(descriptor_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_MethodType_info
  15. def CONSTANT_Methodref_info(class_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, name_and_type_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_Methodref_info
  16. def CONSTANT_Module_info(name_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_Module_info
  17. def CONSTANT_NameAndType_info(name_index: (InvokedynamicRewriting.this)#Constant_Pool_Index, descriptor_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_NameAndType_info
  18. def CONSTANT_Package_info(name_index: (InvokedynamicRewriting.this)#Constant_Pool_Index): (InvokedynamicRewriting.this)#CONSTANT_Package_info
  19. def CONSTANT_String_info(i: Int): (InvokedynamicRewriting.this)#CONSTANT_String_info
  20. def CONSTANT_Utf8_info(r: Array[Byte], s: String): (InvokedynamicRewriting.this)#CONSTANT_Utf8_info
  21. def Constant_Pool(in: DataInputStream): (InvokedynamicRewriting.this)#Constant_Pool
    Definition Classes
    Constant_PoolReader
  22. val ScalaRuntimeObject: ObjectType
  23. def applyDeferredActions(cp: (InvokedynamicRewriting.this)#Constant_Pool, classFile: (InvokedynamicRewriting.this)#ClassFile): (InvokedynamicRewriting.this)#ClassFile

    This method is called/needs to be called after the class file was completely loaded to perform class file specific transformations.

    This method is called/needs to be called after the class file was completely loaded to perform class file specific transformations.

    Definition Classes
    Constant_PoolReaderConstant_PoolAbstractions
  24. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  25. def clone(): AnyRef
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.CloneNotSupportedException]) @native() @IntrinsicCandidate()
  26. implicit val constantPoolEntryType: ClassTag[cp.Constant_Pool_Entry]
  27. implicit def cpIndexTocpEntry(index: (InvokedynamicRewriting.this)#Constant_Pool_Index)(implicit cp: (InvokedynamicRewriting.this)#Constant_Pool): (InvokedynamicRewriting.this)#Constant_Pool_Entry
    Definition Classes
    ConstantPoolBinding
  28. def createDeferredActionsStore(): (InvokedynamicRewriting.this)#DeferredActionsStore

    Creates a storage area for functions that will be called after the class file was completely loaded.

    Creates a storage area for functions that will be called after the class file was completely loaded. This makes it possible to register functions that are newly created for a special class file object to perform actions related to that specific class file object. For further information study the resolving process of invokedynamic instructions.

    Attributes
    protected[this]
    Definition Classes
    ConstantPoolBindingConstant_PoolReader
  29. def createObjectMethodsTarget(bootstrapArgs: BootstrapArguments, methodName: String, newMethodName: String, classFile: br.ClassFile): Option[(br.ClassFile, MethodDescriptor)]

    Creates the code required to perform the action of a method created by java.lang.runtime.ObjectMethods.bootstrap.

    Creates the code required to perform the action of a method created by java.lang.runtime.ObjectMethods.bootstrap.

    bootstrapArgs

    The arguments to the bootstrap method

    methodName

    Name of the represented method (either equals, toString or hashCode)

    newMethodName

    The name for the newly created method

    returns

    Either a tuple of the updated class file and the descriptor of the new method or None

    Attributes
    protected[this]
    Definition Classes
    BootstrapArgumentLoading
  30. def deferredInvokedynamicResolution(classFile: (InvokedynamicRewriting.this)#ClassFile, cp: (InvokedynamicRewriting.this)#Constant_Pool, methodNameIndex: (InvokedynamicRewriting.this)#Constant_Pool_Index, methodDescriptorIndex: (InvokedynamicRewriting.this)#Constant_Pool_Index, invokeDynamicInfo: (InvokedynamicRewriting.this)#CONSTANT_InvokeDynamic_info, instructions: Array[Instruction], pc: PC): (InvokedynamicRewriting.this)#ClassFile

    Resolves an org.opalj.br.instructions.INCOMPLETE_INVOKEDYNAMIC instruction using the BootstrapMethodTable of the class.

    Resolves an org.opalj.br.instructions.INCOMPLETE_INVOKEDYNAMIC instruction using the BootstrapMethodTable of the class.

    Deferred resolution is necessary since the BootstrapMethodTable – which is an attribute of the class file – is loaded after the methods.

    classFile

    The ClassFile with which the deferred action was registered.

    cp

    The class file's Constant_Pool.

    invokeDynamicInfo

    The org.opalj.br.instructions.INVOKEDYNAMIC instruction's constant pool entry.

    instructions

    This method's array of instructions.Instructions. (The array returned by the #Instructions method.)

    pc

    The program counter of the invokedynamic instruction.

    Definition Classes
    InvokedynamicRewritingDeferredInvokedynamicResolution
    Note

    This method is called (back) after the class file was completely loaded. Registration as a callback method happens whenever an invokedynamic instruction is found in a method's byte code.

    Overriding this Method

    To perform additional analyses on invokedynamic instructions, e.g., to fully resolve the call target, a subclass may override this method to do so. When you override this method, you should call this method (super.deferredResolveInvokedynamicResolution) to ensure that the default resolution is carried out.

  31. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  32. def equals(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef → Any
  33. def extractAltMetafactoryArguments(altMetafactoryArgs: Seq[BootstrapArgument]): (IndexedSeq[ReferenceType], IndexedSeq[MethodDescriptor], Boolean)

    Extract the parameters of altMetafactory calls.

    Extract the parameters of altMetafactory calls.

    CallSite altMetafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args)

    Object... args evaluates to the following argument list: int flags, int markerInterfaceCount, // IF flags has MARKERS set Class... markerInterfaces, // IF flags has MARKERS set int bridgeCount, // IF flags has BRIDGES set MethodType... bridges // IF flags has BRIDGES set

    flags is a bitwise OR of the desired flags FLAG_MARKERS, FLAG_BRIDGES and FLAG_SERIALIZABLE.

    altMetafactoryArgs

    Object... args of altMetafactory parameters

    returns

    A tuple containing an IndexSeq of markerInterfaces, bridges and a boolean indicating if the class must be serializable.

    See also

    https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/LambdaMetafactory.html#altMetafactory-java.lang.invoke.MethodHandles.Lookup-java.lang.String-java.lang.invoke.MethodType-java.lang.Object...-

  34. final def getClass(): Class[_ <: AnyRef]
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @IntrinsicCandidate()
  35. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native() @IntrinsicCandidate()
  36. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  37. def loadBootstrapArgument(argument: ConstantValue[_], instructions: InstructionsBuilder, classFile: br.ClassFile, boxed: Boolean = false): (Int, br.ClassFile)

    Generate instructions to load a constant argument for a bootstrap method.

    Generate instructions to load a constant argument for a bootstrap method.

    argument

    The argument to be loaded

    instructions

    The instruction builder the instructions are appended to

    classFile

    The class file the constant is in

    boxed

    If true, ensures the argument is of a reference type, boxing it if necessary

    returns

    The maximum stack height the generated instructions require and the (potentially new!) class file

    Definition Classes
    BootstrapArgumentLoading
  38. def loadDynamicConstant(bootstrapMethod: BootstrapMethod, name: String, descriptor: FieldType, instructions: InstructionsBuilder, classFile: br.ClassFile, boxed: Boolean = false): (Int, br.ClassFile)

    Generate instructions to load a dynamic constant.

    Generate instructions to load a dynamic constant.

    bootstrapMethod

    The constant's bootstrap method

    name

    The constant's name information, passed as the bootstrap method's 2. argument

    descriptor

    The constant's type, passed as the bootstrap method's 3. argument

    instructions

    The instruction builder the instructions are appended to

    classFile

    The class file the constant is in

    boxed

    If true, ensures the constant is of a reference type, boxing it if necessary

    returns

    The maximum stack height the generated instructions require and the (potentially new!) class file

    Definition Classes
    BootstrapArgumentLoading
  39. val logLambdaExpressionsRewrites: Boolean
  40. val logObjectMethodsRewrites: Boolean
  41. val logStringConcatRewrites: Boolean
  42. val logUnknownInvokeDynamics: Boolean
  43. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  44. def newTargetMethodName(cp: cp.Constant_Pool, surroundingMethodNameIndex: Int, surroundingMethodDescriptorIndex: Int, pc: Int, targetMethodName: String): String

    Generates a new, internal name for a method to be inserted.

    Generates a new, internal name for a method to be inserted.

    It follows the pattern: $targetMethodName${surroundingMethodName}{surroundingMethodDescriptor}:pc, where surroundingMethodDescriptor is the JVM descriptor of the method sanitized to not contain characters illegal in method names (replacing /, [, ;, < and > by $, ], :, _ and _ respectively) and where pc is the pc of the invokedynamic that is rewritten.

    Attributes
    protected[this]
    Definition Classes
    BootstrapArgumentLoading
  45. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  46. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @IntrinsicCandidate()
  47. val performInvokedynamicRewriting: Boolean
  48. def registerDeferredAction(cp: (InvokedynamicRewriting.this)#Constant_Pool)(deferredAction: ((InvokedynamicRewriting.this)#ClassFile) => (InvokedynamicRewriting.this)#ClassFile): Unit
    Definition Classes
    Constant_PoolReader
  49. def replaceChars(in: String, oldChars: String, newChars: String): String

    Replaces each of several characters in a String with a given corresponding character.

    Replaces each of several characters in a String with a given corresponding character.

    Attributes
    protected[this]
    Definition Classes
    BootstrapArgumentLoading
  50. def storeProxy(classFile: (InvokedynamicRewriting.this)#ClassFile, proxy: (InvokedynamicRewriting.this)#ClassFile, reason: Option[AnyRef]): (InvokedynamicRewriting.this)#ClassFile
  51. final def synchronized[T0](arg0: => T0): T0
    Definition Classes
    AnyRef
  52. def toString(): String
    Definition Classes
    AnyRef → Any
  53. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  54. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])
  55. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.InterruptedException])

Deprecated Value Members

  1. def finalize(): Unit
    Attributes
    protected[lang]
    Definition Classes
    AnyRef
    Annotations
    @throws(classOf[java.lang.Throwable]) @Deprecated
    Deprecated

Inherited from CodeBinding

Inherited from ConstantPoolBinding

Inherited from Constant_PoolReader

Inherited from AnyRef

Inherited from Any

Ungrouped