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