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