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); |