Symbol addBootstrapMethod ( final Handle bootstrapMethodHandle , final Object ... bootstrapMethodArguments ) { ByteVector bootstrapMethodsAttribute = bootstrapMethods ; if ( bootstrapMethodsAttribute == null ) { bootstrapMethodsAttribute = bootstrapMethods = new ByteVector ( ) ; } // The bootstrap method arguments can be Constant_Dynamic values, which reference other // bootstrap methods. We must therefore add the bootstrap method arguments to the constant pool // and BootstrapMethods attribute first, so that the BootstrapMethods attribute is not modified // while adding the given bootstrap method to it, in the rest of this method. for ( Object bootstrapMethodArgument : bootstrapMethodArguments ) { addConstant ( bootstrapMethodArgument ) ; } // Write the bootstrap method in the BootstrapMethods table. This is necessary to be able to // compare it with existing ones, and will be reverted below if there is already a similar // bootstrap method. int bootstrapMethodOffset = bootstrapMethodsAttribute . length ; bootstrapMethodsAttribute . putShort ( addConstantMethodHandle ( bootstrapMethodHandle . getTag ( ) , bootstrapMethodHandle . getOwner ( ) , bootstrapMethodHandle . getName ( ) , bootstrapMethodHandle . getDesc ( ) , bootstrapMethodHandle . isInterface ( ) ) . index ) ; int numBootstrapArguments = bootstrapMethodArguments . length ; bootstrapMethodsAttribute . putShort ( numBootstrapArguments ) ; for ( Object bootstrapMethodArgument : bootstrapMethodArguments ) { bootstrapMethodsAttribute . putShort ( addConstant ( bootstrapMethodArgument ) . index ) ; } // Compute the length and the hash code of the bootstrap method. int bootstrapMethodlength = bootstrapMethodsAttribute . length - bootstrapMethodOffset ; int hashCode = bootstrapMethodHandle . hashCode ( ) ; for ( Object bootstrapMethodArgument : bootstrapMethodArguments ) { hashCode ^= bootstrapMethodArgument . hashCode ( ) ; } hashCode &= 0x7FFFFFFF ; // Add the bootstrap method to the symbol table or revert the above changes. return addBootstrapMethod ( bootstrapMethodOffset , bootstrapMethodlength , hashCode ) ; }
Adds a bootstrap method to the BootstrapMethods attribute of this symbol table . Does nothing if the BootstrapMethods already contains a similar bootstrap method .