annotate src/share/vm/classfile/javaClasses.cpp @ 6972:bd7a7ce2e264

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