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 }
|