< prev index next >

src/share/vm/prims/jvmtiClassFileReconstituter.cpp

Print this page




  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/symbolTable.hpp"
  27 #include "interpreter/bytecodeStream.hpp"
  28 #include "oops/fieldStreams.hpp"
  29 #include "prims/jvmtiClassFileReconstituter.hpp"
  30 #include "runtime/signature.hpp"
  31 #include "utilities/bytes.hpp"
  32 
  33 // FIXME: add Deprecated attribute
  34 // FIXME: fix Synthetic attribute
  35 // FIXME: per Serguei, add error return handling for ConstantPool::copy_cpool_bytes()
  36 
  37 
  38 // Write the field information portion of ClassFile structure
  39 // JVMSpec|     u2 fields_count;
  40 // JVMSpec|     field_info fields[fields_count];
  41 void JvmtiClassFileReconstituter::write_field_infos() {
  42   HandleMark hm(thread());
  43   Array<AnnotationArray*>* fields_anno = ikh()->fields_annotations();
  44   Array<AnnotationArray*>* fields_type_anno = ikh()->fields_type_annotations();
  45 
  46   // Compute the real number of Java fields
  47   int java_fields = ikh()->java_fields_count();
  48 
  49   write_u2(java_fields);
  50   for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) {
  51     AccessFlags access_flags = fs.access_flags();
  52     int name_index = fs.name_index();
  53     int signature_index = fs.signature_index();
  54     int initial_value_index = fs.initval_index();
  55     guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
  56     // int offset = ikh()->field_offset( index );
  57     int generic_signature_index = fs.generic_signature_index();
  58     AnnotationArray* anno = fields_anno == NULL ? NULL : fields_anno->at(fs.index());
  59     AnnotationArray* type_anno = fields_type_anno == NULL ? NULL : fields_type_anno->at(fs.index());
  60 
  61     // JVMSpec|   field_info {
  62     // JVMSpec|         u2 access_flags;
  63     // JVMSpec|         u2 name_index;
  64     // JVMSpec|         u2 descriptor_index;
  65     // JVMSpec|         u2 attributes_count;
  66     // JVMSpec|         attribute_info attributes[attributes_count];
  67     // JVMSpec|   }
  68 
  69     write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
  70     write_u2(name_index);
  71     write_u2(signature_index);
  72     int attr_count = 0;
  73     if (initial_value_index != 0) {
  74       ++attr_count;
  75     }
  76     if (access_flags.is_synthetic()) {


 261   int checked_exceptions_length = const_method->checked_exceptions_length();
 262   int size =
 263     2 +                                    // number_of_exceptions
 264     2 * checked_exceptions_length;         // exception_index_table
 265 
 266   write_attribute_name_index("Exceptions");
 267   write_u4(size);
 268   write_u2(checked_exceptions_length);
 269   for (int index = 0; index < checked_exceptions_length; index++) {
 270     write_u2(checked_exceptions[index].class_cp_index);
 271   }
 272 }
 273 
 274 // Write SourceFile attribute
 275 // JVMSpec|   SourceFile_attribute {
 276 // JVMSpec|     u2 attribute_name_index;
 277 // JVMSpec|     u4 attribute_length;
 278 // JVMSpec|     u2 sourcefile_index;
 279 // JVMSpec|   }
 280 void JvmtiClassFileReconstituter::write_source_file_attribute() {
 281   assert(ikh()->source_file_name() != NULL, "caller must check");
 282 
 283   write_attribute_name_index("SourceFile");
 284   write_u4(2);  // always length 2
 285   write_u2(symbol_to_cpool_index(ikh()->source_file_name()));
 286 }
 287 
 288 // Write SourceDebugExtension attribute
 289 // JSR45|   SourceDebugExtension_attribute {
 290 // JSR45|       u2 attribute_name_index;
 291 // JSR45|       u4 attribute_length;
 292 // JSR45|       u1 debug_extension[attribute_length];
 293 // JSR45|   }
 294 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
 295   assert(ikh()->source_debug_extension() != NULL, "caller must check");
 296 
 297   write_attribute_name_index("SourceDebugExtension");
 298   int len = (int)strlen(ikh()->source_debug_extension());
 299   write_u4(len);
 300   u1* ext = (u1*)ikh()->source_debug_extension();
 301   for (int i=0; i<len; i++) {
 302     write_u1(ext[i]);
 303   }
 304 }
 305 
 306 // Write (generic) Signature attribute
 307 // JVMSpec|   Signature_attribute {
 308 // JVMSpec|     u2 attribute_name_index;
 309 // JVMSpec|     u4 attribute_length;
 310 // JVMSpec|     u2 signature_index;
 311 // JVMSpec|   }
 312 void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature_index) {
 313   write_attribute_name_index("Signature");
 314   write_u4(2);  // always length 2
 315   write_u2(generic_signature_index);
 316 }
 317 
 318 // Compute the number of entries in the InnerClasses attribute
 319 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
 320   InnerClassesIterator iter(ikh());
 321   return iter.length();
 322 }
 323 
 324 // Write an annotation attribute.  The VM stores them in raw form, so all we need
 325 // to do is add the attrubute name and fill in the length.
 326 // JSR202|   *Annotations_attribute {
 327 // JSR202|     u2 attribute_name_index;
 328 // JSR202|     u4 attribute_length;
 329 // JSR202|     ...
 330 // JSR202|   }
 331 void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_name,
 332                                                               AnnotationArray* annos) {
 333   u4 length = annos->length();
 334   write_attribute_name_index(attr_name);
 335   write_u4(length);
 336   memcpy(writeable_address(length), annos->adr_at(0), length);
 337 }
 338 
 339 //  BootstrapMethods_attribute {
 340 //    u2 attribute_name_index;


 370     for (int arg = 0; arg < num_bootstrap_arguments; arg++) {
 371       u2 bootstrap_argument = cpool()->operand_argument_index_at(n, arg);
 372       write_u2(bootstrap_argument);
 373     }
 374   }
 375 }
 376 
 377 
 378 // Write InnerClasses attribute
 379 // JVMSpec|   InnerClasses_attribute {
 380 // JVMSpec|     u2 attribute_name_index;
 381 // JVMSpec|     u4 attribute_length;
 382 // JVMSpec|     u2 number_of_classes;
 383 // JVMSpec|     {  u2 inner_class_info_index;
 384 // JVMSpec|        u2 outer_class_info_index;
 385 // JVMSpec|        u2 inner_name_index;
 386 // JVMSpec|        u2 inner_class_access_flags;
 387 // JVMSpec|     } classes[number_of_classes];
 388 // JVMSpec|   }
 389 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
 390   InnerClassesIterator iter(ikh());
 391   guarantee(iter.length() != 0 && iter.length() == length,
 392             "caller must check");
 393   u2 entry_count = length / InstanceKlass::inner_class_next_offset;
 394   u4 size = 2 + entry_count * (2+2+2+2);
 395 
 396   write_attribute_name_index("InnerClasses");
 397   write_u4(size);
 398   write_u2(entry_count);
 399   for (; !iter.done(); iter.next()) {
 400     write_u2(iter.inner_class_info_index());
 401     write_u2(iter.outer_class_info_index());
 402     write_u2(iter.inner_name_index());
 403     write_u2(iter.inner_access_flags());
 404   }
 405 }
 406 
 407 // Write Synthetic attribute
 408 // JVMSpec|   Synthetic_attribute {
 409 // JVMSpec|     u2 attribute_name_index;
 410 // JVMSpec|     u4 attribute_length;


 601   }
 602   if (generic_signature_index != 0) {
 603     write_signature_attribute(generic_signature_index);
 604   }
 605   if (anno != NULL) {
 606     write_annotations_attribute("RuntimeVisibleAnnotations", anno);
 607   }
 608   if (param_anno != NULL) {
 609     write_annotations_attribute("RuntimeVisibleParameterAnnotations", param_anno);
 610   }
 611   if (type_anno != NULL) {
 612     write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
 613   }
 614 }
 615 
 616 // Write the class attributes portion of ClassFile structure
 617 // JVMSpec|     u2 attributes_count;
 618 // JVMSpec|     attribute_info attributes[attributes_count];
 619 void JvmtiClassFileReconstituter::write_class_attributes() {
 620   u2 inner_classes_length = inner_classes_attribute_length();
 621   Symbol* generic_signature = ikh()->generic_signature();
 622   AnnotationArray* anno = ikh()->class_annotations();
 623   AnnotationArray* type_anno = ikh()->class_type_annotations();
 624 
 625   int attr_count = 0;
 626   if (generic_signature != NULL) {
 627     ++attr_count;
 628   }
 629   if (ikh()->source_file_name() != NULL) {
 630     ++attr_count;
 631   }
 632   if (ikh()->source_debug_extension() != NULL) {
 633     ++attr_count;
 634   }
 635   if (inner_classes_length > 0) {
 636     ++attr_count;
 637   }
 638   if (anno != NULL) {
 639     ++attr_count;     // has RuntimeVisibleAnnotations attribute
 640   }
 641   if (type_anno != NULL) {
 642     ++attr_count;     // has RuntimeVisibleTypeAnnotations attribute
 643   }
 644   if (cpool()->operands() != NULL) {
 645     ++attr_count;
 646   }
 647 
 648   write_u2(attr_count);
 649 
 650   if (generic_signature != NULL) {
 651     write_signature_attribute(symbol_to_cpool_index(generic_signature));
 652   }
 653   if (ikh()->source_file_name() != NULL) {
 654     write_source_file_attribute();
 655   }
 656   if (ikh()->source_debug_extension() != NULL) {
 657     write_source_debug_extension_attribute();
 658   }
 659   if (inner_classes_length > 0) {
 660     write_inner_classes_attribute(inner_classes_length);
 661   }
 662   if (anno != NULL) {
 663     write_annotations_attribute("RuntimeVisibleAnnotations", anno);
 664   }
 665   if (type_anno != NULL) {
 666     write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
 667   }
 668   if (cpool()->operands() != NULL) {
 669     write_bootstrapmethod_attribute();
 670   }
 671 }
 672 
 673 // Write the method information portion of ClassFile structure
 674 // JVMSpec|     u2 methods_count;
 675 // JVMSpec|     method_info methods[methods_count];
 676 void JvmtiClassFileReconstituter::write_method_infos() {
 677   HandleMark hm(thread());
 678   Array<Method*>* methods = ikh()->methods();
 679   int num_methods = methods->length();
 680   int num_overpass = 0;
 681 
 682   // count the generated default interface methods
 683   // these will not be re-created by write_method_info
 684   // and should not be included in the total count
 685   for (int index = 0; index < num_methods; index++) {
 686     Method* method = methods->at(index);
 687     if (method->is_overpass()) {
 688       num_overpass++;
 689     }
 690   }
 691 
 692   write_u2(num_methods - num_overpass);
 693   if (JvmtiExport::can_maintain_original_method_order()) {
 694     int index;
 695     int original_index;
 696     intArray method_order(num_methods, num_methods, 0);
 697 
 698     // invert the method order mapping
 699     for (index = 0; index < num_methods; index++) {
 700       original_index = ikh()->method_ordering()->at(index);
 701       assert(original_index >= 0 && original_index < num_methods,
 702              "invalid original method index");
 703       method_order.at_put(original_index, index);
 704     }
 705 
 706     // write in original order
 707     for (original_index = 0; original_index < num_methods; original_index++) {
 708       index = method_order.at(original_index);
 709       methodHandle method(thread(), methods->at(index));
 710       write_method_info(method);
 711     }
 712   } else {
 713     // method order not preserved just dump the method infos
 714     for (int index = 0; index < num_methods; index++) {
 715       methodHandle method(thread(), methods->at(index));
 716       write_method_info(method);
 717     }
 718   }
 719 }
 720 
 721 void JvmtiClassFileReconstituter::write_class_file_format() {
 722   ReallocMark();
 723 
 724   // JVMSpec|   ClassFile {
 725   // JVMSpec|           u4 magic;
 726   write_u4(0xCAFEBABE);
 727 
 728   // JVMSpec|           u2 minor_version;
 729   // JVMSpec|           u2 major_version;
 730   write_u2(ikh()->minor_version());
 731   u2 major = ikh()->major_version();
 732   write_u2(major);
 733 
 734   // JVMSpec|           u2 constant_pool_count;
 735   // JVMSpec|           cp_info constant_pool[constant_pool_count-1];
 736   write_u2(cpool()->length());
 737   copy_cpool_bytes(writeable_address(cpool_size()));
 738 
 739   // JVMSpec|           u2 access_flags;
 740   write_u2(ikh()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
 741 
 742   // JVMSpec|           u2 this_class;
 743   // JVMSpec|           u2 super_class;
 744   write_u2(class_symbol_to_cpool_index(ikh()->name()));
 745   Klass* super_class = ikh()->super();
 746   write_u2(super_class == NULL? 0 :  // zero for java.lang.Object
 747                 class_symbol_to_cpool_index(super_class->name()));
 748 
 749   // JVMSpec|           u2 interfaces_count;
 750   // JVMSpec|           u2 interfaces[interfaces_count];
 751   Array<Klass*>* interfaces =  ikh()->local_interfaces();
 752   int num_interfaces = interfaces->length();
 753   write_u2(num_interfaces);
 754   for (int index = 0; index < num_interfaces; index++) {
 755     HandleMark hm(thread());
 756     instanceKlassHandle iikh(thread(), interfaces->at(index));
 757     write_u2(class_symbol_to_cpool_index(iikh->name()));
 758   }
 759 
 760   // JVMSpec|           u2 fields_count;
 761   // JVMSpec|           field_info fields[fields_count];
 762   write_field_infos();
 763 
 764   // JVMSpec|           u2 methods_count;
 765   // JVMSpec|           method_info methods[methods_count];
 766   write_method_infos();
 767 
 768   // JVMSpec|           u2 attributes_count;
 769   // JVMSpec|           attribute_info attributes[attributes_count];
 770   // JVMSpec|   } /* end ClassFile 8?
 771   write_class_attributes();
 772 }
 773 
 774 address JvmtiClassFileReconstituter::writeable_address(size_t size) {
 775   size_t used_size = _buffer_ptr - _buffer;
 776   if (size + used_size >= _buffer_size) {
 777     // compute the new buffer size: must be at least twice as big as before




  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/symbolTable.hpp"
  27 #include "interpreter/bytecodeStream.hpp"
  28 #include "oops/fieldStreams.hpp"
  29 #include "prims/jvmtiClassFileReconstituter.hpp"
  30 #include "runtime/signature.hpp"
  31 #include "utilities/bytes.hpp"
  32 
  33 // FIXME: add Deprecated attribute
  34 // FIXME: fix Synthetic attribute
  35 // FIXME: per Serguei, add error return handling for ConstantPool::copy_cpool_bytes()
  36 
  37 
  38 // Write the field information portion of ClassFile structure
  39 // JVMSpec|     u2 fields_count;
  40 // JVMSpec|     field_info fields[fields_count];
  41 void JvmtiClassFileReconstituter::write_field_infos() {
  42   HandleMark hm(thread());
  43   Array<AnnotationArray*>* fields_anno = ik()->fields_annotations();
  44   Array<AnnotationArray*>* fields_type_anno = ik()->fields_type_annotations();
  45 
  46   // Compute the real number of Java fields
  47   int java_fields = ik()->java_fields_count();
  48 
  49   write_u2(java_fields);
  50   for (JavaFieldStream fs(ik()); !fs.done(); fs.next()) {
  51     AccessFlags access_flags = fs.access_flags();
  52     int name_index = fs.name_index();
  53     int signature_index = fs.signature_index();
  54     int initial_value_index = fs.initval_index();
  55     guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
  56     // int offset = ik()->field_offset( index );
  57     int generic_signature_index = fs.generic_signature_index();
  58     AnnotationArray* anno = fields_anno == NULL ? NULL : fields_anno->at(fs.index());
  59     AnnotationArray* type_anno = fields_type_anno == NULL ? NULL : fields_type_anno->at(fs.index());
  60 
  61     // JVMSpec|   field_info {
  62     // JVMSpec|         u2 access_flags;
  63     // JVMSpec|         u2 name_index;
  64     // JVMSpec|         u2 descriptor_index;
  65     // JVMSpec|         u2 attributes_count;
  66     // JVMSpec|         attribute_info attributes[attributes_count];
  67     // JVMSpec|   }
  68 
  69     write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
  70     write_u2(name_index);
  71     write_u2(signature_index);
  72     int attr_count = 0;
  73     if (initial_value_index != 0) {
  74       ++attr_count;
  75     }
  76     if (access_flags.is_synthetic()) {


 261   int checked_exceptions_length = const_method->checked_exceptions_length();
 262   int size =
 263     2 +                                    // number_of_exceptions
 264     2 * checked_exceptions_length;         // exception_index_table
 265 
 266   write_attribute_name_index("Exceptions");
 267   write_u4(size);
 268   write_u2(checked_exceptions_length);
 269   for (int index = 0; index < checked_exceptions_length; index++) {
 270     write_u2(checked_exceptions[index].class_cp_index);
 271   }
 272 }
 273 
 274 // Write SourceFile attribute
 275 // JVMSpec|   SourceFile_attribute {
 276 // JVMSpec|     u2 attribute_name_index;
 277 // JVMSpec|     u4 attribute_length;
 278 // JVMSpec|     u2 sourcefile_index;
 279 // JVMSpec|   }
 280 void JvmtiClassFileReconstituter::write_source_file_attribute() {
 281   assert(ik()->source_file_name() != NULL, "caller must check");
 282 
 283   write_attribute_name_index("SourceFile");
 284   write_u4(2);  // always length 2
 285   write_u2(symbol_to_cpool_index(ik()->source_file_name()));
 286 }
 287 
 288 // Write SourceDebugExtension attribute
 289 // JSR45|   SourceDebugExtension_attribute {
 290 // JSR45|       u2 attribute_name_index;
 291 // JSR45|       u4 attribute_length;
 292 // JSR45|       u1 debug_extension[attribute_length];
 293 // JSR45|   }
 294 void JvmtiClassFileReconstituter::write_source_debug_extension_attribute() {
 295   assert(ik()->source_debug_extension() != NULL, "caller must check");
 296 
 297   write_attribute_name_index("SourceDebugExtension");
 298   int len = (int)strlen(ik()->source_debug_extension());
 299   write_u4(len);
 300   u1* ext = (u1*)ik()->source_debug_extension();
 301   for (int i=0; i<len; i++) {
 302     write_u1(ext[i]);
 303   }
 304 }
 305 
 306 // Write (generic) Signature attribute
 307 // JVMSpec|   Signature_attribute {
 308 // JVMSpec|     u2 attribute_name_index;
 309 // JVMSpec|     u4 attribute_length;
 310 // JVMSpec|     u2 signature_index;
 311 // JVMSpec|   }
 312 void JvmtiClassFileReconstituter::write_signature_attribute(u2 generic_signature_index) {
 313   write_attribute_name_index("Signature");
 314   write_u4(2);  // always length 2
 315   write_u2(generic_signature_index);
 316 }
 317 
 318 // Compute the number of entries in the InnerClasses attribute
 319 u2 JvmtiClassFileReconstituter::inner_classes_attribute_length() {
 320   InnerClassesIterator iter(ik());
 321   return iter.length();
 322 }
 323 
 324 // Write an annotation attribute.  The VM stores them in raw form, so all we need
 325 // to do is add the attrubute name and fill in the length.
 326 // JSR202|   *Annotations_attribute {
 327 // JSR202|     u2 attribute_name_index;
 328 // JSR202|     u4 attribute_length;
 329 // JSR202|     ...
 330 // JSR202|   }
 331 void JvmtiClassFileReconstituter::write_annotations_attribute(const char* attr_name,
 332                                                               AnnotationArray* annos) {
 333   u4 length = annos->length();
 334   write_attribute_name_index(attr_name);
 335   write_u4(length);
 336   memcpy(writeable_address(length), annos->adr_at(0), length);
 337 }
 338 
 339 //  BootstrapMethods_attribute {
 340 //    u2 attribute_name_index;


 370     for (int arg = 0; arg < num_bootstrap_arguments; arg++) {
 371       u2 bootstrap_argument = cpool()->operand_argument_index_at(n, arg);
 372       write_u2(bootstrap_argument);
 373     }
 374   }
 375 }
 376 
 377 
 378 // Write InnerClasses attribute
 379 // JVMSpec|   InnerClasses_attribute {
 380 // JVMSpec|     u2 attribute_name_index;
 381 // JVMSpec|     u4 attribute_length;
 382 // JVMSpec|     u2 number_of_classes;
 383 // JVMSpec|     {  u2 inner_class_info_index;
 384 // JVMSpec|        u2 outer_class_info_index;
 385 // JVMSpec|        u2 inner_name_index;
 386 // JVMSpec|        u2 inner_class_access_flags;
 387 // JVMSpec|     } classes[number_of_classes];
 388 // JVMSpec|   }
 389 void JvmtiClassFileReconstituter::write_inner_classes_attribute(int length) {
 390   InnerClassesIterator iter(ik());
 391   guarantee(iter.length() != 0 && iter.length() == length,
 392             "caller must check");
 393   u2 entry_count = length / InstanceKlass::inner_class_next_offset;
 394   u4 size = 2 + entry_count * (2+2+2+2);
 395 
 396   write_attribute_name_index("InnerClasses");
 397   write_u4(size);
 398   write_u2(entry_count);
 399   for (; !iter.done(); iter.next()) {
 400     write_u2(iter.inner_class_info_index());
 401     write_u2(iter.outer_class_info_index());
 402     write_u2(iter.inner_name_index());
 403     write_u2(iter.inner_access_flags());
 404   }
 405 }
 406 
 407 // Write Synthetic attribute
 408 // JVMSpec|   Synthetic_attribute {
 409 // JVMSpec|     u2 attribute_name_index;
 410 // JVMSpec|     u4 attribute_length;


 601   }
 602   if (generic_signature_index != 0) {
 603     write_signature_attribute(generic_signature_index);
 604   }
 605   if (anno != NULL) {
 606     write_annotations_attribute("RuntimeVisibleAnnotations", anno);
 607   }
 608   if (param_anno != NULL) {
 609     write_annotations_attribute("RuntimeVisibleParameterAnnotations", param_anno);
 610   }
 611   if (type_anno != NULL) {
 612     write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
 613   }
 614 }
 615 
 616 // Write the class attributes portion of ClassFile structure
 617 // JVMSpec|     u2 attributes_count;
 618 // JVMSpec|     attribute_info attributes[attributes_count];
 619 void JvmtiClassFileReconstituter::write_class_attributes() {
 620   u2 inner_classes_length = inner_classes_attribute_length();
 621   Symbol* generic_signature = ik()->generic_signature();
 622   AnnotationArray* anno = ik()->class_annotations();
 623   AnnotationArray* type_anno = ik()->class_type_annotations();
 624 
 625   int attr_count = 0;
 626   if (generic_signature != NULL) {
 627     ++attr_count;
 628   }
 629   if (ik()->source_file_name() != NULL) {
 630     ++attr_count;
 631   }
 632   if (ik()->source_debug_extension() != NULL) {
 633     ++attr_count;
 634   }
 635   if (inner_classes_length > 0) {
 636     ++attr_count;
 637   }
 638   if (anno != NULL) {
 639     ++attr_count;     // has RuntimeVisibleAnnotations attribute
 640   }
 641   if (type_anno != NULL) {
 642     ++attr_count;     // has RuntimeVisibleTypeAnnotations attribute
 643   }
 644   if (cpool()->operands() != NULL) {
 645     ++attr_count;
 646   }
 647 
 648   write_u2(attr_count);
 649 
 650   if (generic_signature != NULL) {
 651     write_signature_attribute(symbol_to_cpool_index(generic_signature));
 652   }
 653   if (ik()->source_file_name() != NULL) {
 654     write_source_file_attribute();
 655   }
 656   if (ik()->source_debug_extension() != NULL) {
 657     write_source_debug_extension_attribute();
 658   }
 659   if (inner_classes_length > 0) {
 660     write_inner_classes_attribute(inner_classes_length);
 661   }
 662   if (anno != NULL) {
 663     write_annotations_attribute("RuntimeVisibleAnnotations", anno);
 664   }
 665   if (type_anno != NULL) {
 666     write_annotations_attribute("RuntimeVisibleTypeAnnotations", type_anno);
 667   }
 668   if (cpool()->operands() != NULL) {
 669     write_bootstrapmethod_attribute();
 670   }
 671 }
 672 
 673 // Write the method information portion of ClassFile structure
 674 // JVMSpec|     u2 methods_count;
 675 // JVMSpec|     method_info methods[methods_count];
 676 void JvmtiClassFileReconstituter::write_method_infos() {
 677   HandleMark hm(thread());
 678   Array<Method*>* methods = ik()->methods();
 679   int num_methods = methods->length();
 680   int num_overpass = 0;
 681 
 682   // count the generated default interface methods
 683   // these will not be re-created by write_method_info
 684   // and should not be included in the total count
 685   for (int index = 0; index < num_methods; index++) {
 686     Method* method = methods->at(index);
 687     if (method->is_overpass()) {
 688       num_overpass++;
 689     }
 690   }
 691 
 692   write_u2(num_methods - num_overpass);
 693   if (JvmtiExport::can_maintain_original_method_order()) {
 694     int index;
 695     int original_index;
 696     intArray method_order(num_methods, num_methods, 0);
 697 
 698     // invert the method order mapping
 699     for (index = 0; index < num_methods; index++) {
 700       original_index = ik()->method_ordering()->at(index);
 701       assert(original_index >= 0 && original_index < num_methods,
 702              "invalid original method index");
 703       method_order.at_put(original_index, index);
 704     }
 705 
 706     // write in original order
 707     for (original_index = 0; original_index < num_methods; original_index++) {
 708       index = method_order.at(original_index);
 709       methodHandle method(thread(), methods->at(index));
 710       write_method_info(method);
 711     }
 712   } else {
 713     // method order not preserved just dump the method infos
 714     for (int index = 0; index < num_methods; index++) {
 715       methodHandle method(thread(), methods->at(index));
 716       write_method_info(method);
 717     }
 718   }
 719 }
 720 
 721 void JvmtiClassFileReconstituter::write_class_file_format() {
 722   ReallocMark();
 723 
 724   // JVMSpec|   ClassFile {
 725   // JVMSpec|           u4 magic;
 726   write_u4(0xCAFEBABE);
 727 
 728   // JVMSpec|           u2 minor_version;
 729   // JVMSpec|           u2 major_version;
 730   write_u2(ik()->minor_version());
 731   u2 major = ik()->major_version();
 732   write_u2(major);
 733 
 734   // JVMSpec|           u2 constant_pool_count;
 735   // JVMSpec|           cp_info constant_pool[constant_pool_count-1];
 736   write_u2(cpool()->length());
 737   copy_cpool_bytes(writeable_address(cpool_size()));
 738 
 739   // JVMSpec|           u2 access_flags;
 740   write_u2(ik()->access_flags().get_flags() & JVM_RECOGNIZED_CLASS_MODIFIERS);
 741 
 742   // JVMSpec|           u2 this_class;
 743   // JVMSpec|           u2 super_class;
 744   write_u2(class_symbol_to_cpool_index(ik()->name()));
 745   Klass* super_class = ik()->super();
 746   write_u2(super_class == NULL? 0 :  // zero for java.lang.Object
 747                 class_symbol_to_cpool_index(super_class->name()));
 748 
 749   // JVMSpec|           u2 interfaces_count;
 750   // JVMSpec|           u2 interfaces[interfaces_count];
 751   Array<Klass*>* interfaces =  ik()->local_interfaces();
 752   int num_interfaces = interfaces->length();
 753   write_u2(num_interfaces);
 754   for (int index = 0; index < num_interfaces; index++) {
 755     HandleMark hm(thread());
 756     InstanceKlass* iik = InstanceKlass::cast(interfaces->at(index));
 757     write_u2(class_symbol_to_cpool_index(iik->name()));
 758   }
 759 
 760   // JVMSpec|           u2 fields_count;
 761   // JVMSpec|           field_info fields[fields_count];
 762   write_field_infos();
 763 
 764   // JVMSpec|           u2 methods_count;
 765   // JVMSpec|           method_info methods[methods_count];
 766   write_method_infos();
 767 
 768   // JVMSpec|           u2 attributes_count;
 769   // JVMSpec|           attribute_info attributes[attributes_count];
 770   // JVMSpec|   } /* end ClassFile 8?
 771   write_class_attributes();
 772 }
 773 
 774 address JvmtiClassFileReconstituter::writeable_address(size_t size) {
 775   size_t used_size = _buffer_ptr - _buffer;
 776   if (size + used_size >= _buffer_size) {
 777     // compute the new buffer size: must be at least twice as big as before


< prev index next >