diff --git a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp index 9300334729f3a1f1cdafead30b2feae558ed2ea0..2910570160087e2328d7b50996aec2726c3a0790 100644 --- a/src/share/vm/prims/jvmtiClassFileReconstituter.cpp +++ b/src/share/vm/prims/jvmtiClassFileReconstituter.cpp @@ -341,6 +341,44 @@ void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_n memcpy(writeable_address(length), annos->adr_at(0), length); } +// BootstrapMethods_attribute { +// u2 attribute_name_index; +// u4 attribute_length; +// u2 num_bootstrap_methods; +// { u2 bootstrap_method_ref; +// u2 num_bootstrap_arguments; +// u2 bootstrap_arguments[num_bootstrap_arguments]; +// } bootstrap_methods[num_bootstrap_methods]; +// } +void JvmtiClassFileReconstituter::write_boostrapmethod_attribute() { + Array* operands = cpool()->operands(); + write_attribute_name_index("BootstrapMethods"); + int num_bootstrap_methods = ConstantPool::operand_array_length(operands); + + // calculate length of attribute + int length = sizeof(u2); // num_boostrap_methods + for (int n = 0; n < num_bootstrap_methods; n++) { + u2 num_bootstrap_arguments = cpool()->operand_argument_count_at(n); + length += sizeof(u2); // bootstrap_method_ref + length += sizeof(u2); // num_bootstrap_arguments + length += sizeof(u2) * num_bootstrap_arguments; // bootstrap_arguments[num_bootstrap_arguments] + } + write_u4(length); + + // write attribute + write_u2(num_bootstrap_methods); + for (int n = 0; n < num_bootstrap_methods; n++) { + u2 bootstrap_method_ref = cpool()->operand_bootstrap_method_ref_index_at(n); + u2 num_bootstrap_arguments = cpool()->operand_argument_count_at(n); + write_u2(bootstrap_method_ref); + write_u2(num_bootstrap_arguments); + for (int arg = 0; arg < num_bootstrap_arguments; arg++) { + u2 bootstrap_argument = cpool()->operand_argument_index_at(n, arg); + write_u2(bootstrap_argument); + } + } +} + // Write InnerClasses attribute // JVMSpec| InnerClasses_attribute { @@ -597,6 +635,9 @@ void JvmtiClassFileReconstituter::write_class_attributes() { if (anno != NULL) { ++attr_count; // has RuntimeVisibleAnnotations attribute } + if (cpool()->operands() != NULL) { + ++attr_count; + } write_u2(attr_count); @@ -615,6 +656,9 @@ void JvmtiClassFileReconstituter::write_class_attributes() { if (anno != NULL) { write_annotations_attribute("RuntimeVisibleAnnotations", anno); } + if (cpool()->operands() != NULL) { + write_boostrapmethod_attribute(); + } } // Write the method information portion of ClassFile structure diff --git a/src/share/vm/prims/jvmtiClassFileReconstituter.hpp b/src/share/vm/prims/jvmtiClassFileReconstituter.hpp index 365bcd756f86bb32f6492f919a7918c476f90159..3a60229529a183a44c137db2f26e2f60b820b974 100644 --- a/src/share/vm/prims/jvmtiClassFileReconstituter.hpp +++ b/src/share/vm/prims/jvmtiClassFileReconstituter.hpp @@ -127,6 +127,7 @@ class JvmtiClassFileReconstituter : public JvmtiConstantPoolReconstituter { void write_signature_attribute(u2 generic_signaure_index); void write_attribute_name_index(const char* name); void write_annotations_attribute(const char* attr_name, AnnotationArray* annos); + void write_boostrapmethod_attribute(); address writeable_address(size_t size); void write_u1(u1 x);