1 /*
   2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/javaClasses.hpp"
  27 #include "classfile/symbolTable.hpp"
  28 #include "classfile/vmSymbols.hpp"
  29 #include "code/debugInfo.hpp"
  30 #include "code/pcDesc.hpp"
  31 #include "interpreter/interpreter.hpp"
  32 #include "memory/oopFactory.hpp"
  33 #include "memory/resourceArea.hpp"
  34 #include "memory/universe.inline.hpp"
  35 #include "oops/instanceKlass.hpp"
  36 #include "oops/instanceMirrorKlass.hpp"
  37 #include "oops/klass.hpp"
  38 #include "oops/klassOop.hpp"
  39 #include "oops/methodOop.hpp"
  40 #include "oops/symbol.hpp"
  41 #include "oops/typeArrayOop.hpp"
  42 #include "runtime/fieldDescriptor.hpp"
  43 #include "runtime/handles.inline.hpp"
  44 #include "runtime/interfaceSupport.hpp"
  45 #include "runtime/java.hpp"
  46 #include "runtime/javaCalls.hpp"
  47 #include "runtime/safepoint.hpp"
  48 #include "runtime/vframe.hpp"
  49 #include "utilities/preserveException.hpp"
  50 #ifdef TARGET_OS_FAMILY_linux
  51 # include "thread_linux.inline.hpp"
  52 #endif
  53 #ifdef TARGET_OS_FAMILY_solaris
  54 # include "thread_solaris.inline.hpp"
  55 #endif
  56 #ifdef TARGET_OS_FAMILY_windows
  57 # include "thread_windows.inline.hpp"
  58 #endif
  59 
  60 static bool find_field(instanceKlass* ik,
  61                        Symbol* name_symbol, Symbol* signature_symbol,
  62                        fieldDescriptor* fd,
  63                        bool allow_super = false) {
  64   if (allow_super)
  65     return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
  66   else
  67     return ik->find_local_field(name_symbol, signature_symbol, fd);
  68 }
  69 
  70 // Helpful routine for computing field offsets at run time rather than hardcoding them
  71 static void
  72 compute_offset(int &dest_offset,
  73                klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  74                bool allow_super = false) {
  75   fieldDescriptor fd;
  76   instanceKlass* ik = instanceKlass::cast(klass_oop);
  77   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  78     ResourceMark rm;
  79     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
  80     fatal("Invalid layout of preloaded class");
  81   }
  82   dest_offset = fd.offset();
  83 }
  84 
  85 // Same as above but for "optional" offsets that might not be present in certain JDK versions
  86 static void
  87 compute_optional_offset(int& dest_offset,
  88                         klassOop klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
  89                         bool allow_super = false) {
  90   fieldDescriptor fd;
  91   instanceKlass* ik = instanceKlass::cast(klass_oop);
  92   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
  93     dest_offset = fd.offset();
  94   }
  95 }
  96 
  97 
  98 Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) {
  99   // Create the String object first, so there's a chance that the String
 100   // and the char array it points to end up in the same cache line.
 101   oop obj;
 102   if (tenured) {
 103     obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_permanent_instance(CHECK_NH);
 104   } else {
 105     obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_instance(CHECK_NH);
 106   }
 107 
 108   // Create the char array.  The String object must be handlized here
 109   // because GC can happen as a result of the allocation attempt.
 110   Handle h_obj(THREAD, obj);
 111   typeArrayOop buffer;
 112   if (tenured) {
 113     buffer = oopFactory::new_permanent_charArray(length, CHECK_NH);
 114   } else {
 115     buffer = oopFactory::new_charArray(length, CHECK_NH);
 116   }
 117 
 118   // Point the String at the char array
 119   obj = h_obj();
 120   set_value(obj, buffer);
 121   // No need to zero the offset, allocation zero'ed the entire String object
 122   assert(offset(obj) == 0, "initial String offset should be zero");
 123 //set_offset(obj, 0);
 124   set_count(obj, length);
 125 
 126   return h_obj;
 127 }
 128 
 129 Handle java_lang_String::basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS) {
 130   Handle h_obj = basic_create(length, tenured, CHECK_NH);
 131   typeArrayOop buffer = value(h_obj());
 132   for (int index = 0; index < length; index++) {
 133     buffer->char_at_put(index, unicode[index]);
 134   }
 135   return h_obj;
 136 }
 137 
 138 Handle java_lang_String::create_from_unicode(jchar* unicode, int length, TRAPS) {
 139   return basic_create_from_unicode(unicode, length, false, CHECK_NH);
 140 }
 141 
 142 Handle java_lang_String::create_tenured_from_unicode(jchar* unicode, int length, TRAPS) {
 143   return basic_create_from_unicode(unicode, length, JavaObjectsInPerm, CHECK_NH);
 144 }
 145 
 146 oop java_lang_String::create_oop_from_unicode(jchar* unicode, int length, TRAPS) {
 147   Handle h_obj = basic_create_from_unicode(unicode, length, false, CHECK_0);
 148   return h_obj();
 149 }
 150 
 151 Handle java_lang_String::create_from_str(const char* utf8_str, TRAPS) {
 152   if (utf8_str == NULL) {
 153     return Handle();
 154   }
 155   int length = UTF8::unicode_length(utf8_str);
 156   Handle h_obj = basic_create(length, false, CHECK_NH);
 157   if (length > 0) {
 158     UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length);
 159   }
 160   return h_obj;
 161 }
 162 
 163 oop java_lang_String::create_oop_from_str(const char* utf8_str, TRAPS) {
 164   Handle h_obj = create_from_str(utf8_str, CHECK_0);
 165   return h_obj();
 166 }
 167 
 168 Handle java_lang_String::create_from_symbol(Symbol* symbol, TRAPS) {
 169   int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length());
 170   Handle h_obj = basic_create(length, false, CHECK_NH);
 171   if (length > 0) {
 172     UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length);
 173   }
 174   return h_obj;
 175 }
 176 
 177 // Converts a C string to a Java String based on current encoding
 178 Handle java_lang_String::create_from_platform_dependent_str(const char* str, TRAPS) {
 179   assert(str != NULL, "bad arguments");
 180 
 181   typedef jstring (*to_java_string_fn_t)(JNIEnv*, const char *);
 182   static to_java_string_fn_t _to_java_string_fn = NULL;
 183 
 184   if (_to_java_string_fn == NULL) {
 185     void *lib_handle = os::native_java_library();
 186     _to_java_string_fn = CAST_TO_FN_PTR(to_java_string_fn_t, os::dll_lookup(lib_handle, "NewStringPlatform"));
 187     if (_to_java_string_fn == NULL) {
 188       fatal("NewStringPlatform missing");
 189     }
 190   }
 191 
 192   jstring js = NULL;
 193   { JavaThread* thread = (JavaThread*)THREAD;
 194     assert(thread->is_Java_thread(), "must be java thread");
 195     HandleMark hm(thread);
 196     ThreadToNativeFromVM ttn(thread);
 197     js = (_to_java_string_fn)(thread->jni_environment(), str);
 198   }
 199   return Handle(THREAD, JNIHandles::resolve(js));
 200 }
 201 
 202 // Converts a Java String to a native C string that can be used for
 203 // native OS calls.
 204 char* java_lang_String::as_platform_dependent_str(Handle java_string, TRAPS) {
 205 
 206   typedef char* (*to_platform_string_fn_t)(JNIEnv*, jstring, bool*);
 207   static to_platform_string_fn_t _to_platform_string_fn = NULL;
 208 
 209   if (_to_platform_string_fn == NULL) {
 210     void *lib_handle = os::native_java_library();
 211     _to_platform_string_fn = CAST_TO_FN_PTR(to_platform_string_fn_t, os::dll_lookup(lib_handle, "GetStringPlatformChars"));
 212     if (_to_platform_string_fn == NULL) {
 213       fatal("GetStringPlatformChars missing");
 214     }
 215   }
 216 
 217   char *native_platform_string;
 218   { JavaThread* thread = (JavaThread*)THREAD;
 219     assert(thread->is_Java_thread(), "must be java thread");
 220     JNIEnv *env = thread->jni_environment();
 221     jstring js = (jstring) JNIHandles::make_local(env, java_string());
 222     bool is_copy;
 223     HandleMark hm(thread);
 224     ThreadToNativeFromVM ttn(thread);
 225     native_platform_string = (_to_platform_string_fn)(env, js, &is_copy);
 226     assert(is_copy == JNI_TRUE, "is_copy value changed");
 227     JNIHandles::destroy_local(js);
 228   }
 229   return native_platform_string;
 230 }
 231 
 232 Handle java_lang_String::char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS) {
 233   oop          obj    = java_string();
 234   // Typical usage is to convert all '/' to '.' in string.
 235   typeArrayOop value  = java_lang_String::value(obj);
 236   int          offset = java_lang_String::offset(obj);
 237   int          length = java_lang_String::length(obj);
 238 
 239   // First check if any from_char exist
 240   int index; // Declared outside, used later
 241   for (index = 0; index < length; index++) {
 242     if (value->char_at(index + offset) == from_char) {
 243       break;
 244     }
 245   }
 246   if (index == length) {
 247     // No from_char, so do not copy.
 248     return java_string;
 249   }
 250 
 251   // Create new UNICODE buffer. Must handlize value because GC
 252   // may happen during String and char array creation.
 253   typeArrayHandle h_value(THREAD, value);
 254   Handle string = basic_create(length, false, CHECK_NH);
 255 
 256   typeArrayOop from_buffer = h_value();
 257   typeArrayOop to_buffer   = java_lang_String::value(string());
 258 
 259   // Copy contents
 260   for (index = 0; index < length; index++) {
 261     jchar c = from_buffer->char_at(index + offset);
 262     if (c == from_char) {
 263       c = to_char;
 264     }
 265     to_buffer->char_at_put(index, c);
 266   }
 267   return string;
 268 }
 269 
 270 jchar* java_lang_String::as_unicode_string(oop java_string, int& length) {
 271   typeArrayOop value  = java_lang_String::value(java_string);
 272   int          offset = java_lang_String::offset(java_string);
 273                length = java_lang_String::length(java_string);
 274 
 275   jchar* result = NEW_RESOURCE_ARRAY(jchar, length);
 276   for (int index = 0; index < length; index++) {
 277     result[index] = value->char_at(index + offset);
 278   }
 279   return result;
 280 }
 281 
 282 unsigned int java_lang_String::hash_string(oop java_string) {
 283   typeArrayOop value  = java_lang_String::value(java_string);
 284   int          offset = java_lang_String::offset(java_string);
 285   int          length = java_lang_String::length(java_string);
 286 
 287   if (length == 0) return 0;
 288   return hash_string(value->char_at_addr(offset), length);
 289 }
 290 
 291 Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
 292   oop          obj    = java_string();
 293   typeArrayOop value  = java_lang_String::value(obj);
 294   int          offset = java_lang_String::offset(obj);
 295   int          length = java_lang_String::length(obj);
 296   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
 297   Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
 298   return sym;
 299 }
 300 
 301 Symbol* java_lang_String::as_symbol_or_null(oop java_string) {
 302   typeArrayOop value  = java_lang_String::value(java_string);
 303   int          offset = java_lang_String::offset(java_string);
 304   int          length = java_lang_String::length(java_string);
 305   jchar* base = (length == 0) ? NULL : value->char_at_addr(offset);
 306   return SymbolTable::probe_unicode(base, length);
 307 }
 308 
 309 
 310 int java_lang_String::utf8_length(oop java_string) {
 311   typeArrayOop value  = java_lang_String::value(java_string);
 312   int          offset = java_lang_String::offset(java_string);
 313   int          length = java_lang_String::length(java_string);
 314   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
 315   return UNICODE::utf8_length(position, length);
 316 }
 317 
 318 char* java_lang_String::as_utf8_string(oop java_string) {
 319   typeArrayOop value  = java_lang_String::value(java_string);
 320   int          offset = java_lang_String::offset(java_string);
 321   int          length = java_lang_String::length(java_string);
 322   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
 323   return UNICODE::as_utf8(position, length);
 324 }
 325 
 326 char* java_lang_String::as_utf8_string(oop java_string, char* buf, int buflen) {
 327   typeArrayOop value  = java_lang_String::value(java_string);
 328   int          offset = java_lang_String::offset(java_string);
 329   int          length = java_lang_String::length(java_string);
 330   jchar* position = (length == 0) ? NULL : value->char_at_addr(offset);
 331   return UNICODE::as_utf8(position, length, buf, buflen);
 332 }
 333 
 334 char* java_lang_String::as_utf8_string(oop java_string, int start, int len) {
 335   typeArrayOop value  = java_lang_String::value(java_string);
 336   int          offset = java_lang_String::offset(java_string);
 337   int          length = java_lang_String::length(java_string);
 338   assert(start + len <= length, "just checking");
 339   jchar* position = value->char_at_addr(offset + start);
 340   return UNICODE::as_utf8(position, len);
 341 }
 342 
 343 bool java_lang_String::equals(oop java_string, jchar* chars, int len) {
 344   assert(SharedSkipVerify ||
 345          java_string->klass() == SystemDictionary::String_klass(),
 346          "must be java_string");
 347   typeArrayOop value  = java_lang_String::value(java_string);
 348   int          offset = java_lang_String::offset(java_string);
 349   int          length = java_lang_String::length(java_string);
 350   if (length != len) {
 351     return false;
 352   }
 353   for (int i = 0; i < len; i++) {
 354     if (value->char_at(i + offset) != chars[i]) {
 355       return false;
 356     }
 357   }
 358   return true;
 359 }
 360 
 361 void java_lang_String::print(Handle java_string, outputStream* st) {
 362   oop          obj    = java_string();
 363   assert(obj->klass() == SystemDictionary::String_klass(), "must be java_string");
 364   typeArrayOop value  = java_lang_String::value(obj);
 365   int          offset = java_lang_String::offset(obj);
 366   int          length = java_lang_String::length(obj);
 367 
 368   int end = MIN2(length, 100);
 369   if (value == NULL) {
 370     // This can happen if, e.g., printing a String
 371     // object before its initializer has been called
 372     st->print_cr("NULL");
 373   } else {
 374     st->print("\"");
 375     for (int index = 0; index < length; index++) {
 376       st->print("%c", value->char_at(index + offset));
 377     }
 378     st->print("\"");
 379   }
 380 }
 381 
 382 static void initialize_static_field(fieldDescriptor* fd, TRAPS) {
 383   Handle mirror (THREAD, fd->field_holder()->java_mirror());
 384   assert(mirror.not_null() && fd->is_static(), "just checking");
 385   if (fd->has_initial_value()) {
 386     BasicType t = fd->field_type();
 387     switch (t) {
 388       case T_BYTE:
 389         mirror()->byte_field_put(fd->offset(), fd->int_initial_value());
 390               break;
 391       case T_BOOLEAN:
 392         mirror()->bool_field_put(fd->offset(), fd->int_initial_value());
 393               break;
 394       case T_CHAR:
 395         mirror()->char_field_put(fd->offset(), fd->int_initial_value());
 396               break;
 397       case T_SHORT:
 398         mirror()->short_field_put(fd->offset(), fd->int_initial_value());
 399               break;
 400       case T_INT:
 401         mirror()->int_field_put(fd->offset(), fd->int_initial_value());
 402         break;
 403       case T_FLOAT:
 404         mirror()->float_field_put(fd->offset(), fd->float_initial_value());
 405         break;
 406       case T_DOUBLE:
 407         mirror()->double_field_put(fd->offset(), fd->double_initial_value());
 408         break;
 409       case T_LONG:
 410         mirror()->long_field_put(fd->offset(), fd->long_initial_value());
 411         break;
 412       case T_OBJECT:
 413         {
 414           #ifdef ASSERT
 415           TempNewSymbol sym = SymbolTable::new_symbol("Ljava/lang/String;", CHECK);
 416           assert(fd->signature() == sym, "just checking");
 417           #endif
 418           oop string = fd->string_initial_value(CHECK);
 419           mirror()->obj_field_put(fd->offset(), string);
 420         }
 421         break;
 422       default:
 423         THROW_MSG(vmSymbols::java_lang_ClassFormatError(),
 424                   "Illegal ConstantValue attribute in class file");
 425     }
 426   }
 427 }
 428 
 429 
 430 // During bootstrap, java.lang.Class wasn't loaded so static field
 431 // offsets were computed without the size added it.  Go back and
 432 // update all the static field offsets to included the size.
 433 static void fixup_static_field(fieldDescriptor* fd, TRAPS) {
 434   if (fd->is_static()) {
 435     int real_offset = fd->offset() + instanceMirrorKlass::offset_of_static_fields();
 436     typeArrayOop fields = instanceKlass::cast(fd->field_holder())->fields();
 437     fields->short_at_put(fd->index() + instanceKlass::low_offset,  extract_low_short_from_int(real_offset));
 438     fields->short_at_put(fd->index() + instanceKlass::high_offset, extract_high_short_from_int(real_offset));
 439   }
 440 }
 441 
 442 void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) {
 443   assert(instanceMirrorKlass::offset_of_static_fields() != 0, "must have been computed already");
 444 
 445   if (k->oop_is_instance()) {
 446     // Fixup the offsets
 447     instanceKlass::cast(k())->do_local_static_fields(&fixup_static_field, CHECK);
 448   }
 449   create_mirror(k, CHECK);
 450 }
 451 
 452 oop java_lang_Class::create_mirror(KlassHandle k, TRAPS) {
 453   assert(k->java_mirror() == NULL, "should only assign mirror once");
 454   // Use this moment of initialization to cache modifier_flags also,
 455   // to support Class.getModifiers().  Instance classes recalculate
 456   // the cached flags after the class file is parsed, but before the
 457   // class is put into the system dictionary.
 458   int computed_modifiers = k->compute_modifier_flags(CHECK_0);
 459   k->set_modifier_flags(computed_modifiers);
 460   if (SystemDictionary::Class_klass_loaded() && (k->oop_is_instance() || k->oop_is_javaArray())) {
 461     // Allocate mirror (java.lang.Class instance)
 462     Handle mirror = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK_0);
 463     // Setup indirections
 464     mirror->obj_field_put(klass_offset,  k());
 465     k->set_java_mirror(mirror());
 466 
 467     instanceMirrorKlass* mk = instanceMirrorKlass::cast(mirror->klass());
 468     java_lang_Class::set_oop_size(mirror(), mk->instance_size(k));
 469     java_lang_Class::set_static_oop_field_count(mirror(), mk->compute_static_oop_field_count(mirror()));
 470 
 471     // It might also have a component mirror.  This mirror must already exist.
 472     if (k->oop_is_javaArray()) {
 473       Handle comp_mirror;
 474       if (k->oop_is_typeArray()) {
 475         BasicType type = typeArrayKlass::cast(k->as_klassOop())->element_type();
 476         comp_mirror = Universe::java_mirror(type);
 477         assert(comp_mirror.not_null(), "must have primitive mirror");
 478       } else if (k->oop_is_objArray()) {
 479         klassOop element_klass = objArrayKlass::cast(k->as_klassOop())->element_klass();
 480         if (element_klass != NULL
 481             && (Klass::cast(element_klass)->oop_is_instance() ||
 482                 Klass::cast(element_klass)->oop_is_javaArray())) {
 483           comp_mirror = Klass::cast(element_klass)->java_mirror();
 484           assert(comp_mirror.not_null(), "must have element mirror");
 485         }
 486         // else some object array internal to the VM, like systemObjArrayKlassObj
 487       }
 488       if (comp_mirror.not_null()) {
 489         // Two-way link between the array klass and its component mirror:
 490         arrayKlass::cast(k->as_klassOop())->set_component_mirror(comp_mirror());
 491         set_array_klass(comp_mirror(), k->as_klassOop());
 492       }
 493     } else if (k->oop_is_instance()) {
 494       // Initialize static fields
 495       instanceKlass::cast(k())->do_local_static_fields(&initialize_static_field, CHECK_NULL);
 496     }
 497     return mirror();
 498   } else {
 499     return NULL;
 500   }
 501 }
 502 
 503 
 504 
 505 int  java_lang_Class::oop_size(oop java_class) {
 506   assert(oop_size_offset != 0, "must be set");
 507   return java_class->int_field(oop_size_offset);
 508 }
 509 void java_lang_Class::set_oop_size(oop java_class, int size) {
 510   assert(oop_size_offset != 0, "must be set");
 511   java_class->int_field_put(oop_size_offset, size);
 512 }
 513 int  java_lang_Class::static_oop_field_count(oop java_class) {
 514   assert(static_oop_field_count_offset != 0, "must be set");
 515   return java_class->int_field(static_oop_field_count_offset);
 516 }
 517 void java_lang_Class::set_static_oop_field_count(oop java_class, int size) {
 518   assert(static_oop_field_count_offset != 0, "must be set");
 519   java_class->int_field_put(static_oop_field_count_offset, size);
 520 }
 521 
 522 
 523 
 524 
 525 oop java_lang_Class::create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS) {
 526   // This should be improved by adding a field at the Java level or by
 527   // introducing a new VM klass (see comment in ClassFileParser)
 528   oop java_class = instanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance((oop)NULL, CHECK_0);
 529   if (type != T_VOID) {
 530     klassOop aklass = Universe::typeArrayKlassObj(type);
 531     assert(aklass != NULL, "correct bootstrap");
 532     set_array_klass(java_class, aklass);
 533   }
 534   instanceMirrorKlass* mk = instanceMirrorKlass::cast(SystemDictionary::Class_klass());
 535   java_lang_Class::set_oop_size(java_class, mk->instance_size(oop(NULL)));
 536   java_lang_Class::set_static_oop_field_count(java_class, 0);
 537   return java_class;
 538 }
 539 
 540 
 541 klassOop java_lang_Class::as_klassOop(oop java_class) {
 542   //%note memory_2
 543   assert(java_lang_Class::is_instance(java_class), "must be a Class object");
 544   klassOop k = klassOop(java_class->obj_field(klass_offset));
 545   assert(k == NULL || k->is_klass(), "type check");
 546   return k;
 547 }
 548 
 549 
 550 void java_lang_Class::print_signature(oop java_class, outputStream* st) {
 551   assert(java_lang_Class::is_instance(java_class), "must be a Class object");
 552   Symbol* name = NULL;
 553   bool is_instance = false;
 554   if (is_primitive(java_class)) {
 555     name = vmSymbols::type_signature(primitive_type(java_class));
 556   } else {
 557     klassOop k = as_klassOop(java_class);
 558     is_instance = Klass::cast(k)->oop_is_instance();
 559     name = Klass::cast(k)->name();
 560   }
 561   if (name == NULL) {
 562     st->print("<null>");
 563     return;
 564   }
 565   if (is_instance)  st->print("L");
 566   st->write((char*) name->base(), (int) name->utf8_length());
 567   if (is_instance)  st->print(";");
 568 }
 569 
 570 Symbol* java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) {
 571   assert(java_lang_Class::is_instance(java_class), "must be a Class object");
 572   Symbol* name;
 573   if (is_primitive(java_class)) {
 574     name = vmSymbols::type_signature(primitive_type(java_class));
 575     // Because this can create a new symbol, the caller has to decrement
 576     // the refcount, so make adjustment here and below for symbols returned
 577     // that are not created or incremented due to a successful lookup.
 578     name->increment_refcount();
 579   } else {
 580     klassOop k = as_klassOop(java_class);
 581     if (!Klass::cast(k)->oop_is_instance()) {
 582       name = Klass::cast(k)->name();
 583       name->increment_refcount();
 584     } else {
 585       ResourceMark rm;
 586       const char* sigstr = Klass::cast(k)->signature_name();
 587       int         siglen = (int) strlen(sigstr);
 588       if (!intern_if_not_found) {
 589         name = SymbolTable::probe(sigstr, siglen);
 590       } else {
 591         name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
 592       }
 593     }
 594   }
 595   return name;
 596 }
 597 
 598 
 599 klassOop java_lang_Class::array_klass(oop java_class) {
 600   klassOop k = klassOop(java_class->obj_field(array_klass_offset));
 601   assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass");
 602   return k;
 603 }
 604 
 605 
 606 void java_lang_Class::set_array_klass(oop java_class, klassOop klass) {
 607   assert(klass->is_klass() && Klass::cast(klass)->oop_is_javaArray(), "should be array klass");
 608   java_class->obj_field_put(array_klass_offset, klass);
 609 }
 610 
 611 
 612 methodOop java_lang_Class::resolved_constructor(oop java_class) {
 613   oop constructor = java_class->obj_field(resolved_constructor_offset);
 614   assert(constructor == NULL || constructor->is_method(), "should be method");
 615   return methodOop(constructor);
 616 }
 617 
 618 
 619 void java_lang_Class::set_resolved_constructor(oop java_class, methodOop constructor) {
 620   assert(constructor->is_method(), "should be method");
 621   java_class->obj_field_put(resolved_constructor_offset, constructor);
 622 }
 623 
 624 
 625 bool java_lang_Class::is_primitive(oop java_class) {
 626   // should assert:
 627   //assert(java_lang_Class::is_instance(java_class), "must be a Class object");
 628   klassOop k = klassOop(java_class->obj_field(klass_offset));
 629   return k == NULL;
 630 }
 631 
 632 
 633 BasicType java_lang_Class::primitive_type(oop java_class) {
 634   assert(java_lang_Class::is_primitive(java_class), "just checking");
 635   klassOop ak = klassOop(java_class->obj_field(array_klass_offset));
 636   BasicType type = T_VOID;
 637   if (ak != NULL) {
 638     // Note: create_basic_type_mirror above initializes ak to a non-null value.
 639     type = arrayKlass::cast(ak)->element_type();
 640   } else {
 641     assert(java_class == Universe::void_mirror(), "only valid non-array primitive");
 642   }
 643   assert(Universe::java_mirror(type) == java_class, "must be consistent");
 644   return type;
 645 }
 646 
 647 BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) {
 648   assert(java_lang_Class::is_instance(java_class), "must be a Class object");
 649   if (is_primitive(java_class)) {
 650     if (reference_klass != NULL)
 651       (*reference_klass) = NULL;
 652     return primitive_type(java_class);
 653   } else {
 654     if (reference_klass != NULL)
 655       (*reference_klass) = as_klassOop(java_class);
 656     return T_OBJECT;
 657   }
 658 }
 659 
 660 
 661 oop java_lang_Class::primitive_mirror(BasicType t) {
 662   oop mirror = Universe::java_mirror(t);
 663   assert(mirror != NULL && mirror->is_a(SystemDictionary::Class_klass()), "must be a Class");
 664   assert(java_lang_Class::is_primitive(mirror), "must be primitive");
 665   return mirror;
 666 }
 667 
 668 bool java_lang_Class::offsets_computed = false;
 669 int  java_lang_Class::classRedefinedCount_offset = -1;
 670 int  java_lang_Class::parallelCapable_offset = -1;
 671 
 672 void java_lang_Class::compute_offsets() {
 673   assert(!offsets_computed, "offsets should be initialized only once");
 674   offsets_computed = true;
 675 
 676   klassOop k = SystemDictionary::Class_klass();
 677   // The classRedefinedCount field is only present starting in 1.5,
 678   // so don't go fatal.
 679   compute_optional_offset(classRedefinedCount_offset,
 680     k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
 681 
 682   // The field indicating parallelCapable (parallelLockMap) is only present starting in 7,
 683   klassOop k1 = SystemDictionary::ClassLoader_klass();
 684   compute_optional_offset(parallelCapable_offset,
 685     k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature());
 686 }
 687 
 688 // For class loader classes, parallelCapable defined
 689 // based on non-null field
 690 // Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it
 691 bool java_lang_Class::parallelCapable(oop class_loader) {
 692   if (!JDK_Version::is_gte_jdk17x_version()
 693      || parallelCapable_offset == -1) {
 694      // Default for backward compatibility is false
 695      return false;
 696   }
 697   return (class_loader->obj_field(parallelCapable_offset) != NULL);
 698 }
 699 
 700 int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
 701   if (!JDK_Version::is_gte_jdk15x_version()
 702       || classRedefinedCount_offset == -1) {
 703     // The classRedefinedCount field is only present starting in 1.5.
 704     // If we don't have an offset for it then just return -1 as a marker.
 705     return -1;
 706   }
 707 
 708   return the_class_mirror->int_field(classRedefinedCount_offset);
 709 }
 710 
 711 void java_lang_Class::set_classRedefinedCount(oop the_class_mirror, int value) {
 712   if (!JDK_Version::is_gte_jdk15x_version()
 713       || classRedefinedCount_offset == -1) {
 714     // The classRedefinedCount field is only present starting in 1.5.
 715     // If we don't have an offset for it then nothing to set.
 716     return;
 717   }
 718 
 719   the_class_mirror->int_field_put(classRedefinedCount_offset, value);
 720 }
 721 
 722 
 723 // Note: JDK1.1 and before had a privateInfo_offset field which was used for the
 724 //       platform thread structure, and a eetop offset which was used for thread
 725 //       local storage (and unused by the HotSpot VM). In JDK1.2 the two structures
 726 //       merged, so in the HotSpot VM we just use the eetop field for the thread
 727 //       instead of the privateInfo_offset.
 728 //
 729 // Note: The stackSize field is only present starting in 1.4.
 730 
 731 int java_lang_Thread::_name_offset = 0;
 732 int java_lang_Thread::_group_offset = 0;
 733 int java_lang_Thread::_contextClassLoader_offset = 0;
 734 int java_lang_Thread::_inheritedAccessControlContext_offset = 0;
 735 int java_lang_Thread::_priority_offset = 0;
 736 int java_lang_Thread::_eetop_offset = 0;
 737 int java_lang_Thread::_daemon_offset = 0;
 738 int java_lang_Thread::_stillborn_offset = 0;
 739 int java_lang_Thread::_stackSize_offset = 0;
 740 int java_lang_Thread::_tid_offset = 0;
 741 int java_lang_Thread::_thread_status_offset = 0;
 742 int java_lang_Thread::_park_blocker_offset = 0;
 743 int java_lang_Thread::_park_event_offset = 0 ;
 744 
 745 
 746 void java_lang_Thread::compute_offsets() {
 747   assert(_group_offset == 0, "offsets should be initialized only once");
 748 
 749   klassOop k = SystemDictionary::Thread_klass();
 750   compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::char_array_signature());
 751   compute_offset(_group_offset,     k, vmSymbols::group_name(),     vmSymbols::threadgroup_signature());
 752   compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature());
 753   compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature());
 754   compute_offset(_priority_offset,  k, vmSymbols::priority_name(),  vmSymbols::int_signature());
 755   compute_offset(_daemon_offset,    k, vmSymbols::daemon_name(),    vmSymbols::bool_signature());
 756   compute_offset(_eetop_offset,     k, vmSymbols::eetop_name(),     vmSymbols::long_signature());
 757   compute_offset(_stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature());
 758   // The stackSize field is only present starting in 1.4, so don't go fatal.
 759   compute_optional_offset(_stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature());
 760   // The tid and thread_status fields are only present starting in 1.5, so don't go fatal.
 761   compute_optional_offset(_tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature());
 762   compute_optional_offset(_thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature());
 763   // The parkBlocker field is only present starting in 1.6, so don't go fatal.
 764   compute_optional_offset(_park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature());
 765   compute_optional_offset(_park_event_offset, k, vmSymbols::park_event_name(),
 766  vmSymbols::long_signature());
 767 }
 768 
 769 
 770 JavaThread* java_lang_Thread::thread(oop java_thread) {
 771   return (JavaThread*)java_thread->address_field(_eetop_offset);
 772 }
 773 
 774 
 775 void java_lang_Thread::set_thread(oop java_thread, JavaThread* thread) {
 776   java_thread->address_field_put(_eetop_offset, (address)thread);
 777 }
 778 
 779 
 780 typeArrayOop java_lang_Thread::name(oop java_thread) {
 781   oop name = java_thread->obj_field(_name_offset);
 782   assert(name == NULL || (name->is_typeArray() && typeArrayKlass::cast(name->klass())->element_type() == T_CHAR), "just checking");
 783   return typeArrayOop(name);
 784 }
 785 
 786 
 787 void java_lang_Thread::set_name(oop java_thread, typeArrayOop name) {
 788   assert(java_thread->obj_field(_name_offset) == NULL, "name should be NULL");
 789   java_thread->obj_field_put(_name_offset, name);
 790 }
 791 
 792 
 793 ThreadPriority java_lang_Thread::priority(oop java_thread) {
 794   return (ThreadPriority)java_thread->int_field(_priority_offset);
 795 }
 796 
 797 
 798 void java_lang_Thread::set_priority(oop java_thread, ThreadPriority priority) {
 799   java_thread->int_field_put(_priority_offset, priority);
 800 }
 801 
 802 
 803 oop java_lang_Thread::threadGroup(oop java_thread) {
 804   return java_thread->obj_field(_group_offset);
 805 }
 806 
 807 
 808 bool java_lang_Thread::is_stillborn(oop java_thread) {
 809   return java_thread->bool_field(_stillborn_offset) != 0;
 810 }
 811 
 812 
 813 // We never have reason to turn the stillborn bit off
 814 void java_lang_Thread::set_stillborn(oop java_thread) {
 815   java_thread->bool_field_put(_stillborn_offset, true);
 816 }
 817 
 818 
 819 bool java_lang_Thread::is_alive(oop java_thread) {
 820   JavaThread* thr = java_lang_Thread::thread(java_thread);
 821   return (thr != NULL);
 822 }
 823 
 824 
 825 bool java_lang_Thread::is_daemon(oop java_thread) {
 826   return java_thread->bool_field(_daemon_offset) != 0;
 827 }
 828 
 829 
 830 void java_lang_Thread::set_daemon(oop java_thread) {
 831   java_thread->bool_field_put(_daemon_offset, true);
 832 }
 833 
 834 oop java_lang_Thread::context_class_loader(oop java_thread) {
 835   return java_thread->obj_field(_contextClassLoader_offset);
 836 }
 837 
 838 oop java_lang_Thread::inherited_access_control_context(oop java_thread) {
 839   return java_thread->obj_field(_inheritedAccessControlContext_offset);
 840 }
 841 
 842 
 843 jlong java_lang_Thread::stackSize(oop java_thread) {
 844   // The stackSize field is only present starting in 1.4
 845   if (_stackSize_offset > 0) {
 846     assert(JDK_Version::is_gte_jdk14x_version(), "sanity check");
 847     return java_thread->long_field(_stackSize_offset);
 848   } else {
 849     return 0;
 850   }
 851 }
 852 
 853 // Write the thread status value to threadStatus field in java.lang.Thread java class.
 854 void java_lang_Thread::set_thread_status(oop java_thread,
 855                                          java_lang_Thread::ThreadStatus status) {
 856   assert(JavaThread::current()->thread_state() == _thread_in_vm, "Java Thread is not running in vm");
 857   // The threadStatus is only present starting in 1.5
 858   if (_thread_status_offset > 0) {
 859     java_thread->int_field_put(_thread_status_offset, status);
 860   }
 861 }
 862 
 863 // Read thread status value from threadStatus field in java.lang.Thread java class.
 864 java_lang_Thread::ThreadStatus java_lang_Thread::get_thread_status(oop java_thread) {
 865   assert(Thread::current()->is_VM_thread() ||
 866          JavaThread::current()->thread_state() == _thread_in_vm,
 867          "Java Thread is not running in vm");
 868   // The threadStatus is only present starting in 1.5
 869   if (_thread_status_offset > 0) {
 870     return (java_lang_Thread::ThreadStatus)java_thread->int_field(_thread_status_offset);
 871   } else {
 872     // All we can easily figure out is if it is alive, but that is
 873     // enough info for a valid unknown status.
 874     // These aren't restricted to valid set ThreadStatus values, so
 875     // use JVMTI values and cast.
 876     JavaThread* thr = java_lang_Thread::thread(java_thread);
 877     if (thr == NULL) {
 878       // the thread hasn't run yet or is in the process of exiting
 879       return NEW;
 880     }
 881     return (java_lang_Thread::ThreadStatus)JVMTI_THREAD_STATE_ALIVE;
 882   }
 883 }
 884 
 885 
 886 jlong java_lang_Thread::thread_id(oop java_thread) {
 887   // The thread ID field is only present starting in 1.5
 888   if (_tid_offset > 0) {
 889     return java_thread->long_field(_tid_offset);
 890   } else {
 891     return 0;
 892   }
 893 }
 894 
 895 oop java_lang_Thread::park_blocker(oop java_thread) {
 896   assert(JDK_Version::current().supports_thread_park_blocker() &&
 897          _park_blocker_offset != 0, "Must support parkBlocker field");
 898 
 899   if (_park_blocker_offset > 0) {
 900     return java_thread->obj_field(_park_blocker_offset);
 901   }
 902 
 903   return NULL;
 904 }
 905 
 906 jlong java_lang_Thread::park_event(oop java_thread) {
 907   if (_park_event_offset > 0) {
 908     return java_thread->long_field(_park_event_offset);
 909   }
 910   return 0;
 911 }
 912 
 913 bool java_lang_Thread::set_park_event(oop java_thread, jlong ptr) {
 914   if (_park_event_offset > 0) {
 915     java_thread->long_field_put(_park_event_offset, ptr);
 916     return true;
 917   }
 918   return false;
 919 }
 920 
 921 
 922 const char* java_lang_Thread::thread_status_name(oop java_thread) {
 923   assert(JDK_Version::is_gte_jdk15x_version() && _thread_status_offset != 0, "Must have thread status");
 924   ThreadStatus status = (java_lang_Thread::ThreadStatus)java_thread->int_field(_thread_status_offset);
 925   switch (status) {
 926     case NEW                      : return "NEW";
 927     case RUNNABLE                 : return "RUNNABLE";
 928     case SLEEPING                 : return "TIMED_WAITING (sleeping)";
 929     case IN_OBJECT_WAIT           : return "WAITING (on object monitor)";
 930     case IN_OBJECT_WAIT_TIMED     : return "TIMED_WAITING (on object monitor)";
 931     case PARKED                   : return "WAITING (parking)";
 932     case PARKED_TIMED             : return "TIMED_WAITING (parking)";
 933     case BLOCKED_ON_MONITOR_ENTER : return "BLOCKED (on object monitor)";
 934     case TERMINATED               : return "TERMINATED";
 935     default                       : return "UNKNOWN";
 936   };
 937 }
 938 int java_lang_ThreadGroup::_parent_offset = 0;
 939 int java_lang_ThreadGroup::_name_offset = 0;
 940 int java_lang_ThreadGroup::_threads_offset = 0;
 941 int java_lang_ThreadGroup::_groups_offset = 0;
 942 int java_lang_ThreadGroup::_maxPriority_offset = 0;
 943 int java_lang_ThreadGroup::_destroyed_offset = 0;
 944 int java_lang_ThreadGroup::_daemon_offset = 0;
 945 int java_lang_ThreadGroup::_vmAllowSuspension_offset = 0;
 946 int java_lang_ThreadGroup::_nthreads_offset = 0;
 947 int java_lang_ThreadGroup::_ngroups_offset = 0;
 948 
 949 oop  java_lang_ThreadGroup::parent(oop java_thread_group) {
 950   assert(java_thread_group->is_oop(), "thread group must be oop");
 951   return java_thread_group->obj_field(_parent_offset);
 952 }
 953 
 954 // ("name as oop" accessor is not necessary)
 955 
 956 typeArrayOop java_lang_ThreadGroup::name(oop java_thread_group) {
 957   oop name = java_thread_group->obj_field(_name_offset);
 958   // ThreadGroup.name can be null
 959   return name == NULL ? (typeArrayOop)NULL : java_lang_String::value(name);
 960 }
 961 
 962 int java_lang_ThreadGroup::nthreads(oop java_thread_group) {
 963   assert(java_thread_group->is_oop(), "thread group must be oop");
 964   return java_thread_group->int_field(_nthreads_offset);
 965 }
 966 
 967 objArrayOop java_lang_ThreadGroup::threads(oop java_thread_group) {
 968   oop threads = java_thread_group->obj_field(_threads_offset);
 969   assert(threads != NULL, "threadgroups should have threads");
 970   assert(threads->is_objArray(), "just checking"); // Todo: Add better type checking code
 971   return objArrayOop(threads);
 972 }
 973 
 974 int java_lang_ThreadGroup::ngroups(oop java_thread_group) {
 975   assert(java_thread_group->is_oop(), "thread group must be oop");
 976   return java_thread_group->int_field(_ngroups_offset);
 977 }
 978 
 979 objArrayOop java_lang_ThreadGroup::groups(oop java_thread_group) {
 980   oop groups = java_thread_group->obj_field(_groups_offset);
 981   assert(groups == NULL || groups->is_objArray(), "just checking"); // Todo: Add better type checking code
 982   return objArrayOop(groups);
 983 }
 984 
 985 ThreadPriority java_lang_ThreadGroup::maxPriority(oop java_thread_group) {
 986   assert(java_thread_group->is_oop(), "thread group must be oop");
 987   return (ThreadPriority) java_thread_group->int_field(_maxPriority_offset);
 988 }
 989 
 990 bool java_lang_ThreadGroup::is_destroyed(oop java_thread_group) {
 991   assert(java_thread_group->is_oop(), "thread group must be oop");
 992   return java_thread_group->bool_field(_destroyed_offset) != 0;
 993 }
 994 
 995 bool java_lang_ThreadGroup::is_daemon(oop java_thread_group) {
 996   assert(java_thread_group->is_oop(), "thread group must be oop");
 997   return java_thread_group->bool_field(_daemon_offset) != 0;
 998 }
 999 
1000 bool java_lang_ThreadGroup::is_vmAllowSuspension(oop java_thread_group) {
1001   assert(java_thread_group->is_oop(), "thread group must be oop");
1002   return java_thread_group->bool_field(_vmAllowSuspension_offset) != 0;
1003 }
1004 
1005 void java_lang_ThreadGroup::compute_offsets() {
1006   assert(_parent_offset == 0, "offsets should be initialized only once");
1007 
1008   klassOop k = SystemDictionary::ThreadGroup_klass();
1009 
1010   compute_offset(_parent_offset,      k, vmSymbols::parent_name(),      vmSymbols::threadgroup_signature());
1011   compute_offset(_name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
1012   compute_offset(_threads_offset,     k, vmSymbols::threads_name(),     vmSymbols::thread_array_signature());
1013   compute_offset(_groups_offset,      k, vmSymbols::groups_name(),      vmSymbols::threadgroup_array_signature());
1014   compute_offset(_maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature());
1015   compute_offset(_destroyed_offset,   k, vmSymbols::destroyed_name(),   vmSymbols::bool_signature());
1016   compute_offset(_daemon_offset,      k, vmSymbols::daemon_name(),      vmSymbols::bool_signature());
1017   compute_offset(_vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature());
1018   compute_offset(_nthreads_offset,    k, vmSymbols::nthreads_name(),    vmSymbols::int_signature());
1019   compute_offset(_ngroups_offset,     k, vmSymbols::ngroups_name(),     vmSymbols::int_signature());
1020 }
1021 
1022 oop java_lang_Throwable::unassigned_stacktrace() {
1023   instanceKlass* ik = instanceKlass::cast(SystemDictionary::Throwable_klass());
1024   address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);
1025   if (UseCompressedOops) {
1026     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
1027   } else {
1028     return oopDesc::load_decode_heap_oop((oop*)addr);
1029   }
1030 }
1031 
1032 oop java_lang_Throwable::backtrace(oop throwable) {
1033   return throwable->obj_field_acquire(backtrace_offset);
1034 }
1035 
1036 
1037 void java_lang_Throwable::set_backtrace(oop throwable, oop value) {
1038   throwable->release_obj_field_put(backtrace_offset, value);
1039 }
1040 
1041 
1042 oop java_lang_Throwable::message(oop throwable) {
1043   return throwable->obj_field(detailMessage_offset);
1044 }
1045 
1046 
1047 oop java_lang_Throwable::message(Handle throwable) {
1048   return throwable->obj_field(detailMessage_offset);
1049 }
1050 
1051 
1052 void java_lang_Throwable::set_message(oop throwable, oop value) {
1053   throwable->obj_field_put(detailMessage_offset, value);
1054 }
1055 
1056 
1057 void java_lang_Throwable::set_stacktrace(oop throwable, oop st_element_array) {
1058   throwable->obj_field_put(stackTrace_offset, st_element_array);
1059 }
1060 
1061 void java_lang_Throwable::clear_stacktrace(oop throwable) {
1062   assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4");
1063   set_stacktrace(throwable, NULL);
1064 }
1065 
1066 
1067 void java_lang_Throwable::print(oop throwable, outputStream* st) {
1068   ResourceMark rm;
1069   klassOop k = throwable->klass();
1070   assert(k != NULL, "just checking");
1071   st->print("%s", instanceKlass::cast(k)->external_name());
1072   oop msg = message(throwable);
1073   if (msg != NULL) {
1074     st->print(": %s", java_lang_String::as_utf8_string(msg));
1075   }
1076 }
1077 
1078 
1079 void java_lang_Throwable::print(Handle throwable, outputStream* st) {
1080   ResourceMark rm;
1081   klassOop k = throwable->klass();
1082   assert(k != NULL, "just checking");
1083   st->print("%s", instanceKlass::cast(k)->external_name());
1084   oop msg = message(throwable);
1085   if (msg != NULL) {
1086     st->print(": %s", java_lang_String::as_utf8_string(msg));
1087   }
1088 }
1089 
1090 // Print stack trace element to resource allocated buffer
1091 char* java_lang_Throwable::print_stack_element_to_buffer(methodOop method, int bci) {
1092   // Get strings and string lengths
1093   instanceKlass* klass = instanceKlass::cast(method->method_holder());
1094   const char* klass_name  = klass->external_name();
1095   int buf_len = (int)strlen(klass_name);
1096   char* source_file_name;
1097   if (klass->source_file_name() == NULL) {
1098     source_file_name = NULL;
1099   } else {
1100     source_file_name = klass->source_file_name()->as_C_string();
1101     buf_len += (int)strlen(source_file_name);
1102   }
1103   char* method_name = method->name()->as_C_string();
1104   buf_len += (int)strlen(method_name);
1105 
1106   // Allocate temporary buffer with extra space for formatting and line number
1107   char* buf = NEW_RESOURCE_ARRAY(char, buf_len + 64);
1108 
1109   // Print stack trace line in buffer
1110   sprintf(buf, "\tat %s.%s", klass_name, method_name);
1111   if (method->is_native()) {
1112     strcat(buf, "(Native Method)");
1113   } else {
1114     int line_number = method->line_number_from_bci(bci);
1115     if (source_file_name != NULL && (line_number != -1)) {
1116       // Sourcename and linenumber
1117       sprintf(buf + (int)strlen(buf), "(%s:%d)", source_file_name, line_number);
1118     } else if (source_file_name != NULL) {
1119       // Just sourcename
1120       sprintf(buf + (int)strlen(buf), "(%s)", source_file_name);
1121     } else {
1122       // Neither soucename and linenumber
1123       sprintf(buf + (int)strlen(buf), "(Unknown Source)");
1124     }
1125     nmethod* nm = method->code();
1126     if (WizardMode && nm != NULL) {
1127       sprintf(buf + (int)strlen(buf), "(nmethod " PTR_FORMAT ")", (intptr_t)nm);
1128     }
1129   }
1130 
1131   return buf;
1132 }
1133 
1134 
1135 void java_lang_Throwable::print_stack_element(Handle stream, methodOop method, int bci) {
1136   ResourceMark rm;
1137   char* buf = print_stack_element_to_buffer(method, bci);
1138   print_to_stream(stream, buf);
1139 }
1140 
1141 void java_lang_Throwable::print_stack_element(outputStream *st, methodOop method, int bci) {
1142   ResourceMark rm;
1143   char* buf = print_stack_element_to_buffer(method, bci);
1144   st->print_cr("%s", buf);
1145 }
1146 
1147 void java_lang_Throwable::print_to_stream(Handle stream, const char* str) {
1148   if (stream.is_null()) {
1149     tty->print_cr("%s", str);
1150   } else {
1151     EXCEPTION_MARK;
1152     JavaValue result(T_VOID);
1153     Handle arg (THREAD, oopFactory::new_charArray(str, THREAD));
1154     if (!HAS_PENDING_EXCEPTION) {
1155       JavaCalls::call_virtual(&result,
1156                               stream,
1157                               KlassHandle(THREAD, stream->klass()),
1158                               vmSymbols::println_name(),
1159                               vmSymbols::char_array_void_signature(),
1160                               arg,
1161                               THREAD);
1162     }
1163     // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
1164     if (HAS_PENDING_EXCEPTION) CLEAR_PENDING_EXCEPTION;
1165   }
1166 
1167 }
1168 
1169 
1170 const char* java_lang_Throwable::no_stack_trace_message() {
1171   return "\t<<no stack trace available>>";
1172 }
1173 
1174 
1175 // Currently used only for exceptions occurring during startup
1176 void java_lang_Throwable::print_stack_trace(oop throwable, outputStream* st) {
1177   Thread *THREAD = Thread::current();
1178   Handle h_throwable(THREAD, throwable);
1179   while (h_throwable.not_null()) {
1180     objArrayHandle result (THREAD, objArrayOop(backtrace(h_throwable())));
1181     if (result.is_null()) {
1182       st->print_cr(no_stack_trace_message());
1183       return;
1184     }
1185 
1186     while (result.not_null()) {
1187       objArrayHandle methods (THREAD,
1188                               objArrayOop(result->obj_at(trace_methods_offset)));
1189       typeArrayHandle bcis (THREAD,
1190                             typeArrayOop(result->obj_at(trace_bcis_offset)));
1191 
1192       if (methods.is_null() || bcis.is_null()) {
1193         st->print_cr(no_stack_trace_message());
1194         return;
1195       }
1196 
1197       int length = methods()->length();
1198       for (int index = 0; index < length; index++) {
1199         methodOop method = methodOop(methods()->obj_at(index));
1200         if (method == NULL) goto handle_cause;
1201         int bci = bcis->ushort_at(index);
1202         print_stack_element(st, method, bci);
1203       }
1204       result = objArrayHandle(THREAD, objArrayOop(result->obj_at(trace_next_offset)));
1205     }
1206   handle_cause:
1207     {
1208       EXCEPTION_MARK;
1209       JavaValue result(T_OBJECT);
1210       JavaCalls::call_virtual(&result,
1211                               h_throwable,
1212                               KlassHandle(THREAD, h_throwable->klass()),
1213                               vmSymbols::getCause_name(),
1214                               vmSymbols::void_throwable_signature(),
1215                               THREAD);
1216       // Ignore any exceptions. we are in the middle of exception handling. Same as classic VM.
1217       if (HAS_PENDING_EXCEPTION) {
1218         CLEAR_PENDING_EXCEPTION;
1219         h_throwable = Handle();
1220       } else {
1221         h_throwable = Handle(THREAD, (oop) result.get_jobject());
1222         if (h_throwable.not_null()) {
1223           st->print("Caused by: ");
1224           print(h_throwable, st);
1225           st->cr();
1226         }
1227       }
1228     }
1229   }
1230 }
1231 
1232 
1233 void java_lang_Throwable::print_stack_trace(oop throwable, oop print_stream) {
1234   // Note: this is no longer used in Merlin, but we support it for compatibility.
1235   Thread *thread = Thread::current();
1236   Handle stream(thread, print_stream);
1237   objArrayHandle result (thread, objArrayOop(backtrace(throwable)));
1238   if (result.is_null()) {
1239     print_to_stream(stream, no_stack_trace_message());
1240     return;
1241   }
1242 
1243   while (result.not_null()) {
1244     objArrayHandle methods (thread,
1245                             objArrayOop(result->obj_at(trace_methods_offset)));
1246     typeArrayHandle bcis (thread,
1247                           typeArrayOop(result->obj_at(trace_bcis_offset)));
1248 
1249     if (methods.is_null() || bcis.is_null()) {
1250       print_to_stream(stream, no_stack_trace_message());
1251       return;
1252     }
1253 
1254     int length = methods()->length();
1255     for (int index = 0; index < length; index++) {
1256       methodOop method = methodOop(methods()->obj_at(index));
1257       if (method == NULL) return;
1258       int bci = bcis->ushort_at(index);
1259       print_stack_element(stream, method, bci);
1260     }
1261     result = objArrayHandle(thread, objArrayOop(result->obj_at(trace_next_offset)));
1262   }
1263 }
1264 
1265 // This class provides a simple wrapper over the internal structure of
1266 // exception backtrace to insulate users of the backtrace from needing
1267 // to know what it looks like.
1268 class BacktraceBuilder: public StackObj {
1269  private:
1270   Handle          _backtrace;
1271   objArrayOop     _head;
1272   objArrayOop     _methods;
1273   typeArrayOop    _bcis;
1274   int             _index;
1275   No_Safepoint_Verifier _nsv;
1276 
1277  public:
1278 
1279   enum {
1280     trace_methods_offset = java_lang_Throwable::trace_methods_offset,
1281     trace_bcis_offset    = java_lang_Throwable::trace_bcis_offset,
1282     trace_next_offset    = java_lang_Throwable::trace_next_offset,
1283     trace_size           = java_lang_Throwable::trace_size,
1284     trace_chunk_size     = java_lang_Throwable::trace_chunk_size
1285   };
1286 
1287   // constructor for new backtrace
1288   BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL) {
1289     expand(CHECK);
1290     _backtrace = _head;
1291     _index = 0;
1292   }
1293 
1294   void expand(TRAPS) {
1295     objArrayHandle old_head(THREAD, _head);
1296     Pause_No_Safepoint_Verifier pnsv(&_nsv);
1297 
1298     objArrayOop head = oopFactory::new_objectArray(trace_size, CHECK);
1299     objArrayHandle new_head(THREAD, head);
1300 
1301     objArrayOop methods = oopFactory::new_objectArray(trace_chunk_size, CHECK);
1302     objArrayHandle new_methods(THREAD, methods);
1303 
1304     typeArrayOop bcis = oopFactory::new_shortArray(trace_chunk_size, CHECK);
1305     typeArrayHandle new_bcis(THREAD, bcis);
1306 
1307     if (!old_head.is_null()) {
1308       old_head->obj_at_put(trace_next_offset, new_head());
1309     }
1310     new_head->obj_at_put(trace_methods_offset, new_methods());
1311     new_head->obj_at_put(trace_bcis_offset, new_bcis());
1312 
1313     _head    = new_head();
1314     _methods = new_methods();
1315     _bcis    = new_bcis();
1316     _index = 0;
1317   }
1318 
1319   oop backtrace() {
1320     return _backtrace();
1321   }
1322 
1323   inline void push(methodOop method, short bci, TRAPS) {
1324     if (_index >= trace_chunk_size) {
1325       methodHandle mhandle(THREAD, method);
1326       expand(CHECK);
1327       method = mhandle();
1328     }
1329 
1330     _methods->obj_at_put(_index, method);
1331     _bcis->ushort_at_put(_index, bci);
1332     _index++;
1333   }
1334 
1335   methodOop current_method() {
1336     assert(_index >= 0 && _index < trace_chunk_size, "out of range");
1337     return methodOop(_methods->obj_at(_index));
1338   }
1339 
1340   jushort current_bci() {
1341     assert(_index >= 0 && _index < trace_chunk_size, "out of range");
1342     return _bcis->ushort_at(_index);
1343   }
1344 };
1345 
1346 
1347 void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method, TRAPS) {
1348   if (!StackTraceInThrowable) return;
1349   ResourceMark rm(THREAD);
1350 
1351   // Start out by clearing the backtrace for this object, in case the VM
1352   // runs out of memory while allocating the stack trace
1353   set_backtrace(throwable(), NULL);
1354   if (JDK_Version::is_gte_jdk14x_version()) {
1355     // New since 1.4, clear lazily constructed Java level stacktrace if
1356     // refilling occurs
1357     // This is unnecessary in 1.7+ but harmless
1358     clear_stacktrace(throwable());
1359   }
1360 
1361   int max_depth = MaxJavaStackTraceDepth;
1362   JavaThread* thread = (JavaThread*)THREAD;
1363   BacktraceBuilder bt(CHECK);
1364 
1365   // If there is no Java frame just return the method that was being called
1366   // with bci 0
1367   if (!thread->has_last_Java_frame()) {
1368     if (max_depth >= 1 && method() != NULL) {
1369       bt.push(method(), 0, CHECK);
1370       set_backtrace(throwable(), bt.backtrace());
1371     }
1372     return;
1373   }
1374 
1375   // Instead of using vframe directly, this version of fill_in_stack_trace
1376   // basically handles everything by hand. This significantly improved the
1377   // speed of this method call up to 28.5% on Solaris sparc. 27.1% on Windows.
1378   // See bug 6333838 for  more details.
1379   // The "ASSERT" here is to verify this method generates the exactly same stack
1380   // trace as utilizing vframe.
1381 #ifdef ASSERT
1382   vframeStream st(thread);
1383   methodHandle st_method(THREAD, st.method());
1384 #endif
1385   int total_count = 0;
1386   RegisterMap map(thread, false);
1387   int decode_offset = 0;
1388   nmethod* nm = NULL;
1389   bool skip_fillInStackTrace_check = false;
1390   bool skip_throwableInit_check = false;
1391 
1392   for (frame fr = thread->last_frame(); max_depth != total_count;) {
1393     methodOop method = NULL;
1394     int bci = 0;
1395 
1396     // Compiled java method case.
1397     if (decode_offset != 0) {
1398       DebugInfoReadStream stream(nm, decode_offset);
1399       decode_offset = stream.read_int();
1400       method = (methodOop)nm->oop_at(stream.read_int());
1401       bci = stream.read_bci();
1402     } else {
1403       if (fr.is_first_frame()) break;
1404       address pc = fr.pc();
1405       if (fr.is_interpreted_frame()) {
1406         intptr_t bcx = fr.interpreter_frame_bcx();
1407         method = fr.interpreter_frame_method();
1408         bci =  fr.is_bci(bcx) ? bcx : method->bci_from((address)bcx);
1409         fr = fr.sender(&map);
1410       } else {
1411         CodeBlob* cb = fr.cb();
1412         // HMMM QQQ might be nice to have frame return nm as NULL if cb is non-NULL
1413         // but non nmethod
1414         fr = fr.sender(&map);
1415         if (cb == NULL || !cb->is_nmethod()) {
1416           continue;
1417         }
1418         nm = (nmethod*)cb;
1419         if (nm->method()->is_native()) {
1420           method = nm->method();
1421           bci = 0;
1422         } else {
1423           PcDesc* pd = nm->pc_desc_at(pc);
1424           decode_offset = pd->scope_decode_offset();
1425           // if decode_offset is not equal to 0, it will execute the
1426           // "compiled java method case" at the beginning of the loop.
1427           continue;
1428         }
1429       }
1430     }
1431 #ifdef ASSERT
1432     assert(st_method() == method && st.bci() == bci,
1433            "Wrong stack trace");
1434     st.next();
1435     // vframeStream::method isn't GC-safe so store off a copy
1436     // of the methodOop in case we GC.
1437     if (!st.at_end()) {
1438       st_method = st.method();
1439     }
1440 #endif
1441 
1442     // the format of the stacktrace will be:
1443     // - 1 or more fillInStackTrace frames for the exception class (skipped)
1444     // - 0 or more <init> methods for the exception class (skipped)
1445     // - rest of the stack
1446 
1447     if (!skip_fillInStackTrace_check) {
1448       if ((method->name() == vmSymbols::fillInStackTrace_name() ||
1449            method->name() == vmSymbols::fillInStackTrace0_name()) &&
1450           throwable->is_a(method->method_holder())) {
1451         continue;
1452       }
1453       else {
1454         skip_fillInStackTrace_check = true; // gone past them all
1455       }
1456     }
1457     if (!skip_throwableInit_check) {
1458       assert(skip_fillInStackTrace_check, "logic error in backtrace filtering");
1459 
1460       // skip <init> methods of the exception class and superclasses
1461       // This is simlar to classic VM.
1462       if (method->name() == vmSymbols::object_initializer_name() &&
1463           throwable->is_a(method->method_holder())) {
1464         continue;
1465       } else {
1466         // there are none or we've seen them all - either way stop checking
1467         skip_throwableInit_check = true;
1468       }
1469     }
1470     bt.push(method, bci, CHECK);
1471     total_count++;
1472   }
1473 
1474   // Put completed stack trace into throwable object
1475   set_backtrace(throwable(), bt.backtrace());
1476 }
1477 
1478 void java_lang_Throwable::fill_in_stack_trace(Handle throwable, methodHandle method) {
1479   // No-op if stack trace is disabled
1480   if (!StackTraceInThrowable) {
1481     return;
1482   }
1483 
1484   // Disable stack traces for some preallocated out of memory errors
1485   if (!Universe::should_fill_in_stack_trace(throwable)) {
1486     return;
1487   }
1488 
1489   PRESERVE_EXCEPTION_MARK;
1490 
1491   JavaThread* thread = JavaThread::active();
1492   fill_in_stack_trace(throwable, method, thread);
1493   // ignore exceptions thrown during stack trace filling
1494   CLEAR_PENDING_EXCEPTION;
1495 }
1496 
1497 void java_lang_Throwable::allocate_backtrace(Handle throwable, TRAPS) {
1498   // Allocate stack trace - backtrace is created but not filled in
1499 
1500   // No-op if stack trace is disabled
1501   if (!StackTraceInThrowable) return;
1502 
1503   objArrayOop h_oop = oopFactory::new_objectArray(trace_size, CHECK);
1504   objArrayHandle backtrace  (THREAD, h_oop);
1505   objArrayOop m_oop = oopFactory::new_objectArray(trace_chunk_size, CHECK);
1506   objArrayHandle methods (THREAD, m_oop);
1507   typeArrayOop b = oopFactory::new_shortArray(trace_chunk_size, CHECK);
1508   typeArrayHandle bcis(THREAD, b);
1509 
1510   // backtrace has space for one chunk (next is NULL)
1511   backtrace->obj_at_put(trace_methods_offset, methods());
1512   backtrace->obj_at_put(trace_bcis_offset, bcis());
1513   set_backtrace(throwable(), backtrace());
1514 }
1515 
1516 
1517 void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle throwable) {
1518   // Fill in stack trace into preallocated backtrace (no GC)
1519 
1520   // No-op if stack trace is disabled
1521   if (!StackTraceInThrowable) return;
1522 
1523   assert(throwable->is_a(SystemDictionary::Throwable_klass()), "sanity check");
1524 
1525   oop backtrace = java_lang_Throwable::backtrace(throwable());
1526   assert(backtrace != NULL, "backtrace not preallocated");
1527 
1528   oop m = objArrayOop(backtrace)->obj_at(trace_methods_offset);
1529   objArrayOop methods = objArrayOop(m);
1530   assert(methods != NULL && methods->length() > 0, "method array not preallocated");
1531 
1532   oop b = objArrayOop(backtrace)->obj_at(trace_bcis_offset);
1533   typeArrayOop bcis = typeArrayOop(b);
1534   assert(bcis != NULL, "bci array not preallocated");
1535 
1536   assert(methods->length() == bcis->length(), "method and bci arrays should match");
1537 
1538   JavaThread* thread = JavaThread::current();
1539   ResourceMark rm(thread);
1540   vframeStream st(thread);
1541 
1542   // Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init
1543   // methods as preallocated errors aren't created by "java" code.
1544 
1545   // fill in as much stack trace as possible
1546   int max_chunks = MIN2(methods->length(), (int)MaxJavaStackTraceDepth);
1547   int chunk_count = 0;
1548 
1549   for (;!st.at_end(); st.next()) {
1550     // add element
1551     bcis->ushort_at_put(chunk_count, st.bci());
1552     methods->obj_at_put(chunk_count, st.method());
1553 
1554     chunk_count++;
1555 
1556     // Bail-out for deep stacks
1557     if (chunk_count >= max_chunks) break;
1558   }
1559 
1560   // For Java 7+ we support the Throwable immutability protocol defined for Java 7. This support
1561   // was missing in 7u0 so in 7u0 there is a workaround in the Throwable class. That workaround
1562   // can be removed in a JDK using this JVM version
1563   if (JDK_Version::is_gte_jdk17x_version()) {
1564       java_lang_Throwable::set_stacktrace(throwable(), java_lang_Throwable::unassigned_stacktrace());
1565       assert(java_lang_Throwable::unassigned_stacktrace() != NULL, "not initialized");
1566   }
1567 
1568 }
1569 
1570 
1571 int java_lang_Throwable::get_stack_trace_depth(oop throwable, TRAPS) {
1572   if (throwable == NULL) {
1573     THROW_0(vmSymbols::java_lang_NullPointerException());
1574   }
1575   objArrayOop chunk = objArrayOop(backtrace(throwable));
1576   int depth = 0;
1577   if (chunk != NULL) {
1578     // Iterate over chunks and count full ones
1579     while (true) {
1580       objArrayOop next = objArrayOop(chunk->obj_at(trace_next_offset));
1581       if (next == NULL) break;
1582       depth += trace_chunk_size;
1583       chunk = next;
1584     }
1585     assert(chunk != NULL && chunk->obj_at(trace_next_offset) == NULL, "sanity check");
1586     // Count element in remaining partial chunk
1587     objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset));
1588     typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));
1589     assert(methods != NULL && bcis != NULL, "sanity check");
1590     for (int i = 0; i < methods->length(); i++) {
1591       if (methods->obj_at(i) == NULL) break;
1592       depth++;
1593     }
1594   }
1595   return depth;
1596 }
1597 
1598 
1599 oop java_lang_Throwable::get_stack_trace_element(oop throwable, int index, TRAPS) {
1600   if (throwable == NULL) {
1601     THROW_0(vmSymbols::java_lang_NullPointerException());
1602   }
1603   if (index < 0) {
1604     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
1605   }
1606   // Compute how many chunks to skip and index into actual chunk
1607   objArrayOop chunk = objArrayOop(backtrace(throwable));
1608   int skip_chunks = index / trace_chunk_size;
1609   int chunk_index = index % trace_chunk_size;
1610   while (chunk != NULL && skip_chunks > 0) {
1611     chunk = objArrayOop(chunk->obj_at(trace_next_offset));
1612         skip_chunks--;
1613   }
1614   if (chunk == NULL) {
1615     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
1616   }
1617   // Get method,bci from chunk
1618   objArrayOop methods = objArrayOop(chunk->obj_at(trace_methods_offset));
1619   typeArrayOop bcis = typeArrayOop(chunk->obj_at(trace_bcis_offset));
1620   assert(methods != NULL && bcis != NULL, "sanity check");
1621   methodHandle method(THREAD, methodOop(methods->obj_at(chunk_index)));
1622   int bci = bcis->ushort_at(chunk_index);
1623   // Chunk can be partial full
1624   if (method.is_null()) {
1625     THROW_(vmSymbols::java_lang_IndexOutOfBoundsException(), NULL);
1626   }
1627 
1628   oop element = java_lang_StackTraceElement::create(method, bci, CHECK_0);
1629   return element;
1630 }
1631 
1632 oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) {
1633   // SystemDictionary::stackTraceElement_klass() will be null for pre-1.4 JDKs
1634   assert(JDK_Version::is_gte_jdk14x_version(), "should only be called in >= 1.4");
1635 
1636   // Allocate java.lang.StackTraceElement instance
1637   klassOop k = SystemDictionary::StackTraceElement_klass();
1638   assert(k != NULL, "must be loaded in 1.4+");
1639   instanceKlassHandle ik (THREAD, k);
1640   if (ik->should_be_initialized()) {
1641     ik->initialize(CHECK_0);
1642   }
1643 
1644   Handle element = ik->allocate_instance_handle(CHECK_0);
1645   // Fill in class name
1646   ResourceMark rm(THREAD);
1647   const char* str = instanceKlass::cast(method->method_holder())->external_name();
1648   oop classname = StringTable::intern((char*) str, CHECK_0);
1649   java_lang_StackTraceElement::set_declaringClass(element(), classname);
1650   // Fill in method name
1651   oop methodname = StringTable::intern(method->name(), CHECK_0);
1652   java_lang_StackTraceElement::set_methodName(element(), methodname);
1653   // Fill in source file name
1654   Symbol* source = instanceKlass::cast(method->method_holder())->source_file_name();
1655   oop filename = StringTable::intern(source, CHECK_0);
1656   java_lang_StackTraceElement::set_fileName(element(), filename);
1657   // File in source line number
1658   int line_number;
1659   if (method->is_native()) {
1660     // Negative value different from -1 below, enabling Java code in
1661     // class java.lang.StackTraceElement to distinguish "native" from
1662     // "no LineNumberTable".
1663     line_number = -2;
1664   } else {
1665     // Returns -1 if no LineNumberTable, and otherwise actual line number
1666     line_number = method->line_number_from_bci(bci);
1667   }
1668   java_lang_StackTraceElement::set_lineNumber(element(), line_number);
1669 
1670   return element();
1671 }
1672 
1673 
1674 void java_lang_reflect_AccessibleObject::compute_offsets() {
1675   klassOop k = SystemDictionary::reflect_AccessibleObject_klass();
1676   compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
1677 }
1678 
1679 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
1680   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1681   return (jboolean) reflect->bool_field(override_offset);
1682 }
1683 
1684 void java_lang_reflect_AccessibleObject::set_override(oop reflect, jboolean value) {
1685   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1686   reflect->bool_field_put(override_offset, (int) value);
1687 }
1688 
1689 void java_lang_reflect_Method::compute_offsets() {
1690   klassOop k = SystemDictionary::reflect_Method_klass();
1691   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
1692   compute_offset(name_offset,           k, vmSymbols::name_name(),           vmSymbols::string_signature());
1693   compute_offset(returnType_offset,     k, vmSymbols::returnType_name(),     vmSymbols::class_signature());
1694   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
1695   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
1696   compute_offset(slot_offset,           k, vmSymbols::slot_name(),           vmSymbols::int_signature());
1697   compute_offset(modifiers_offset,      k, vmSymbols::modifiers_name(),      vmSymbols::int_signature());
1698   // The generic signature and annotations fields are only present in 1.5
1699   signature_offset = -1;
1700   annotations_offset = -1;
1701   parameter_annotations_offset = -1;
1702   annotation_default_offset = -1;
1703   compute_optional_offset(signature_offset,             k, vmSymbols::signature_name(),             vmSymbols::string_signature());
1704   compute_optional_offset(annotations_offset,           k, vmSymbols::annotations_name(),           vmSymbols::byte_array_signature());
1705   compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
1706   compute_optional_offset(annotation_default_offset,    k, vmSymbols::annotation_default_name(),    vmSymbols::byte_array_signature());
1707 }
1708 
1709 Handle java_lang_reflect_Method::create(TRAPS) {
1710   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1711   klassOop klass = SystemDictionary::reflect_Method_klass();
1712   // This class is eagerly initialized during VM initialization, since we keep a refence
1713   // to one of the methods
1714   assert(instanceKlass::cast(klass)->is_initialized(), "must be initialized");
1715   return instanceKlass::cast(klass)->allocate_instance_handle(CHECK_NH);
1716 }
1717 
1718 oop java_lang_reflect_Method::clazz(oop reflect) {
1719   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1720   return reflect->obj_field(clazz_offset);
1721 }
1722 
1723 void java_lang_reflect_Method::set_clazz(oop reflect, oop value) {
1724   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1725    reflect->obj_field_put(clazz_offset, value);
1726 }
1727 
1728 int java_lang_reflect_Method::slot(oop reflect) {
1729   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1730   return reflect->int_field(slot_offset);
1731 }
1732 
1733 void java_lang_reflect_Method::set_slot(oop reflect, int value) {
1734   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1735   reflect->int_field_put(slot_offset, value);
1736 }
1737 
1738 oop java_lang_reflect_Method::name(oop method) {
1739   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1740   return method->obj_field(name_offset);
1741 }
1742 
1743 void java_lang_reflect_Method::set_name(oop method, oop value) {
1744   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1745   method->obj_field_put(name_offset, value);
1746 }
1747 
1748 oop java_lang_reflect_Method::return_type(oop method) {
1749   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1750   return method->obj_field(returnType_offset);
1751 }
1752 
1753 void java_lang_reflect_Method::set_return_type(oop method, oop value) {
1754   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1755   method->obj_field_put(returnType_offset, value);
1756 }
1757 
1758 oop java_lang_reflect_Method::parameter_types(oop method) {
1759   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1760   return method->obj_field(parameterTypes_offset);
1761 }
1762 
1763 void java_lang_reflect_Method::set_parameter_types(oop method, oop value) {
1764   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1765   method->obj_field_put(parameterTypes_offset, value);
1766 }
1767 
1768 oop java_lang_reflect_Method::exception_types(oop method) {
1769   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1770   return method->obj_field(exceptionTypes_offset);
1771 }
1772 
1773 void java_lang_reflect_Method::set_exception_types(oop method, oop value) {
1774   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1775   method->obj_field_put(exceptionTypes_offset, value);
1776 }
1777 
1778 int java_lang_reflect_Method::modifiers(oop method) {
1779   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1780   return method->int_field(modifiers_offset);
1781 }
1782 
1783 void java_lang_reflect_Method::set_modifiers(oop method, int value) {
1784   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1785   method->int_field_put(modifiers_offset, value);
1786 }
1787 
1788 bool java_lang_reflect_Method::has_signature_field() {
1789   return (signature_offset >= 0);
1790 }
1791 
1792 oop java_lang_reflect_Method::signature(oop method) {
1793   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1794   assert(has_signature_field(), "signature field must be present");
1795   return method->obj_field(signature_offset);
1796 }
1797 
1798 void java_lang_reflect_Method::set_signature(oop method, oop value) {
1799   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1800   assert(has_signature_field(), "signature field must be present");
1801   method->obj_field_put(signature_offset, value);
1802 }
1803 
1804 bool java_lang_reflect_Method::has_annotations_field() {
1805   return (annotations_offset >= 0);
1806 }
1807 
1808 oop java_lang_reflect_Method::annotations(oop method) {
1809   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1810   assert(has_annotations_field(), "annotations field must be present");
1811   return method->obj_field(annotations_offset);
1812 }
1813 
1814 void java_lang_reflect_Method::set_annotations(oop method, oop value) {
1815   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1816   assert(has_annotations_field(), "annotations field must be present");
1817   method->obj_field_put(annotations_offset, value);
1818 }
1819 
1820 bool java_lang_reflect_Method::has_parameter_annotations_field() {
1821   return (parameter_annotations_offset >= 0);
1822 }
1823 
1824 oop java_lang_reflect_Method::parameter_annotations(oop method) {
1825   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1826   assert(has_parameter_annotations_field(), "parameter annotations field must be present");
1827   return method->obj_field(parameter_annotations_offset);
1828 }
1829 
1830 void java_lang_reflect_Method::set_parameter_annotations(oop method, oop value) {
1831   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1832   assert(has_parameter_annotations_field(), "parameter annotations field must be present");
1833   method->obj_field_put(parameter_annotations_offset, value);
1834 }
1835 
1836 bool java_lang_reflect_Method::has_annotation_default_field() {
1837   return (annotation_default_offset >= 0);
1838 }
1839 
1840 oop java_lang_reflect_Method::annotation_default(oop method) {
1841   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1842   assert(has_annotation_default_field(), "annotation default field must be present");
1843   return method->obj_field(annotation_default_offset);
1844 }
1845 
1846 void java_lang_reflect_Method::set_annotation_default(oop method, oop value) {
1847   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1848   assert(has_annotation_default_field(), "annotation default field must be present");
1849   method->obj_field_put(annotation_default_offset, value);
1850 }
1851 
1852 void java_lang_reflect_Constructor::compute_offsets() {
1853   klassOop k = SystemDictionary::reflect_Constructor_klass();
1854   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
1855   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
1856   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
1857   compute_offset(slot_offset,           k, vmSymbols::slot_name(),           vmSymbols::int_signature());
1858   compute_offset(modifiers_offset,      k, vmSymbols::modifiers_name(),      vmSymbols::int_signature());
1859   // The generic signature and annotations fields are only present in 1.5
1860   signature_offset = -1;
1861   annotations_offset = -1;
1862   parameter_annotations_offset = -1;
1863   compute_optional_offset(signature_offset,             k, vmSymbols::signature_name(),             vmSymbols::string_signature());
1864   compute_optional_offset(annotations_offset,           k, vmSymbols::annotations_name(),           vmSymbols::byte_array_signature());
1865   compute_optional_offset(parameter_annotations_offset, k, vmSymbols::parameter_annotations_name(), vmSymbols::byte_array_signature());
1866 }
1867 
1868 Handle java_lang_reflect_Constructor::create(TRAPS) {
1869   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1870   Symbol* name = vmSymbols::java_lang_reflect_Constructor();
1871   klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
1872   instanceKlassHandle klass (THREAD, k);
1873   // Ensure it is initialized
1874   klass->initialize(CHECK_NH);
1875   return klass->allocate_instance_handle(CHECK_NH);
1876 }
1877 
1878 oop java_lang_reflect_Constructor::clazz(oop reflect) {
1879   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1880   return reflect->obj_field(clazz_offset);
1881 }
1882 
1883 void java_lang_reflect_Constructor::set_clazz(oop reflect, oop value) {
1884   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1885    reflect->obj_field_put(clazz_offset, value);
1886 }
1887 
1888 oop java_lang_reflect_Constructor::parameter_types(oop constructor) {
1889   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1890   return constructor->obj_field(parameterTypes_offset);
1891 }
1892 
1893 void java_lang_reflect_Constructor::set_parameter_types(oop constructor, oop value) {
1894   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1895   constructor->obj_field_put(parameterTypes_offset, value);
1896 }
1897 
1898 oop java_lang_reflect_Constructor::exception_types(oop constructor) {
1899   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1900   return constructor->obj_field(exceptionTypes_offset);
1901 }
1902 
1903 void java_lang_reflect_Constructor::set_exception_types(oop constructor, oop value) {
1904   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1905   constructor->obj_field_put(exceptionTypes_offset, value);
1906 }
1907 
1908 int java_lang_reflect_Constructor::slot(oop reflect) {
1909   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1910   return reflect->int_field(slot_offset);
1911 }
1912 
1913 void java_lang_reflect_Constructor::set_slot(oop reflect, int value) {
1914   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1915   reflect->int_field_put(slot_offset, value);
1916 }
1917 
1918 int java_lang_reflect_Constructor::modifiers(oop constructor) {
1919   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1920   return constructor->int_field(modifiers_offset);
1921 }
1922 
1923 void java_lang_reflect_Constructor::set_modifiers(oop constructor, int value) {
1924   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1925   constructor->int_field_put(modifiers_offset, value);
1926 }
1927 
1928 bool java_lang_reflect_Constructor::has_signature_field() {
1929   return (signature_offset >= 0);
1930 }
1931 
1932 oop java_lang_reflect_Constructor::signature(oop constructor) {
1933   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1934   assert(has_signature_field(), "signature field must be present");
1935   return constructor->obj_field(signature_offset);
1936 }
1937 
1938 void java_lang_reflect_Constructor::set_signature(oop constructor, oop value) {
1939   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1940   assert(has_signature_field(), "signature field must be present");
1941   constructor->obj_field_put(signature_offset, value);
1942 }
1943 
1944 bool java_lang_reflect_Constructor::has_annotations_field() {
1945   return (annotations_offset >= 0);
1946 }
1947 
1948 oop java_lang_reflect_Constructor::annotations(oop constructor) {
1949   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1950   assert(has_annotations_field(), "annotations field must be present");
1951   return constructor->obj_field(annotations_offset);
1952 }
1953 
1954 void java_lang_reflect_Constructor::set_annotations(oop constructor, oop value) {
1955   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1956   assert(has_annotations_field(), "annotations field must be present");
1957   constructor->obj_field_put(annotations_offset, value);
1958 }
1959 
1960 bool java_lang_reflect_Constructor::has_parameter_annotations_field() {
1961   return (parameter_annotations_offset >= 0);
1962 }
1963 
1964 oop java_lang_reflect_Constructor::parameter_annotations(oop method) {
1965   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1966   assert(has_parameter_annotations_field(), "parameter annotations field must be present");
1967   return method->obj_field(parameter_annotations_offset);
1968 }
1969 
1970 void java_lang_reflect_Constructor::set_parameter_annotations(oop method, oop value) {
1971   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1972   assert(has_parameter_annotations_field(), "parameter annotations field must be present");
1973   method->obj_field_put(parameter_annotations_offset, value);
1974 }
1975 
1976 void java_lang_reflect_Field::compute_offsets() {
1977   klassOop k = SystemDictionary::reflect_Field_klass();
1978   compute_offset(clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
1979   compute_offset(name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
1980   compute_offset(type_offset,      k, vmSymbols::type_name(),      vmSymbols::class_signature());
1981   compute_offset(slot_offset,      k, vmSymbols::slot_name(),      vmSymbols::int_signature());
1982   compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
1983   // The generic signature and annotations fields are only present in 1.5
1984   signature_offset = -1;
1985   annotations_offset = -1;
1986   compute_optional_offset(signature_offset, k, vmSymbols::signature_name(), vmSymbols::string_signature());
1987   compute_optional_offset(annotations_offset,  k, vmSymbols::annotations_name(),  vmSymbols::byte_array_signature());
1988 }
1989 
1990 Handle java_lang_reflect_Field::create(TRAPS) {
1991   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
1992   Symbol* name = vmSymbols::java_lang_reflect_Field();
1993   klassOop k = SystemDictionary::resolve_or_fail(name, true, CHECK_NH);
1994   instanceKlassHandle klass (THREAD, k);
1995   // Ensure it is initialized
1996   klass->initialize(CHECK_NH);
1997   return klass->allocate_instance_handle(CHECK_NH);
1998 }
1999 
2000 oop java_lang_reflect_Field::clazz(oop reflect) {
2001   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2002   return reflect->obj_field(clazz_offset);
2003 }
2004 
2005 void java_lang_reflect_Field::set_clazz(oop reflect, oop value) {
2006   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2007    reflect->obj_field_put(clazz_offset, value);
2008 }
2009 
2010 oop java_lang_reflect_Field::name(oop field) {
2011   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2012   return field->obj_field(name_offset);
2013 }
2014 
2015 void java_lang_reflect_Field::set_name(oop field, oop value) {
2016   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2017   field->obj_field_put(name_offset, value);
2018 }
2019 
2020 oop java_lang_reflect_Field::type(oop field) {
2021   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2022   return field->obj_field(type_offset);
2023 }
2024 
2025 void java_lang_reflect_Field::set_type(oop field, oop value) {
2026   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2027   field->obj_field_put(type_offset, value);
2028 }
2029 
2030 int java_lang_reflect_Field::slot(oop reflect) {
2031   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2032   return reflect->int_field(slot_offset);
2033 }
2034 
2035 void java_lang_reflect_Field::set_slot(oop reflect, int value) {
2036   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2037   reflect->int_field_put(slot_offset, value);
2038 }
2039 
2040 int java_lang_reflect_Field::modifiers(oop field) {
2041   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2042   return field->int_field(modifiers_offset);
2043 }
2044 
2045 void java_lang_reflect_Field::set_modifiers(oop field, int value) {
2046   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2047   field->int_field_put(modifiers_offset, value);
2048 }
2049 
2050 bool java_lang_reflect_Field::has_signature_field() {
2051   return (signature_offset >= 0);
2052 }
2053 
2054 oop java_lang_reflect_Field::signature(oop field) {
2055   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2056   assert(has_signature_field(), "signature field must be present");
2057   return field->obj_field(signature_offset);
2058 }
2059 
2060 void java_lang_reflect_Field::set_signature(oop field, oop value) {
2061   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2062   assert(has_signature_field(), "signature field must be present");
2063   field->obj_field_put(signature_offset, value);
2064 }
2065 
2066 bool java_lang_reflect_Field::has_annotations_field() {
2067   return (annotations_offset >= 0);
2068 }
2069 
2070 oop java_lang_reflect_Field::annotations(oop field) {
2071   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2072   assert(has_annotations_field(), "annotations field must be present");
2073   return field->obj_field(annotations_offset);
2074 }
2075 
2076 void java_lang_reflect_Field::set_annotations(oop field, oop value) {
2077   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2078   assert(has_annotations_field(), "annotations field must be present");
2079   field->obj_field_put(annotations_offset, value);
2080 }
2081 
2082 
2083 void sun_reflect_ConstantPool::compute_offsets() {
2084   klassOop k = SystemDictionary::reflect_ConstantPool_klass();
2085   // This null test can be removed post beta
2086   if (k != NULL) {
2087     compute_offset(_cp_oop_offset, k, vmSymbols::constantPoolOop_name(), vmSymbols::object_signature());
2088   }
2089 }
2090 
2091 
2092 Handle sun_reflect_ConstantPool::create(TRAPS) {
2093   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2094   klassOop k = SystemDictionary::reflect_ConstantPool_klass();
2095   instanceKlassHandle klass (THREAD, k);
2096   // Ensure it is initialized
2097   klass->initialize(CHECK_NH);
2098   return klass->allocate_instance_handle(CHECK_NH);
2099 }
2100 
2101 
2102 oop sun_reflect_ConstantPool::cp_oop(oop reflect) {
2103   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2104   return reflect->obj_field(_cp_oop_offset);
2105 }
2106 
2107 
2108 void sun_reflect_ConstantPool::set_cp_oop(oop reflect, oop value) {
2109   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
2110   reflect->obj_field_put(_cp_oop_offset, value);
2111 }
2112 
2113 void sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {
2114   klassOop k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass();
2115   // This null test can be removed post beta
2116   if (k != NULL) {
2117     compute_offset(_base_offset, k,
2118                    vmSymbols::base_name(), vmSymbols::object_signature());
2119   }
2120 }
2121 
2122 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
2123   klassOop k = SystemDictionary::box_klass(type);
2124   if (k == NULL)  return NULL;
2125   instanceKlassHandle h (THREAD, k);
2126   if (!h->is_initialized())  h->initialize(CHECK_0);
2127   return h->allocate_instance(THREAD);
2128 }
2129 
2130 
2131 oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
2132   oop box = initialize_and_allocate(type, CHECK_0);
2133   if (box == NULL)  return NULL;
2134   switch (type) {
2135     case T_BOOLEAN:
2136       box->bool_field_put(value_offset, value->z);
2137       break;
2138     case T_CHAR:
2139       box->char_field_put(value_offset, value->c);
2140       break;
2141     case T_FLOAT:
2142       box->float_field_put(value_offset, value->f);
2143       break;
2144     case T_DOUBLE:
2145       box->double_field_put(long_value_offset, value->d);
2146       break;
2147     case T_BYTE:
2148       box->byte_field_put(value_offset, value->b);
2149       break;
2150     case T_SHORT:
2151       box->short_field_put(value_offset, value->s);
2152       break;
2153     case T_INT:
2154       box->int_field_put(value_offset, value->i);
2155       break;
2156     case T_LONG:
2157       box->long_field_put(long_value_offset, value->j);
2158       break;
2159     default:
2160       return NULL;
2161   }
2162   return box;
2163 }
2164 
2165 
2166 BasicType java_lang_boxing_object::basic_type(oop box) {
2167   if (box == NULL)  return T_ILLEGAL;
2168   BasicType type = SystemDictionary::box_klass_type(box->klass());
2169   if (type == T_OBJECT)         // 'unknown' value returned by SD::bkt
2170     return T_ILLEGAL;
2171   return type;
2172 }
2173 
2174 
2175 BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
2176   BasicType type = SystemDictionary::box_klass_type(box->klass());
2177   switch (type) {
2178   case T_BOOLEAN:
2179     value->z = box->bool_field(value_offset);
2180     break;
2181   case T_CHAR:
2182     value->c = box->char_field(value_offset);
2183     break;
2184   case T_FLOAT:
2185     value->f = box->float_field(value_offset);
2186     break;
2187   case T_DOUBLE:
2188     value->d = box->double_field(long_value_offset);
2189     break;
2190   case T_BYTE:
2191     value->b = box->byte_field(value_offset);
2192     break;
2193   case T_SHORT:
2194     value->s = box->short_field(value_offset);
2195     break;
2196   case T_INT:
2197     value->i = box->int_field(value_offset);
2198     break;
2199   case T_LONG:
2200     value->j = box->long_field(long_value_offset);
2201     break;
2202   default:
2203     return T_ILLEGAL;
2204   } // end switch
2205   return type;
2206 }
2207 
2208 
2209 BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
2210   BasicType type = SystemDictionary::box_klass_type(box->klass());
2211   switch (type) {
2212   case T_BOOLEAN:
2213     box->bool_field_put(value_offset, value->z);
2214     break;
2215   case T_CHAR:
2216     box->char_field_put(value_offset, value->c);
2217     break;
2218   case T_FLOAT:
2219     box->float_field_put(value_offset, value->f);
2220     break;
2221   case T_DOUBLE:
2222     box->double_field_put(long_value_offset, value->d);
2223     break;
2224   case T_BYTE:
2225     box->byte_field_put(value_offset, value->b);
2226     break;
2227   case T_SHORT:
2228     box->short_field_put(value_offset, value->s);
2229     break;
2230   case T_INT:
2231     box->int_field_put(value_offset, value->i);
2232     break;
2233   case T_LONG:
2234     box->long_field_put(long_value_offset, value->j);
2235     break;
2236   default:
2237     return T_ILLEGAL;
2238   } // end switch
2239   return type;
2240 }
2241 
2242 
2243 void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) {
2244   switch (type) {
2245   case T_BOOLEAN:   st->print("%s", value->z ? "true" : "false");   break;
2246   case T_CHAR:      st->print("%d", value->c);                      break;
2247   case T_BYTE:      st->print("%d", value->b);                      break;
2248   case T_SHORT:     st->print("%d", value->s);                      break;
2249   case T_INT:       st->print("%d", value->i);                      break;
2250   case T_LONG:      st->print(INT64_FORMAT, value->j);              break;
2251   case T_FLOAT:     st->print("%f", value->f);                      break;
2252   case T_DOUBLE:    st->print("%lf", value->d);                     break;
2253   default:          st->print("type %d?", type);                    break;
2254   }
2255 }
2256 
2257 
2258 // Support for java_lang_ref_Reference
2259 oop java_lang_ref_Reference::pending_list_lock() {
2260   instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass());
2261   address addr = ik->static_field_addr(static_lock_offset);
2262   if (UseCompressedOops) {
2263     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
2264   } else {
2265     return oopDesc::load_decode_heap_oop((oop*)addr);
2266   }
2267 }
2268 
2269 HeapWord *java_lang_ref_Reference::pending_list_addr() {
2270   instanceKlass* ik = instanceKlass::cast(SystemDictionary::Reference_klass());
2271   address addr = ik->static_field_addr(static_pending_offset);
2272   // XXX This might not be HeapWord aligned, almost rather be char *.
2273   return (HeapWord*)addr;
2274 }
2275 
2276 oop java_lang_ref_Reference::pending_list() {
2277   char *addr = (char *)pending_list_addr();
2278   if (UseCompressedOops) {
2279     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
2280   } else {
2281     return oopDesc::load_decode_heap_oop((oop*)addr);
2282   }
2283 }
2284 
2285 
2286 // Support for java_lang_ref_SoftReference
2287 
2288 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
2289   return ref->long_field(timestamp_offset);
2290 }
2291 
2292 jlong java_lang_ref_SoftReference::clock() {
2293   instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass());
2294   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2295   return *offset;
2296 }
2297 
2298 void java_lang_ref_SoftReference::set_clock(jlong value) {
2299   instanceKlass* ik = instanceKlass::cast(SystemDictionary::SoftReference_klass());
2300   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2301   *offset = value;
2302 }
2303 
2304 
2305 // Support for java_lang_invoke_MethodHandle
2306 
2307 int java_lang_invoke_MethodHandle::_type_offset;
2308 int java_lang_invoke_MethodHandle::_vmtarget_offset;
2309 int java_lang_invoke_MethodHandle::_vmentry_offset;
2310 int java_lang_invoke_MethodHandle::_vmslots_offset;
2311 
2312 int java_lang_invoke_MemberName::_clazz_offset;
2313 int java_lang_invoke_MemberName::_name_offset;
2314 int java_lang_invoke_MemberName::_type_offset;
2315 int java_lang_invoke_MemberName::_flags_offset;
2316 int java_lang_invoke_MemberName::_vmtarget_offset;
2317 int java_lang_invoke_MemberName::_vmindex_offset;
2318 
2319 int java_lang_invoke_DirectMethodHandle::_vmindex_offset;
2320 
2321 int java_lang_invoke_BoundMethodHandle::_argument_offset;
2322 int java_lang_invoke_BoundMethodHandle::_vmargslot_offset;
2323 
2324 int java_lang_invoke_AdapterMethodHandle::_conversion_offset;
2325 
2326 int java_lang_invoke_CountingMethodHandle::_vmcount_offset;
2327 
2328 void java_lang_invoke_MethodHandle::compute_offsets() {
2329   klassOop k = SystemDictionary::MethodHandle_klass();
2330   if (k != NULL && EnableInvokeDynamic) {
2331     bool allow_super = false;
2332     compute_offset(_type_offset,      k, vmSymbols::type_name(),      vmSymbols::java_lang_invoke_MethodType_signature(), allow_super);
2333     compute_offset(_vmtarget_offset,  k, vmSymbols::vmtarget_name(),  vmSymbols::object_signature(),                      allow_super);
2334     compute_offset(_vmentry_offset,   k, vmSymbols::vmentry_name(),   vmSymbols::machine_word_signature(),                allow_super);
2335 
2336     // Note:  MH.vmslots (if it is present) is a hoisted copy of MH.type.form.vmslots.
2337     // It is optional pending experiments to keep or toss.
2338     compute_optional_offset(_vmslots_offset, k, vmSymbols::vmslots_name(), vmSymbols::int_signature(), allow_super);
2339   }
2340 }
2341 
2342 void java_lang_invoke_MemberName::compute_offsets() {
2343   klassOop k = SystemDictionary::MemberName_klass();
2344   if (k != NULL && EnableInvokeDynamic) {
2345     compute_offset(_clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
2346     compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
2347     compute_offset(_type_offset,      k, vmSymbols::type_name(),      vmSymbols::object_signature());
2348     compute_offset(_flags_offset,     k, vmSymbols::flags_name(),     vmSymbols::int_signature());
2349     compute_offset(_vmtarget_offset,  k, vmSymbols::vmtarget_name(),  vmSymbols::object_signature());
2350     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature());
2351   }
2352 }
2353 
2354 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
2355   klassOop k = SystemDictionary::DirectMethodHandle_klass();
2356   if (k != NULL && EnableInvokeDynamic) {
2357     compute_offset(_vmindex_offset,   k, vmSymbols::vmindex_name(),   vmSymbols::int_signature(),    true);
2358   }
2359 }
2360 
2361 void java_lang_invoke_BoundMethodHandle::compute_offsets() {
2362   klassOop k = SystemDictionary::BoundMethodHandle_klass();
2363   if (k != NULL && EnableInvokeDynamic) {
2364     compute_offset(_vmargslot_offset, k, vmSymbols::vmargslot_name(), vmSymbols::int_signature(),    true);
2365     compute_offset(_argument_offset,  k, vmSymbols::argument_name(),  vmSymbols::object_signature(), true);
2366   }
2367 }
2368 
2369 void java_lang_invoke_AdapterMethodHandle::compute_offsets() {
2370   klassOop k = SystemDictionary::AdapterMethodHandle_klass();
2371   if (k != NULL && EnableInvokeDynamic) {
2372     compute_offset(_conversion_offset, k, vmSymbols::conversion_name(), vmSymbols::int_signature(), true);
2373   }
2374 }
2375 
2376 void java_lang_invoke_CountingMethodHandle::compute_offsets() {
2377   klassOop k = SystemDictionary::CountingMethodHandle_klass();
2378   if (k != NULL && EnableInvokeDynamic) {
2379     compute_offset(_vmcount_offset, k, vmSymbols::vmcount_name(), vmSymbols::int_signature(), true);
2380   }
2381 }
2382 
2383 int java_lang_invoke_CountingMethodHandle::vmcount(oop mh) {
2384   assert(is_instance(mh), "CMH only");
2385   return mh->int_field(_vmcount_offset);
2386 }
2387 
2388 void java_lang_invoke_CountingMethodHandle::set_vmcount(oop mh, int count) {
2389   assert(is_instance(mh), "CMH only");
2390   mh->int_field_put(_vmcount_offset, count);
2391 }
2392 
2393 oop java_lang_invoke_MethodHandle::type(oop mh) {
2394   return mh->obj_field(_type_offset);
2395 }
2396 
2397 void java_lang_invoke_MethodHandle::set_type(oop mh, oop mtype) {
2398   mh->obj_field_put(_type_offset, mtype);
2399 }
2400 
2401 int java_lang_invoke_MethodHandle::vmslots(oop mh) {
2402   int vmslots_offset = _vmslots_offset;
2403   if (vmslots_offset != 0) {
2404 #ifdef ASSERT
2405     int x = mh->int_field(vmslots_offset);
2406     int y = compute_vmslots(mh);
2407     assert(x == y, "correct hoisted value");
2408 #endif
2409     return mh->int_field(vmslots_offset);
2410   } else {
2411     return compute_vmslots(mh);
2412   }
2413 }
2414 
2415 // if MH.vmslots exists, hoist into it the value of type.form.vmslots
2416 void java_lang_invoke_MethodHandle::init_vmslots(oop mh) {
2417   int vmslots_offset = _vmslots_offset;
2418   if (vmslots_offset != 0) {
2419     mh->int_field_put(vmslots_offset, compute_vmslots(mh));
2420   }
2421 }
2422 
2423 // fetch type.form.vmslots, which is the number of JVM stack slots
2424 // required to carry the arguments of this MH
2425 int java_lang_invoke_MethodHandle::compute_vmslots(oop mh) {
2426   oop mtype = type(mh);
2427   if (mtype == NULL)  return 0;  // Java code would get NPE
2428   oop form = java_lang_invoke_MethodType::form(mtype);
2429   if (form == NULL)   return 0;  // Java code would get NPE
2430   return java_lang_invoke_MethodTypeForm::vmslots(form);
2431 }
2432 
2433 // fetch the low-level entry point for this mh
2434 MethodHandleEntry* java_lang_invoke_MethodHandle::vmentry(oop mh) {
2435   return (MethodHandleEntry*) mh->address_field(_vmentry_offset);
2436 }
2437 
2438 void java_lang_invoke_MethodHandle::set_vmentry(oop mh, MethodHandleEntry* me) {
2439   assert(_vmentry_offset != 0, "must be present");
2440 
2441   // This is always the final step that initializes a valid method handle:
2442   mh->release_address_field_put(_vmentry_offset, (address) me);
2443 
2444   // There should be enough memory barriers on exit from native methods
2445   // to ensure that the MH is fully initialized to all threads before
2446   // Java code can publish it in global data structures.
2447   // But just in case, we use release_address_field_put.
2448 }
2449 
2450 /// MemberName accessors
2451 
2452 oop java_lang_invoke_MemberName::clazz(oop mname) {
2453   assert(is_instance(mname), "wrong type");
2454   return mname->obj_field(_clazz_offset);
2455 }
2456 
2457 void java_lang_invoke_MemberName::set_clazz(oop mname, oop clazz) {
2458   assert(is_instance(mname), "wrong type");
2459   mname->obj_field_put(_clazz_offset, clazz);
2460 }
2461 
2462 oop java_lang_invoke_MemberName::name(oop mname) {
2463   assert(is_instance(mname), "wrong type");
2464   return mname->obj_field(_name_offset);
2465 }
2466 
2467 void java_lang_invoke_MemberName::set_name(oop mname, oop name) {
2468   assert(is_instance(mname), "wrong type");
2469   mname->obj_field_put(_name_offset, name);
2470 }
2471 
2472 oop java_lang_invoke_MemberName::type(oop mname) {
2473   assert(is_instance(mname), "wrong type");
2474   return mname->obj_field(_type_offset);
2475 }
2476 
2477 void java_lang_invoke_MemberName::set_type(oop mname, oop type) {
2478   assert(is_instance(mname), "wrong type");
2479   mname->obj_field_put(_type_offset, type);
2480 }
2481 
2482 int java_lang_invoke_MemberName::flags(oop mname) {
2483   assert(is_instance(mname), "wrong type");
2484   return mname->int_field(_flags_offset);
2485 }
2486 
2487 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
2488   assert(is_instance(mname), "wrong type");
2489   mname->int_field_put(_flags_offset, flags);
2490 }
2491 
2492 oop java_lang_invoke_MemberName::vmtarget(oop mname) {
2493   assert(is_instance(mname), "wrong type");
2494   return mname->obj_field(_vmtarget_offset);
2495 }
2496 
2497 void java_lang_invoke_MemberName::set_vmtarget(oop mname, oop ref) {
2498   assert(is_instance(mname), "wrong type");
2499   mname->obj_field_put(_vmtarget_offset, ref);
2500 }
2501 
2502 int java_lang_invoke_MemberName::vmindex(oop mname) {
2503   assert(is_instance(mname), "wrong type");
2504   return mname->int_field(_vmindex_offset);
2505 }
2506 
2507 void java_lang_invoke_MemberName::set_vmindex(oop mname, int index) {
2508   assert(is_instance(mname), "wrong type");
2509   mname->int_field_put(_vmindex_offset, index);
2510 }
2511 
2512 oop java_lang_invoke_MethodHandle::vmtarget(oop mh) {
2513   assert(is_instance(mh), "MH only");
2514   return mh->obj_field(_vmtarget_offset);
2515 }
2516 
2517 void java_lang_invoke_MethodHandle::set_vmtarget(oop mh, oop ref) {
2518   assert(is_instance(mh), "MH only");
2519   mh->obj_field_put(_vmtarget_offset, ref);
2520 }
2521 
2522 int java_lang_invoke_DirectMethodHandle::vmindex(oop mh) {
2523   assert(is_instance(mh), "DMH only");
2524   return mh->int_field(_vmindex_offset);
2525 }
2526 
2527 void java_lang_invoke_DirectMethodHandle::set_vmindex(oop mh, int index) {
2528   assert(is_instance(mh), "DMH only");
2529   mh->int_field_put(_vmindex_offset, index);
2530 }
2531 
2532 int java_lang_invoke_BoundMethodHandle::vmargslot(oop mh) {
2533   assert(is_instance(mh), "BMH only");
2534   return mh->int_field(_vmargslot_offset);
2535 }
2536 
2537 oop java_lang_invoke_BoundMethodHandle::argument(oop mh) {
2538   assert(is_instance(mh), "BMH only");
2539   return mh->obj_field(_argument_offset);
2540 }
2541 
2542 int java_lang_invoke_AdapterMethodHandle::conversion(oop mh) {
2543   assert(is_instance(mh), "AMH only");
2544   return mh->int_field(_conversion_offset);
2545 }
2546 
2547 void java_lang_invoke_AdapterMethodHandle::set_conversion(oop mh, int conv) {
2548   assert(is_instance(mh), "AMH only");
2549   mh->int_field_put(_conversion_offset, conv);
2550 }
2551 
2552 
2553 // Support for java_lang_invoke_MethodType
2554 
2555 int java_lang_invoke_MethodType::_rtype_offset;
2556 int java_lang_invoke_MethodType::_ptypes_offset;
2557 int java_lang_invoke_MethodType::_form_offset;
2558 
2559 void java_lang_invoke_MethodType::compute_offsets() {
2560   klassOop k = SystemDictionary::MethodType_klass();
2561   if (k != NULL) {
2562     compute_offset(_rtype_offset,  k, vmSymbols::rtype_name(),  vmSymbols::class_signature());
2563     compute_offset(_ptypes_offset, k, vmSymbols::ptypes_name(), vmSymbols::class_array_signature());
2564     compute_offset(_form_offset,   k, vmSymbols::form_name(),   vmSymbols::java_lang_invoke_MethodTypeForm_signature());
2565   }
2566 }
2567 
2568 void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
2569   st->print("(");
2570   objArrayOop pts = ptypes(mt);
2571   for (int i = 0, limit = pts->length(); i < limit; i++) {
2572     java_lang_Class::print_signature(pts->obj_at(i), st);
2573   }
2574   st->print(")");
2575   java_lang_Class::print_signature(rtype(mt), st);
2576 }
2577 
2578 Symbol* java_lang_invoke_MethodType::as_signature(oop mt, bool intern_if_not_found, TRAPS) {
2579   ResourceMark rm;
2580   stringStream buffer(128);
2581   print_signature(mt, &buffer);
2582   const char* sigstr =       buffer.base();
2583   int         siglen = (int) buffer.size();
2584   Symbol *name;
2585   if (!intern_if_not_found) {
2586     name = SymbolTable::probe(sigstr, siglen);
2587   } else {
2588     name = SymbolTable::new_symbol(sigstr, siglen, THREAD);
2589   }
2590   return name;
2591 }
2592 
2593 bool java_lang_invoke_MethodType::equals(oop mt1, oop mt2) {
2594   if (rtype(mt1) != rtype(mt2))
2595     return false;
2596   if (ptype_count(mt1) != ptype_count(mt2))
2597     return false;
2598   for (int i = ptype_count(mt1) - 1; i >= 0; i--) {
2599     if (ptype(mt1, i) != ptype(mt2, i))
2600       return false;
2601   }
2602   return true;
2603 }
2604 
2605 oop java_lang_invoke_MethodType::rtype(oop mt) {
2606   assert(is_instance(mt), "must be a MethodType");
2607   return mt->obj_field(_rtype_offset);
2608 }
2609 
2610 objArrayOop java_lang_invoke_MethodType::ptypes(oop mt) {
2611   assert(is_instance(mt), "must be a MethodType");
2612   return (objArrayOop) mt->obj_field(_ptypes_offset);
2613 }
2614 
2615 oop java_lang_invoke_MethodType::form(oop mt) {
2616   assert(is_instance(mt), "must be a MethodType");
2617   return mt->obj_field(_form_offset);
2618 }
2619 
2620 oop java_lang_invoke_MethodType::ptype(oop mt, int idx) {
2621   return ptypes(mt)->obj_at(idx);
2622 }
2623 
2624 int java_lang_invoke_MethodType::ptype_count(oop mt) {
2625   return ptypes(mt)->length();
2626 }
2627 
2628 
2629 
2630 // Support for java_lang_invoke_MethodTypeForm
2631 
2632 int java_lang_invoke_MethodTypeForm::_vmslots_offset;
2633 int java_lang_invoke_MethodTypeForm::_vmlayout_offset;
2634 int java_lang_invoke_MethodTypeForm::_erasedType_offset;
2635 int java_lang_invoke_MethodTypeForm::_genericInvoker_offset;
2636 
2637 void java_lang_invoke_MethodTypeForm::compute_offsets() {
2638   klassOop k = SystemDictionary::MethodTypeForm_klass();
2639   if (k != NULL) {
2640     compute_optional_offset(_vmslots_offset,    k, vmSymbols::vmslots_name(),    vmSymbols::int_signature(), true);
2641     compute_optional_offset(_vmlayout_offset,   k, vmSymbols::vmlayout_name(),   vmSymbols::object_signature());
2642     compute_optional_offset(_erasedType_offset, k, vmSymbols::erasedType_name(), vmSymbols::java_lang_invoke_MethodType_signature(), true);
2643     compute_optional_offset(_genericInvoker_offset, k, vmSymbols::genericInvoker_name(), vmSymbols::java_lang_invoke_MethodHandle_signature(), true);
2644     if (_genericInvoker_offset == 0)  _genericInvoker_offset = -1;  // set to explicit "empty" value
2645   }
2646 }
2647 
2648 int java_lang_invoke_MethodTypeForm::vmslots(oop mtform) {
2649   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2650   assert(_vmslots_offset > 0, "");
2651   return mtform->int_field(_vmslots_offset);
2652 }
2653 
2654 oop java_lang_invoke_MethodTypeForm::vmlayout(oop mtform) {
2655   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2656   assert(_vmlayout_offset > 0, "");
2657   return mtform->obj_field(_vmlayout_offset);
2658 }
2659 
2660 oop java_lang_invoke_MethodTypeForm::init_vmlayout(oop mtform, oop cookie) {
2661   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2662   oop previous = vmlayout(mtform);
2663   if (previous != NULL) {
2664     return previous;  // someone else beat us to it
2665   }
2666   HeapWord* cookie_addr = (HeapWord*) mtform->obj_field_addr<oop>(_vmlayout_offset);
2667   OrderAccess::storestore();  // make sure our copy is fully committed
2668   previous = oopDesc::atomic_compare_exchange_oop(cookie, cookie_addr, previous);
2669   if (previous != NULL) {
2670     return previous;  // someone else beat us to it
2671   }
2672   return cookie;
2673 }
2674 
2675 oop java_lang_invoke_MethodTypeForm::erasedType(oop mtform) {
2676   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2677   return mtform->obj_field(_erasedType_offset);
2678 }
2679 
2680 oop java_lang_invoke_MethodTypeForm::genericInvoker(oop mtform) {
2681   assert(mtform->klass() == SystemDictionary::MethodTypeForm_klass(), "MTForm only");
2682   return mtform->obj_field(_genericInvoker_offset);
2683 }
2684 
2685 
2686 // Support for java_lang_invoke_CallSite
2687 
2688 int java_lang_invoke_CallSite::_target_offset;
2689 
2690 void java_lang_invoke_CallSite::compute_offsets() {
2691   if (!EnableInvokeDynamic)  return;
2692   klassOop k = SystemDictionary::CallSite_klass();
2693   if (k != NULL) {
2694     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
2695   }
2696 }
2697 
2698 oop java_lang_invoke_CallSite::target(oop site) {
2699   return site->obj_field(_target_offset);
2700 }
2701 
2702 void java_lang_invoke_CallSite::set_target(oop site, oop target) {
2703   site->obj_field_put(_target_offset, target);
2704 }
2705 
2706 
2707 // Support for java_security_AccessControlContext
2708 
2709 int java_security_AccessControlContext::_context_offset = 0;
2710 int java_security_AccessControlContext::_privilegedContext_offset = 0;
2711 int java_security_AccessControlContext::_isPrivileged_offset = 0;
2712 
2713 void java_security_AccessControlContext::compute_offsets() {
2714   assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
2715   fieldDescriptor fd;
2716   instanceKlass* ik = instanceKlass::cast(SystemDictionary::AccessControlContext_klass());
2717 
2718   if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
2719     fatal("Invalid layout of java.security.AccessControlContext");
2720   }
2721   _context_offset = fd.offset();
2722 
2723   if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
2724     fatal("Invalid layout of java.security.AccessControlContext");
2725   }
2726   _privilegedContext_offset = fd.offset();
2727 
2728   if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) {
2729     fatal("Invalid layout of java.security.AccessControlContext");
2730   }
2731   _isPrivileged_offset = fd.offset();
2732 }
2733 
2734 
2735 oop java_security_AccessControlContext::create(objArrayHandle context, bool isPrivileged, Handle privileged_context, TRAPS) {
2736   assert(_isPrivileged_offset != 0, "offsets should have been initialized");
2737   // Ensure klass is initialized
2738   instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->initialize(CHECK_0);
2739   // Allocate result
2740   oop result = instanceKlass::cast(SystemDictionary::AccessControlContext_klass())->allocate_instance(CHECK_0);
2741   // Fill in values
2742   result->obj_field_put(_context_offset, context());
2743   result->obj_field_put(_privilegedContext_offset, privileged_context());
2744   result->bool_field_put(_isPrivileged_offset, isPrivileged);
2745   return result;
2746 }
2747 
2748 
2749 // Support for java_lang_ClassLoader
2750 
2751 oop java_lang_ClassLoader::parent(oop loader) {
2752   assert(loader->is_oop(), "loader must be oop");
2753   return loader->obj_field(parent_offset);
2754 }
2755 
2756 
2757 bool java_lang_ClassLoader::is_trusted_loader(oop loader) {
2758   // Fix for 4474172; see evaluation for more details
2759   loader = non_reflection_class_loader(loader);
2760 
2761   oop cl = SystemDictionary::java_system_loader();
2762   while(cl != NULL) {
2763     if (cl == loader) return true;
2764     cl = parent(cl);
2765   }
2766   return false;
2767 }
2768 
2769 oop java_lang_ClassLoader::non_reflection_class_loader(oop loader) {
2770   if (loader != NULL) {
2771     // See whether this is one of the class loaders associated with
2772     // the generated bytecodes for reflection, and if so, "magically"
2773     // delegate to its parent to prevent class loading from occurring
2774     // in places where applications using reflection didn't expect it.
2775     klassOop delegating_cl_class = SystemDictionary::reflect_DelegatingClassLoader_klass();
2776     // This might be null in non-1.4 JDKs
2777     if (delegating_cl_class != NULL && loader->is_a(delegating_cl_class)) {
2778       return parent(loader);
2779     }
2780   }
2781   return loader;
2782 }
2783 
2784 
2785 // Support for java_lang_System
2786 int java_lang_System::in_offset_in_bytes() {
2787   return (instanceMirrorKlass::offset_of_static_fields() + static_in_offset);
2788 }
2789 
2790 
2791 int java_lang_System::out_offset_in_bytes() {
2792   return (instanceMirrorKlass::offset_of_static_fields() + static_out_offset);
2793 }
2794 
2795 
2796 int java_lang_System::err_offset_in_bytes() {
2797   return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset);
2798 }
2799 
2800 
2801 
2802 int java_lang_String::value_offset;
2803 int java_lang_String::offset_offset;
2804 int java_lang_String::count_offset;
2805 int java_lang_String::hash_offset;
2806 int java_lang_Class::klass_offset;
2807 int java_lang_Class::array_klass_offset;
2808 int java_lang_Class::resolved_constructor_offset;
2809 int java_lang_Class::number_of_fake_oop_fields;
2810 int java_lang_Class::oop_size_offset;
2811 int java_lang_Class::static_oop_field_count_offset;
2812 int java_lang_Throwable::backtrace_offset;
2813 int java_lang_Throwable::detailMessage_offset;
2814 int java_lang_Throwable::cause_offset;
2815 int java_lang_Throwable::stackTrace_offset;
2816 int java_lang_Throwable::static_unassigned_stacktrace_offset;
2817 int java_lang_reflect_AccessibleObject::override_offset;
2818 int java_lang_reflect_Method::clazz_offset;
2819 int java_lang_reflect_Method::name_offset;
2820 int java_lang_reflect_Method::returnType_offset;
2821 int java_lang_reflect_Method::parameterTypes_offset;
2822 int java_lang_reflect_Method::exceptionTypes_offset;
2823 int java_lang_reflect_Method::slot_offset;
2824 int java_lang_reflect_Method::modifiers_offset;
2825 int java_lang_reflect_Method::signature_offset;
2826 int java_lang_reflect_Method::annotations_offset;
2827 int java_lang_reflect_Method::parameter_annotations_offset;
2828 int java_lang_reflect_Method::annotation_default_offset;
2829 int java_lang_reflect_Constructor::clazz_offset;
2830 int java_lang_reflect_Constructor::parameterTypes_offset;
2831 int java_lang_reflect_Constructor::exceptionTypes_offset;
2832 int java_lang_reflect_Constructor::slot_offset;
2833 int java_lang_reflect_Constructor::modifiers_offset;
2834 int java_lang_reflect_Constructor::signature_offset;
2835 int java_lang_reflect_Constructor::annotations_offset;
2836 int java_lang_reflect_Constructor::parameter_annotations_offset;
2837 int java_lang_reflect_Field::clazz_offset;
2838 int java_lang_reflect_Field::name_offset;
2839 int java_lang_reflect_Field::type_offset;
2840 int java_lang_reflect_Field::slot_offset;
2841 int java_lang_reflect_Field::modifiers_offset;
2842 int java_lang_reflect_Field::signature_offset;
2843 int java_lang_reflect_Field::annotations_offset;
2844 int java_lang_boxing_object::value_offset;
2845 int java_lang_boxing_object::long_value_offset;
2846 int java_lang_ref_Reference::referent_offset;
2847 int java_lang_ref_Reference::queue_offset;
2848 int java_lang_ref_Reference::next_offset;
2849 int java_lang_ref_Reference::discovered_offset;
2850 int java_lang_ref_Reference::static_lock_offset;
2851 int java_lang_ref_Reference::static_pending_offset;
2852 int java_lang_ref_Reference::number_of_fake_oop_fields;
2853 int java_lang_ref_SoftReference::timestamp_offset;
2854 int java_lang_ref_SoftReference::static_clock_offset;
2855 int java_lang_ClassLoader::parent_offset;
2856 int java_lang_System::static_in_offset;
2857 int java_lang_System::static_out_offset;
2858 int java_lang_System::static_err_offset;
2859 int java_lang_StackTraceElement::declaringClass_offset;
2860 int java_lang_StackTraceElement::methodName_offset;
2861 int java_lang_StackTraceElement::fileName_offset;
2862 int java_lang_StackTraceElement::lineNumber_offset;
2863 int java_lang_AssertionStatusDirectives::classes_offset;
2864 int java_lang_AssertionStatusDirectives::classEnabled_offset;
2865 int java_lang_AssertionStatusDirectives::packages_offset;
2866 int java_lang_AssertionStatusDirectives::packageEnabled_offset;
2867 int java_lang_AssertionStatusDirectives::deflt_offset;
2868 int java_nio_Buffer::_limit_offset;
2869 int sun_misc_AtomicLongCSImpl::_value_offset;
2870 int java_util_concurrent_locks_AbstractOwnableSynchronizer::_owner_offset = 0;
2871 int sun_reflect_ConstantPool::_cp_oop_offset;
2872 int sun_reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
2873 
2874 
2875 // Support for java_lang_StackTraceElement
2876 
2877 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
2878   element->obj_field_put(fileName_offset, value);
2879 }
2880 
2881 void java_lang_StackTraceElement::set_declaringClass(oop element, oop value) {
2882   element->obj_field_put(declaringClass_offset, value);
2883 }
2884 
2885 void java_lang_StackTraceElement::set_methodName(oop element, oop value) {
2886   element->obj_field_put(methodName_offset, value);
2887 }
2888 
2889 void java_lang_StackTraceElement::set_lineNumber(oop element, int value) {
2890   element->int_field_put(lineNumber_offset, value);
2891 }
2892 
2893 
2894 // Support for java Assertions - java_lang_AssertionStatusDirectives.
2895 
2896 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
2897   o->obj_field_put(classes_offset, val);
2898 }
2899 
2900 void java_lang_AssertionStatusDirectives::set_classEnabled(oop o, oop val) {
2901   o->obj_field_put(classEnabled_offset, val);
2902 }
2903 
2904 void java_lang_AssertionStatusDirectives::set_packages(oop o, oop val) {
2905   o->obj_field_put(packages_offset, val);
2906 }
2907 
2908 void java_lang_AssertionStatusDirectives::set_packageEnabled(oop o, oop val) {
2909   o->obj_field_put(packageEnabled_offset, val);
2910 }
2911 
2912 void java_lang_AssertionStatusDirectives::set_deflt(oop o, bool val) {
2913   o->bool_field_put(deflt_offset, val);
2914 }
2915 
2916 
2917 // Support for intrinsification of java.nio.Buffer.checkIndex
2918 int java_nio_Buffer::limit_offset() {
2919   return _limit_offset;
2920 }
2921 
2922 
2923 void java_nio_Buffer::compute_offsets() {
2924   klassOop k = SystemDictionary::java_nio_Buffer_klass();
2925   assert(k != NULL, "must be loaded in 1.4+");
2926   compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature());
2927 }
2928 
2929 // Support for intrinsification of sun.misc.AtomicLongCSImpl.attemptUpdate
2930 int sun_misc_AtomicLongCSImpl::value_offset() {
2931   assert(SystemDictionary::sun_misc_AtomicLongCSImpl_klass() != NULL, "can't call this");
2932   return _value_offset;
2933 }
2934 
2935 
2936 void sun_misc_AtomicLongCSImpl::compute_offsets() {
2937   klassOop k = SystemDictionary::sun_misc_AtomicLongCSImpl_klass();
2938   // If this class is not present, its value field offset won't be referenced.
2939   if (k != NULL) {
2940     compute_offset(_value_offset, k, vmSymbols::value_name(), vmSymbols::long_signature());
2941   }
2942 }
2943 
2944 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
2945   if (_owner_offset != 0) return;
2946 
2947   assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
2948   SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
2949   klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass();
2950   compute_offset(_owner_offset, k,
2951                  vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature());
2952 }
2953 
2954 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
2955   assert(_owner_offset != 0, "Must be initialized");
2956   return obj->obj_field(_owner_offset);
2957 }
2958 
2959 // Compute hard-coded offsets
2960 // Invoked before SystemDictionary::initialize, so pre-loaded classes
2961 // are not available to determine the offset_of_static_fields.
2962 void JavaClasses::compute_hard_coded_offsets() {
2963   const int x = heapOopSize;
2964   const int header = instanceOopDesc::base_offset_in_bytes();
2965 
2966   // Do the String Class
2967   java_lang_String::value_offset  = java_lang_String::hc_value_offset  * x + header;
2968   java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header;
2969   java_lang_String::count_offset  = java_lang_String::offset_offset + sizeof (jint);
2970   java_lang_String::hash_offset   = java_lang_String::count_offset + sizeof (jint);
2971 
2972   {
2973     // Do the Class Class
2974     int offset = header;
2975     java_lang_Class::oop_size_offset = header;
2976     offset += BytesPerInt;
2977     java_lang_Class::static_oop_field_count_offset = offset;
2978     offset = align_size_up(offset + BytesPerInt, x);
2979     java_lang_Class::klass_offset = offset;
2980     offset += x;
2981     java_lang_Class::array_klass_offset = offset;
2982     offset += x;
2983     java_lang_Class::resolved_constructor_offset = offset;
2984   }
2985 
2986   // This is NOT an offset
2987   java_lang_Class::number_of_fake_oop_fields = java_lang_Class::hc_number_of_fake_oop_fields;
2988 
2989   // Throwable Class
2990   java_lang_Throwable::backtrace_offset  = java_lang_Throwable::hc_backtrace_offset  * x + header;
2991   java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
2992   java_lang_Throwable::cause_offset      = java_lang_Throwable::hc_cause_offset      * x + header;
2993   java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
2994   java_lang_Throwable::static_unassigned_stacktrace_offset = java_lang_Throwable::hc_static_unassigned_stacktrace_offset *  x;
2995 
2996   // java_lang_boxing_object
2997   java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header;
2998   java_lang_boxing_object::long_value_offset = align_size_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong);
2999 
3000   // java_lang_ref_Reference:
3001   java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
3002   java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
3003   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
3004   java_lang_ref_Reference::discovered_offset  = java_lang_ref_Reference::hc_discovered_offset * x + header;
3005   java_lang_ref_Reference::static_lock_offset = java_lang_ref_Reference::hc_static_lock_offset *  x;
3006   java_lang_ref_Reference::static_pending_offset = java_lang_ref_Reference::hc_static_pending_offset * x;
3007   // Artificial fields for java_lang_ref_Reference
3008   // The first field is for the discovered field added in 1.4
3009   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
3010 
3011   // java_lang_ref_SoftReference Class
3012   java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong);
3013   // Don't multiply static fields because they are always in wordSize units
3014   java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
3015 
3016   // java_lang_ClassLoader
3017   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
3018 
3019   // java_lang_System
3020   java_lang_System::static_in_offset  = java_lang_System::hc_static_in_offset  * x;
3021   java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x;
3022   java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x;
3023 
3024   // java_lang_StackTraceElement
3025   java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset  * x + header;
3026   java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header;
3027   java_lang_StackTraceElement::fileName_offset   = java_lang_StackTraceElement::hc_fileName_offset   * x + header;
3028   java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
3029   java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
3030   java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
3031   java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
3032   java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;
3033   java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header;
3034 
3035 }
3036 
3037 
3038 // Compute non-hard-coded field offsets of all the classes in this file
3039 void JavaClasses::compute_offsets() {
3040 
3041   java_lang_Class::compute_offsets();
3042   java_lang_Thread::compute_offsets();
3043   java_lang_ThreadGroup::compute_offsets();
3044   if (EnableInvokeDynamic) {
3045     java_lang_invoke_MethodHandle::compute_offsets();
3046     java_lang_invoke_MemberName::compute_offsets();
3047     java_lang_invoke_DirectMethodHandle::compute_offsets();
3048     java_lang_invoke_BoundMethodHandle::compute_offsets();
3049     java_lang_invoke_AdapterMethodHandle::compute_offsets();
3050     java_lang_invoke_MethodType::compute_offsets();
3051     java_lang_invoke_MethodTypeForm::compute_offsets();
3052     java_lang_invoke_CallSite::compute_offsets();
3053     java_lang_invoke_CountingMethodHandle::compute_offsets();
3054   }
3055   java_security_AccessControlContext::compute_offsets();
3056   // Initialize reflection classes. The layouts of these classes
3057   // changed with the new reflection implementation in JDK 1.4, and
3058   // since the Universe doesn't know what JDK version it is until this
3059   // point we defer computation of these offsets until now.
3060   java_lang_reflect_AccessibleObject::compute_offsets();
3061   java_lang_reflect_Method::compute_offsets();
3062   java_lang_reflect_Constructor::compute_offsets();
3063   java_lang_reflect_Field::compute_offsets();
3064   if (JDK_Version::is_gte_jdk14x_version()) {
3065     java_nio_Buffer::compute_offsets();
3066   }
3067   if (JDK_Version::is_gte_jdk15x_version()) {
3068     sun_reflect_ConstantPool::compute_offsets();
3069     sun_reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
3070   }
3071   sun_misc_AtomicLongCSImpl::compute_offsets();
3072 
3073   // generated interpreter code wants to know about the offsets we just computed:
3074   AbstractAssembler::update_delayed_values();
3075 }
3076 
3077 #ifndef PRODUCT
3078 
3079 // These functions exist to assert the validity of hard-coded field offsets to guard
3080 // against changes in the class files
3081 
3082 bool JavaClasses::check_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
3083   EXCEPTION_MARK;
3084   fieldDescriptor fd;
3085   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3086   klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3087   instanceKlassHandle h_klass (THREAD, k);
3088   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3089   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
3090   if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3091     tty->print_cr("Nonstatic field %s.%s not found", klass_name, field_name);
3092     return false;
3093   }
3094   if (fd.is_static()) {
3095     tty->print_cr("Nonstatic field %s.%s appears to be static", klass_name, field_name);
3096     return false;
3097   }
3098   if (fd.offset() == hardcoded_offset ) {
3099     return true;
3100   } else {
3101     tty->print_cr("Offset of nonstatic field %s.%s is hardcoded as %d but should really be %d.",
3102                   klass_name, field_name, hardcoded_offset, fd.offset());
3103     return false;
3104   }
3105 }
3106 
3107 
3108 bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
3109   EXCEPTION_MARK;
3110   fieldDescriptor fd;
3111   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3112   klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3113   instanceKlassHandle h_klass (THREAD, k);
3114   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3115   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
3116   if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3117     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
3118     return false;
3119   }
3120   if (!fd.is_static()) {
3121     tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name);
3122     return false;
3123   }
3124   if (fd.offset() == hardcoded_offset + instanceMirrorKlass::offset_of_static_fields()) {
3125     return true;
3126   } else {
3127     tty->print_cr("Offset of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_offset, fd.offset() - instanceMirrorKlass::offset_of_static_fields());
3128     return false;
3129   }
3130 }
3131 
3132 
3133 bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) {
3134   EXCEPTION_MARK;
3135   fieldDescriptor fd;
3136   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
3137   klassOop k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
3138   instanceKlassHandle h_klass (THREAD, k);
3139   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
3140   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
3141   if (!h_klass->find_local_field(f_name, f_sig, &fd)) {
3142     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
3143     return false;
3144   }
3145   if (!fd.is_static() || !fd.has_initial_value()) {
3146     tty->print_cr("Static field %s.%s appears to be non-constant", klass_name, field_name);
3147     return false;
3148   }
3149   if (!fd.initial_value_tag().is_int()) {
3150     tty->print_cr("Static field %s.%s is not an int", klass_name, field_name);
3151     return false;
3152   }
3153   jint field_value = fd.int_initial_value();
3154   if (field_value == hardcoded_constant) {
3155     return true;
3156   } else {
3157     tty->print_cr("Constant value of static field %s.%s is hardcoded as %d but should really be %d.", klass_name, field_name, hardcoded_constant, field_value);
3158     return false;
3159   }
3160 }
3161 
3162 
3163 // Check the hard-coded field offsets of all the classes in this file
3164 
3165 void JavaClasses::check_offsets() {
3166   bool valid = true;
3167 
3168 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3169   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
3170 
3171 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3172   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
3173 
3174 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
3175   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
3176 
3177 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
3178   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
3179 
3180   // java.lang.String
3181 
3182   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
3183   CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
3184   CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
3185   CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
3186 
3187   // java.lang.Class
3188 
3189   // Fake fields
3190   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
3191   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
3192   // CHECK_OFFSET("java/lang/Class", java_lang_Class, resolved_constructor); // %%% this needs to be checked
3193 
3194   // java.lang.Throwable
3195 
3196   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
3197   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
3198   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
3199   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
3200 
3201   // Boxed primitive objects (java_lang_boxing_object)
3202 
3203   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
3204   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
3205   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");
3206   CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
3207   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
3208   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
3209   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
3210   CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
3211 
3212   // java.lang.ClassLoader
3213 
3214   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,      "Ljava/lang/ClassLoader;");
3215 
3216   // java.lang.System
3217 
3218   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System,  in, "Ljava/io/InputStream;");
3219   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;");
3220   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;");
3221 
3222   // java.lang.StackTraceElement
3223 
3224   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;");
3225   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;");
3226   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement,   fileName, "Ljava/lang/String;");
3227   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber, "I");
3228 
3229   // java.lang.ref.Reference
3230 
3231   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;");
3232   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;");
3233   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;");
3234   // Fake field
3235   //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;");
3236   CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, lock, "Ljava/lang/ref/Reference$Lock;");
3237   CHECK_STATIC_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, pending, "Ljava/lang/ref/Reference;");
3238 
3239   // java.lang.ref.SoftReference
3240 
3241   CHECK_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, timestamp, "J");
3242   CHECK_STATIC_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, clock, "J");
3243 
3244   // java.lang.AssertionStatusDirectives
3245   //
3246   // The CheckAssertionStatusDirectives boolean can be removed from here and
3247   // globals.hpp after the AssertionStatusDirectives class has been integrated
3248   // into merlin "for some time."  Without it, the vm will fail with early
3249   // merlin builds.
3250 
3251   if (CheckAssertionStatusDirectives && JDK_Version::is_gte_jdk14x_version()) {
3252     const char* nm = "java/lang/AssertionStatusDirectives";
3253     const char* sig = "[Ljava/lang/String;";
3254     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classes, sig);
3255     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classEnabled, "[Z");
3256     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packages, sig);
3257     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packageEnabled, "[Z");
3258     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, deflt, "Z");
3259   }
3260 
3261   if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed");
3262 }
3263 
3264 #endif // PRODUCT
3265 
3266 void javaClasses_init() {
3267   JavaClasses::compute_offsets();
3268   JavaClasses::check_offsets();
3269   FilteredFieldsMap::initialize();  // must be done after computing offsets.
3270 }