src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 6703888 Sdiff src/share/vm/classfile

src/share/vm/classfile/javaClasses.cpp

Print this page




1855   instanceKlassHandle h (THREAD, k);
1856   if (!h->is_initialized())  h->initialize(CHECK_0);
1857   return h->allocate_instance(THREAD);
1858 }
1859 
1860 
1861 oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
1862   oop box = initialize_and_allocate(type, CHECK_0);
1863   if (box == NULL)  return NULL;
1864   switch (type) {
1865     case T_BOOLEAN:
1866       box->bool_field_put(value_offset, value->z);
1867       break;
1868     case T_CHAR:
1869       box->char_field_put(value_offset, value->c);
1870       break;
1871     case T_FLOAT:
1872       box->float_field_put(value_offset, value->f);
1873       break;
1874     case T_DOUBLE:
1875       box->double_field_put(value_offset, value->d);
1876       break;
1877     case T_BYTE:
1878       box->byte_field_put(value_offset, value->b);
1879       break;
1880     case T_SHORT:
1881       box->short_field_put(value_offset, value->s);
1882       break;
1883     case T_INT:
1884       box->int_field_put(value_offset, value->i);
1885       break;
1886     case T_LONG:
1887       box->long_field_put(value_offset, value->j);
1888       break;
1889     default:
1890       return NULL;
1891   }
1892   return box;
1893 }
1894 
1895 
1896 BasicType java_lang_boxing_object::basic_type(oop box) {
1897   if (box == NULL)  return T_ILLEGAL;
1898   BasicType type = SystemDictionary::box_klass_type(box->klass());
1899   if (type == T_OBJECT)         // 'unknown' value returned by SD::bkt
1900     return T_ILLEGAL;
1901   return type;
1902 }
1903 
1904 
1905 BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
1906   BasicType type = SystemDictionary::box_klass_type(box->klass());
1907   switch (type) {
1908   case T_BOOLEAN:
1909     value->z = box->bool_field(value_offset);
1910     break;
1911   case T_CHAR:
1912     value->c = box->char_field(value_offset);
1913     break;
1914   case T_FLOAT:
1915     value->f = box->float_field(value_offset);
1916     break;
1917   case T_DOUBLE:
1918     value->d = box->double_field(value_offset);
1919     break;
1920   case T_BYTE:
1921     value->b = box->byte_field(value_offset);
1922     break;
1923   case T_SHORT:
1924     value->s = box->short_field(value_offset);
1925     break;
1926   case T_INT:
1927     value->i = box->int_field(value_offset);
1928     break;
1929   case T_LONG:
1930     value->j = box->long_field(value_offset);
1931     break;
1932   default:
1933     return T_ILLEGAL;
1934   } // end switch
1935   return type;
1936 }
1937 
1938 
1939 BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
1940   BasicType type = SystemDictionary::box_klass_type(box->klass());
1941   switch (type) {
1942   case T_BOOLEAN:
1943     box->bool_field_put(value_offset, value->z);
1944     break;
1945   case T_CHAR:
1946     box->char_field_put(value_offset, value->c);
1947     break;
1948   case T_FLOAT:
1949     box->float_field_put(value_offset, value->f);
1950     break;
1951   case T_DOUBLE:
1952     box->double_field_put(value_offset, value->d);
1953     break;
1954   case T_BYTE:
1955     box->byte_field_put(value_offset, value->b);
1956     break;
1957   case T_SHORT:
1958     box->short_field_put(value_offset, value->s);
1959     break;
1960   case T_INT:
1961     box->int_field_put(value_offset, value->i);
1962     break;
1963   case T_LONG:
1964     box->long_field_put(value_offset, value->j);
1965     break;
1966   default:
1967     return T_ILLEGAL;
1968   } // end switch
1969   return type;
1970 }
1971 
1972 
1973 // Support for java_lang_ref_Reference
1974 oop java_lang_ref_Reference::pending_list_lock() {
1975   instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
1976   char *addr = (((char *)ik->start_of_static_fields()) + static_lock_offset);
1977   if (UseCompressedOops) {
1978     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
1979   } else {
1980     return oopDesc::load_decode_heap_oop((oop*)addr);
1981   }
1982 }
1983 
1984 HeapWord *java_lang_ref_Reference::pending_list_addr() {


2146 int java_lang_reflect_Method::signature_offset;
2147 int java_lang_reflect_Method::annotations_offset;
2148 int java_lang_reflect_Method::parameter_annotations_offset;
2149 int java_lang_reflect_Method::annotation_default_offset;
2150 int java_lang_reflect_Constructor::clazz_offset;
2151 int java_lang_reflect_Constructor::parameterTypes_offset;
2152 int java_lang_reflect_Constructor::exceptionTypes_offset;
2153 int java_lang_reflect_Constructor::slot_offset;
2154 int java_lang_reflect_Constructor::modifiers_offset;
2155 int java_lang_reflect_Constructor::signature_offset;
2156 int java_lang_reflect_Constructor::annotations_offset;
2157 int java_lang_reflect_Constructor::parameter_annotations_offset;
2158 int java_lang_reflect_Field::clazz_offset;
2159 int java_lang_reflect_Field::name_offset;
2160 int java_lang_reflect_Field::type_offset;
2161 int java_lang_reflect_Field::slot_offset;
2162 int java_lang_reflect_Field::modifiers_offset;
2163 int java_lang_reflect_Field::signature_offset;
2164 int java_lang_reflect_Field::annotations_offset;
2165 int java_lang_boxing_object::value_offset;

2166 int java_lang_ref_Reference::referent_offset;
2167 int java_lang_ref_Reference::queue_offset;
2168 int java_lang_ref_Reference::next_offset;
2169 int java_lang_ref_Reference::discovered_offset;
2170 int java_lang_ref_Reference::static_lock_offset;
2171 int java_lang_ref_Reference::static_pending_offset;
2172 int java_lang_ref_Reference::number_of_fake_oop_fields;
2173 int java_lang_ref_SoftReference::timestamp_offset;
2174 int java_lang_ref_SoftReference::static_clock_offset;
2175 int java_lang_ClassLoader::parent_offset;
2176 int java_lang_System::offset_of_static_fields;
2177 int java_lang_System::static_in_offset;
2178 int java_lang_System::static_out_offset;
2179 int java_lang_System::static_err_offset;
2180 int java_lang_StackTraceElement::declaringClass_offset;
2181 int java_lang_StackTraceElement::methodName_offset;
2182 int java_lang_StackTraceElement::fileName_offset;
2183 int java_lang_StackTraceElement::lineNumber_offset;
2184 int java_lang_AssertionStatusDirectives::classes_offset;
2185 int java_lang_AssertionStatusDirectives::classEnabled_offset;


2265 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
2266   if (_owner_offset != 0) return;
2267 
2268   assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
2269   SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
2270   klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass();
2271   compute_offset(_owner_offset, k,
2272                  vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature());
2273 }
2274 
2275 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
2276   assert(_owner_offset != 0, "Must be initialized");
2277   return obj->obj_field(_owner_offset);
2278 }
2279 
2280 // Compute hard-coded offsets
2281 // Invoked before SystemDictionary::initialize, so pre-loaded classes
2282 // are not available to determine the offset_of_static_fields.
2283 void JavaClasses::compute_hard_coded_offsets() {
2284   const int x = heapOopSize;
2285   // Objects don't get allocated in the gap in the header with compressed oops
2286   // for these special classes because hard coded offsets can't be conditional
2287   // so base_offset_in_bytes() is wrong here, allocate after the header.
2288   const int header = sizeof(instanceOopDesc);
2289 
2290   // Do the String Class
2291   java_lang_String::value_offset  = java_lang_String::hc_value_offset  * x + header;
2292   java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header;
2293   java_lang_String::count_offset  = java_lang_String::offset_offset + sizeof (jint);
2294   java_lang_String::hash_offset   = java_lang_String::count_offset + sizeof (jint);
2295 
2296   // Do the Class Class
2297   java_lang_Class::klass_offset = java_lang_Class::hc_klass_offset * x + header;
2298   java_lang_Class::array_klass_offset = java_lang_Class::hc_array_klass_offset * x + header;
2299   java_lang_Class::resolved_constructor_offset = java_lang_Class::hc_resolved_constructor_offset * x + header;
2300 
2301   // This is NOT an offset
2302   java_lang_Class::number_of_fake_oop_fields = java_lang_Class::hc_number_of_fake_oop_fields;
2303 
2304   // Throwable Class
2305   java_lang_Throwable::backtrace_offset  = java_lang_Throwable::hc_backtrace_offset  * x + header;
2306   java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
2307   java_lang_Throwable::cause_offset      = java_lang_Throwable::hc_cause_offset      * x + header;
2308   java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
2309 
2310   // java_lang_boxing_object
2311   java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset * x + header;

2312 
2313   // java_lang_ref_Reference:
2314   java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
2315   java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
2316   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
2317   java_lang_ref_Reference::discovered_offset  = java_lang_ref_Reference::hc_discovered_offset * x + header;
2318   java_lang_ref_Reference::static_lock_offset = java_lang_ref_Reference::hc_static_lock_offset *  x;
2319   java_lang_ref_Reference::static_pending_offset = java_lang_ref_Reference::hc_static_pending_offset * x;
2320   // Artificial fields for java_lang_ref_Reference
2321   // The first field is for the discovered field added in 1.4
2322   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
2323 
2324   // java_lang_ref_SoftReference Class
2325   java_lang_ref_SoftReference::timestamp_offset = java_lang_ref_SoftReference::hc_timestamp_offset * x + header;
2326   // Don't multiply static fields because they are always in wordSize units
2327   java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
2328 
2329   // java_lang_ClassLoader
2330   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
2331 
2332   // java_lang_System
2333   java_lang_System::static_in_offset  = java_lang_System::hc_static_in_offset  * x;
2334   java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x;
2335   java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x;
2336 
2337   // java_lang_StackTraceElement
2338   java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset  * x + header;
2339   java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header;
2340   java_lang_StackTraceElement::fileName_offset   = java_lang_StackTraceElement::hc_fileName_offset   * x + header;
2341   java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
2342   java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
2343   java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
2344   java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
2345   java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;


2452     return false;
2453   }
2454   jint field_value = fd.int_initial_value();
2455   if (field_value == hardcoded_constant) {
2456     return true;
2457   } else {
2458     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);
2459     return false;
2460   }
2461 }
2462 
2463 
2464 // Check the hard-coded field offsets of all the classes in this file
2465 
2466 void JavaClasses::check_offsets() {
2467   bool valid = true;
2468 
2469 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
2470   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
2471 



2472 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
2473   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
2474 
2475 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
2476   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
2477 
2478   // java.lang.String
2479 
2480   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
2481   CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
2482   CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
2483   CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
2484 
2485   // java.lang.Class
2486 
2487   // Fake fields
2488   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
2489   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
2490   // CHECK_OFFSET("java/lang/Class", java_lang_Class, resolved_constructor); // %%% this needs to be checked
2491 
2492   // java.lang.Throwable
2493 
2494   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
2495   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
2496   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
2497   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
2498 
2499   // Boxed primitive objects (java_lang_boxing_object)
2500 
2501   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
2502   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
2503   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");
2504   CHECK_OFFSET("java/lang/Double",    java_lang_boxing_object, value, "D");
2505   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
2506   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
2507   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
2508   CHECK_OFFSET("java/lang/Long",      java_lang_boxing_object, value, "J");
2509 
2510   // java.lang.ClassLoader
2511 
2512   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,      "Ljava/lang/ClassLoader;");
2513 
2514   // java.lang.System
2515 
2516   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System,  in, "Ljava/io/InputStream;");
2517   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;");
2518   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;");
2519 
2520   // java.lang.StackTraceElement
2521 
2522   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;");
2523   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;");
2524   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement,   fileName, "Ljava/lang/String;");
2525   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber, "I");
2526 
2527   // java.lang.ref.Reference
2528 




