< prev index next >

src/hotspot/share/classfile/javaClasses.cpp

Print this page


 122 
 123 #define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \
 124   if (sid == vmSymbols::VM_SYMBOL_ENUM_NAME(klass)) {              \
 125     count++;                                                       \
 126     if (start == -1) start = klass##_##name##_enum;                \
 127   }
 128   ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD);
 129 #undef LOOKUP_INJECTED_FIELD
 130 
 131   if (start != -1) {
 132     *field_count = count;
 133     return _injected_fields + start;
 134   }
 135   return NULL;
 136 }
 137 
 138 
 139 // Helpful routine for computing field offsets at run time rather than hardcoding them
 140 // Finds local fields only, including static fields.  Static field offsets are from the
 141 // beginning of the mirror.
 142 void JavaClasses::compute_offset(int &dest_offset,
 143                                  InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol,
 144                                  bool is_static) {
 145   fieldDescriptor fd;
 146   if (ik == NULL) {
 147     ResourceMark rm;
 148     log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string());
 149     vm_exit_during_initialization("Invalid layout of well-known class");
 150   }
 151 
 152   if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) {
 153     ResourceMark rm;
 154     log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(),
 155                      name_symbol->as_C_string(), signature_symbol->as_C_string());
 156 #ifndef PRODUCT
 157     // Prints all fields and offsets
 158     Log(class) lt;
 159     LogStream ls(lt.error());
 160     ik->print_on(&ls);
 161 #endif //PRODUCT
 162     vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");
 163   }
 164   dest_offset = fd.offset();
 165 }
 166 
 167 // Overloading to pass name as a string.
 168 void JavaClasses::compute_offset(int& dest_offset, InstanceKlass* ik,
 169                                  const char* name_string, Symbol* signature_symbol,
 170                                  bool is_static) {
 171   TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string));
 172   if (name == NULL) {
 173     ResourceMark rm;
 174     log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string);
 175     vm_exit_during_initialization("Invalid layout of well-known class", ik->external_name());
 176   }
 177   compute_offset(dest_offset, ik, name, signature_symbol, is_static);
 178 }
 179 
 180 
 181 #if INCLUDE_CDS
 182 #define FIELD_SERIALIZE_OFFSET(offset, klass, name, signature, is_static) \
 183   f->do_u4((u4*)&offset)
 184 #endif
 185 
 186 #define FIELD_COMPUTE_OFFSET(offset, klass, name, signature, is_static) \
 187   JavaClasses::compute_offset(offset, klass, name, vmSymbols::signature(), is_static)
 188 
 189 
 190 // java_lang_String
 191 
 192 int java_lang_String::_value_offset;
 193 int java_lang_String::_hash_offset;
 194 int java_lang_String::_hashIsZero_offset;
 195 int java_lang_String::_coder_offset;
 196 
 197 bool java_lang_String::_initialized;
 198 
 199 bool java_lang_String::is_instance(oop obj) {
 200   return is_instance_inlined(obj);
 201 }
 202 
 203 #define STRING_FIELDS_DO(macro) \
 204   macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature, false); \
 205   macro(_hash_offset,  k, "hash",                  int_signature,        false); \
 206   macro(_hashIsZero_offset, k, "hashIsZero",       bool_signature,       false); \
 207   macro(_coder_offset, k, "coder",                 byte_signature,       false);




 122 
 123 #define LOOKUP_INJECTED_FIELD(klass, name, signature, may_be_java) \
 124   if (sid == vmSymbols::VM_SYMBOL_ENUM_NAME(klass)) {              \
 125     count++;                                                       \
 126     if (start == -1) start = klass##_##name##_enum;                \
 127   }
 128   ALL_INJECTED_FIELDS(LOOKUP_INJECTED_FIELD);
 129 #undef LOOKUP_INJECTED_FIELD
 130 
 131   if (start != -1) {
 132     *field_count = count;
 133     return _injected_fields + start;
 134   }
 135   return NULL;
 136 }
 137 
 138 
 139 // Helpful routine for computing field offsets at run time rather than hardcoding them
 140 // Finds local fields only, including static fields.  Static field offsets are from the
 141 // beginning of the mirror.
 142 static void compute_offset(int &dest_offset,
 143                            InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol,
 144                            bool is_static = false) {
 145   fieldDescriptor fd;
 146   if (ik == NULL) {
 147     ResourceMark rm;
 148     log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string());
 149     vm_exit_during_initialization("Invalid layout of well-known class");
 150   }
 151 
 152   if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) {
 153     ResourceMark rm;
 154     log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(),
 155                      name_symbol->as_C_string(), signature_symbol->as_C_string());
 156 #ifndef PRODUCT
 157     // Prints all fields and offsets
 158     Log(class) lt;
 159     LogStream ls(lt.error());
 160     ik->print_on(&ls);
 161 #endif //PRODUCT
 162     vm_exit_during_initialization("Invalid layout of well-known class: use -Xlog:class+load=info to see the origin of the problem class");
 163   }
 164   dest_offset = fd.offset();
 165 }
 166 
 167 // Overloading to pass name as a string.
 168 static void compute_offset(int& dest_offset, InstanceKlass* ik,
 169                            const char* name_string, Symbol* signature_symbol,
 170                            bool is_static = false) {
 171   TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string));
 172   if (name == NULL) {
 173     ResourceMark rm;
 174     log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string);
 175     vm_exit_during_initialization("Invalid layout of well-known class", ik->external_name());
 176   }
 177   compute_offset(dest_offset, ik, name, signature_symbol, is_static);
 178 }
 179 
 180 
 181 #if INCLUDE_CDS
 182 #define FIELD_SERIALIZE_OFFSET(offset, klass, name, signature, is_static) \
 183   f->do_u4((u4*)&offset)
 184 #endif
 185 
 186 #define FIELD_COMPUTE_OFFSET(offset, klass, name, signature, is_static) \
 187   compute_offset(offset, klass, name, vmSymbols::signature(), is_static)
 188 
 189 
 190 // java_lang_String
 191 
 192 int java_lang_String::_value_offset;
 193 int java_lang_String::_hash_offset;
 194 int java_lang_String::_hashIsZero_offset;
 195 int java_lang_String::_coder_offset;
 196 
 197 bool java_lang_String::_initialized;
 198 
 199 bool java_lang_String::is_instance(oop obj) {
 200   return is_instance_inlined(obj);
 201 }
 202 
 203 #define STRING_FIELDS_DO(macro) \
 204   macro(_value_offset, k, vmSymbols::value_name(), byte_array_signature, false); \
 205   macro(_hash_offset,  k, "hash",                  int_signature,        false); \
 206   macro(_hashIsZero_offset, k, "hashIsZero",       bool_signature,       false); \
 207   macro(_coder_offset, k, "coder",                 byte_signature,       false);


< prev index next >