annotate src/share/vm/classfile/javaClasses.cpp @ 3762:5c0a3c1858b1

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