< prev index next >

src/share/vm/classfile/javaClasses.cpp

Print this page




 130 #endif //PRODUCT
 131     vm_exit_during_initialization("Invalid layout of preloaded class: use -XX:+TraceClassLoading to see the origin of the problem class");
 132   }
 133   dest_offset = fd.offset();
 134 }
 135 
 136 // Same as above but for "optional" offsets that might not be present in certain JDK versions
 137 static void
 138 compute_optional_offset(int& dest_offset,
 139                         Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 140                         bool allow_super = false) {
 141   fieldDescriptor fd;
 142   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 143   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 144     dest_offset = fd.offset();
 145   }
 146 }
 147 
 148 
 149 int java_lang_String::value_offset  = 0;
 150 int java_lang_String::offset_offset = 0;
 151 int java_lang_String::count_offset  = 0;
 152 int java_lang_String::hash_offset   = 0;

 153 
 154 bool java_lang_String::initialized  = false;
 155 
 156 bool java_lang_String::is_instance(oop obj) {
 157   return is_instance_inlined(obj);
 158 }
 159 
 160 void java_lang_String::compute_offsets() {
 161   assert(!initialized, "offsets should be initialized only once");
 162 
 163   Klass* k = SystemDictionary::String_klass();
 164   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::char_array_signature());
 165   compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature());
 166   compute_optional_offset(count_offset,  k, vmSymbols::count_name(),  vmSymbols::int_signature());
 167   compute_optional_offset(hash_offset,   k, vmSymbols::hash_name(),   vmSymbols::int_signature());

 168 
 169   initialized = true;
 170 }
 171 
 172 Handle java_lang_String::basic_create(int length, TRAPS) {






















 173   assert(initialized, "Must be initialized");


 174   // Create the String object first, so there's a chance that the String
 175   // and the char array it points to end up in the same cache line.
 176   oop obj;
 177   obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
 178 
 179   // Create the char array.  The String object must be handlized here
 180   // because GC can happen as a result of the allocation attempt.
 181   Handle h_obj(THREAD, obj);
 182   typeArrayOop buffer;
 183     buffer = oopFactory::new_charArray(length, CHECK_NH);
 184 
 185   // Point the String at the char array
 186   obj = h_obj();
 187   set_value(obj, buffer);
 188   // No need to zero the offset, allocation zero'ed the entire String object
 189   assert(offset(obj) == 0, "initial String offset should be zero");
 190 //set_offset(obj, 0);
 191   set_count(obj, length);
 192 
 193   return h_obj;
 194 }
 195 
 196 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
 197   Handle h_obj = basic_create(length, CHECK_NH);

 198   typeArrayOop buffer = value(h_obj());






 199   for (int index = 0; index < length; index++) {
 200     buffer->char_at_put(index, unicode[index]);
 201   }














 202   return h_obj;
 203 }
 204 
 205 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
 206   Handle h_obj = create_from_unicode(unicode, length, CHECK_0);
 207   return h_obj();
 208 }
 209 
 210 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
 211   if (utf8_str == NULL) {
 212     return Handle();
 213   }
 214   int length = UTF8::unicode_length(utf8_str);
 215   Handle h_obj = basic_create(length, CHECK_NH);






 216   if (length > 0) {





 217     UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
 218   }


















 219   return h_obj;
 220 }
 221 
 222 oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
 223   Handle h_obj = create_from_str(utf8_str, CHECK_0);
 224   return h_obj();
 225 }
 226 
 227 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
 228   int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length());
 229   Handle h_obj = basic_create(length, CHECK_NH);









 230   if (length > 0) {
 231     UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length);





 232   }














 233   return h_obj;
 234 }
 235 
 236 // Converts a C string to a Java String based on current encoding
 237 Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
 238   assert(str != NULL, "bad arguments");
 239 
 240   typedef jstring (*to_java_string_fn_t)(JNIEnv*, const char *);
 241   static to_java_string_fn_t _to_java_string_fn = NULL;
 242 
 243   if (_to_java_string_fn == NULL) {
 244     void *lib_handle = os::native_java_library();
 245     _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "NewStringPlatform"));
 246     if (_to_java_string_fn == NULL) {
 247       fatal("NewStringPlatform missing");
 248     }
 249   }
 250 
 251   jstring js = NULL;
 252   { JavaThread* thread = (JavaThread*)THREAD;
 253     assert(thread->is_Java_thread(), "must be java thread");
 254     HandleMark hm(thread);
 255     ThreadToNativeFromVM ttn(thread);
 256     js = (_to_java_string_fn)(thread->jni_environment(), str);
 257   }
 258   return Handle(THREAD, JNIHandles::resolve(js));
 259 }
 260 
 261 // Converts a Java String to a native C string that can be used for
 262 // native OS calls.
 263 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
 264 
 265   typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
 266   static to_platform_string_fn_t _to_platform_string_fn = NULL;
 267 
 268   if (_to_platform_string_fn == NULL) {
 269     void *lib_handle = os::native_java_library();
 270     _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
 271     if (_to_platform_string_fn == NULL) {
 272       fatal("GetStringPlatformChars missing");
 273     }
 274   }
 275 
 276   char *native_platform_string;
 277   { JavaThread* thread = (JavaThread*)THREAD;
 278     assert(thread->is_Java_thread(), "must be java thread");
 279     JNIEnv *env = thread->jni_environment();
 280     jstring js = (jstring) JNIHandles::make_local(env, java_string());
 281     bool is_copy;
 282     HandleMark hm(thread);
 283     ThreadToNativeFromVM ttn(thread);
 284     native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
 285     assert(is_copy == JNI_TRUE, "is_copy value changed");
 286     JNIHandles::destroy_local(js);
 287   }
 288   return native_platform_string;
 289 }
 290 
 291 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
 292   oop          obj    = java_string();
 293   // Typical usage is to convert all '/' to '.' in string.
 294   typeArrayOop value  = java_lang_String::value(obj);
 295   int          offset = java_lang_String::offset(obj);
 296   int          length = java_lang_String::length(obj);

 297 
 298   // First check if any from_char exist
 299   int index; // Declared outside, used later
 300   for (index = 0; index < length; index++) {
 301     if (value->char_at(index + offset) == from_char) {


 302       break;
 303     }
 304   }
 305   if (index == length) {
 306     // No from_char, so do not copy.
 307     return java_string;
 308   }
 309 
 310   // Create new UNICODE buffer. Must handlize value because GC






















 311   // may happen during String and char array creation.
 312   typeArrayHandle h_value(THREAD, value);
 313   Handle string = basic_create(length, CHECK_NH);
 314 
 315   typeArrayOop from_buffer = h_value();
 316   typeArrayOop to_buffer   = java_lang_String::value(string());
 317 
 318   // Copy contents
 319   for (index = 0; index < length; index++) {
 320     jchar c = from_buffer->char_at(index + offset);

 321     if (c == from_char) {
 322       c = to_char;
 323     }

 324     to_buffer->char_at_put(index, c);



 325   }
 326   return string;
 327 }
 328 
 329 jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
 330   typeArrayOop value  = java_lang_String::value(java_string);
 331   int          offset = java_lang_String::offset(java_string);
 332                length = java_lang_String::length(java_string);

 333 
 334   jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
 335   if (result != NULL) {

 336     for (int index = 0; index < length; index++) {
 337       result[index] = value->char_at(index + offset);





 338     }
 339   } else {
 340     THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
 341   }
 342   return result;
 343 }
 344 
 345 unsigned int java_lang_String::hash_code(oop java_string) {
 346   int          length = java_lang_String::length(java_string);
 347   // Zero length string will hash to zero with String.hashCode() function.
 348   if (length == 0) return 0;
 349 
 350   typeArrayOop value  = java_lang_String::value(java_string);
 351   int          offset = java_lang_String::offset(java_string);
 352   return java_lang_String::hash_code(value->char_at_addr(offset), length);





 353 }
 354 
 355 char* java_lang_String::as_quoted_ascii(oop java_string) {
 356   typeArrayOop value  = java_lang_String::value(java_string);
 357   int          offset = java_lang_String::offset(java_string);
 358   int          length = java_lang_String::length(java_string);

 359 
 360   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
 361   if (base == NULL) return NULL;
 362 
 363   int result_length = UNICODE::quoted_ascii_length(base, length) + 1;
 364   char* result = NEW_RESOURCE_ARRAY(char, result_length);




 365   UNICODE::as_quoted_ascii(base, length, result, result_length);






 366   assert(result_length >= length + 1, "must not be shorter");
 367   assert(result_length == (int)strlen(result) + 1, "must match");
 368   return result;
 369 }
 370 
 371 unsigned int java_lang_String::hash_string(oop java_string) {
 372   int          length = java_lang_String::length(java_string);
 373   // Zero length string doesn't hash necessarily hash to zero.
 374   if (length == 0) {
 375     return StringTable::hash_string(NULL, 0);
 376   }
 377 
 378   typeArrayOop value  = java_lang_String::value(java_string);
 379   int          offset = java_lang_String::offset(java_string);
 380   return StringTable::hash_string(value->char_at_addr(offset), length);




 381 }
 382 
 383 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
 384   oop          obj    = java_string();
 385   typeArrayOop value  = java_lang_String::value(obj);
 386   int          offset = java_lang_String::offset(obj);
 387   int          length = java_lang_String::length(obj);
 388   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);


 389   Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
 390   return sym;







 391 }
 392 
 393 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
 394   typeArrayOop value  = java_lang_String::value(java_string);
 395   int          offset = java_lang_String::offset(java_string);
 396   int          length = java_lang_String::length(java_string);
 397   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);


 398   return SymbolTable::probe_unicode(base, length);






 399 }
 400 
 401 
 402 int java_lang_String::utf8_length(oop java_string) {
 403   typeArrayOop value  = java_lang_String::value(java_string);
 404   int          offset = java_lang_String::offset(java_string);
 405   int          length = java_lang_String::length(java_string);
 406   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
 407   return UNICODE::utf8_length(position, length);







 408 }
 409 
 410 char* java_lang_String::as_utf8_string(oop java_string) {
 411   typeArrayOop value  = java_lang_String::value(java_string);
 412   int          offset = java_lang_String::offset(java_string);
 413   int          length = java_lang_String::length(java_string);
 414   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);





 415   return UNICODE::as_utf8(position, length);

 416 }
 417 
 418 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
 419   typeArrayOop value  = java_lang_String::value(java_string);
 420   int          offset = java_lang_String::offset(java_string);
 421   int          length = java_lang_String::length(java_string);
 422   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);





 423   return UNICODE::as_utf8(position, length, buf, buflen);

 424 }
 425 
 426 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
 427   typeArrayOop value  = java_lang_String::value(java_string);
 428   int          offset = java_lang_String::offset(java_string);
 429   int          length = java_lang_String::length(java_string);
 430   assert(start + len <= length, "just checking");
 431   jchar* position = value->char_at_addr(offset + start);


 432   return UNICODE::as_utf8(position, len);




 433 }
 434 
 435 char* java_lang_String::as_utf8_string(oop java_string, int start, int len, char* buf, int buflen) {
 436   typeArrayOop value  = java_lang_String::value(java_string);
 437   int          offset = java_lang_String::offset(java_string);
 438   int          length = java_lang_String::length(java_string);
 439   assert(start + len <= length, "just checking");
 440   jchar* position = value->char_at_addr(offset + start);


 441   return UNICODE::as_utf8(position, len, buf, buflen);




 442 }
 443 
 444 bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
 445   assert(java_string->klass() == SystemDictionary::String_klass(),
 446          "must be java_string");
 447   typeArrayOop value  = java_lang_String::value(java_string);
 448   int          offset = java_lang_String::offset(java_string);
 449   int          length = java_lang_String::length(java_string);
 450   if (length != len) {
 451     return false;
 452   }


 453   for (int i = 0; i < len; i++) {
 454     if (value->char_at(i + offset) != chars[i]) {
 455       return false;
 456     }
 457   }







 458   return true;
 459 }
 460 
 461 bool java_lang_String::equals(oop str1, oop str2) {
 462   assert(str1->klass() == SystemDictionary::String_klass(),
 463          "must be java String");
 464   assert(str2->klass() == SystemDictionary::String_klass(),
 465          "must be java String");
 466   typeArrayOop value1  = java_lang_String::value(str1);
 467   int          offset1 = java_lang_String::offset(str1);
 468   int          length1 = java_lang_String::length(str1);

 469   typeArrayOop value2  = java_lang_String::value(str2);
 470   int          offset2 = java_lang_String::offset(str2);
 471   int          length2 = java_lang_String::length(str2);

 472 
 473   if (length1 != length2) {


 474     return false;
 475   }
 476   for (int i = 0; i < length1; i++) {
 477     if (value1->char_at(i + offset1) != value2->char_at(i + offset2)) {

 478       return false;
 479     }
 480   }
 481   return true;
 482 }
 483 
 484 void java_lang_String::print(oop java_string, outputStream* st) {
 485   assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string");
 486   typeArrayOop value  = java_lang_String::value(java_string);
 487 
 488   if (value == NULL) {
 489     // This can happen if, e.g., printing a String
 490     // object before its initializer has been called
 491     st->print("NULL");
 492     return;
 493   }
 494 
 495   int offset = java_lang_String::offset(java_string);
 496   int length = java_lang_String::length(java_string);

 497 
 498   st->print("\"");
 499   for (int index = 0; index < length; index++) {
 500     st->print("%c", value->char_at(index + offset));

 501   }
 502   st->print("\"");
 503 }
 504 
 505 
 506 static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPS) {
 507   assert(mirror.not_null() && fd->is_static(), "just checking");
 508   if (fd->has_initial_value()) {
 509     BasicType t = fd->field_type();
 510     switch (t) {
 511       case T_BYTE:
 512         mirror()->byte_field_put(fd->offset(), fd->int_initial_value());
 513               break;
 514       case T_BOOLEAN:
 515         mirror()->bool_field_put(fd->offset(), fd->int_initial_value());
 516               break;
 517       case T_CHAR:
 518         mirror()->char_field_put(fd->offset(), fd->int_initial_value());
 519               break;
 520       case T_SHORT:


1152   };
1153 }
1154 int java_lang_ThreadGroup::_parent_offset = 0;
1155 int java_lang_ThreadGroup::_name_offset = 0;
1156 int java_lang_ThreadGroup::_threads_offset = 0;
1157 int java_lang_ThreadGroup::_groups_offset = 0;
1158 int java_lang_ThreadGroup::_maxPriority_offset = 0;
1159 int java_lang_ThreadGroup::_destroyed_offset = 0;
1160 int java_lang_ThreadGroup::_daemon_offset = 0;
1161 int java_lang_ThreadGroup::_vmAllowSuspension_offset = 0;
1162 int java_lang_ThreadGroup::_nthreads_offset = 0;
1163 int java_lang_ThreadGroup::_ngroups_offset = 0;
1164 
1165 oop  java_lang_ThreadGroup::parent(oop java_thread_group) {
1166   assert(java_thread_group->is_oop(), "thread group must be oop");
1167   return java_thread_group->obj_field(_parent_offset);
1168 }
1169 
1170 // ("name as oop" accessor is not necessary)
1171 
1172 typeArrayOop java_lang_ThreadGroup::name(oop java_thread_group) {
1173   oop name = java_thread_group->obj_field(_name_offset);
1174   // ThreadGroup.name can be null
1175   return name == NULL ? (typeArrayOop)NULL : java_lang_String::value(name);



1176 }
1177 
1178 int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
1179   assert(java_thread_group->is_oop(), "thread group must be oop");
1180   return java_thread_group->int_field(_nthreads_offset);
1181 }
1182 
1183 objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {
1184   oop threads = java_thread_group->obj_field(_threads_offset);
1185   assert(threads != NULL, "threadgroups should have threads");
1186   assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code
1187   return objArrayOop(threads);
1188 }
1189 
1190 int java_lang_ThreadGroup::ngroups(oop java_thread_group) {
1191   assert(java_thread_group->is_oop(), "thread group must be oop");
1192   return java_thread_group->int_field(_ngroups_offset);
1193 }
1194 
1195 objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {


3524 // Check the hard-coded field offsets of all the classes in this file
3525 
3526 void JavaClasses::check_offsets() {
3527   bool valid = true;
3528   HandleMark hm;
3529 
3530 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3531   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
3532 
3533 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3534   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
3535 
3536 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3537   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
3538 
3539 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
3540   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
3541 
3542   // java.lang.String
3543 
3544   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
3545   if (java_lang_String::has_offset_field()) {
3546     CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
3547     CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
3548   }
3549   if (java_lang_String::has_hash_field()) {
3550     CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");



3551   }
3552 
3553   // java.lang.Class
3554 
3555   // Fake fields
3556   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
3557   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
3558 
3559   // java.lang.Throwable
3560 
3561   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
3562   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
3563   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
3564   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
3565 
3566   // Boxed primitive objects (java_lang_boxing_object)
3567 
3568   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
3569   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
3570   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");




 130 #endif //PRODUCT
 131     vm_exit_during_initialization("Invalid layout of preloaded class: use -XX:+TraceClassLoading to see the origin of the problem class");
 132   }
 133   dest_offset = fd.offset();
 134 }
 135 
 136 // Same as above but for "optional" offsets that might not be present in certain JDK versions
 137 static void
 138 compute_optional_offset(int& dest_offset,
 139                         Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
 140                         bool allow_super = false) {
 141   fieldDescriptor fd;
 142   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
 143   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
 144     dest_offset = fd.offset();
 145   }
 146 }
 147 
 148 
 149 int java_lang_String::value_offset  = 0;


 150 int java_lang_String::hash_offset   = 0;
 151 int java_lang_String::coder_offset  = 0;
 152 
 153 bool java_lang_String::initialized  = false;
 154 
 155 bool java_lang_String::is_instance(oop obj) {
 156   return is_instance_inlined(obj);
 157 }
 158 
 159 void java_lang_String::compute_offsets() {
 160   assert(!initialized, "offsets should be initialized only once");
 161 
 162   Klass* k = SystemDictionary::String_klass();
 163   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::byte_array_signature());


 164   compute_optional_offset(hash_offset,   k, vmSymbols::hash_name(),   vmSymbols::int_signature());
 165   compute_optional_offset(coder_offset,  k, vmSymbols::coder_name(),  vmSymbols::byte_signature());
 166 
 167   initialized = true;
 168 }
 169 
 170 class CompactStringsFixup : public FieldClosure {
 171 private:
 172   bool _value;
 173 
 174 public:
 175   CompactStringsFixup(bool value) : _value(value) {}
 176 
 177   void do_field(fieldDescriptor* fd) {
 178     if (fd->name() == vmSymbols::compact_strings_name()) {
 179       oop mirror = fd->field_holder()->java_mirror();
 180       assert(fd->field_holder() == SystemDictionary::String_klass(), "Should be String");
 181       assert(mirror != NULL, "String must have mirror already");
 182       mirror->bool_field_put(fd->offset(), _value);
 183     }
 184   }
 185 };
 186 
 187 void java_lang_String::set_compact_strings(bool value) {
 188   CompactStringsFixup fix(value);
 189   InstanceKlass::cast(SystemDictionary::String_klass())->do_local_static_fields(&fix);
 190 }
 191 
 192 Handle java_lang_String::basic_create(int length, bool is_latin1, TRAPS) {
 193   assert(initialized, "Must be initialized");
 194   assert(CompactStrings || !is_latin1, "Must be UTF16 without CompactStrings");
 195 
 196   // Create the String object first, so there's a chance that the String
 197   // and the char array it points to end up in the same cache line.
 198   oop obj;
 199   obj = InstanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
 200 
 201   // Create the char array.  The String object must be handlized here
 202   // because GC can happen as a result of the allocation attempt.
 203   Handle h_obj(THREAD, obj);
 204   int arr_length = is_latin1 ? length : length << 1; // 2 bytes per UTF16.
 205   typeArrayOop buffer = oopFactory::new_byteArray(arr_length, CHECK_NH);;
 206 
 207   // Point the String at the char array
 208   obj = h_obj();
 209   set_value(obj, buffer);
 210   // No need to zero the offset, allocation zero'ed the entire String object
 211   set_coder(obj, is_latin1 ? CODER_LATIN1 : CODER_UTF16);



 212   return h_obj;
 213 }
 214 
 215 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
 216   bool is_latin1 = CompactStrings && UNICODE::is_latin1(unicode, length);
 217   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
 218   typeArrayOop buffer = value(h_obj());
 219   assert(TypeArrayKlass::cast(buffer->klass())->element_type() == T_BYTE, "only byte[]");
 220   if (is_latin1) {
 221     for (int index = 0; index < length; index++) {
 222       buffer->byte_at_put(index, (jbyte)unicode[index]);
 223     }
 224   } else {
 225     for (int index = 0; index < length; index++) {
 226       buffer->char_at_put(index, unicode[index]);
 227     }
 228   }
 229 
 230 #ifdef ASSERT
 231   {
 232     ResourceMark rm;
 233     char* expected = UNICODE::as_utf8(unicode, length);
 234     char* actual = as_utf8_string(h_obj());
 235     if (strcmp(expected, actual) != 0) {
 236       tty->print_cr("Unicode conversion failure: %s --> %s", expected, actual);
 237       ShouldNotReachHere();
 238     }
 239   }
 240 #endif
 241 
 242   return h_obj;
 243 }
 244 
 245 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
 246   Handle h_obj = create_from_unicode(unicode, length, CHECK_0);
 247   return h_obj();
 248 }
 249 
 250 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
 251   if (utf8_str == NULL) {
 252     return Handle();
 253   }
 254   bool has_multibyte, is_latin1;
 255   int length = UTF8::unicode_length(utf8_str, is_latin1, has_multibyte);
 256   if (!CompactStrings) {
 257     has_multibyte = true;
 258     is_latin1 = false;
 259   }
 260 
 261   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
 262   if (length > 0) {
 263     if (!has_multibyte) {
 264       strncpy((char*)value(h_obj())->byte_at_addr(0), utf8_str, length);
 265     } else if (is_latin1) {
 266       UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
 267     } else {
 268       UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
 269     }
 270   }
 271 
 272 #ifdef ASSERT
 273   // This check is too strict because the input string is not necessarily valid UTF8.
 274   // For example, it may be created with arbitrary content via jni_NewStringUTF.
 275   /*
 276   {
 277     ResourceMark rm;
 278     const char* expected = utf8_str;
 279     char* actual = as_utf8_string(h_obj());
 280     if (strcmp(expected, actual) != 0) {
 281       tty->print_cr("String conversion failure: %s --> %s", expected, actual);
 282       ShouldNotReachHere();
 283     }
 284   }
 285   */
 286 #endif
 287 
 288   return h_obj;
 289 }
 290 
 291 oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
 292   Handle h_obj = create_from_str(utf8_str, CHECK_0);
 293   return h_obj();
 294 }
 295 
 296 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
 297   const char* utf8_str = (char*)symbol->bytes();
 298   int utf8_len = symbol->utf8_length();
 299 
 300   bool has_multibyte, is_latin1;
 301   int length = UTF8::unicode_length(utf8_str, utf8_len, is_latin1, has_multibyte);
 302   if (!CompactStrings) {
 303     has_multibyte = true;
 304     is_latin1 = false;
 305   }
 306 
 307   Handle h_obj = basic_create(length, is_latin1, CHECK_NH);
 308   if (length > 0) {
 309     if (!has_multibyte) {
 310       strncpy((char*)value(h_obj())->byte_at_addr(0), utf8_str, length);
 311     } else if (is_latin1) {
 312       UTF8::convert_to_unicode(utf8_str, value(h_obj())->byte_at_addr(0), length);
 313     } else {
 314       UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
 315     }
 316   }
 317 
 318 #ifdef ASSERT
 319   {
 320     ResourceMark rm;
 321     const char* expected = symbol->as_utf8();
 322     char* actual = as_utf8_string(h_obj());
 323     if (strncmp(expected, actual, utf8_len) != 0) {
 324       tty->print_cr("Symbol conversion failure: %s --> %s", expected, actual);
 325       ShouldNotReachHere();
 326     }
 327   }
 328 #endif
 329 
 330   return h_obj;
 331 }
 332 
 333 // Converts a C string to a Java String based on current encoding
 334 Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
 335   assert(str != NULL, "bad arguments");
 336 
 337   typedef jstring (*to_java_string_fn_t)(JNIEnv*, const char *);
 338   static to_java_string_fn_t _to_java_string_fn = NULL;
 339 
 340   if (_to_java_string_fn == NULL) {
 341     void *lib_handle = os::native_java_library();
 342     _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "NewStringPlatform"));
 343     if (_to_java_string_fn == NULL) {
 344       fatal("NewStringPlatform missing");
 345     }
 346   }
 347 
 348   jstring js = NULL;
 349   { JavaThread* thread = (JavaThread*)THREAD;
 350     assert(thread->is_Java_thread(), "must be java thread");
 351     HandleMark hm(thread);
 352     ThreadToNativeFromVM ttn(thread);
 353     js = (_to_java_string_fn)(thread->jni_environment(), str);
 354   }
 355   return Handle(THREAD, JNIHandles::resolve(js));
 356 }
 357 
 358 // Converts a Java String to a native C string that can be used for
 359 // native OS calls.
 360 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {

 361   typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
 362   static to_platform_string_fn_t _to_platform_string_fn = NULL;
 363 
 364   if (_to_platform_string_fn == NULL) {
 365     void *lib_handle = os::native_java_library();
 366     _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
 367     if (_to_platform_string_fn == NULL) {
 368       fatal("GetStringPlatformChars missing");
 369     }
 370   }
 371 
 372   char *native_platform_string;
 373   { JavaThread* thread = (JavaThread*)THREAD;
 374     assert(thread->is_Java_thread(), "must be java thread");
 375     JNIEnv *env = thread->jni_environment();
 376     jstring js = (jstring) JNIHandles::make_local(env, java_string());
 377     bool is_copy;
 378     HandleMark hm(thread);
 379     ThreadToNativeFromVM ttn(thread);
 380     native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
 381     assert(is_copy == JNI_TRUE, "is_copy value changed");
 382     JNIHandles::destroy_local(js);
 383   }
 384   return native_platform_string;
 385 }
 386 
 387 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
 388   oop          obj    = java_string();
 389   // Typical usage is to convert all '/' to '.' in string.
 390   typeArrayOop value  = java_lang_String::value(obj);

 391   int          length = java_lang_String::length(obj);
 392   bool      is_latin1 = java_lang_String::is_latin1(obj);
 393 
 394   // First check if any from_char exist
 395   int index; // Declared outside, used later
 396   for (index = 0; index < length; index++) {
 397     jchar c = !is_latin1 ? value->char_at(index) :
 398                   ((jchar) value->byte_at(index)) & 0xff;
 399     if (c == from_char) {
 400       break;
 401     }
 402   }
 403   if (index == length) {
 404     // No from_char, so do not copy.
 405     return java_string;
 406   }
 407 
 408   // Check if result string will be latin1
 409   bool to_is_latin1 = false;
 410 
 411   // Replacement char must be latin1
 412   if (CompactStrings && UNICODE::is_latin1(to_char)) {
 413     if (is_latin1) {
 414       // Source string is latin1 as well
 415       to_is_latin1 = true;
 416     } else if (!UNICODE::is_latin1(from_char)) {
 417       // We are replacing an UTF16 char. Scan string to
 418       // check if result can be latin1 encoded.
 419       to_is_latin1 = true;
 420       for (index = 0; index < length; index++) {
 421         jchar c = value->char_at(index);
 422         if (c != from_char && !UNICODE::is_latin1(c)) {
 423           to_is_latin1 = false;
 424           break;
 425         }
 426       }
 427     }
 428   }
 429 
 430   // Create new UNICODE (or byte) buffer. Must handlize value because GC
 431   // may happen during String and char array creation.
 432   typeArrayHandle h_value(THREAD, value);
 433   Handle string = basic_create(length, to_is_latin1, CHECK_NH);

 434   typeArrayOop from_buffer = h_value();
 435   typeArrayOop to_buffer = java_lang_String::value(string());
 436 
 437   // Copy contents
 438   for (index = 0; index < length; index++) {
 439     jchar c = (!is_latin1) ? from_buffer->char_at(index) :
 440                     ((jchar) from_buffer->byte_at(index)) & 0xff;
 441     if (c == from_char) {
 442       c = to_char;
 443     }
 444     if (!to_is_latin1) {
 445       to_buffer->char_at_put(index, c);
 446     } else {
 447       to_buffer->byte_at_put(index, (jbyte) c);
 448     }
 449   }
 450   return string;
 451 }
 452 
 453 jchar* java_lang_String::as_unicode_string(oop java_string, int& length, TRAPS) {
 454   typeArrayOop value  = java_lang_String::value(java_string);

 455                length = java_lang_String::length(java_string);
 456   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 457 
 458   jchar* result = NEW_RESOURCE_ARRAY_RETURN_NULL(jchar, length);
 459   if (result != NULL) {
 460     if (!is_latin1) {
 461       for (int index = 0; index < length; index++) {
 462         result[index] = value->char_at(index);
 463       }
 464     } else {
 465       for (int index = 0; index < length; index++) {
 466         result[index] = ((jchar) value->byte_at(index)) & 0xff;
 467       }
 468     }
 469   } else {
 470     THROW_MSG_0(vmSymbols::java_lang_OutOfMemoryError(), "could not allocate Unicode string");
 471   }
 472   return result;
 473 }
 474 
 475 unsigned int java_lang_String::hash_code(oop java_string) {
 476   int          length = java_lang_String::length(java_string);
 477   // Zero length string will hash to zero with String.hashCode() function.
 478   if (length == 0) return 0;
 479 
 480   typeArrayOop value  = java_lang_String::value(java_string);
 481   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 482 
 483   if (is_latin1) {
 484     return java_lang_String::hash_code(value->byte_at_addr(0), length);
 485   } else {
 486     return java_lang_String::hash_code(value->char_at_addr(0), length);
 487   }
 488 }
 489 
 490 char* java_lang_String::as_quoted_ascii(oop java_string) {
 491   typeArrayOop value  = java_lang_String::value(java_string);

 492   int          length = java_lang_String::length(java_string);
 493   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 494 
 495   if (length == 0) return NULL;

 496 
 497   char* result;
 498   int result_length;
 499   if (!is_latin1) {
 500     jchar* base = value->char_at_addr(0);
 501     result_length = UNICODE::quoted_ascii_length(base, length) + 1;
 502     result = NEW_RESOURCE_ARRAY(char, result_length);
 503     UNICODE::as_quoted_ascii(base, length, result, result_length);
 504   } else {
 505     jbyte* base = value->byte_at_addr(0);
 506     result_length = UNICODE::quoted_ascii_length(base, length) + 1;
 507     result = NEW_RESOURCE_ARRAY(char, result_length);
 508     UNICODE::as_quoted_ascii(base, length, result, result_length);
 509   }
 510   assert(result_length >= length + 1, "must not be shorter");
 511   assert(result_length == (int)strlen(result) + 1, "must match");
 512   return result;
 513 }
 514 
 515 unsigned int java_lang_String::hash_string(oop java_string) {
 516   int          length = java_lang_String::length(java_string);
 517   // Zero length string doesn't necessarily hash to zero.
 518   if (length == 0) {
 519     return StringTable::hash_string((jchar*) NULL, 0);
 520   }
 521 
 522   typeArrayOop value  = java_lang_String::value(java_string);
 523   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 524   if (is_latin1) {
 525     return StringTable::hash_string(value->byte_at_addr(0), length);
 526   } else {
 527     return StringTable::hash_string(value->char_at_addr(0), length);
 528   }
 529 }
 530 
 531 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
 532   oop          obj    = java_string();
 533   typeArrayOop value  = java_lang_String::value(obj);

 534   int          length = java_lang_String::length(obj);
 535   bool      is_latin1 = java_lang_String::is_latin1(obj);
 536   if (!is_latin1) {
 537     jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
 538     Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
 539     return sym;
 540   } else {
 541     ResourceMark rm;
 542     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
 543     const char* base = UNICODE::as_utf8(position, length);
 544     Symbol* sym = SymbolTable::lookup(base, length, THREAD);
 545     return sym;
 546   }
 547 }
 548 
 549 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
 550   typeArrayOop value  = java_lang_String::value(java_string);

 551   int          length = java_lang_String::length(java_string);
 552   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 553   if (!is_latin1) {
 554     jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
 555     return SymbolTable::probe_unicode(base, length);
 556   } else {
 557     ResourceMark rm;
 558     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
 559     const char* base = UNICODE::as_utf8(position, length);
 560     return SymbolTable::probe(base, length);
 561   }
 562 }
 563 

 564 int java_lang_String::utf8_length(oop java_string) {
 565   typeArrayOop value  = java_lang_String::value(java_string);

 566   int          length = java_lang_String::length(java_string);
 567   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 568   if (length == 0) {
 569     return 0;
 570   }
 571   if (!is_latin1) {
 572     return UNICODE::utf8_length(value->char_at_addr(0), length);
 573   } else {
 574     return UNICODE::utf8_length(value->byte_at_addr(0), length);
 575   }
 576 }
 577 
 578 char* java_lang_String::as_utf8_string(oop java_string) {
 579   typeArrayOop value  = java_lang_String::value(java_string);

 580   int          length = java_lang_String::length(java_string);
 581   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 582   if (!is_latin1) {
 583     jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
 584     return UNICODE::as_utf8(position, length);
 585   } else {
 586     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
 587     return UNICODE::as_utf8(position, length);
 588   }
 589 }
 590 
 591 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
 592   typeArrayOop value  = java_lang_String::value(java_string);

 593   int          length = java_lang_String::length(java_string);
 594   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 595   if (!is_latin1) {
 596     jchar* position = (length == 0) ? NULL : value->char_at_addr(0);
 597     return UNICODE::as_utf8(position, length, buf, buflen);
 598   } else {
 599     jbyte* position = (length == 0) ? NULL : value->byte_at_addr(0);
 600     return UNICODE::as_utf8(position, length, buf, buflen);
 601   }
 602 }
 603 
 604 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
 605   typeArrayOop value  = java_lang_String::value(java_string);

 606   int          length = java_lang_String::length(java_string);
 607   assert(start + len <= length, "just checking");
 608   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 609   if (!is_latin1) {
 610     jchar* position = value->char_at_addr(start);
 611     return UNICODE::as_utf8(position, len);
 612   } else {
 613     jbyte* position = value->byte_at_addr(start);
 614     return UNICODE::as_utf8(position, len);
 615   }
 616 }
 617 
 618 char* java_lang_String::as_utf8_string(oop java_string, int start, int len, char* buf, int buflen) {
 619   typeArrayOop value  = java_lang_String::value(java_string);

 620   int          length = java_lang_String::length(java_string);
 621   assert(start + len <= length, "just checking");
 622   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 623   if (!is_latin1) {
 624     jchar* position = value->char_at_addr(start);
 625     return UNICODE::as_utf8(position, len, buf, buflen);
 626   } else {
 627     jbyte* position = value->byte_at_addr(start);
 628     return UNICODE::as_utf8(position, len, buf, buflen);
 629   }
 630 }
 631 
 632 bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
 633   assert(java_string->klass() == SystemDictionary::String_klass(),
 634          "must be java_string");
 635   typeArrayOop value  = java_lang_String::value(java_string);

 636   int          length = java_lang_String::length(java_string);
 637   if (length != len) {
 638     return false;
 639   }
 640   bool      is_latin1 = java_lang_String::is_latin1(java_string);
 641   if (!is_latin1) {
 642     for (int i = 0; i < len; i++) {
 643       if (value->char_at(i) != chars[i]) {
 644         return false;
 645       }
 646     }
 647   } else {
 648     for (int i = 0; i < len; i++) {
 649       if ((((jchar) value->byte_at(i)) & 0xff) != chars[i]) {
 650         return false;
 651       }
 652     }
 653   }
 654   return true;
 655 }
 656 
 657 bool java_lang_String::equals(oop str1, oop str2) {
 658   assert(str1->klass() == SystemDictionary::String_klass(),
 659          "must be java String");
 660   assert(str2->klass() == SystemDictionary::String_klass(),
 661          "must be java String");
 662   typeArrayOop value1  = java_lang_String::value(str1);

 663   int          length1 = java_lang_String::length(str1);
 664   bool       is_latin1 = java_lang_String::is_latin1(str1);
 665   typeArrayOop value2  = java_lang_String::value(str2);

 666   int          length2 = java_lang_String::length(str2);
 667   bool       is_latin2 = java_lang_String::is_latin1(str2);
 668 
 669   if ((length1 != length2) || (is_latin1 != is_latin2)) {
 670     // Strings of different size or with different
 671     // coders are never equal.
 672     return false;
 673   }
 674   int blength1 = value1->length();
 675   for (int i = 0; i < value1->length(); i++) {
 676     if (value1->byte_at(i) != value2->byte_at(i)) {
 677       return false;
 678     }
 679   }
 680   return true;
 681 }
 682 
 683 void java_lang_String::print(oop java_string, outputStream* st) {
 684   assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string");
 685   typeArrayOop value  = java_lang_String::value(java_string);
 686 
 687   if (value == NULL) {
 688     // This can happen if, e.g., printing a String
 689     // object before its initializer has been called
 690     st->print("NULL");
 691     return;
 692   }
 693 

 694   int length = java_lang_String::length(java_string);
 695   bool is_latin1 = java_lang_String::is_latin1(java_string);
 696 
 697   st->print("\"");
 698   for (int index = 0; index < length; index++) {
 699     st->print("%c", (!is_latin1) ?  value->char_at(index) :
 700                            ((jchar) value->byte_at(index)) & 0xff );
 701   }
 702   st->print("\"");
 703 }
 704 
 705 
 706 static void initialize_static_field(fieldDescriptor* fd, Handle mirror, TRAPS) {
 707   assert(mirror.not_null() && fd->is_static(), "just checking");
 708   if (fd->has_initial_value()) {
 709     BasicType t = fd->field_type();
 710     switch (t) {
 711       case T_BYTE:
 712         mirror()->byte_field_put(fd->offset(), fd->int_initial_value());
 713               break;
 714       case T_BOOLEAN:
 715         mirror()->bool_field_put(fd->offset(), fd->int_initial_value());
 716               break;
 717       case T_CHAR:
 718         mirror()->char_field_put(fd->offset(), fd->int_initial_value());
 719               break;
 720       case T_SHORT:


1352   };
1353 }
1354 int java_lang_ThreadGroup::_parent_offset = 0;
1355 int java_lang_ThreadGroup::_name_offset = 0;
1356 int java_lang_ThreadGroup::_threads_offset = 0;
1357 int java_lang_ThreadGroup::_groups_offset = 0;
1358 int java_lang_ThreadGroup::_maxPriority_offset = 0;
1359 int java_lang_ThreadGroup::_destroyed_offset = 0;
1360 int java_lang_ThreadGroup::_daemon_offset = 0;
1361 int java_lang_ThreadGroup::_vmAllowSuspension_offset = 0;
1362 int java_lang_ThreadGroup::_nthreads_offset = 0;
1363 int java_lang_ThreadGroup::_ngroups_offset = 0;
1364 
1365 oop  java_lang_ThreadGroup::parent(oop java_thread_group) {
1366   assert(java_thread_group->is_oop(), "thread group must be oop");
1367   return java_thread_group->obj_field(_parent_offset);
1368 }
1369 
1370 // ("name as oop" accessor is not necessary)
1371 
1372 const char* java_lang_ThreadGroup::name(oop java_thread_group) {
1373   oop name = java_thread_group->obj_field(_name_offset);
1374   // ThreadGroup.name can be null
1375   if (name != NULL) {
1376     return java_lang_String::as_utf8_string(name);
1377   }
1378   return NULL;
1379 }
1380 
1381 int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
1382   assert(java_thread_group->is_oop(), "thread group must be oop");
1383   return java_thread_group->int_field(_nthreads_offset);
1384 }
1385 
1386 objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {
1387   oop threads = java_thread_group->obj_field(_threads_offset);
1388   assert(threads != NULL, "threadgroups should have threads");
1389   assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code
1390   return objArrayOop(threads);
1391 }
1392 
1393 int java_lang_ThreadGroup::ngroups(oop java_thread_group) {
1394   assert(java_thread_group->is_oop(), "thread group must be oop");
1395   return java_thread_group->int_field(_ngroups_offset);
1396 }
1397 
1398 objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {


3727 // Check the hard-coded field offsets of all the classes in this file
3728 
3729 void JavaClasses::check_offsets() {
3730   bool valid = true;
3731   HandleMark hm;
3732 
3733 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3734   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
3735 
3736 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3737   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
3738 
3739 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3740   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
3741 
3742 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
3743   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
3744 
3745   // java.lang.String
3746 
3747   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B");




3748   if (java_lang_String::has_hash_field()) {
3749     CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
3750   }
3751   if (java_lang_String::has_coder_field()) {
3752     CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B");
3753   }
3754 
3755   // java.lang.Class
3756 
3757   // Fake fields
3758   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
3759   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
3760 
3761   // java.lang.Throwable
3762 
3763   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
3764   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
3765   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
3766   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
3767 
3768   // Boxed primitive objects (java_lang_boxing_object)
3769 
3770   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
3771   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
3772   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");


< prev index next >