8009615: JvmtiClassFileReconstituter does not create BootstrapMethod attributes
Reviewed-by: coleenp, sspitsyn
This commit is contained in:
parent
768a1b55cf
commit
f4c589b895
@ -341,6 +341,44 @@ void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_n
|
|||||||
memcpy(writeable_address(length), annos->adr_at(0), length);
|
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
|
// Write InnerClasses attribute
|
||||||
// JVMSpec| InnerClasses_attribute {
|
// JVMSpec| InnerClasses_attribute {
|
||||||
@ -597,6 +635,9 @@ void JvmtiClassFileReconstituter::write_class_attributes() {
|
|||||||
if (anno != NULL) {
|
if (anno != NULL) {
|
||||||
++attr_count; // has RuntimeVisibleAnnotations attribute
|
++attr_count; // has RuntimeVisibleAnnotations attribute
|
||||||
}
|
}
|
||||||
|
if (cpool()->operands() != NULL) {
|
||||||
|
++attr_count;
|
||||||
|
}
|
||||||
|
|
||||||
write_u2(attr_count);
|
write_u2(attr_count);
|
||||||
|
|
||||||
@ -615,6 +656,9 @@ void JvmtiClassFileReconstituter::write_class_attributes() {
|
|||||||
if (anno != NULL) {
|
if (anno != NULL) {
|
||||||
write_annotations_attribute("RuntimeVisibleAnnotations", anno);
|
write_annotations_attribute("RuntimeVisibleAnnotations", anno);
|
||||||
}
|
}
|
||||||
|
if (cpool()->operands() != NULL) {
|
||||||
|
write_boostrapmethod_attribute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the method information portion of ClassFile structure
|
// Write the method information portion of ClassFile structure
|
||||||
|
@ -127,6 +127,7 @@ class JvmtiClassFileReconstituter : public JvmtiConstantPoolReconstituter {
|
|||||||
void write_signature_attribute(u2 generic_signaure_index);
|
void write_signature_attribute(u2 generic_signaure_index);
|
||||||
void write_attribute_name_index(const char* name);
|
void write_attribute_name_index(const char* name);
|
||||||
void write_annotations_attribute(const char* attr_name, AnnotationArray* annos);
|
void write_annotations_attribute(const char* attr_name, AnnotationArray* annos);
|
||||||
|
void write_boostrapmethod_attribute();
|
||||||
|
|
||||||
address writeable_address(size_t size);
|
address writeable_address(size_t size);
|
||||||
void write_u1(u1 x);
|
void write_u1(u1 x);
|
||||||
|
Loading…
Reference in New Issue
Block a user