annotate src/share/vm/classfile/javaClasses.cpp @ 1091:6aa7255741f3

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