< prev index next >

src/share/vm/classfile/javaClasses.cpp

Print this page




 109     return ik->find_local_field(name_symbol, signature_symbol, fd);
 110 }
 111 
 112 // Helpful routine for computing field offsets at run time rather than hardcoding them
 113 static void
 114 compute_offset(int &dest_offset,
 115                Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 116                bool allow_super = false) {
 117   fieldDescriptor fd;
 118   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 119   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 120     ResourceMark rm;
 121     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
 122 #ifndef PRODUCT
 123     klass_oop->print();
 124     tty->print_cr("all fields:");
 125     for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
 126       tty->print_cr("  name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
 127     }
 128 #endif //PRODUCT
 129     fatal("Invalid layout of preloaded class");
 130   }
 131   dest_offset = fd.offset();
 132 }
 133 
 134 // Same as above but for "optional" offsets that might not be present in certain JDK versions
 135 static void
 136 compute_optional_offset(int& dest_offset,
 137                         Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 138                         bool allow_super = false) {
 139   fieldDescriptor fd;
 140   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 141   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 142     dest_offset = fd.offset();
 143   }
 144 }
 145 
 146 
 147 int java_lang_String::value_offset  = 0;
 148 int java_lang_String::offset_offset = 0;
 149 int java_lang_String::count_offset  = 0;


3589 int InjectedField::compute_offset() {
3590   Klass* klass_oop = klass();
3591   for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
3592     if (!may_be_java && !fs.access_flags().is_internal()) {
3593       // Only look at injected fields
3594       continue;
3595     }
3596     if (fs.name() == name() && fs.signature() == signature()) {
3597       return fs.offset();
3598     }
3599   }
3600   ResourceMark rm;
3601   tty->print_cr("Invalid layout of %s at %s/%s%s", InstanceKlass::cast(klass_oop)->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : "");
3602 #ifndef PRODUCT
3603   klass_oop->print();
3604   tty->print_cr("all fields:");
3605   for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
3606     tty->print_cr("  name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
3607   }
3608 #endif //PRODUCT
3609   fatal("Invalid layout of preloaded class");
3610   return -1;
3611 }
3612 
3613 void javaClasses_init() {
3614   JavaClasses::compute_offsets();
3615   JavaClasses::check_offsets();
3616   FilteredFieldsMap::initialize();  // must be done after computing offsets.
3617 }


 109     return ik->find_local_field(name_symbol, signature_symbol, fd);
 110 }
 111 
 112 // Helpful routine for computing field offsets at run time rather than hardcoding them
 113 static void
 114 compute_offset(int &dest_offset,
 115                Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 116                bool allow_super = false) {
 117   fieldDescriptor fd;
 118   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 119   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 120     ResourceMark rm;
 121     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
 122 #ifndef PRODUCT
 123     klass_oop->print();
 124     tty->print_cr("all fields:");
 125     for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
 126       tty->print_cr("  name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
 127     }
 128 #endif //PRODUCT
 129     vm_exit_during_initialization("Invalid layout of preloaded class");
 130   }
 131   dest_offset = fd.offset();
 132 }
 133 
 134 // Same as above but for "optional" offsets that might not be present in certain JDK versions
 135 static void
 136 compute_optional_offset(int& dest_offset,
 137                         Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 138                         bool allow_super = false) {
 139   fieldDescriptor fd;
 140   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 141   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 142     dest_offset = fd.offset();
 143   }
 144 }
 145 
 146 
 147 int java_lang_String::value_offset  = 0;
 148 int java_lang_String::offset_offset = 0;
 149 int java_lang_String::count_offset  = 0;


3589 int InjectedField::compute_offset() {
3590   Klass* klass_oop = klass();
3591   for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
3592     if (!may_be_java && !fs.access_flags().is_internal()) {
3593       // Only look at injected fields
3594       continue;
3595     }
3596     if (fs.name() == name() && fs.signature() == signature()) {
3597       return fs.offset();
3598     }
3599   }
3600   ResourceMark rm;
3601   tty->print_cr("Invalid layout of %s at %s/%s%s", InstanceKlass::cast(klass_oop)->external_name(), name()->as_C_string(), signature()->as_C_string(), may_be_java ? " (may_be_java)" : "");
3602 #ifndef PRODUCT
3603   klass_oop->print();
3604   tty->print_cr("all fields:");
3605   for (AllFieldStream fs(InstanceKlass::cast(klass_oop)); !fs.done(); fs.next()) {
3606     tty->print_cr("  name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
3607   }
3608 #endif //PRODUCT
3609   vm_exit_during_initialization("Invalid layout of preloaded class");
3610   return -1;
3611 }
3612 
3613 void javaClasses_init() {
3614   JavaClasses::compute_offsets();
3615   JavaClasses::check_offsets();
3616   FilteredFieldsMap::initialize();  // must be done after computing offsets.
3617 }
< prev index next >