hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 591 04d2e26e6d69
parent 379 10767ca40189
child 670 ddf3e9583f2f
equal deleted inserted replaced
590:2954744d7bba 591:04d2e26e6d69
  1870       break;
  1870       break;
  1871     case T_FLOAT:
  1871     case T_FLOAT:
  1872       box->float_field_put(value_offset, value->f);
  1872       box->float_field_put(value_offset, value->f);
  1873       break;
  1873       break;
  1874     case T_DOUBLE:
  1874     case T_DOUBLE:
  1875       box->double_field_put(value_offset, value->d);
  1875       box->double_field_put(long_value_offset, value->d);
  1876       break;
  1876       break;
  1877     case T_BYTE:
  1877     case T_BYTE:
  1878       box->byte_field_put(value_offset, value->b);
  1878       box->byte_field_put(value_offset, value->b);
  1879       break;
  1879       break;
  1880     case T_SHORT:
  1880     case T_SHORT:
  1882       break;
  1882       break;
  1883     case T_INT:
  1883     case T_INT:
  1884       box->int_field_put(value_offset, value->i);
  1884       box->int_field_put(value_offset, value->i);
  1885       break;
  1885       break;
  1886     case T_LONG:
  1886     case T_LONG:
  1887       box->long_field_put(value_offset, value->j);
  1887       box->long_field_put(long_value_offset, value->j);
  1888       break;
  1888       break;
  1889     default:
  1889     default:
  1890       return NULL;
  1890       return NULL;
  1891   }
  1891   }
  1892   return box;
  1892   return box;
  1913     break;
  1913     break;
  1914   case T_FLOAT:
  1914   case T_FLOAT:
  1915     value->f = box->float_field(value_offset);
  1915     value->f = box->float_field(value_offset);
  1916     break;
  1916     break;
  1917   case T_DOUBLE:
  1917   case T_DOUBLE:
  1918     value->d = box->double_field(value_offset);
  1918     value->d = box->double_field(long_value_offset);
  1919     break;
  1919     break;
  1920   case T_BYTE:
  1920   case T_BYTE:
  1921     value->b = box->byte_field(value_offset);
  1921     value->b = box->byte_field(value_offset);
  1922     break;
  1922     break;
  1923   case T_SHORT:
  1923   case T_SHORT:
  1925     break;
  1925     break;
  1926   case T_INT:
  1926   case T_INT:
  1927     value->i = box->int_field(value_offset);
  1927     value->i = box->int_field(value_offset);
  1928     break;
  1928     break;
  1929   case T_LONG:
  1929   case T_LONG:
  1930     value->j = box->long_field(value_offset);
  1930     value->j = box->long_field(long_value_offset);
  1931     break;
  1931     break;
  1932   default:
  1932   default:
  1933     return T_ILLEGAL;
  1933     return T_ILLEGAL;
  1934   } // end switch
  1934   } // end switch
  1935   return type;
  1935   return type;
  1947     break;
  1947     break;
  1948   case T_FLOAT:
  1948   case T_FLOAT:
  1949     box->float_field_put(value_offset, value->f);
  1949     box->float_field_put(value_offset, value->f);
  1950     break;
  1950     break;
  1951   case T_DOUBLE:
  1951   case T_DOUBLE:
  1952     box->double_field_put(value_offset, value->d);
  1952     box->double_field_put(long_value_offset, value->d);
  1953     break;
  1953     break;
  1954   case T_BYTE:
  1954   case T_BYTE:
  1955     box->byte_field_put(value_offset, value->b);
  1955     box->byte_field_put(value_offset, value->b);
  1956     break;
  1956     break;
  1957   case T_SHORT:
  1957   case T_SHORT:
  1959     break;
  1959     break;
  1960   case T_INT:
  1960   case T_INT:
  1961     box->int_field_put(value_offset, value->i);
  1961     box->int_field_put(value_offset, value->i);
  1962     break;
  1962     break;
  1963   case T_LONG:
  1963   case T_LONG:
  1964     box->long_field_put(value_offset, value->j);
  1964     box->long_field_put(long_value_offset, value->j);
  1965     break;
  1965     break;
  1966   default:
  1966   default:
  1967     return T_ILLEGAL;
  1967     return T_ILLEGAL;
  1968   } // end switch
  1968   } // end switch
  1969   return type;
  1969   return type;
  2161 int java_lang_reflect_Field::slot_offset;
  2161 int java_lang_reflect_Field::slot_offset;
  2162 int java_lang_reflect_Field::modifiers_offset;
  2162 int java_lang_reflect_Field::modifiers_offset;
  2163 int java_lang_reflect_Field::signature_offset;
  2163 int java_lang_reflect_Field::signature_offset;
  2164 int java_lang_reflect_Field::annotations_offset;
  2164 int java_lang_reflect_Field::annotations_offset;
  2165 int java_lang_boxing_object::value_offset;
  2165 int java_lang_boxing_object::value_offset;
       
  2166 int java_lang_boxing_object::long_value_offset;
  2166 int java_lang_ref_Reference::referent_offset;
  2167 int java_lang_ref_Reference::referent_offset;
  2167 int java_lang_ref_Reference::queue_offset;
  2168 int java_lang_ref_Reference::queue_offset;
  2168 int java_lang_ref_Reference::next_offset;
  2169 int java_lang_ref_Reference::next_offset;
  2169 int java_lang_ref_Reference::discovered_offset;
  2170 int java_lang_ref_Reference::discovered_offset;
  2170 int java_lang_ref_Reference::static_lock_offset;
  2171 int java_lang_ref_Reference::static_lock_offset;
  2280 // Compute hard-coded offsets
  2281 // Compute hard-coded offsets
  2281 // Invoked before SystemDictionary::initialize, so pre-loaded classes
  2282 // Invoked before SystemDictionary::initialize, so pre-loaded classes
  2282 // are not available to determine the offset_of_static_fields.
  2283 // are not available to determine the offset_of_static_fields.
  2283 void JavaClasses::compute_hard_coded_offsets() {
  2284 void JavaClasses::compute_hard_coded_offsets() {
  2284   const int x = heapOopSize;
  2285   const int x = heapOopSize;
  2285   // Objects don't get allocated in the gap in the header with compressed oops
  2286   const int header = instanceOopDesc::base_offset_in_bytes();
  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 
  2287 
  2290   // Do the String Class
  2288   // Do the String Class
  2291   java_lang_String::value_offset  = java_lang_String::hc_value_offset  * x + header;
  2289   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;
  2290   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);
  2291   java_lang_String::count_offset  = java_lang_String::offset_offset + sizeof (jint);
  2306   java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
  2304   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;
  2305   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;
  2306   java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
  2309 
  2307 
  2310   // java_lang_boxing_object
  2308   // java_lang_boxing_object
  2311   java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset * x + header;
  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);
  2312 
  2311 
  2313   // java_lang_ref_Reference:
  2312   // java_lang_ref_Reference:
  2314   java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
  2313   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;
  2314   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;
  2315   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
  2320   // Artificial fields for java_lang_ref_Reference
  2319   // Artificial fields for java_lang_ref_Reference
  2321   // The first field is for the discovered field added in 1.4
  2320   // The first field is for the discovered field added in 1.4
  2322   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
  2321   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
  2323 
  2322 
  2324   // java_lang_ref_SoftReference Class
  2323   // java_lang_ref_SoftReference Class
  2325   java_lang_ref_SoftReference::timestamp_offset = java_lang_ref_SoftReference::hc_timestamp_offset * x + header;
  2324   java_lang_ref_SoftReference::timestamp_offset = align_size_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong);
  2326   // Don't multiply static fields because they are always in wordSize units
  2325   // 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;
  2326   java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
  2328 
  2327 
  2329   // java_lang_ClassLoader
  2328   // java_lang_ClassLoader
  2330   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
  2329   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
  2467   bool valid = true;
  2466   bool valid = true;
  2468 
  2467 
  2469 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  2468 #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)
  2469   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
  2471 
  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 
  2472 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  2474 #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)
  2475   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
  2474 
  2476 
  2475 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
  2477 #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)
  2478   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
  2499   // Boxed primitive objects (java_lang_boxing_object)
  2501   // Boxed primitive objects (java_lang_boxing_object)
  2500 
  2502 
  2501   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
  2503   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
  2502   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
  2504   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
  2503   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");
  2505   CHECK_OFFSET("java/lang/Float",     java_lang_boxing_object, value, "F");
  2504   CHECK_OFFSET("java/lang/Double",    java_lang_boxing_object, value, "D");
  2506   CHECK_LONG_OFFSET("java/lang/Double", java_lang_boxing_object, value, "D");
  2505   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
  2507   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
  2506   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
  2508   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
  2507   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
  2509   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
  2508   CHECK_OFFSET("java/lang/Long",      java_lang_boxing_object, value, "J");
  2510   CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
  2509 
  2511 
  2510   // java.lang.ClassLoader
  2512   // java.lang.ClassLoader
  2511 
  2513 
  2512   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,      "Ljava/lang/ClassLoader;");
  2514   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,      "Ljava/lang/ClassLoader;");
  2513 
  2515