src/hotspot/share/classfile/javaClasses.cpp
changeset 48619 1703d83b3ffe
parent 47998 fb0275c320a0
child 48620 7f97d35fac6e
equal deleted inserted replaced
48614:c39ae979ca35 48619:1703d83b3ffe
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    31 #include "classfile/vmSymbols.hpp"
    31 #include "classfile/vmSymbols.hpp"
    32 #include "code/debugInfo.hpp"
    32 #include "code/debugInfo.hpp"
    33 #include "code/dependencyContext.hpp"
    33 #include "code/dependencyContext.hpp"
    34 #include "code/pcDesc.hpp"
    34 #include "code/pcDesc.hpp"
    35 #include "interpreter/interpreter.hpp"
    35 #include "interpreter/interpreter.hpp"
       
    36 #include "logging/log.hpp"
       
    37 #include "logging/logStream.hpp"
    36 #include "memory/oopFactory.hpp"
    38 #include "memory/oopFactory.hpp"
    37 #include "memory/resourceArea.hpp"
    39 #include "memory/resourceArea.hpp"
    38 #include "memory/universe.inline.hpp"
    40 #include "memory/universe.inline.hpp"
    39 #include "oops/fieldStreams.hpp"
    41 #include "oops/fieldStreams.hpp"
    40 #include "oops/instanceKlass.hpp"
    42 #include "oops/instanceKlass.hpp"
   102   }
   104   }
   103   return NULL;
   105   return NULL;
   104 }
   106 }
   105 
   107 
   106 
   108 
   107 static bool find_field(InstanceKlass* ik,
       
   108                        Symbol* name_symbol, Symbol* signature_symbol,
       
   109                        fieldDescriptor* fd,
       
   110                        bool is_static = false, bool allow_super = false) {
       
   111   if (allow_super || is_static) {
       
   112     return ik->find_field(name_symbol, signature_symbol, is_static, fd) != NULL;
       
   113   } else {
       
   114     return ik->find_local_field(name_symbol, signature_symbol, fd);
       
   115   }
       
   116 }
       
   117 
       
   118 // Helpful routine for computing field offsets at run time rather than hardcoding them
   109 // Helpful routine for computing field offsets at run time rather than hardcoding them
   119 static void
   110 // Finds local fields only, including static fields.  Static field offsets are from the
   120 compute_offset(int &dest_offset,
   111 // beginning of the mirror.
   121                Klass* klass, Symbol* name_symbol, Symbol* signature_symbol,
   112 static void compute_offset(int &dest_offset,
   122                bool is_static = false, bool allow_super = false) {
   113                            InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol,
       
   114                            bool is_static = false) {
   123   fieldDescriptor fd;
   115   fieldDescriptor fd;
   124   InstanceKlass* ik = InstanceKlass::cast(klass);
   116   if (ik == NULL) {
   125   if (!find_field(ik, name_symbol, signature_symbol, &fd, is_static, allow_super)) {
       
   126     ResourceMark rm;
   117     ResourceMark rm;
   127     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
   118     log_error(class)("Mismatch JDK version for field: %s type: %s", name_symbol->as_C_string(), signature_symbol->as_C_string());
       
   119     vm_exit_during_initialization("Invalid layout of preloaded class");
       
   120   }
       
   121 
       
   122   if (!ik->find_local_field(name_symbol, signature_symbol, &fd) || fd.is_static() != is_static) {
       
   123     ResourceMark rm;
       
   124     log_error(class)("Invalid layout of %s field: %s type: %s", ik->external_name(),
       
   125                      name_symbol->as_C_string(), signature_symbol->as_C_string());
   128 #ifndef PRODUCT
   126 #ifndef PRODUCT
   129     ik->print();
   127     // Prints all fields and offsets
   130     tty->print_cr("all fields:");
   128     Log(class) lt;
   131     for (AllFieldStream fs(ik); !fs.done(); fs.next()) {
   129     LogStream ls(lt.error());
   132       tty->print_cr("  name: %s, sig: %s, flags: %08x", fs.name()->as_C_string(), fs.signature()->as_C_string(), fs.access_flags().as_int());
   130     ik->print_on(&ls);
   133     }
       
   134 #endif //PRODUCT
   131 #endif //PRODUCT
   135     vm_exit_during_initialization("Invalid layout of preloaded class: use -Xlog:class+load=info to see the origin of the problem class");
   132     vm_exit_during_initialization("Invalid layout of preloaded class: use -Xlog:class+load=info to see the origin of the problem class");
   136   }
   133   }
   137   dest_offset = fd.offset();
   134   dest_offset = fd.offset();
   138 }
   135 }
   139 
   136 
       
   137 // Overloading to pass name as a string.
       
   138 static void compute_offset(int& dest_offset, InstanceKlass* ik,
       
   139                            const char* name_string, Symbol* signature_symbol,
       
   140                            bool is_static = false) {
       
   141   TempNewSymbol name = SymbolTable::probe(name_string, (int)strlen(name_string));
       
   142   if (name == NULL) {
       
   143     ResourceMark rm;
       
   144     log_error(class)("Name %s should be in the SymbolTable since its class is loaded", name_string);
       
   145     vm_exit_during_initialization("Invalid layout of preloaded class", ik->external_name());
       
   146   }
       
   147   compute_offset(dest_offset, ik, name, signature_symbol, is_static);
       
   148 }
       
   149 
   140 // Same as above but for "optional" offsets that might not be present in certain JDK versions
   150 // Same as above but for "optional" offsets that might not be present in certain JDK versions
       
   151 // Old versions should be cleaned out since Hotspot only supports the current JDK, and this
       
   152 // function should be removed.
   141 static void
   153 static void
   142 compute_optional_offset(int& dest_offset,
   154 compute_optional_offset(int& dest_offset,
   143                         Klass* klass, Symbol* name_symbol, Symbol* signature_symbol,
   155                         InstanceKlass* ik, Symbol* name_symbol, Symbol* signature_symbol) {
   144                         bool allow_super = false) {
       
   145   fieldDescriptor fd;
   156   fieldDescriptor fd;
   146   InstanceKlass* ik = InstanceKlass::cast(klass);
   157   if (ik->find_local_field(name_symbol, signature_symbol, &fd)) {
   147   if (find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
       
   148     dest_offset = fd.offset();
   158     dest_offset = fd.offset();
   149   }
   159   }
   150 }
   160 }
   151 
       
   152 
   161 
   153 int java_lang_String::value_offset  = 0;
   162 int java_lang_String::value_offset  = 0;
   154 int java_lang_String::hash_offset   = 0;
   163 int java_lang_String::hash_offset   = 0;
   155 int java_lang_String::coder_offset  = 0;
   164 int java_lang_String::coder_offset  = 0;
   156 
   165 
   161 }
   170 }
   162 
   171 
   163 void java_lang_String::compute_offsets() {
   172 void java_lang_String::compute_offsets() {
   164   assert(!initialized, "offsets should be initialized only once");
   173   assert(!initialized, "offsets should be initialized only once");
   165 
   174 
   166   Klass* k = SystemDictionary::String_klass();
   175   InstanceKlass* k = SystemDictionary::String_klass();
   167   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::byte_array_signature());
   176   compute_offset(value_offset,           k, vmSymbols::value_name(),  vmSymbols::byte_array_signature());
   168   compute_offset(hash_offset,            k, vmSymbols::hash_name(),   vmSymbols::int_signature());
   177   compute_offset(hash_offset,            k, "hash",   vmSymbols::int_signature());
   169   compute_offset(coder_offset,           k, vmSymbols::coder_name(),  vmSymbols::byte_signature());
   178   compute_offset(coder_offset,           k, "coder",  vmSymbols::byte_signature());
   170 
   179 
   171   initialized = true;
   180   initialized = true;
   172 }
   181 }
   173 
   182 
   174 class CompactStringsFixup : public FieldClosure {
   183 class CompactStringsFixup : public FieldClosure {
  1159 
  1168 
  1160 void java_lang_Class::compute_offsets() {
  1169 void java_lang_Class::compute_offsets() {
  1161   assert(!offsets_computed, "offsets should be initialized only once");
  1170   assert(!offsets_computed, "offsets should be initialized only once");
  1162   offsets_computed = true;
  1171   offsets_computed = true;
  1163 
  1172 
  1164   Klass* k = SystemDictionary::Class_klass();
  1173   InstanceKlass* k = SystemDictionary::Class_klass();
  1165   // The classRedefinedCount field is only present starting in 1.5,
  1174   compute_offset(classRedefinedCount_offset, k, "classRedefinedCount", vmSymbols::int_signature());
  1166   // so don't go fatal.
  1175   compute_offset(_class_loader_offset,       k, "classLoader", vmSymbols::classloader_signature());
  1167   compute_optional_offset(classRedefinedCount_offset,
  1176   compute_offset(_component_mirror_offset,   k, "componentType", vmSymbols::class_signature());
  1168                           k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
  1177   compute_offset(_module_offset,             k, "module", vmSymbols::module_signature());
  1169 
       
  1170   // Needs to be optional because the old build runs Queens during bootstrapping
       
  1171   // and jdk8-9 doesn't have coordinated pushes yet.
       
  1172   compute_optional_offset(_class_loader_offset,
       
  1173                  k, vmSymbols::classLoader_name(),
       
  1174                  vmSymbols::classloader_signature());
       
  1175 
       
  1176   compute_offset(_component_mirror_offset,
       
  1177                  k, vmSymbols::componentType_name(),
       
  1178                  vmSymbols::class_signature());
       
  1179 
       
  1180   compute_offset(_module_offset,
       
  1181                  k, vmSymbols::module_name(),
       
  1182                  vmSymbols::module_signature());
       
  1183 
  1178 
  1184   // Init lock is a C union with component_mirror.  Only instanceKlass mirrors have
  1179   // Init lock is a C union with component_mirror.  Only instanceKlass mirrors have
  1185   // init_lock and only ArrayKlass mirrors have component_mirror.  Since both are oops
  1180   // init_lock and only ArrayKlass mirrors have component_mirror.  Since both are oops
  1186   // GC treats them the same.
  1181   // GC treats them the same.
  1187   _init_lock_offset = _component_mirror_offset;
  1182   _init_lock_offset = _component_mirror_offset;
  1232 
  1227 
  1233 
  1228 
  1234 void java_lang_Thread::compute_offsets() {
  1229 void java_lang_Thread::compute_offsets() {
  1235   assert(_group_offset == 0, "offsets should be initialized only once");
  1230   assert(_group_offset == 0, "offsets should be initialized only once");
  1236 
  1231 
  1237   Klass* k = SystemDictionary::Thread_klass();
  1232   InstanceKlass* k = SystemDictionary::Thread_klass();
  1238   compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
  1233   compute_offset(_name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
  1239   compute_offset(_group_offset,     k, vmSymbols::group_name(),     vmSymbols::threadgroup_signature());
  1234   compute_offset(_group_offset,     k, vmSymbols::group_name(),     vmSymbols::threadgroup_signature());
  1240   compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(), vmSymbols::classloader_signature());
  1235   compute_offset(_contextClassLoader_offset, k, vmSymbols::contextClassLoader_name(),
  1241   compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(), vmSymbols::accesscontrolcontext_signature());
  1236                  vmSymbols::classloader_signature());
       
  1237   compute_offset(_inheritedAccessControlContext_offset, k, vmSymbols::inheritedAccessControlContext_name(),
       
  1238                  vmSymbols::accesscontrolcontext_signature());
  1242   compute_offset(_priority_offset,  k, vmSymbols::priority_name(),  vmSymbols::int_signature());
  1239   compute_offset(_priority_offset,  k, vmSymbols::priority_name(),  vmSymbols::int_signature());
  1243   compute_offset(_daemon_offset,    k, vmSymbols::daemon_name(),    vmSymbols::bool_signature());
  1240   compute_offset(_daemon_offset,    k, vmSymbols::daemon_name(),    vmSymbols::bool_signature());
  1244   compute_offset(_eetop_offset,     k, vmSymbols::eetop_name(),     vmSymbols::long_signature());
  1241   compute_offset(_eetop_offset,     k, "eetop", vmSymbols::long_signature());
  1245   compute_offset(_stillborn_offset, k, vmSymbols::stillborn_name(), vmSymbols::bool_signature());
  1242   compute_offset(_stillborn_offset, k, "stillborn", vmSymbols::bool_signature());
  1246   // The stackSize field is only present starting in 1.4, so don't go fatal.
  1243   compute_offset(_stackSize_offset, k, "stackSize", vmSymbols::long_signature());
  1247   compute_optional_offset(_stackSize_offset, k, vmSymbols::stackSize_name(), vmSymbols::long_signature());
  1244   compute_offset(_tid_offset,       k, "tid", vmSymbols::long_signature());
  1248   // The tid and thread_status fields are only present starting in 1.5, so don't go fatal.
  1245   compute_offset(_thread_status_offset, k, "threadStatus", vmSymbols::int_signature());
  1249   compute_optional_offset(_tid_offset, k, vmSymbols::thread_id_name(), vmSymbols::long_signature());
  1246   compute_offset(_park_blocker_offset,  k, "parkBlocker", vmSymbols::object_signature());
  1250   compute_optional_offset(_thread_status_offset, k, vmSymbols::thread_status_name(), vmSymbols::int_signature());
  1247   compute_offset(_park_event_offset,    k, "nativeParkEventPointer", vmSymbols::long_signature());
  1251   // The parkBlocker field is only present starting in 1.6, so don't go fatal.
       
  1252   compute_optional_offset(_park_blocker_offset, k, vmSymbols::park_blocker_name(), vmSymbols::object_signature());
       
  1253   compute_optional_offset(_park_event_offset, k, vmSymbols::park_event_name(),
       
  1254  vmSymbols::long_signature());
       
  1255 }
  1248 }
  1256 
  1249 
  1257 
  1250 
  1258 JavaThread* java_lang_Thread::thread(oop java_thread) {
  1251 JavaThread* java_lang_Thread::thread(oop java_thread) {
  1259   return (JavaThread*)java_thread->address_field(_eetop_offset);
  1252   return (JavaThread*)java_thread->address_field(_eetop_offset);
  1484 }
  1477 }
  1485 
  1478 
  1486 void java_lang_ThreadGroup::compute_offsets() {
  1479 void java_lang_ThreadGroup::compute_offsets() {
  1487   assert(_parent_offset == 0, "offsets should be initialized only once");
  1480   assert(_parent_offset == 0, "offsets should be initialized only once");
  1488 
  1481 
  1489   Klass* k = SystemDictionary::ThreadGroup_klass();
  1482   InstanceKlass* k = SystemDictionary::ThreadGroup_klass();
  1490 
  1483 
  1491   compute_offset(_parent_offset,      k, vmSymbols::parent_name(),      vmSymbols::threadgroup_signature());
  1484   compute_offset(_parent_offset,      k, vmSymbols::parent_name(),      vmSymbols::threadgroup_signature());
  1492   compute_offset(_name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
  1485   compute_offset(_name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
  1493   compute_offset(_threads_offset,     k, vmSymbols::threads_name(),     vmSymbols::thread_array_signature());
  1486   compute_offset(_threads_offset,     k, vmSymbols::threads_name(),     vmSymbols::thread_array_signature());
  1494   compute_offset(_groups_offset,      k, vmSymbols::groups_name(),      vmSymbols::threadgroup_array_signature());
  1487   compute_offset(_groups_offset,      k, vmSymbols::groups_name(),      vmSymbols::threadgroup_array_signature());
  1499   compute_offset(_ngroups_offset,     k, vmSymbols::ngroups_name(),     vmSymbols::int_signature());
  1492   compute_offset(_ngroups_offset,     k, vmSymbols::ngroups_name(),     vmSymbols::int_signature());
  1500 }
  1493 }
  1501 
  1494 
  1502 
  1495 
  1503 void java_lang_Throwable::compute_offsets() {
  1496 void java_lang_Throwable::compute_offsets() {
  1504   Klass* k = SystemDictionary::Throwable_klass();
  1497   InstanceKlass* k = SystemDictionary::Throwable_klass();
  1505   compute_offset(depth_offset, k, vmSymbols::depth_name(), vmSymbols::int_signature());
  1498   compute_offset(backtrace_offset,     k, "backtrace", vmSymbols::object_signature());
       
  1499   compute_offset(detailMessage_offset, k, "detailMessage", vmSymbols::string_signature());
       
  1500   compute_offset(stackTrace_offset,    k, "stackTrace",    vmSymbols::java_lang_StackTraceElement_array());
       
  1501   compute_offset(depth_offset,         k, "depth", vmSymbols::int_signature());
       
  1502   compute_offset(static_unassigned_stacktrace_offset, k, "UNASSIGNED_STACK", vmSymbols::java_lang_StackTraceElement_array(),
       
  1503                  /*is_static*/true);
  1506 }
  1504 }
  1507 
  1505 
  1508 oop java_lang_Throwable::unassigned_stacktrace() {
  1506 oop java_lang_Throwable::unassigned_stacktrace() {
  1509   InstanceKlass* ik = SystemDictionary::Throwable_klass();
  1507   InstanceKlass* ik = SystemDictionary::Throwable_klass();
  1510   address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);
  1508   address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);
  2268   Symbol* name = method->name();
  2266   Symbol* name = method->name();
  2269   java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, name, CHECK);
  2267   java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, name, CHECK);
  2270 }
  2268 }
  2271 
  2269 
  2272 void java_lang_StackFrameInfo::compute_offsets() {
  2270 void java_lang_StackFrameInfo::compute_offsets() {
  2273   Klass* k = SystemDictionary::StackFrameInfo_klass();
  2271   InstanceKlass* k = SystemDictionary::StackFrameInfo_klass();
  2274   compute_offset(_memberName_offset,     k, vmSymbols::memberName_name(),  vmSymbols::object_signature());
  2272   compute_offset(_memberName_offset,     k, "memberName",  vmSymbols::object_signature());
  2275   compute_offset(_bci_offset,            k, vmSymbols::bci_name(),         vmSymbols::short_signature());
  2273   compute_offset(_bci_offset,            k, "bci",         vmSymbols::short_signature());
  2276   STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2274   STACKFRAMEINFO_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2277 }
  2275 }
  2278 
  2276 
  2279 void java_lang_LiveStackFrameInfo::compute_offsets() {
  2277 void java_lang_LiveStackFrameInfo::compute_offsets() {
  2280   Klass* k = SystemDictionary::LiveStackFrameInfo_klass();
  2278   InstanceKlass* k = SystemDictionary::LiveStackFrameInfo_klass();
  2281   compute_offset(_monitors_offset,   k, vmSymbols::monitors_name(),    vmSymbols::object_array_signature());
  2279   compute_offset(_monitors_offset,   k, "monitors",    vmSymbols::object_array_signature());
  2282   compute_offset(_locals_offset,     k, vmSymbols::locals_name(),      vmSymbols::object_array_signature());
  2280   compute_offset(_locals_offset,     k, "locals",      vmSymbols::object_array_signature());
  2283   compute_offset(_operands_offset,   k, vmSymbols::operands_name(),    vmSymbols::object_array_signature());
  2281   compute_offset(_operands_offset,   k, "operands",    vmSymbols::object_array_signature());
  2284   compute_offset(_mode_offset,       k, vmSymbols::mode_name(),        vmSymbols::int_signature());
  2282   compute_offset(_mode_offset,       k, "mode",        vmSymbols::int_signature());
  2285 }
  2283 }
  2286 
  2284 
  2287 void java_lang_reflect_AccessibleObject::compute_offsets() {
  2285 void java_lang_reflect_AccessibleObject::compute_offsets() {
  2288   Klass* k = SystemDictionary::reflect_AccessibleObject_klass();
  2286   InstanceKlass* k = SystemDictionary::reflect_AccessibleObject_klass();
  2289   compute_offset(override_offset, k, vmSymbols::override_name(), vmSymbols::bool_signature());
  2287   compute_offset(override_offset, k, "override", vmSymbols::bool_signature());
  2290 }
  2288 }
  2291 
  2289 
  2292 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
  2290 jboolean java_lang_reflect_AccessibleObject::override(oop reflect) {
  2293   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2291   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2294   return (jboolean) reflect->bool_field(override_offset);
  2292   return (jboolean) reflect->bool_field(override_offset);
  2298   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2296   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2299   reflect->bool_field_put(override_offset, (int) value);
  2297   reflect->bool_field_put(override_offset, (int) value);
  2300 }
  2298 }
  2301 
  2299 
  2302 void java_lang_reflect_Method::compute_offsets() {
  2300 void java_lang_reflect_Method::compute_offsets() {
  2303   Klass* k = SystemDictionary::reflect_Method_klass();
  2301   InstanceKlass* k = SystemDictionary::reflect_Method_klass();
  2304   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
  2302   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
  2305   compute_offset(name_offset,           k, vmSymbols::name_name(),           vmSymbols::string_signature());
  2303   compute_offset(name_offset,           k, vmSymbols::name_name(),           vmSymbols::string_signature());
  2306   compute_offset(returnType_offset,     k, vmSymbols::returnType_name(),     vmSymbols::class_signature());
  2304   compute_offset(returnType_offset,     k, vmSymbols::returnType_name(),     vmSymbols::class_signature());
  2307   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  2305   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  2308   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  2306   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  2479   assert(has_type_annotations_field(), "type_annotations field must be present");
  2477   assert(has_type_annotations_field(), "type_annotations field must be present");
  2480   method->obj_field_put(type_annotations_offset, value);
  2478   method->obj_field_put(type_annotations_offset, value);
  2481 }
  2479 }
  2482 
  2480 
  2483 void java_lang_reflect_Constructor::compute_offsets() {
  2481 void java_lang_reflect_Constructor::compute_offsets() {
  2484   Klass* k = SystemDictionary::reflect_Constructor_klass();
  2482   InstanceKlass* k = SystemDictionary::reflect_Constructor_klass();
  2485   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
  2483   compute_offset(clazz_offset,          k, vmSymbols::clazz_name(),          vmSymbols::class_signature());
  2486   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  2484   compute_offset(parameterTypes_offset, k, vmSymbols::parameterTypes_name(), vmSymbols::class_array_signature());
  2487   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  2485   compute_offset(exceptionTypes_offset, k, vmSymbols::exceptionTypes_name(), vmSymbols::class_array_signature());
  2488   compute_offset(slot_offset,           k, vmSymbols::slot_name(),           vmSymbols::int_signature());
  2486   compute_offset(slot_offset,           k, vmSymbols::slot_name(),           vmSymbols::int_signature());
  2489   compute_offset(modifiers_offset,      k, vmSymbols::modifiers_name(),      vmSymbols::int_signature());
  2487   compute_offset(modifiers_offset,      k, vmSymbols::modifiers_name(),      vmSymbols::int_signature());
  2621   assert(has_type_annotations_field(), "type_annotations field must be present");
  2619   assert(has_type_annotations_field(), "type_annotations field must be present");
  2622   constructor->obj_field_put(type_annotations_offset, value);
  2620   constructor->obj_field_put(type_annotations_offset, value);
  2623 }
  2621 }
  2624 
  2622 
  2625 void java_lang_reflect_Field::compute_offsets() {
  2623 void java_lang_reflect_Field::compute_offsets() {
  2626   Klass* k = SystemDictionary::reflect_Field_klass();
  2624   InstanceKlass* k = SystemDictionary::reflect_Field_klass();
  2627   compute_offset(clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
  2625   compute_offset(clazz_offset,     k, vmSymbols::clazz_name(),     vmSymbols::class_signature());
  2628   compute_offset(name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
  2626   compute_offset(name_offset,      k, vmSymbols::name_name(),      vmSymbols::string_signature());
  2629   compute_offset(type_offset,      k, vmSymbols::type_name(),      vmSymbols::class_signature());
  2627   compute_offset(type_offset,      k, vmSymbols::type_name(),      vmSymbols::class_signature());
  2630   compute_offset(slot_offset,      k, vmSymbols::slot_name(),      vmSymbols::int_signature());
  2628   compute_offset(slot_offset,      k, vmSymbols::slot_name(),      vmSymbols::int_signature());
  2631   compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
  2629   compute_offset(modifiers_offset, k, vmSymbols::modifiers_name(), vmSymbols::int_signature());
  2745   assert(has_type_annotations_field(), "type_annotations field must be present");
  2743   assert(has_type_annotations_field(), "type_annotations field must be present");
  2746   field->obj_field_put(type_annotations_offset, value);
  2744   field->obj_field_put(type_annotations_offset, value);
  2747 }
  2745 }
  2748 
  2746 
  2749 void reflect_ConstantPool::compute_offsets() {
  2747 void reflect_ConstantPool::compute_offsets() {
  2750   Klass* k = SystemDictionary::reflect_ConstantPool_klass();
  2748   InstanceKlass* k = SystemDictionary::reflect_ConstantPool_klass();
  2751   // This null test can be removed post beta
  2749   // The field is called ConstantPool* in the sun.reflect.ConstantPool class.
  2752   if (k != NULL) {
  2750   compute_offset(_oop_offset, k, "constantPoolOop", vmSymbols::object_signature());
  2753     // The field is called ConstantPool* in the sun.reflect.ConstantPool class.
       
  2754     compute_offset(_oop_offset, k, vmSymbols::ConstantPool_name(), vmSymbols::object_signature());
       
  2755   }
       
  2756 }
  2751 }
  2757 
  2752 
  2758 void java_lang_reflect_Parameter::compute_offsets() {
  2753 void java_lang_reflect_Parameter::compute_offsets() {
  2759   Klass* k = SystemDictionary::reflect_Parameter_klass();
  2754   InstanceKlass* k = SystemDictionary::reflect_Parameter_klass();
  2760   if(NULL != k) {
  2755   compute_offset(name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
  2761     compute_offset(name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
  2756   compute_offset(modifiers_offset,   k, vmSymbols::modifiers_name(),   vmSymbols::int_signature());
  2762     compute_offset(modifiers_offset,   k, vmSymbols::modifiers_name(),   vmSymbols::int_signature());
  2757   compute_offset(index_offset,       k, vmSymbols::index_name(),       vmSymbols::int_signature());
  2763     compute_offset(index_offset,       k, vmSymbols::index_name(),       vmSymbols::int_signature());
  2758   compute_offset(executable_offset,  k, vmSymbols::executable_name(),  vmSymbols::executable_signature());
  2764     compute_offset(executable_offset,  k, vmSymbols::executable_name(),  vmSymbols::executable_signature());
       
  2765   }
       
  2766 }
  2759 }
  2767 
  2760 
  2768 Handle java_lang_reflect_Parameter::create(TRAPS) {
  2761 Handle java_lang_reflect_Parameter::create(TRAPS) {
  2769   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2762   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2770   Symbol* name = vmSymbols::java_lang_reflect_Parameter();
  2763   Symbol* name = vmSymbols::java_lang_reflect_Parameter();
  2834                           loader, module_name, CHECK_NH);
  2827                           loader, module_name, CHECK_NH);
  2835   return jlmh;
  2828   return jlmh;
  2836 }
  2829 }
  2837 
  2830 
  2838 void java_lang_Module::compute_offsets() {
  2831 void java_lang_Module::compute_offsets() {
  2839   Klass* k = SystemDictionary::Module_klass();
  2832   InstanceKlass* k = SystemDictionary::Module_klass();
  2840   if(NULL != k) {
  2833   compute_offset(loader_offset,  k, vmSymbols::loader_name(),  vmSymbols::classloader_signature());
  2841     compute_offset(loader_offset,  k, vmSymbols::loader_name(),  vmSymbols::classloader_signature());
  2834   compute_offset(name_offset,    k, vmSymbols::name_name(),    vmSymbols::string_signature());
  2842     compute_offset(name_offset,    k, vmSymbols::name_name(),    vmSymbols::string_signature());
  2835   MODULE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  2843     MODULE_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
       
  2844   }
       
  2845 }
  2836 }
  2846 
  2837 
  2847 
  2838 
  2848 oop java_lang_Module::loader(oop module) {
  2839 oop java_lang_Module::loader(oop module) {
  2849   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2840   assert(Universe::is_fully_initialized(), "Need to find another solution to the reflection problem");
  2919   // the original.
  2910   // the original.
  2920   return InstanceKlass::cast(k)->constants();
  2911   return InstanceKlass::cast(k)->constants();
  2921 }
  2912 }
  2922 
  2913 
  2923 void reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {
  2914 void reflect_UnsafeStaticFieldAccessorImpl::compute_offsets() {
  2924   Klass* k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass();
  2915   InstanceKlass* k = SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_klass();
  2925   // This null test can be removed post beta
  2916   compute_offset(_base_offset, k, "base", vmSymbols::object_signature());
  2926   if (k != NULL) {
       
  2927     compute_offset(_base_offset, k,
       
  2928                    vmSymbols::base_name(), vmSymbols::object_signature());
       
  2929   }
       
  2930 }
  2917 }
  2931 
  2918 
  2932 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
  2919 oop java_lang_boxing_object::initialize_and_allocate(BasicType type, TRAPS) {
  2933   Klass* k = SystemDictionary::box_klass(type);
  2920   Klass* k = SystemDictionary::box_klass(type);
  2934   if (k == NULL)  return NULL;
  2921   if (k == NULL)  return NULL;
  3082   assert(!is_reference || ik->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
  3069   assert(!is_reference || ik->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
  3083   return is_reference;
  3070   return is_reference;
  3084 }
  3071 }
  3085 
  3072 
  3086 // Support for java_lang_ref_SoftReference
  3073 // Support for java_lang_ref_SoftReference
       
  3074 //
       
  3075 
       
  3076 void java_lang_ref_SoftReference::compute_offsets() {
       
  3077   InstanceKlass* k = SystemDictionary::SoftReference_klass();
       
  3078   compute_offset(timestamp_offset,    k, "timestamp", vmSymbols::long_signature());
       
  3079   compute_offset(static_clock_offset, k, "clock",     vmSymbols::long_signature(), true);
       
  3080 }
  3087 
  3081 
  3088 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
  3082 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
  3089   return ref->long_field(timestamp_offset);
  3083   return ref->long_field(timestamp_offset);
  3090 }
  3084 }
  3091 
  3085 
  3111          "a DirectMethodHandle oop is expected");
  3105          "a DirectMethodHandle oop is expected");
  3112   return dmh->obj_field(member_offset_in_bytes());
  3106   return dmh->obj_field(member_offset_in_bytes());
  3113 }
  3107 }
  3114 
  3108 
  3115 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
  3109 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
  3116   Klass* k = SystemDictionary::DirectMethodHandle_klass();
  3110   InstanceKlass* k = SystemDictionary::DirectMethodHandle_klass();
  3117   if (k != NULL) {
  3111   compute_offset(_member_offset, k, "member", vmSymbols::java_lang_invoke_MemberName_signature());
  3118     compute_offset(_member_offset, k, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
       
  3119   }
       
  3120 }
  3112 }
  3121 
  3113 
  3122 // Support for java_lang_invoke_MethodHandle
  3114 // Support for java_lang_invoke_MethodHandle
  3123 
  3115 
  3124 int java_lang_invoke_MethodHandle::_type_offset;
  3116 int java_lang_invoke_MethodHandle::_type_offset;
  3135 int java_lang_invoke_ResolvedMethodName::_vmholder_offset;
  3127 int java_lang_invoke_ResolvedMethodName::_vmholder_offset;
  3136 
  3128 
  3137 int java_lang_invoke_LambdaForm::_vmentry_offset;
  3129 int java_lang_invoke_LambdaForm::_vmentry_offset;
  3138 
  3130 
  3139 void java_lang_invoke_MethodHandle::compute_offsets() {
  3131 void java_lang_invoke_MethodHandle::compute_offsets() {
  3140   Klass* k = SystemDictionary::MethodHandle_klass();
  3132   InstanceKlass* k = SystemDictionary::MethodHandle_klass();
  3141   if (k != NULL) {
  3133   compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
  3142     compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
  3134   compute_offset(_form_offset, k, "form", vmSymbols::java_lang_invoke_LambdaForm_signature());
  3143     compute_offset(_form_offset, k, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature());
       
  3144   }
       
  3145 }
  3135 }
  3146 
  3136 
  3147 void java_lang_invoke_MemberName::compute_offsets() {
  3137 void java_lang_invoke_MemberName::compute_offsets() {
  3148   Klass* k = SystemDictionary::MemberName_klass();
  3138   InstanceKlass* k = SystemDictionary::MemberName_klass();
  3149   assert (k != NULL, "jdk mismatch");
       
  3150   compute_offset(_clazz_offset,   k, vmSymbols::clazz_name(),   vmSymbols::class_signature());
  3139   compute_offset(_clazz_offset,   k, vmSymbols::clazz_name(),   vmSymbols::class_signature());
  3151   compute_offset(_name_offset,    k, vmSymbols::name_name(),    vmSymbols::string_signature());
  3140   compute_offset(_name_offset,    k, vmSymbols::name_name(),    vmSymbols::string_signature());
  3152   compute_offset(_type_offset,    k, vmSymbols::type_name(),    vmSymbols::object_signature());
  3141   compute_offset(_type_offset,    k, vmSymbols::type_name(),    vmSymbols::object_signature());
  3153   compute_offset(_flags_offset,   k, vmSymbols::flags_name(),   vmSymbols::int_signature());
  3142   compute_offset(_flags_offset,   k, vmSymbols::flags_name(),   vmSymbols::int_signature());
  3154   compute_offset(_method_offset,  k, vmSymbols::method_name(),  vmSymbols::java_lang_invoke_ResolvedMethodName_signature());
  3143   compute_offset(_method_offset,  k, vmSymbols::method_name(),  vmSymbols::java_lang_invoke_ResolvedMethodName_signature());
  3155   MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3144   MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3156 }
  3145 }
  3157 
  3146 
  3158 void java_lang_invoke_ResolvedMethodName::compute_offsets() {
  3147 void java_lang_invoke_ResolvedMethodName::compute_offsets() {
  3159   Klass* k = SystemDictionary::ResolvedMethodName_klass();
  3148   InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass();
  3160   assert(k != NULL, "jdk mismatch");
  3149   assert(k != NULL, "jdk mismatch");
  3161   RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3150   RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3162 }
  3151 }
  3163 
  3152 
  3164 void java_lang_invoke_LambdaForm::compute_offsets() {
  3153 void java_lang_invoke_LambdaForm::compute_offsets() {
  3165   Klass* k = SystemDictionary::LambdaForm_klass();
  3154   InstanceKlass* k = SystemDictionary::LambdaForm_klass();
  3166   assert (k != NULL, "jdk mismatch");
  3155   assert (k != NULL, "jdk mismatch");
  3167   compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature());
  3156   compute_offset(_vmentry_offset, k, "vmentry", vmSymbols::java_lang_invoke_MemberName_signature());
  3168 }
  3157 }
  3169 
  3158 
  3170 bool java_lang_invoke_LambdaForm::is_instance(oop obj) {
  3159 bool java_lang_invoke_LambdaForm::is_instance(oop obj) {
  3171   return obj != NULL && is_subclass(obj->klass());
  3160   return obj != NULL && is_subclass(obj->klass());
  3172 }
  3161 }
  3303 
  3292 
  3304 int java_lang_invoke_MethodType::_rtype_offset;
  3293 int java_lang_invoke_MethodType::_rtype_offset;
  3305 int java_lang_invoke_MethodType::_ptypes_offset;
  3294 int java_lang_invoke_MethodType::_ptypes_offset;
  3306 
  3295 
  3307 void java_lang_invoke_MethodType::compute_offsets() {
  3296 void java_lang_invoke_MethodType::compute_offsets() {
  3308   Klass* k = SystemDictionary::MethodType_klass();
  3297   InstanceKlass* k = SystemDictionary::MethodType_klass();
  3309   if (k != NULL) {
  3298   compute_offset(_rtype_offset,  k, "rtype",  vmSymbols::class_signature());
  3310     compute_offset(_rtype_offset,  k, vmSymbols::rtype_name(),  vmSymbols::class_signature());
  3299   compute_offset(_ptypes_offset, k, "ptypes", vmSymbols::class_array_signature());
  3311     compute_offset(_ptypes_offset, k, vmSymbols::ptypes_name(), vmSymbols::class_array_signature());
       
  3312   }
       
  3313 }
  3300 }
  3314 
  3301 
  3315 void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
  3302 void java_lang_invoke_MethodType::print_signature(oop mt, outputStream* st) {
  3316   st->print("(");
  3303   st->print("(");
  3317   objArrayOop pts = ptypes(mt);
  3304   objArrayOop pts = ptypes(mt);
  3390 
  3377 
  3391 int java_lang_invoke_CallSite::_target_offset;
  3378 int java_lang_invoke_CallSite::_target_offset;
  3392 int java_lang_invoke_CallSite::_context_offset;
  3379 int java_lang_invoke_CallSite::_context_offset;
  3393 
  3380 
  3394 void java_lang_invoke_CallSite::compute_offsets() {
  3381 void java_lang_invoke_CallSite::compute_offsets() {
  3395   Klass* k = SystemDictionary::CallSite_klass();
  3382   InstanceKlass* k = SystemDictionary::CallSite_klass();
  3396   if (k != NULL) {
  3383   compute_offset(_target_offset,  k, "target", vmSymbols::java_lang_invoke_MethodHandle_signature());
  3397     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  3384   compute_offset(_context_offset, k, "context",
  3398     compute_offset(_context_offset, k, vmSymbols::context_name(),
  3385                  vmSymbols::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature());
  3399                    vmSymbols::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature());
       
  3400   }
       
  3401 }
  3386 }
  3402 
  3387 
  3403 oop java_lang_invoke_CallSite::context(oop call_site) {
  3388 oop java_lang_invoke_CallSite::context(oop call_site) {
  3404   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
  3389   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
  3405 
  3390 
  3410 // Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
  3395 // Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
  3411 
  3396 
  3412 int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
  3397 int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
  3413 
  3398 
  3414 void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
  3399 void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
  3415   Klass* k = SystemDictionary::Context_klass();
  3400   InstanceKlass* k = SystemDictionary::Context_klass();
  3416   if (k != NULL) {
  3401   CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3417     CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
       
  3418   }
       
  3419 }
  3402 }
  3420 
  3403 
  3421 DependencyContext java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
  3404 DependencyContext java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
  3422   assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
  3405   assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
  3423   intptr_t* vmdeps_addr = (intptr_t*)call_site->address_field_addr(_vmdependencies_offset);
  3406   intptr_t* vmdeps_addr = (intptr_t*)call_site->address_field_addr(_vmdependencies_offset);
  3432 int java_security_AccessControlContext::_isPrivileged_offset = 0;
  3415 int java_security_AccessControlContext::_isPrivileged_offset = 0;
  3433 int java_security_AccessControlContext::_isAuthorized_offset = -1;
  3416 int java_security_AccessControlContext::_isAuthorized_offset = -1;
  3434 
  3417 
  3435 void java_security_AccessControlContext::compute_offsets() {
  3418 void java_security_AccessControlContext::compute_offsets() {
  3436   assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
  3419   assert(_isPrivileged_offset == 0, "offsets should be initialized only once");
  3437   fieldDescriptor fd;
  3420   InstanceKlass* k = SystemDictionary::AccessControlContext_klass();
  3438   InstanceKlass* ik = SystemDictionary::AccessControlContext_klass();
  3421 
  3439 
  3422   compute_offset(_context_offset,           k, "context",      vmSymbols::protectiondomain_signature());
  3440   if (!ik->find_local_field(vmSymbols::context_name(), vmSymbols::protectiondomain_signature(), &fd)) {
  3423   compute_offset(_privilegedContext_offset, k, "privilegedContext", vmSymbols::accesscontrolcontext_signature());
  3441     fatal("Invalid layout of java.security.AccessControlContext");
  3424   compute_offset(_isPrivileged_offset,      k, "isPrivileged", vmSymbols::bool_signature());
  3442   }
  3425   compute_offset(_isAuthorized_offset,      k, "isAuthorized", vmSymbols::bool_signature());
  3443   _context_offset = fd.offset();
       
  3444 
       
  3445   if (!ik->find_local_field(vmSymbols::privilegedContext_name(), vmSymbols::accesscontrolcontext_signature(), &fd)) {
       
  3446     fatal("Invalid layout of java.security.AccessControlContext");
       
  3447   }
       
  3448   _privilegedContext_offset = fd.offset();
       
  3449 
       
  3450   if (!ik->find_local_field(vmSymbols::isPrivileged_name(), vmSymbols::bool_signature(), &fd)) {
       
  3451     fatal("Invalid layout of java.security.AccessControlContext");
       
  3452   }
       
  3453   _isPrivileged_offset = fd.offset();
       
  3454 
       
  3455   // The offset may not be present for bootstrapping with older JDK.
       
  3456   if (ik->find_local_field(vmSymbols::isAuthorized_name(), vmSymbols::bool_signature(), &fd)) {
       
  3457     _isAuthorized_offset = fd.offset();
       
  3458   }
       
  3459 }
  3426 }
  3460 
  3427 
  3461 
  3428 
  3462 bool java_security_AccessControlContext::is_authorized(Handle context) {
  3429 bool java_security_AccessControlContext::is_authorized(Handle context) {
  3463   assert(context.not_null() && context->klass() == SystemDictionary::AccessControlContext_klass(), "Invalid type");
  3430   assert(context.not_null() && context->klass() == SystemDictionary::AccessControlContext_klass(), "Invalid type");
  3502 
  3469 
  3503 void java_lang_ClassLoader::compute_offsets() {
  3470 void java_lang_ClassLoader::compute_offsets() {
  3504   assert(!offsets_computed, "offsets should be initialized only once");
  3471   assert(!offsets_computed, "offsets should be initialized only once");
  3505   offsets_computed = true;
  3472   offsets_computed = true;
  3506 
  3473 
  3507   // The field indicating parallelCapable (parallelLockMap) is only present starting in 7,
  3474   InstanceKlass* k1 = SystemDictionary::ClassLoader_klass();
  3508   Klass* k1 = SystemDictionary::ClassLoader_klass();
  3475   compute_offset(parallelCapable_offset,
  3509   compute_optional_offset(parallelCapable_offset,
  3476     k1, "parallelLockMap", vmSymbols::concurrenthashmap_signature());
  3510     k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature());
       
  3511 
  3477 
  3512   compute_offset(name_offset,
  3478   compute_offset(name_offset,
  3513     k1, vmSymbols::name_name(), vmSymbols::string_signature());
  3479     k1, vmSymbols::name_name(), vmSymbols::string_signature());
  3514 
  3480 
  3515   compute_offset(unnamedModule_offset,
  3481   compute_offset(unnamedModule_offset,
  3516     k1, vmSymbols::unnamedModule_name(), vmSymbols::module_signature());
  3482     k1, "unnamedModule", vmSymbols::module_signature());
       
  3483 
       
  3484   compute_offset(parent_offset, k1, "parent", vmSymbols::classloader_signature());
  3517 
  3485 
  3518   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3486   CLASSLOADER_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3519 }
  3487 }
  3520 
  3488 
  3521 oop java_lang_ClassLoader::parent(oop loader) {
  3489 oop java_lang_ClassLoader::parent(oop loader) {
  3598   assert(is_instance(loader), "loader must be oop");
  3566   assert(is_instance(loader), "loader must be oop");
  3599   return loader->obj_field(unnamedModule_offset);
  3567   return loader->obj_field(unnamedModule_offset);
  3600 }
  3568 }
  3601 
  3569 
  3602 // Support for java_lang_System
  3570 // Support for java_lang_System
  3603 int java_lang_System::in_offset_in_bytes() {
  3571 //
  3604   return (InstanceMirrorKlass::offset_of_static_fields() + static_in_offset);
  3572 void java_lang_System::compute_offsets() {
  3605 }
  3573   InstanceKlass* k = SystemDictionary::System_klass();
  3606 
  3574   compute_offset(static_in_offset,  k, "in",  vmSymbols::input_stream_signature(), true);
  3607 
  3575   compute_offset(static_out_offset, k, "out", vmSymbols::print_stream_signature(), true);
  3608 int java_lang_System::out_offset_in_bytes() {
  3576   compute_offset(static_err_offset, k, "err", vmSymbols::print_stream_signature(), true);
  3609   return (InstanceMirrorKlass::offset_of_static_fields() + static_out_offset);
  3577   compute_offset(static_security_offset, k, "security", vmSymbols::security_manager_signature(), true);
  3610 }
  3578 }
  3611 
  3579 
  3612 
  3580 int java_lang_System::in_offset_in_bytes() { return static_in_offset; }
  3613 int java_lang_System::err_offset_in_bytes() {
  3581 int java_lang_System::out_offset_in_bytes() { return static_out_offset; }
  3614   return (InstanceMirrorKlass::offset_of_static_fields() + static_err_offset);
  3582 int java_lang_System::err_offset_in_bytes() { return static_err_offset; }
  3615 }
       
  3616 
  3583 
  3617 
  3584 
  3618 bool java_lang_System::has_security_manager() {
  3585 bool java_lang_System::has_security_manager() {
  3619   InstanceKlass* ik = SystemDictionary::System_klass();
  3586   InstanceKlass* ik = SystemDictionary::System_klass();
  3620   address addr = ik->static_field_addr(static_security_offset);
  3587   address addr = ik->static_field_addr(static_security_offset);
  3680 int java_lang_boxing_object::long_value_offset;
  3647 int java_lang_boxing_object::long_value_offset;
  3681 int java_lang_ref_Reference::referent_offset;
  3648 int java_lang_ref_Reference::referent_offset;
  3682 int java_lang_ref_Reference::queue_offset;
  3649 int java_lang_ref_Reference::queue_offset;
  3683 int java_lang_ref_Reference::next_offset;
  3650 int java_lang_ref_Reference::next_offset;
  3684 int java_lang_ref_Reference::discovered_offset;
  3651 int java_lang_ref_Reference::discovered_offset;
  3685 int java_lang_ref_Reference::number_of_fake_oop_fields;
       
  3686 int java_lang_ref_SoftReference::timestamp_offset;
  3652 int java_lang_ref_SoftReference::timestamp_offset;
  3687 int java_lang_ref_SoftReference::static_clock_offset;
  3653 int java_lang_ref_SoftReference::static_clock_offset;
  3688 int java_lang_ClassLoader::parent_offset;
  3654 int java_lang_ClassLoader::parent_offset;
  3689 int java_lang_System::static_in_offset;
  3655 int java_lang_System::static_in_offset;
  3690 int java_lang_System::static_out_offset;
  3656 int java_lang_System::static_out_offset;
  3715 int reflect_ConstantPool::_oop_offset;
  3681 int reflect_ConstantPool::_oop_offset;
  3716 int reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
  3682 int reflect_UnsafeStaticFieldAccessorImpl::_base_offset;
  3717 
  3683 
  3718 
  3684 
  3719 // Support for java_lang_StackTraceElement
  3685 // Support for java_lang_StackTraceElement
       
  3686 void java_lang_StackTraceElement::compute_offsets() {
       
  3687   InstanceKlass* k = SystemDictionary::StackTraceElement_klass();
       
  3688   compute_offset(declaringClassObject_offset,  k, "declaringClassObject", vmSymbols::class_signature());
       
  3689   compute_offset(classLoaderName_offset, k, "classLoaderName", vmSymbols::string_signature());
       
  3690   compute_offset(moduleName_offset,      k, "moduleName",      vmSymbols::string_signature());
       
  3691   compute_offset(moduleVersion_offset,   k, "moduleVersion",   vmSymbols::string_signature());
       
  3692   compute_offset(declaringClass_offset,  k, "declaringClass",  vmSymbols::string_signature());
       
  3693   compute_offset(methodName_offset,      k, "methodName",      vmSymbols::string_signature());
       
  3694   compute_offset(fileName_offset,        k, "fileName",        vmSymbols::string_signature());
       
  3695   compute_offset(lineNumber_offset,      k, "lineNumber",      vmSymbols::int_signature());
       
  3696 }
  3720 
  3697 
  3721 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
  3698 void java_lang_StackTraceElement::set_fileName(oop element, oop value) {
  3722   element->obj_field_put(fileName_offset, value);
  3699   element->obj_field_put(fileName_offset, value);
  3723 }
  3700 }
  3724 
  3701 
  3773 void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) {
  3750 void java_lang_LiveStackFrameInfo::set_mode(oop element, int value) {
  3774   element->int_field_put(_mode_offset, value);
  3751   element->int_field_put(_mode_offset, value);
  3775 }
  3752 }
  3776 
  3753 
  3777 // Support for java Assertions - java_lang_AssertionStatusDirectives.
  3754 // Support for java Assertions - java_lang_AssertionStatusDirectives.
       
  3755 
       
  3756 void java_lang_AssertionStatusDirectives::compute_offsets() {
       
  3757   InstanceKlass* k = SystemDictionary::AssertionStatusDirectives_klass();
       
  3758   compute_offset(classes_offset,        k, "classes",        vmSymbols::string_array_signature());
       
  3759   compute_offset(classEnabled_offset,   k, "classEnabled",   vmSymbols::bool_array_signature());
       
  3760   compute_offset(packages_offset,       k, "packages",       vmSymbols::string_array_signature());
       
  3761   compute_offset(packageEnabled_offset, k, "packageEnabled", vmSymbols::bool_array_signature());
       
  3762   compute_offset(deflt_offset,          k, "deflt",          vmSymbols::bool_signature());
       
  3763 }
       
  3764 
  3778 
  3765 
  3779 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
  3766 void java_lang_AssertionStatusDirectives::set_classes(oop o, oop val) {
  3780   o->obj_field_put(classes_offset, val);
  3767   o->obj_field_put(classes_offset, val);
  3781 }
  3768 }
  3782 
  3769 
  3802   return _limit_offset;
  3789   return _limit_offset;
  3803 }
  3790 }
  3804 
  3791 
  3805 
  3792 
  3806 void java_nio_Buffer::compute_offsets() {
  3793 void java_nio_Buffer::compute_offsets() {
  3807   Klass* k = SystemDictionary::nio_Buffer_klass();
  3794   InstanceKlass* k = SystemDictionary::nio_Buffer_klass();
  3808   assert(k != NULL, "must be loaded in 1.4+");
  3795   assert(k != NULL, "must be loaded in 1.4+");
  3809   compute_offset(_limit_offset, k, vmSymbols::limit_name(), vmSymbols::int_signature());
  3796   compute_offset(_limit_offset, k, "limit", vmSymbols::int_signature());
  3810 }
  3797 }
  3811 
  3798 
  3812 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
  3799 void java_util_concurrent_locks_AbstractOwnableSynchronizer::initialize(TRAPS) {
  3813   if (_owner_offset != 0) return;
  3800   if (_owner_offset != 0) return;
  3814 
  3801 
  3815   SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
  3802   SystemDictionary::load_abstract_ownable_synchronizer_klass(CHECK);
  3816   Klass* k = SystemDictionary::abstract_ownable_synchronizer_klass();
  3803   InstanceKlass* k = SystemDictionary::abstract_ownable_synchronizer_klass();
  3817   compute_offset(_owner_offset, k,
  3804   compute_offset(_owner_offset, k,
  3818                  vmSymbols::exclusive_owner_thread_name(), vmSymbols::thread_signature());
  3805                  "exclusiveOwnerThread", vmSymbols::thread_signature());
  3819 }
  3806 }
  3820 
  3807 
  3821 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
  3808 oop java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(oop obj) {
  3822   assert(_owner_offset != 0, "Must be initialized");
  3809   assert(_owner_offset != 0, "Must be initialized");
  3823   return obj->obj_field(_owner_offset);
  3810   return obj->obj_field(_owner_offset);
       
  3811 }
       
  3812 
       
  3813 static int member_offset(int hardcoded_offset) {
       
  3814   return (hardcoded_offset * heapOopSize) + instanceOopDesc::base_offset_in_bytes();
  3824 }
  3815 }
  3825 
  3816 
  3826 // Compute hard-coded offsets
  3817 // Compute hard-coded offsets
  3827 // Invoked before SystemDictionary::initialize, so pre-loaded classes
  3818 // Invoked before SystemDictionary::initialize, so pre-loaded classes
  3828 // are not available to determine the offset_of_static_fields.
  3819 // are not available to determine the offset_of_static_fields.
  3829 void JavaClasses::compute_hard_coded_offsets() {
  3820 void JavaClasses::compute_hard_coded_offsets() {
  3830   const int x = heapOopSize;
       
  3831   const int header = instanceOopDesc::base_offset_in_bytes();
       
  3832 
       
  3833   // Throwable Class
       
  3834   java_lang_Throwable::backtrace_offset  = java_lang_Throwable::hc_backtrace_offset  * x + header;
       
  3835   java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header;
       
  3836   java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header;
       
  3837   java_lang_Throwable::static_unassigned_stacktrace_offset = java_lang_Throwable::hc_static_unassigned_stacktrace_offset *  x;
       
  3838 
  3821 
  3839   // java_lang_boxing_object
  3822   // java_lang_boxing_object
  3840   java_lang_boxing_object::value_offset = java_lang_boxing_object::hc_value_offset + header;
  3823   java_lang_boxing_object::value_offset      = member_offset(java_lang_boxing_object::hc_value_offset);
  3841   java_lang_boxing_object::long_value_offset = align_up((java_lang_boxing_object::hc_value_offset + header), BytesPerLong);
  3824   java_lang_boxing_object::long_value_offset = align_up(member_offset(java_lang_boxing_object::hc_value_offset), BytesPerLong);
  3842 
  3825 
  3843   // java_lang_ref_Reference:
  3826   // java_lang_ref_Reference
  3844   java_lang_ref_Reference::referent_offset = java_lang_ref_Reference::hc_referent_offset * x + header;
  3827   java_lang_ref_Reference::referent_offset    = member_offset(java_lang_ref_Reference::hc_referent_offset);
  3845   java_lang_ref_Reference::queue_offset = java_lang_ref_Reference::hc_queue_offset * x + header;
  3828   java_lang_ref_Reference::queue_offset       = member_offset(java_lang_ref_Reference::hc_queue_offset);
  3846   java_lang_ref_Reference::next_offset  = java_lang_ref_Reference::hc_next_offset * x + header;
  3829   java_lang_ref_Reference::next_offset        = member_offset(java_lang_ref_Reference::hc_next_offset);
  3847   java_lang_ref_Reference::discovered_offset  = java_lang_ref_Reference::hc_discovered_offset * x + header;
  3830   java_lang_ref_Reference::discovered_offset  = member_offset(java_lang_ref_Reference::hc_discovered_offset);
  3848   // Artificial fields for java_lang_ref_Reference
       
  3849   // The first field is for the discovered field added in 1.4
       
  3850   java_lang_ref_Reference::number_of_fake_oop_fields = 1;
       
  3851 
       
  3852   // java_lang_ref_SoftReference Class
       
  3853   java_lang_ref_SoftReference::timestamp_offset = align_up((java_lang_ref_SoftReference::hc_timestamp_offset * x + header), BytesPerLong);
       
  3854   // Don't multiply static fields because they are always in wordSize units
       
  3855   java_lang_ref_SoftReference::static_clock_offset = java_lang_ref_SoftReference::hc_static_clock_offset * x;
       
  3856 
       
  3857   // java_lang_ClassLoader
       
  3858   java_lang_ClassLoader::parent_offset = java_lang_ClassLoader::hc_parent_offset * x + header;
       
  3859 
       
  3860   // java_lang_System
       
  3861   java_lang_System::static_in_offset  = java_lang_System::hc_static_in_offset  * x;
       
  3862   java_lang_System::static_out_offset = java_lang_System::hc_static_out_offset * x;
       
  3863   java_lang_System::static_err_offset = java_lang_System::hc_static_err_offset * x;
       
  3864   java_lang_System::static_security_offset = java_lang_System::hc_static_security_offset * x;
       
  3865 
       
  3866   // java_lang_StackTraceElement
       
  3867   java_lang_StackTraceElement::declaringClassObject_offset = java_lang_StackTraceElement::hc_declaringClassObject_offset * x + header;
       
  3868   java_lang_StackTraceElement::classLoaderName_offset = java_lang_StackTraceElement::hc_classLoaderName_offset * x + header;
       
  3869   java_lang_StackTraceElement::moduleName_offset = java_lang_StackTraceElement::hc_moduleName_offset * x + header;
       
  3870   java_lang_StackTraceElement::moduleVersion_offset = java_lang_StackTraceElement::hc_moduleVersion_offset * x + header;
       
  3871   java_lang_StackTraceElement::declaringClass_offset = java_lang_StackTraceElement::hc_declaringClass_offset  * x + header;
       
  3872   java_lang_StackTraceElement::methodName_offset = java_lang_StackTraceElement::hc_methodName_offset * x + header;
       
  3873   java_lang_StackTraceElement::fileName_offset   = java_lang_StackTraceElement::hc_fileName_offset   * x + header;
       
  3874   java_lang_StackTraceElement::lineNumber_offset = java_lang_StackTraceElement::hc_lineNumber_offset * x + header;
       
  3875   java_lang_AssertionStatusDirectives::classes_offset = java_lang_AssertionStatusDirectives::hc_classes_offset * x + header;
       
  3876   java_lang_AssertionStatusDirectives::classEnabled_offset = java_lang_AssertionStatusDirectives::hc_classEnabled_offset * x + header;
       
  3877   java_lang_AssertionStatusDirectives::packages_offset = java_lang_AssertionStatusDirectives::hc_packages_offset * x + header;
       
  3878   java_lang_AssertionStatusDirectives::packageEnabled_offset = java_lang_AssertionStatusDirectives::hc_packageEnabled_offset * x + header;
       
  3879   java_lang_AssertionStatusDirectives::deflt_offset = java_lang_AssertionStatusDirectives::hc_deflt_offset * x + header;
       
  3880 
       
  3881 }
  3831 }
  3882 
  3832 
  3883 
  3833 
  3884 // Compute non-hard-coded field offsets of all the classes in this file
  3834 // Compute non-hard-coded field offsets of all the classes in this file
  3885 void JavaClasses::compute_offsets() {
  3835 void JavaClasses::compute_offsets() {
  3886   // java_lang_Class::compute_offsets was called earlier in bootstrap
  3836   // java_lang_Class::compute_offsets was called earlier in bootstrap
       
  3837   java_lang_System::compute_offsets();
  3887   java_lang_ClassLoader::compute_offsets();
  3838   java_lang_ClassLoader::compute_offsets();
  3888   java_lang_Throwable::compute_offsets();
  3839   java_lang_Throwable::compute_offsets();
  3889   java_lang_Thread::compute_offsets();
  3840   java_lang_Thread::compute_offsets();
  3890   java_lang_ThreadGroup::compute_offsets();
  3841   java_lang_ThreadGroup::compute_offsets();
       
  3842   java_lang_AssertionStatusDirectives::compute_offsets();
       
  3843   java_lang_ref_SoftReference::compute_offsets();
  3891   java_lang_invoke_MethodHandle::compute_offsets();
  3844   java_lang_invoke_MethodHandle::compute_offsets();
  3892   java_lang_invoke_DirectMethodHandle::compute_offsets();
  3845   java_lang_invoke_DirectMethodHandle::compute_offsets();
  3893   java_lang_invoke_MemberName::compute_offsets();
  3846   java_lang_invoke_MemberName::compute_offsets();
  3894   java_lang_invoke_ResolvedMethodName::compute_offsets();
  3847   java_lang_invoke_ResolvedMethodName::compute_offsets();
  3895   java_lang_invoke_LambdaForm::compute_offsets();
  3848   java_lang_invoke_LambdaForm::compute_offsets();
  3908   java_nio_Buffer::compute_offsets();
  3861   java_nio_Buffer::compute_offsets();
  3909   reflect_ConstantPool::compute_offsets();
  3862   reflect_ConstantPool::compute_offsets();
  3910   reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
  3863   reflect_UnsafeStaticFieldAccessorImpl::compute_offsets();
  3911   java_lang_reflect_Parameter::compute_offsets();
  3864   java_lang_reflect_Parameter::compute_offsets();
  3912   java_lang_Module::compute_offsets();
  3865   java_lang_Module::compute_offsets();
       
  3866   java_lang_StackTraceElement::compute_offsets();
  3913   java_lang_StackFrameInfo::compute_offsets();
  3867   java_lang_StackFrameInfo::compute_offsets();
  3914   java_lang_LiveStackFrameInfo::compute_offsets();
  3868   java_lang_LiveStackFrameInfo::compute_offsets();
  3915 
  3869 
  3916   // generated interpreter code wants to know about the offsets we just computed:
  3870   // generated interpreter code wants to know about the offsets we just computed:
  3917   AbstractAssembler::update_delayed_values();
  3871   AbstractAssembler::update_delayed_values();
  3945                   klass_name, field_name, hardcoded_offset, fd.offset());
  3899                   klass_name, field_name, hardcoded_offset, fd.offset());
  3946     return false;
  3900     return false;
  3947   }
  3901   }
  3948 }
  3902 }
  3949 
  3903 
  3950 
       
  3951 bool JavaClasses::check_static_offset(const char *klass_name, int hardcoded_offset, const char *field_name, const char* field_sig) {
       
  3952   EXCEPTION_MARK;
       
  3953   fieldDescriptor fd;
       
  3954   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
       
  3955   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
       
  3956   InstanceKlass* ik = InstanceKlass::cast(k);
       
  3957   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
       
  3958   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
       
  3959   if (!ik->find_local_field(f_name, f_sig, &fd)) {
       
  3960     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
       
  3961     return false;
       
  3962   }
       
  3963   if (!fd.is_static()) {
       
  3964     tty->print_cr("Static field %s.%s appears to be nonstatic", klass_name, field_name);
       
  3965     return false;
       
  3966   }
       
  3967   if (fd.offset() == hardcoded_offset + InstanceMirrorKlass::offset_of_static_fields()) {
       
  3968     return true;
       
  3969   } else {
       
  3970     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());
       
  3971     return false;
       
  3972   }
       
  3973 }
       
  3974 
       
  3975 
       
  3976 bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant, const char *field_name, const char* field_sig) {
       
  3977   EXCEPTION_MARK;
       
  3978   fieldDescriptor fd;
       
  3979   TempNewSymbol klass_sym = SymbolTable::new_symbol(klass_name, CATCH);
       
  3980   Klass* k = SystemDictionary::resolve_or_fail(klass_sym, true, CATCH);
       
  3981   InstanceKlass* ik = InstanceKlass::cast(k);
       
  3982   TempNewSymbol f_name = SymbolTable::new_symbol(field_name, CATCH);
       
  3983   TempNewSymbol f_sig  = SymbolTable::new_symbol(field_sig, CATCH);
       
  3984   if (!ik->find_local_field(f_name, f_sig, &fd)) {
       
  3985     tty->print_cr("Static field %s.%s not found", klass_name, field_name);
       
  3986     return false;
       
  3987   }
       
  3988   if (!fd.is_static() || !fd.has_initial_value()) {
       
  3989     tty->print_cr("Static field %s.%s appears to be non-constant", klass_name, field_name);
       
  3990     return false;
       
  3991   }
       
  3992   if (!fd.initial_value_tag().is_int()) {
       
  3993     tty->print_cr("Static field %s.%s is not an int", klass_name, field_name);
       
  3994     return false;
       
  3995   }
       
  3996   jint field_value = fd.int_initial_value();
       
  3997   if (field_value == hardcoded_constant) {
       
  3998     return true;
       
  3999   } else {
       
  4000     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);
       
  4001     return false;
       
  4002   }
       
  4003 }
       
  4004 
       
  4005 
       
  4006 // Check the hard-coded field offsets of all the classes in this file
  3904 // Check the hard-coded field offsets of all the classes in this file
  4007 
  3905 
  4008 void JavaClasses::check_offsets() {
  3906 void JavaClasses::check_offsets() {
  4009   bool valid = true;
  3907   bool valid = true;
  4010 
  3908 
  4011 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  3909 #define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  4012   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
  3910   valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
  4013 
  3911 
  4014 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  3912 #define CHECK_LONG_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
  4015   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
  3913   valid &= check_offset(klass_name, cpp_klass_name :: long_ ## field_name ## _offset, #field_name, field_sig)
  4016 
       
  4017 #define CHECK_STATIC_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
       
  4018   valid &= check_static_offset(klass_name, cpp_klass_name :: static_ ## field_name ## _offset, #field_name, field_sig)
       
  4019 
       
  4020 #define CHECK_CONSTANT(klass_name, cpp_klass_name, field_name, field_sig) \
       
  4021   valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig)
       
  4022 
       
  4023   // java.lang.String
       
  4024 
       
  4025   CHECK_OFFSET("java/lang/String", java_lang_String, value, "[B");
       
  4026   CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I");
       
  4027   CHECK_OFFSET("java/lang/String", java_lang_String, coder, "B");
       
  4028 
       
  4029   // java.lang.Class
       
  4030 
       
  4031   // Fake fields
       
  4032   // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked
       
  4033   // CHECK_OFFSET("java/lang/Class", java_lang_Class, array_klass); // %%% this needs to be checked
       
  4034 
       
  4035   // java.lang.Throwable
       
  4036 
       
  4037   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, backtrace, "Ljava/lang/Object;");
       
  4038   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, detailMessage, "Ljava/lang/String;");
       
  4039   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, stackTrace, "[Ljava/lang/StackTraceElement;");
       
  4040   CHECK_OFFSET("java/lang/Throwable", java_lang_Throwable, depth, "I");
       
  4041 
  3914 
  4042   // Boxed primitive objects (java_lang_boxing_object)
  3915   // Boxed primitive objects (java_lang_boxing_object)
  4043 
  3916 
  4044   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
  3917   CHECK_OFFSET("java/lang/Boolean",   java_lang_boxing_object, value, "Z");
  4045   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
  3918   CHECK_OFFSET("java/lang/Character", java_lang_boxing_object, value, "C");
  4048   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
  3921   CHECK_OFFSET("java/lang/Byte",      java_lang_boxing_object, value, "B");
  4049   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
  3922   CHECK_OFFSET("java/lang/Short",     java_lang_boxing_object, value, "S");
  4050   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
  3923   CHECK_OFFSET("java/lang/Integer",   java_lang_boxing_object, value, "I");
  4051   CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
  3924   CHECK_LONG_OFFSET("java/lang/Long", java_lang_boxing_object, value, "J");
  4052 
  3925 
  4053   // java.lang.ClassLoader
       
  4054 
       
  4055   CHECK_OFFSET("java/lang/ClassLoader", java_lang_ClassLoader, parent,        "Ljava/lang/ClassLoader;");
       
  4056 
       
  4057   // java.lang.System
       
  4058 
       
  4059   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System,  in, "Ljava/io/InputStream;");
       
  4060   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, out, "Ljava/io/PrintStream;");
       
  4061   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, err, "Ljava/io/PrintStream;");
       
  4062   CHECK_STATIC_OFFSET("java/lang/System", java_lang_System, security, "Ljava/lang/SecurityManager;");
       
  4063 
       
  4064   // java.lang.StackTraceElement
       
  4065 
       
  4066   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClassObject, "Ljava/lang/Class;");
       
  4067   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, classLoaderName, "Ljava/lang/String;");
       
  4068   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, moduleName,      "Ljava/lang/String;");
       
  4069   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, moduleVersion,   "Ljava/lang/String;");
       
  4070   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, declaringClass,  "Ljava/lang/String;");
       
  4071   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, methodName,      "Ljava/lang/String;");
       
  4072   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, fileName,        "Ljava/lang/String;");
       
  4073   CHECK_OFFSET("java/lang/StackTraceElement", java_lang_StackTraceElement, lineNumber,      "I");
       
  4074 
       
  4075   // java.lang.ref.Reference
  3926   // java.lang.ref.Reference
  4076 
  3927 
  4077   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;");
  3928   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, referent, "Ljava/lang/Object;");
  4078   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;");
  3929   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, queue, "Ljava/lang/ref/ReferenceQueue;");
  4079   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;");
  3930   CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, next, "Ljava/lang/ref/Reference;");
  4080   // Fake field
  3931   // Fake field
  4081   //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;");
  3932   //CHECK_OFFSET("java/lang/ref/Reference", java_lang_ref_Reference, discovered, "Ljava/lang/ref/Reference;");
  4082 
       
  4083   // java.lang.ref.SoftReference
       
  4084 
       
  4085   CHECK_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, timestamp, "J");
       
  4086   CHECK_STATIC_OFFSET("java/lang/ref/SoftReference", java_lang_ref_SoftReference, clock, "J");
       
  4087 
       
  4088   // java.lang.AssertionStatusDirectives
       
  4089   //
       
  4090   // The CheckAssertionStatusDirectives boolean can be removed from here and
       
  4091   // globals.hpp after the AssertionStatusDirectives class has been integrated
       
  4092   // into merlin "for some time."  Without it, the vm will fail with early
       
  4093   // merlin builds.
       
  4094 
       
  4095   if (CheckAssertionStatusDirectives) {
       
  4096     const char* nm = "java/lang/AssertionStatusDirectives";
       
  4097     const char* sig = "[Ljava/lang/String;";
       
  4098     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classes, sig);
       
  4099     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, classEnabled, "[Z");
       
  4100     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packages, sig);
       
  4101     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, packageEnabled, "[Z");
       
  4102     CHECK_OFFSET(nm, java_lang_AssertionStatusDirectives, deflt, "Z");
       
  4103   }
       
  4104 
  3933 
  4105   if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed");
  3934   if (!valid) vm_exit_during_initialization("Hard-coded field offset verification failed");
  4106 }
  3935 }
  4107 
  3936 
  4108 #endif // PRODUCT
  3937 #endif // PRODUCT