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