1855   instanceKlassHandle h (THREAD, k);
1856   if (!h->is_initialized())  h->initialize(CHECK_0);
1857   return h->allocate_instance(THREAD);
1858 }
1859 
1860 
1861 oop java_lang_boxing_object::create(BasicType type, jvalue* value, TRAPS) {
1862   oop box = initialize_and_allocate(type, CHECK_0);
1863   if (box == NULL)  return NULL;
1864   switch (type) {
1865     case T_BOOLEAN:
1866       box->bool_field_put(value_offset, value->z);
1867       break;
1868     case T_CHAR:
1869       box->char_field_put(value_offset, value->c);
1870       break;
1871     case T_FLOAT:
1872       box->float_field_put(value_offset, value->f);
1873       break;
1874     case T_DOUBLE:
1875       box->double_field_put(long_value_offset, value->d);
1876       break;
1877     case T_BYTE:
1878       box->byte_field_put(value_offset, value->b);
1879       break;
1880     case T_SHORT:
1881       box->short_field_put(value_offset, value->s);
1882       break;
1883     case T_INT:
1884       box->int_field_put(value_offset, value->i);
1885       break;
1886     case T_LONG:
1887       box->long_field_put(long_value_offset, value->j);
1888       break;
1889     default:
1890       return NULL;
1891   }
1892   return box;
1893 }
1894 
1895 
1896 BasicType java_lang_boxing_object::basic_type(oop box) {
1897   if (box == NULL)  return T_ILLEGAL;
1898   BasicType type = SystemDictionary::box_klass_type(box->klass());
1899   if (type == T_OBJECT)         // 'unknown' value returned by SD::bkt
1900     return T_ILLEGAL;
1901   return type;
1902 }
1903 
1904 
1905 BasicType java_lang_boxing_object::get_value(oop box, jvalue* value) {
1906   BasicType type = SystemDictionary::box_klass_type(box->klass());
1907   switch (type) {
1908   case T_BOOLEAN:
1909     value->z = box->bool_field(value_offset);
1910     break;
1911   case T_CHAR:
1912     value->c = box->char_field(value_offset);
1913     break;
1914   case T_FLOAT:
1915     value->f = box->float_field(value_offset);
1916     break;
1917   case T_DOUBLE:
1918     value->d = box->double_field(long_value_offset);
1919     break;
1920   case T_BYTE:
1921     value->b = box->byte_field(value_offset);
1922     break;
1923   case T_SHORT:
1924     value->s = box->short_field(value_offset);
1925     break;
1926   case T_INT:
1927     value->i = box->int_field(value_offset);
1928     break;
1929   case T_LONG:
1930     value->j = box->long_field(long_value_offset);
1931     break;
1932   default:
1933     return T_ILLEGAL;
1934   } // end switch
1935   return type;
1936 }
1937 
1938 
1939 BasicType java_lang_boxing_object::set_value(oop box, jvalue* value) {
1940   BasicType type = SystemDictionary::box_klass_type(box->klass());
1941   switch (type) {
1942   case T_BOOLEAN:
1943     box->bool_field_put(value_offset, value->z);
1944     break;
1945   case T_CHAR:
1946     box->char_field_put(value_offset, value->c);
1947     break;
1948   case T_FLOAT:
1949     box->float_field_put(value_offset, value->f);
1950     break;
1951   case T_DOUBLE:
1952     box->double_field_put(long_value_offset, value->d);
1953     break;
1954   case T_BYTE:
1955     box->byte_field_put(value_offset, value->b);
1956     break;
1957   case T_SHORT:
1958     box->short_field_put(value_offset, value->s);
1959     break;
1960   case T_INT:
1961     box->int_field_put(value_offset, value->i);
1962     break;
1963   case T_LONG:
1964     box->long_field_put(long_value_offset, value->j);
1965     break;
1966   default:
1967     return T_ILLEGAL;
1968   } // end switch
1969   return type;
1970 }
1971 
1972 
1973 // Support for java_lang_ref_Reference
1974 oop java_lang_ref_Reference::pending_list_lock() {
1975   instanceKlass* ik = instanceKlass::cast(SystemDictionary::reference_klass());
1976   char *addr = (((char *)ik->start_of_static_fields()) + static_lock_offset);
1977   if (UseCompressedOops) {
1978     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
1979   } else {
1980     return oopDesc::load_decode_heap_oop((oop*)addr);
1981   }
1982 }
1983 
1984 HeapWord *java_lang_ref_Reference::pending_list_addr() {


2146 int java_lang_reflect_Method::signature_offset;
2147 int java_lang_reflect_Method::annotations_offset;
2148 int java_lang_reflect_Method::parameter_annotations_offset;
2149 int java_lang_reflect_Method::annotation_default_offset;
2150 int java_lang_reflect_Constructor::clazz_offset;
2151 int java_lang_reflect_Constructor::parameterTypes_offset;
2152 int java_lang_reflect_Constructor::exceptionTypes_offset;
2153 int java_lang_reflect_Constructor::slot_offset;
2154 int java_lang_reflect_Constructor::modifiers_offset;
2155 int java_lang_reflect_Constructor::signature_offset;
2156 int java_lang_reflect_Constructor::annotations_offset;
2157 int java_lang_reflect_Constructor::parameter_annotations_offset;
2158 int java_lang_reflect_Field::clazz_offset;
2159 int java_lang_reflect_Field::name_offset;
2160 int java_lang_reflect_Field::type_offset;
2161 int java_lang_reflect_Field::slot_offset;
2162 int java_lang_reflect_Field::modifiers_offset;
2163 int java_lang_reflect_Field::signature_offset;
2164 int java_lang_reflect_Field::annotations_offset;
2165 int java_lang_boxing_object::value_offset;
2166 int java_lang_boxing_object::long_value_offset;
2167 int java_lang_ref_Reference::referent_offset;
2168 int java_lang_ref_Reference::queue_offset;
2169 int java_lang_ref_Reference::next_offset;
2170 int java_lang_ref_Reference::discovered_offset;
2171 int java_lang_ref_Reference::static_lock_offset;
2172 int java_lang_ref_Reference::static_pending_offset;
2173 int java_lang_ref_Reference::number_of_fake_oop_fields;
2174 int java_lang_ref_SoftReference::timestamp_offset;
2175 int java_lang_ref_SoftReference::static_clock_offset;
2176 int java_lang_ClassLoader::parent_offset;
2177 int java_lang_System::offset_of_static_fields;
2178 int java_lang_System::static_in_offset;
2179 int java_lang_System::static_out_offset;
2180 int java_lang_System::static_err_offset;
2181 int java_lang_StackTraceElement::declaringClass_offset;
2182 int java_lang_StackTraceElement::methodName_offset;
2183 int java_lang_StackTraceElement::fileName_offset;
2184 int java_lang_StackTraceElement::lineNumber_offset;
2185 int java_lang_AssertionStatusDirectives::classes_offset;
2186 int java_lang_AssertionStatusDirectives::classEnabled_offset;


2266 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
2267   if (_owner_offset != 0) return;
2268 
2269   assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
2270   SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
2271   klassOop k = SystemDictionary::abstract_ownable_synchronizer_klass();
2272   compute_offset(_owner_offset, k,
2273                  vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature());
2274 }
2275 
2276 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
2277   assert(_owner_offset != 0, "Must be initialized");
2278   return obj->obj_field(_owner_offset);
2279 }
2280 
2281 // Compute hard-coded offsets
2282 // Invoked before SystemDictionary::initialize, so pre-loaded classes
2283 // are not available to determine the offset_of_static_fields.
2284 void JavaClasses::compute_hard_coded_offsets() {
2285   const int x = heapOopSize;
2286   const int header = instanceOopDesc::base_offset_in_bytes();



2287 
2288   // Do the String Class
2289   java_lang_String::value_offset  = java_lang_String::hc_value_offset  * x + header;
2290   java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header;
2291   java_lang_String::count_offset  = java_lang_String::offset_offset + sizeof (jint);
2292   java_lang_String::hash_offset   = java_lang_String::count_offset + sizeof (jint);
2293 
2294   // Do the Class Class
2295   java_lang_Class::klass_offset = java_lang_Class::hc_klass_offset * x + header;
2296   java_lang_Class::array_klass_offset = java_lang_Class::hc_array_klass_offset * x + header;
2297   java_lang_Class::resolved_constructor_offset = java_lang_Class::hc_resolved_constructor_offset * x + header;
2298 
2299   // This is NOT an offset
2300   java_lang_Class::number_of_fake_oop_fields = java_lang_Class::hc_number_of_fake_oop_fields;
2301 
2302   // Throwable Class
2303   java_lang_Throwable::backtrace_offset  = java_lang_Throwable::hc_backtrace_offset  * x + header;
2304   java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
2305   java_lang_Throwable::cause_offset      = java_lang_Throwable::hc_cause_offset      * x + header;
2306   java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
2307 
2308   // java_lang_boxing_object
2309   java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header;
2310   java_lang_boxing_object::long_value_offset = align_size_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong);
2311 
2312   // java_lang_ref_Reference:
2313   java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
2314   java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
2315   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
2316   java_lang_ref_Reference::discovered_offset  = java_lang_ref_Reference::hc_discovered_offset * x + header;
2317   java_lang_ref_Reference::static_lock_offset = java_lang_ref_Reference::hc_static_lock_offset *  x;
2318   java_lang_ref_Reference::static_pending_offset = java_lang_ref_Reference::hc_static_pending_offset * x;
2319   // Artificial fields for java_lang_ref_Reference
2320   // The first field is for the discovered field added in 1.4
2321   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
2322 
2323   // java_lang_ref_SoftReference Class
2324   java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong);
2325   // Don't multiply static fields because they are always in wordSize units
2326   java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
2327 
2328   // java_lang_ClassLoader
2329   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
2330 
2331   // java_lang_System
2332   java_lang_System::static_in_offset  = java_lang_System::hc_static_in_offset  * x;
2333   java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x;
2334   java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x;
2335 
2336   // java_lang_StackTraceElement
2337   java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset  * x + header;
2338   java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header;
2339   java_lang_StackTraceElement::fileName_offset   = java_lang_StackTraceElement::hc_fileName_offset   * x + header;
2340   java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
2341   java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
2342   java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
2343   java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
2344   java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;


