--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Mon May 06 12:36:20 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp Tue May 07 01:25:21 2013 +0200
@@ -341,6 +341,44 @@
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<u2>* 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 @@
if (anno != NULL) {
++attr_count; // has RuntimeVisibleAnnotations attribute
}
+ if (cpool()->operands() != NULL) {
+ ++attr_count;
+ }
write_u2(attr_count);
@@ -615,6 +656,9 @@
if (anno != NULL) {
write_annotations_attribute("RuntimeVisibleAnnotations", anno);
}
+ if (cpool()->operands() != NULL) {
+ write_boostrapmethod_attribute();
+ }
}
// Write the method information portion of ClassFile structure
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp Mon May 06 12:36:20 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp Tue May 07 01:25:21 2013 +0200
@@ -127,6 +127,7 @@
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);