2451     return false;
2452   }
2453   jint field_value = fd.int_initial_value();
2454   if (field_value == hardcoded_constant) {
2455     return true;
2456   } else {
2457     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);
2458     return false;
2459   }
2460 }
2461 
2462 
2463 // Check the hard-coded field offsets of all the classes in this file
2464 
2465 void JavaClasses::check_offsets() {
2466   bool valid = true;
2467 
2468 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
2469   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
2470 
2471 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
2472   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
2473 
2474 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
2475   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
2476 
2477 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
2478   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
2479 
2480   // java.lang.String
2481 
2482   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C");
2483   CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I");
2484   CHECK_OFFSET("java/lang/String", java_lang_String, count, "I");
2485   CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
2486 
2487   // java.lang.Class
2488 
2489   // Fake fields
2490   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
2491   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
2492   // CHECK_OFFSET("java/lang/Class", java_lang_Class, resolved_constructor); // %%% this needs to be checked
2493 
2494   // java.lang.Throwable
2495 
2496   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
2497   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
2498   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, cause, "Ljava/lang/Throwable;");
2499   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
2500 
2501   // Boxed primitive objects (java_lang_boxing_object)
2502 
2503   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
2504   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
2505   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");
2506   CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
2507   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
2508   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
2509   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
2510   CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
2511 
2512   // java.lang.ClassLoader
2513 
2514   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,      "Ljava/lang/ClassLoader;");
2515 
2516   // java.lang.System
2517 
2518   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System,  in, "Ljava/io/InputStream;");
2519   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;");
2520   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;");
2521 
2522   // java.lang.StackTraceElement
2523 
2524   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass, "Ljava/lang/String;");
2525   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName, "Ljava/lang/String;");
2526   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement,   fileName, "Ljava/lang/String;");
2527   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber, "I");
2528 
2529   // java.lang.ref.Reference
2530 


src/share/vm/classfile/javaClasses.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File