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

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 633ba56cb013
children e522a00b91aa 070d523b96a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
4864
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1508
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
25 #include "precompiled.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
26 #include "classfile/classLoaderData.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
27 #include "classfile/dictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
28 #include "classfile/javaClasses.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
29 #include "classfile/loaderConstraints.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "classfile/placeholders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "classfile/resolutionErrors.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
33 #include "classfile/vmSymbols.hpp"
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
34 #include "compiler/compileBroker.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
35 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
36 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
37 #include "memory/gcLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
38 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
39 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
40 #include "oops/instanceRefKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
41 #include "oops/klass.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
42 #include "oops/methodData.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
43 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
44 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
45 #include "oops/oop.inline2.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
46 #include "oops/typeArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
47 #include "prims/jvmtiEnvBase.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
48 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
49 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
50 #include "runtime/fieldType.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
51 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
52 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
53 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
54 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
55 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
56 #include "services/classLoadingService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
57 #include "services/threadService.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
60 Dictionary* SystemDictionary::_dictionary = NULL;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
61 PlaceholderTable* SystemDictionary::_placeholders = NULL;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
62 Dictionary* SystemDictionary::_shared_dictionary = NULL;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
63 LoaderConstraintTable* SystemDictionary::_loader_constraints = NULL;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
64 ResolutionErrorTable* SystemDictionary::_resolution_errors = NULL;
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
65 SymbolPropertyTable* SystemDictionary::_invoke_method_table = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 int SystemDictionary::_number_of_modifications = 0;
4864
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
69 int SystemDictionary::_sdgeneration = 0;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
70 const int SystemDictionary::_primelist[_prime_array_size] = {1009,2017,4049,5051,10103,
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
71 20201,40423,99991};
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 oop SystemDictionary::_system_loader_lock_obj = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
74
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
75 Klass* SystemDictionary::_well_known_klasses[SystemDictionary::WKID_LIMIT]
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
76 = { NULL /*, NULL...*/ };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
78 Klass* SystemDictionary::_box_klasses[T_VOID+1] = { NULL /*, NULL...*/ };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 oop SystemDictionary::_java_system_loader = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 bool SystemDictionary::_has_loadClassInternal = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 bool SystemDictionary::_has_checkPackageAccess = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // lazily initialized klass variables
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
86 Klass* volatile SystemDictionary::_abstract_ownable_synchronizer_klass = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // Java-level SystemLoader
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 oop SystemDictionary::java_system_loader() {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 return _java_system_loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void SystemDictionary::compute_java_system_loader(TRAPS) {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
97 KlassHandle system_klass(THREAD, WK_KLASS(ClassLoader_klass));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 JavaCalls::call_static(&result,
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
100 KlassHandle(THREAD, WK_KLASS(ClassLoader_klass)),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
101 vmSymbols::getSystemClassLoader_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
102 vmSymbols::void_classloader_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
103 CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _java_system_loader = (oop)result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
109 ClassLoaderData* SystemDictionary::register_loader(Handle class_loader) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
110 if (class_loader() == NULL) return ClassLoaderData::the_null_class_loader_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
111 return ClassLoaderDataGraph::find_or_create(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
112 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
113
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // return true if class_name contains no '.' (internal format is '/')
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
120 bool SystemDictionary::is_internal_format(Symbol* class_name) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
121 if (class_name != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 char* name = class_name->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 return strchr(name, '.') == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // ----------------------------------------------------------------------------
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
133 // Parallel class loading check
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
134
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
135 bool SystemDictionary::is_parallelCapable(Handle class_loader) {
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
136 if (UnsyncloadClass || class_loader.is_null()) return true;
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
137 if (AlwaysLockClassLoader) return false;
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3852
diff changeset
138 return java_lang_ClassLoader::parallelCapable(class_loader());
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
139 }
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
140 // ----------------------------------------------------------------------------
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
141 // ParallelDefineClass flag does not apply to bootclass loader
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
142 bool SystemDictionary::is_parallelDefine(Handle class_loader) {
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
143 if (class_loader.is_null()) return false;
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3852
diff changeset
144 if (AllowParallelDefineClass && java_lang_ClassLoader::parallelCapable(class_loader())) {
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
145 return true;
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
146 }
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
147 return false;
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
148 }
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
149 // ----------------------------------------------------------------------------
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Resolving of classes
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Forwards to resolve_or_null
a61af66fc99e Initial load
duke
parents:
diff changeset
153
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
154 Klass* SystemDictionary::resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
155 Klass* klass = resolve_or_null(class_name, class_loader, protection_domain, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (HAS_PENDING_EXCEPTION || klass == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 KlassHandle k_h(THREAD, klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // can return a null klass
a61af66fc99e Initial load
duke
parents:
diff changeset
159 klass = handle_resolution_exception(class_name, class_loader, protection_domain, throw_error, k_h, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 return klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
164 Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // If we have a pending exception we forward it to the caller, unless throw_error is true,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // in which case we have to check whether the pending exception is a ClassNotFoundException,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // and if so convert it to a NoClassDefFoundError
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // And chain the original ClassNotFoundException
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
170 if (throw_error && PENDING_EXCEPTION->is_a(SystemDictionary::ClassNotFoundException_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 assert(klass_h() == NULL, "Should not have result with exception pending");
a61af66fc99e Initial load
duke
parents:
diff changeset
173 Handle e(THREAD, PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 THROW_MSG_CAUSE_0(vmSymbols::java_lang_NoClassDefFoundError(), class_name->as_C_string(), e);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // Class not found, throw appropriate error or exception depending on value of throw_error
a61af66fc99e Initial load
duke
parents:
diff changeset
181 if (klass_h() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 if (throw_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), class_name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
185 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), class_name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
189 return (Klass*)klass_h();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
193 Klass* SystemDictionary::resolve_or_fail(Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 bool throw_error, TRAPS)
a61af66fc99e Initial load
duke
parents:
diff changeset
195 {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 return resolve_or_fail(class_name, Handle(), Handle(), throw_error, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // Forwards to resolve_instance_class_or_null
a61af66fc99e Initial load
duke
parents:
diff changeset
201
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
202 Klass* SystemDictionary::resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
203 assert(!THREAD->is_Compiler_thread(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
204 err_msg("can not load classes with compiler thread: class=%s, classloader=%s",
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
205 class_name->as_C_string(),
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
206 class_loader.is_null() ? "null" : class_loader->klass()->name()->as_C_string()));
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
207 if (FieldType::is_array(class_name)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return resolve_array_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
209 } else if (FieldType::is_obj(class_name)) {
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
210 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
211 // Ignore wrapping L and ;.
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
212 TempNewSymbol name = SymbolTable::new_symbol(class_name->as_C_string() + 1,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
213 class_name->utf8_length() - 2, CHECK_NULL);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
214 return resolve_instance_class_or_null(name, class_loader, protection_domain, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 return resolve_instance_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
220 Klass* SystemDictionary::resolve_or_null(Symbol* class_name, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221 return resolve_or_null(class_name, Handle(), Handle(), THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Forwards to resolve_instance_class_or_null
a61af66fc99e Initial load
duke
parents:
diff changeset
225
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
226 Klass* SystemDictionary::resolve_array_class_or_null(Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
228 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
229 TRAPS) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
230 assert(FieldType::is_array(class_name), "must be array");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
231 Klass* k = NULL;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
232 FieldArrayInfo fd;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
233 // dimension and object_key in FieldArrayInfo are assigned as a side-effect
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
234 // of this call
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
235 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
236 if (t == T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // naked oop "k" is OK here -- we assign back into it
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
238 k = SystemDictionary::resolve_instance_class_or_null(fd.object_key(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
239 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
240 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
241 CHECK_NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 if (k != NULL) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
243 k = Klass::cast(k)->array_klass(fd.dimension(), CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 k = Universe::typeArrayKlassObj(t);
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
247 k = TypeArrayKlass::cast(k)->array_klass(fd.dimension(), CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // Must be called for any super-class or super-interface resolution
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // during class definition to allow class circularity checking
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // super-interface callers:
a61af66fc99e Initial load
duke
parents:
diff changeset
256 // parse_interfaces - for defineClass & jvmtiRedefineClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
257 // super-class callers:
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // ClassFileParser - for defineClass & jvmtiRedefineClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // load_shared_class - while loading a class from shared archive
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
260 // resolve_instance_class_or_null:
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
261 // via: handle_parallel_super_load
0
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // when resolving a class that has an existing placeholder with
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // a saved superclass [i.e. a defineClass is currently in progress]
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // if another thread is trying to resolve the class, it must do
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // super-class checks on its own thread to catch class circularity
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // This last call is critical in class circularity checking for cases
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // where classloading is delegated to different threads and the
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // classloader lock is released.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Take the case: Base->Super->Base
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // 1. If thread T1 tries to do a defineClass of class Base
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // resolve_super_or_fail creates placeholder: T1, Base (super Super)
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // 2. resolve_instance_class_or_null does not find SD or placeholder for Super
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // so it tries to load Super
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // 3. If we load the class internally, or user classloader uses same thread
a61af66fc99e Initial load
duke
parents:
diff changeset
275 // loadClassFromxxx or defineClass via parseClassFile Super ...
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // 3.1 resolve_super_or_fail creates placeholder: T1, Super (super Base)
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // 3.3 resolve_instance_class_or_null Base, finds placeholder for Base
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // 3.4 calls resolve_super_or_fail Base
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // 3.5 finds T1,Base -> throws class circularity
a61af66fc99e Initial load
duke
parents:
diff changeset
280 //OR 4. If T2 tries to resolve Super via defineClass Super ...
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // 4.1 resolve_super_or_fail creates placeholder: T2, Super (super Base)
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // 4.2 resolve_instance_class_or_null Base, finds placeholder for Base (super Super)
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // 4.3 calls resolve_super_or_fail Super in parallel on own thread T2
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // 4.4 finds T2, Super -> throws class circularity
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Must be called, even if superclass is null, since this is
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // where the placeholder entry is created which claims this
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // thread is loading this class/classloader.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
288 Klass* SystemDictionary::resolve_super_or_fail(Symbol* child_name,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
289 Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
291 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
292 bool is_superclass,
a61af66fc99e Initial load
duke
parents:
diff changeset
293 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // Double-check, if child class is already loaded, just return super-class,interface
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Don't add a placedholder if already loaded, i.e. already in system dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Make sure there's a placeholder for the *child* before resolving.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // Used as a claim that this thread is currently loading superclass/classloader
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Used here for ClassCircularity checks and also for heap verification
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
299 // (every InstanceKlass in the heap needs to be in the system dictionary
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // or have a placeholder).
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // Must check ClassCircularity before checking if super class is already loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
302 //
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // We might not already have a placeholder if this child_name was
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // first seen via resolve_from_stream (jni_DefineClass or JVM_DefineClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // the name of the class might not be known until the stream is actually
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // parsed.
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // Bugs 4643874, 4715493
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // compute_hash can have a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
309
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
310 ClassLoaderData* loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
311 unsigned int d_hash = dictionary()->compute_hash(child_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
312 int d_index = dictionary()->hash_to_index(d_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
313 unsigned int p_hash = placeholders()->compute_hash(child_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // can't throw error holding a lock
a61af66fc99e Initial load
duke
parents:
diff changeset
316 bool child_already_loaded = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 bool throw_circularity_error = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
320 Klass* childk = find_class(d_index, d_hash, child_name, loader_data);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
321 Klass* quicksuperk;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // to support // loading: if child done loading, just return superclass
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // if class_name, & class_loader don't match:
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // if initial define, SD update will give LinkageError
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // if redefine: compare_class_versions will give HIERARCHY_CHANGED
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // so we don't throw an exception here.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // see: nsk redefclass014 & java.lang.instrument Instrument032
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if ((childk != NULL ) && (is_superclass) &&
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
329 ((quicksuperk = InstanceKlass::cast(childk)->super()) != NULL) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
330
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
331 ((Klass::cast(quicksuperk)->name() == class_name) &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 (Klass::cast(quicksuperk)->class_loader() == class_loader()))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 return quicksuperk;
a61af66fc99e Initial load
duke
parents:
diff changeset
334 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
335 PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, child_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (probe && probe->check_seen_thread(THREAD, PlaceholderTable::LOAD_SUPER)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 throw_circularity_error = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
339 }
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
340 if (!throw_circularity_error) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
341 PlaceholderEntry* newprobe = placeholders()->find_and_add(p_index, p_hash, child_name, loader_data, PlaceholderTable::LOAD_SUPER, class_name, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
344 if (throw_circularity_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 THROW_MSG_0(vmSymbols::java_lang_ClassCircularityError(), child_name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // java.lang.Object should have been found above
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
350 assert(class_name != NULL, "null super class for resolving");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // Resolve the super class or interface, check results on return
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
352 Klass* superk = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
353 superk = SystemDictionary::resolve_or_null(class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
354 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
355 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
356 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 KlassHandle superk_h(THREAD, superk);
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // Note: clean up of placeholders currently in callers of
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // resolve_super_or_fail - either at update_dictionary time
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // or on error
a61af66fc99e Initial load
duke
parents:
diff changeset
363 {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
365 PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, child_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366 if (probe != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 probe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_SUPER);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370 if (HAS_PENDING_EXCEPTION || superk_h() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // can null superk
a61af66fc99e Initial load
duke
parents:
diff changeset
372 superk_h = KlassHandle(THREAD, handle_resolution_exception(class_name, class_loader, protection_domain, true, superk_h, THREAD));
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 return superk_h();
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 void SystemDictionary::validate_protection_domain(instanceKlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
379 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
380 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
381 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
382 if(!has_checkPackageAccess()) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Now we have to call back to java to check if the initating class has access
a61af66fc99e Initial load
duke
parents:
diff changeset
385 JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 if (TraceProtectionDomainVerification) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // Print out trace information
a61af66fc99e Initial load
duke
parents:
diff changeset
388 tty->print_cr("Checking package access");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 tty->print(" - class loader: "); class_loader()->print_value_on(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 tty->print(" - protection domain: "); protection_domain()->print_value_on(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
391 tty->print(" - loading: "); klass()->print_value_on(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
393
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
394 KlassHandle system_loader(THREAD, SystemDictionary::ClassLoader_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
396 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
397 system_loader,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
398 vmSymbols::checkPackageAccess_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
399 vmSymbols::class_protectiondomain_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
400 Handle(THREAD, klass->java_mirror()),
a61af66fc99e Initial load
duke
parents:
diff changeset
401 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
402 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (TraceProtectionDomainVerification) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 tty->print_cr(" -> DENIED !!!!!!!!!!!!!!!!!!!!!");
a61af66fc99e Initial load
duke
parents:
diff changeset
407 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 tty->print_cr(" -> granted");
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 if (HAS_PENDING_EXCEPTION) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // If no exception has been thrown, we have validated the protection domain
a61af66fc99e Initial load
duke
parents:
diff changeset
416 // Insert the protection domain of the initiating class into the set.
a61af66fc99e Initial load
duke
parents:
diff changeset
417 {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // We recalculate the entry here -- we've called out to java since
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // the last time it was calculated.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
420 ClassLoaderData* loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
421
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
422 Symbol* kn = klass->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
423 unsigned int d_hash = dictionary()->compute_hash(kn, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
424 int d_index = dictionary()->hash_to_index(d_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
427 {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // Note that we have an entry, and entries can be deleted only during GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // so we cannot allow GC to occur while we're holding this entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // We're using a No_Safepoint_Verifier to catch any place where we
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // might potentially do a GC at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
433 // SystemDictionary::do_unloading() asserts that classes are only
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // unloaded at a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
435 No_Safepoint_Verifier nosafepoint;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
436 dictionary()->add_protection_domain(d_index, d_hash, klass, loader_data,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 protection_domain, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // We only get here if this thread finds that another thread
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // has already claimed the placeholder token for the current operation,
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // but that other thread either never owned or gave up the
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // object lock
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // Waits on SystemDictionary_lock to indicate placeholder table updated
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // On return, caller must recheck placeholder table state
a61af66fc99e Initial load
duke
parents:
diff changeset
448 //
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // We only get here if
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // 1) custom classLoader, i.e. not bootstrap classloader
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // 2) UnsyncloadClass not set
a61af66fc99e Initial load
duke
parents:
diff changeset
452 // 3) custom classLoader has broken the class loader objectLock
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // so another thread got here in parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
454 //
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // lockObject must be held.
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // Complicated dance due to lock ordering:
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Must first release the classloader object lock to
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // allow initial definer to complete the class definition
a61af66fc99e Initial load
duke
parents:
diff changeset
459 // and to avoid deadlock
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // Reclaim classloader lock object with same original recursion count
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // Must release SystemDictionary_lock after notify, since
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // class loader lock must be claimed before SystemDictionary_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // to prevent deadlocks
a61af66fc99e Initial load
duke
parents:
diff changeset
464 //
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // The notify allows applications that did an untimed wait() on
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // the classloader object lock to not hang.
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void SystemDictionary::double_lock_wait(Handle lockObject, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 assert_lock_strong(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 bool calledholdinglock
a61af66fc99e Initial load
duke
parents:
diff changeset
471 = ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, lockObject);
a61af66fc99e Initial load
duke
parents:
diff changeset
472 assert(calledholdinglock,"must hold lock for notify");
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
473 assert((!(lockObject() == _system_loader_lock_obj) && !is_parallelCapable(lockObject)), "unexpected double_lock_wait");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
474 ObjectSynchronizer::notifyall(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 intptr_t recursions = ObjectSynchronizer::complete_exit(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 SystemDictionary_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
477 SystemDictionary_lock->unlock();
a61af66fc99e Initial load
duke
parents:
diff changeset
478 ObjectSynchronizer::reenter(lockObject, recursions, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 SystemDictionary_lock->lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // If the class in is in the placeholder table, class loading is in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // For cases where the application changes threads to load classes, it
a61af66fc99e Initial load
duke
parents:
diff changeset
484 // is critical to ClassCircularity detection that we try loading
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // the superclass on the same thread internally, so we do parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // super class loading here.
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // This also is critical in cases where the original thread gets stalled
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // even in non-circularity situations.
a61af66fc99e Initial load
duke
parents:
diff changeset
489 // Note: only one thread can define the class, but multiple can resolve
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Note: must call resolve_super_or_fail even if null super -
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
491 // to force placeholder entry creation for this class for circularity detection
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Caller must check for pending exception
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
493 // Returns non-null Klass* if other thread has completed load
0
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // and we are done,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
495 // If return null Klass* and no pending exception, the caller must load the class
0
a61af66fc99e Initial load
duke
parents:
diff changeset
496 instanceKlassHandle SystemDictionary::handle_parallel_super_load(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
497 Symbol* name, Symbol* superclassname, Handle class_loader,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
498 Handle protection_domain, Handle lockObject, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 instanceKlassHandle nh = instanceKlassHandle(); // null Handle
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
501 ClassLoaderData* loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
502 unsigned int d_hash = dictionary()->compute_hash(name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
503 int d_index = dictionary()->hash_to_index(d_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
504 unsigned int p_hash = placeholders()->compute_hash(name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // superk is not used, resolve_super called for circularity check only
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // This code is reached in two situations. One if this thread
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // is loading the same class twice (e.g. ClassCircularity, or
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // java.lang.instrument).
a61af66fc99e Initial load
duke
parents:
diff changeset
511 // The second is if another thread started the resolve_super first
a61af66fc99e Initial load
duke
parents:
diff changeset
512 // and has not yet finished.
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // In both cases the original caller will clean up the placeholder
a61af66fc99e Initial load
duke
parents:
diff changeset
514 // entry on error.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
515 Klass* superk = SystemDictionary::resolve_super_or_fail(name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
516 superclassname,
a61af66fc99e Initial load
duke
parents:
diff changeset
517 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
518 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
519 true,
a61af66fc99e Initial load
duke
parents:
diff changeset
520 CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // We don't redefine the class, so we just need to clean up if there
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // was not an error (don't want to modify any system dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // data structures).
a61af66fc99e Initial load
duke
parents:
diff changeset
524 {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
526 placeholders()->find_and_remove(p_index, p_hash, name, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
530 // parallelCapable class loaders do NOT wait for parallel superclass loads to complete
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
531 // Serial class loaders and bootstrap classloader do wait for superclass loads
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
532 if (!class_loader.is_null() && is_parallelCapable(class_loader)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
533 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Check if classloading completed while we were loading superclass or waiting
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
535 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Klass is already loaded, so just return it
a61af66fc99e Initial load
duke
parents:
diff changeset
538 return(instanceKlassHandle(THREAD, check));
a61af66fc99e Initial load
duke
parents:
diff changeset
539 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 return nh;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // must loop to both handle other placeholder updates
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // and spurious notifications
a61af66fc99e Initial load
duke
parents:
diff changeset
546 bool super_load_in_progress = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 PlaceholderEntry* placeholder;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 while (super_load_in_progress) {
a61af66fc99e Initial load
duke
parents:
diff changeset
549 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 // Check if classloading completed while we were loading superclass or waiting
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
551 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
552 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
553 // Klass is already loaded, so just return it
a61af66fc99e Initial load
duke
parents:
diff changeset
554 return(instanceKlassHandle(THREAD, check));
a61af66fc99e Initial load
duke
parents:
diff changeset
555 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
556 placeholder = placeholders()->get_entry(p_index, p_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (placeholder && placeholder->super_load_in_progress() ){
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Before UnsyncloadClass:
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // We only get here if the application has released the
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // classloader lock when another thread was in the middle of loading a
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // superclass/superinterface for this class, and now
a61af66fc99e Initial load
duke
parents:
diff changeset
562 // this thread is also trying to load this class.
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // To minimize surprises, the first thread that started to
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // load a class should be the one to complete the loading
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // with the classfile it initially expected.
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // This logic has the current thread wait once it has done
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // all the superclass/superinterface loading it can, until
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // the original thread completes the class loading or fails
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
569 // If it completes we will use the resulting InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // which we will find below in the systemDictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // We also get here for parallel bootstrap classloader
a61af66fc99e Initial load
duke
parents:
diff changeset
572 if (class_loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
573 SystemDictionary_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
574 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
575 double_lock_wait(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
577 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // If not in SD and not in PH, other thread's load must have failed
a61af66fc99e Initial load
duke
parents:
diff changeset
579 super_load_in_progress = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 return (nh);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
587 Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle class_loader, Handle protection_domain, TRAPS) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
588 assert(name != NULL && !FieldType::is_array(name) &&
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
589 !FieldType::is_obj(name), "invalid class name");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // UseNewReflection
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Fix for 4474172; see evaluation for more details
a61af66fc99e Initial load
duke
parents:
diff changeset
593 class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
594 ClassLoaderData *loader_data = register_loader(class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // Do lookup to see if class already exist and the protection domain
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // has the right access
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
598 unsigned int d_hash = dictionary()->compute_hash(name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
599 int d_index = dictionary()->hash_to_index(d_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
600 Klass* probe = dictionary()->find(d_index, d_hash, name, loader_data,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
601 protection_domain, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (probe != NULL) return probe;
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // Non-bootstrap class loaders will call out to class loader and
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // define via jvm/jni_DefineClass which will acquire the
a61af66fc99e Initial load
duke
parents:
diff changeset
607 // class loader object lock to protect against multiple threads
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // defining the class in parallel by accident.
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // This lock must be acquired here so the waiter will find
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // any successful result in the SystemDictionary and not attempt
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // the define
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
612 // ParallelCapable Classloaders and the bootstrap classloader,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // or all classloaders with UnsyncloadClass do not acquire lock here
a61af66fc99e Initial load
duke
parents:
diff changeset
614 bool DoObjectLock = true;
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
615 if (is_parallelCapable(class_loader)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
616 DoObjectLock = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
619 unsigned int p_hash = placeholders()->compute_hash(name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
620 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // Class is not in SystemDictionary so we have to do loading.
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Make sure we are synchronized on the class loader before we proceed
a61af66fc99e Initial load
duke
parents:
diff changeset
624 Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 check_loader_lock_contention(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
626 ObjectLocker ol(lockObject, THREAD, DoObjectLock);
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // Check again (after locking) if class already exist in SystemDictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
629 bool class_has_been_loaded = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
630 bool super_load_in_progress = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
631 bool havesupername = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
632 instanceKlassHandle k;
a61af66fc99e Initial load
duke
parents:
diff changeset
633 PlaceholderEntry* placeholder;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
634 Symbol* superclassname = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
638 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // Klass is already loaded, so just return it
a61af66fc99e Initial load
duke
parents:
diff changeset
641 class_has_been_loaded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
642 k = instanceKlassHandle(THREAD, check);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
644 placeholder = placeholders()->get_entry(p_index, p_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645 if (placeholder && placeholder->super_load_in_progress()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 super_load_in_progress = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 if (placeholder->havesupername() == true) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
648 superclassname = placeholder->supername();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
649 havesupername = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
650 }
a61af66fc99e Initial load
duke
parents:
diff changeset
651 }
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 // If the class in is in the placeholder table, class loading is in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (super_load_in_progress && havesupername==true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 k = SystemDictionary::handle_parallel_super_load(name, superclassname,
a61af66fc99e Initial load
duke
parents:
diff changeset
658 class_loader, protection_domain, lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
660 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if (!k.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 class_has_been_loaded = true;
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 if (!class_has_been_loaded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // add placeholder entry to record loading instance class
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Five cases:
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // All cases need to prevent modifying bootclasssearchpath
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // in parallel with a classload of same classname
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
673 // Redefineclasses uses existence of the placeholder for the duration
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
674 // of the class load to prevent concurrent redefinition of not completely
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
675 // defined classes.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // case 1. traditional classloaders that rely on the classloader object lock
a61af66fc99e Initial load
duke
parents:
diff changeset
677 // - no other need for LOAD_INSTANCE
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // case 2. traditional classloaders that break the classloader object lock
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // as a deadlock workaround. Detection of this case requires that
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // this check is done while holding the classloader object lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // and that lock is still held when calling classloader's loadClass.
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // For these classloaders, we ensure that the first requestor
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // completes the load and other requestors wait for completion.
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // case 3. UnsyncloadClass - don't use objectLocker
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // With this flag, we allow parallel classloading of a
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // class/classloader pair
a61af66fc99e Initial load
duke
parents:
diff changeset
687 // case4. Bootstrap classloader - don't own objectLocker
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // This classloader supports parallelism at the classloader level,
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // but only allows a single load of a class/classloader pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
690 // No performance benefit and no deadlock issues.
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
691 // case 5. parallelCapable user level classloaders - without objectLocker
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
692 // Allow parallel classloading of a class/classloader pair
0
a61af66fc99e Initial load
duke
parents:
diff changeset
693 bool throw_circularity_error = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
694 {
a61af66fc99e Initial load
duke
parents:
diff changeset
695 MutexLocker mu(SystemDictionary_lock, THREAD);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
696 if (class_loader.is_null() || !is_parallelCapable(class_loader)) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
697 PlaceholderEntry* oldprobe = placeholders()->get_entry(p_index, p_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
698 if (oldprobe) {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // only need check_seen_thread once, not on each loop
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // 6341374 java/lang/Instrument with -Xcomp
a61af66fc99e Initial load
duke
parents:
diff changeset
701 if (oldprobe->check_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 throw_circularity_error = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
703 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // case 1: traditional: should never see load_in_progress.
a61af66fc99e Initial load
duke
parents:
diff changeset
705 while (!class_has_been_loaded && oldprobe && oldprobe->instance_load_in_progress()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // case 4: bootstrap classloader: prevent futile classloading,
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // wait on first requestor
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (class_loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 SystemDictionary_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
711 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // case 2: traditional with broken classloader lock. wait on first
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // requestor.
a61af66fc99e Initial load
duke
parents:
diff changeset
714 double_lock_wait(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // Check if classloading completed while we were waiting
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
717 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // Klass is already loaded, so just return it
a61af66fc99e Initial load
duke
parents:
diff changeset
720 k = instanceKlassHandle(THREAD, check);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 class_has_been_loaded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // check if other thread failed to load and cleaned up
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
724 oldprobe = placeholders()->get_entry(p_index, p_hash, name, loader_data);
0
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 }
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // All cases: add LOAD_INSTANCE
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
730 // case 3: UnsyncloadClass || case 5: parallelCapable: allow competing threads to try
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731 // LOAD_INSTANCE in parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
732 // add placeholder entry even if error - callers will remove on error
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
733 if (!throw_circularity_error && !class_has_been_loaded) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
734 PlaceholderEntry* newprobe = placeholders()->find_and_add(p_index, p_hash, name, loader_data, PlaceholderTable::LOAD_INSTANCE, NULL, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // For class loaders that do not acquire the classloader object lock,
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // if they did not catch another thread holding LOAD_INSTANCE,
a61af66fc99e Initial load
duke
parents:
diff changeset
737 // need a check analogous to the acquire ObjectLocker/find_class
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // i.e. now that we hold the LOAD_INSTANCE token on loading this class/CL
a61af66fc99e Initial load
duke
parents:
diff changeset
739 // one final check if the load has already completed
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
740 // class loaders holding the ObjectLock shouldn't find the class here
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
741 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
742 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // Klass is already loaded, so just return it
a61af66fc99e Initial load
duke
parents:
diff changeset
744 k = instanceKlassHandle(THREAD, check);
a61af66fc99e Initial load
duke
parents:
diff changeset
745 class_has_been_loaded = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 newprobe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
747 placeholders()->find_and_remove(p_index, p_hash, name, loader_data, THREAD);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
748 SystemDictionary_lock->notify_all();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // must throw error outside of owning lock
a61af66fc99e Initial load
duke
parents:
diff changeset
753 if (throw_circularity_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
755 THROW_MSG_0(vmSymbols::java_lang_ClassCircularityError(), name->as_C_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 if (!class_has_been_loaded) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // Do actual loading
a61af66fc99e Initial load
duke
parents:
diff changeset
761 k = load_instance_class(name, class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
762
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
763 // For UnsyncloadClass only
0
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // If they got a linkageError, check if a parallel class load succeeded.
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // If it did, then for bytecode resolution the specification requires
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // that we return the same result we did for the other thread, i.e. the
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
767 // successfully loaded InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
768 // Should not get here for classloaders that support parallelism
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
769 // with the new cleaner mechanism, even with AllowParallelDefineClass
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
770 // Bootstrap goes through here to allow for an extra guarantee check
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 if (UnsyncloadClass || (class_loader.is_null())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 if (k.is_null() && HAS_PENDING_EXCEPTION
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
773 && PENDING_EXCEPTION->is_a(SystemDictionary::LinkageError_klass())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
775 Klass* check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
776 if (check != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // Klass is already loaded, so just use it
a61af66fc99e Initial load
duke
parents:
diff changeset
778 k = instanceKlassHandle(THREAD, check);
a61af66fc99e Initial load
duke
parents:
diff changeset
779 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 guarantee((!class_loader.is_null()), "dup definition for bootstrap loader?");
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // clean up placeholder entries for success or error
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // This cleans up LOAD_INSTANCE entries
a61af66fc99e Initial load
duke
parents:
diff changeset
787 // It also cleans up LOAD_SUPER entries on errors from
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // calling load_instance_class
a61af66fc99e Initial load
duke
parents:
diff changeset
789 {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
791 PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
792 if (probe != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 probe->remove_seen_thread(THREAD, PlaceholderTable::LOAD_INSTANCE);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
794 placeholders()->find_and_remove(p_index, p_hash, name, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
795 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
796 }
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // If everything was OK (no exceptions, no null return value), and
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // class_loader is NOT the defining loader, do a little more bookkeeping.
a61af66fc99e Initial load
duke
parents:
diff changeset
801 if (!HAS_PENDING_EXCEPTION && !k.is_null() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
802 k->class_loader() != class_loader()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 check_constraints(d_index, d_hash, k, class_loader, false, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 // Need to check for a PENDING_EXCEPTION again; check_constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
807 // can throw and doesn't use the CHECK macro.
a61af66fc99e Initial load
duke
parents:
diff changeset
808 if (!HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
809 { // Grabbing the Compile_lock prevents systemDictionary updates
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // during compilations.
a61af66fc99e Initial load
duke
parents:
diff changeset
811 MutexLocker mu(Compile_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 update_dictionary(d_index, d_hash, p_index, p_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
813 k, class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815 if (JvmtiExport::should_post_class_load()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
816 Thread *thread = THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 assert(thread->is_Java_thread(), "thread->is_Java_thread()");
a61af66fc99e Initial load
duke
parents:
diff changeset
818 JvmtiExport::post_class_load((JavaThread *) thread, k());
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821 }
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (HAS_PENDING_EXCEPTION || k.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // On error, clean up placeholders
a61af66fc99e Initial load
duke
parents:
diff changeset
824 {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
826 placeholders()->find_and_remove(p_index, p_hash, name, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
827 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
835 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
836 ClassLoaderData* loader_data = k->class_loader_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
838 Klass* kk = find_class(name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
839 assert(kk == k(), "should be present in dictionary");
a61af66fc99e Initial load
duke
parents:
diff changeset
840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
841 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
842
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // return if the protection domain in NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
844 if (protection_domain() == NULL) return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
845
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // Check the protection domain has the right access
a61af66fc99e Initial load
duke
parents:
diff changeset
847 {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // Note that we have an entry, and entries can be deleted only during GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
850 // so we cannot allow GC to occur while we're holding this entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // We're using a No_Safepoint_Verifier to catch any place where we
a61af66fc99e Initial load
duke
parents:
diff changeset
852 // might potentially do a GC at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // SystemDictionary::do_unloading() asserts that classes are only
a61af66fc99e Initial load
duke
parents:
diff changeset
854 // unloaded at a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
855 No_Safepoint_Verifier nosafepoint;
a61af66fc99e Initial load
duke
parents:
diff changeset
856 if (dictionary()->is_valid_protection_domain(d_index, d_hash, name,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
857 loader_data,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
858 protection_domain)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861 }
a61af66fc99e Initial load
duke
parents:
diff changeset
862
a61af66fc99e Initial load
duke
parents:
diff changeset
863 // Verify protection domain. If it fails an exception is thrown
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
864 validate_protection_domain(k, class_loader, protection_domain, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // This routine does not lock the system dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
871 //
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // Since readers don't hold a lock, we must make sure that system
a61af66fc99e Initial load
duke
parents:
diff changeset
873 // dictionary entries are only removed at a safepoint (when only one
a61af66fc99e Initial load
duke
parents:
diff changeset
874 // thread is running), and are added to in a safe way (all links must
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // be updated in an MT-safe manner).
a61af66fc99e Initial load
duke
parents:
diff changeset
876 //
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // Callers should be aware that an entry could be added just after
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // _dictionary->bucket(index) is read here, so the caller will not see
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // the new entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
880
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
881 Klass* SystemDictionary::find(Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
882 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
883 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
884 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
885
556
48bb4a49b7ac 6790209: server VM fails with assert(will_link,"_new: typeflow responsibility")
kvn
parents: 431
diff changeset
886 // UseNewReflection
48bb4a49b7ac 6790209: server VM fails with assert(will_link,"_new: typeflow responsibility")
kvn
parents: 431
diff changeset
887 // The result of this call should be consistent with the result
48bb4a49b7ac 6790209: server VM fails with assert(will_link,"_new: typeflow responsibility")
kvn
parents: 431
diff changeset
888 // of the call to resolve_instance_class_or_null().
48bb4a49b7ac 6790209: server VM fails with assert(will_link,"_new: typeflow responsibility")
kvn
parents: 431
diff changeset
889 // See evaluation 6790209 and 4474172 for more details.
48bb4a49b7ac 6790209: server VM fails with assert(will_link,"_new: typeflow responsibility")
kvn
parents: 431
diff changeset
890 class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader()));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
891 ClassLoaderData* loader_data = register_loader(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
892
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
893 unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
894 int d_index = dictionary()->hash_to_index(d_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // Note that we have an entry, and entries can be deleted only during GC,
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // so we cannot allow GC to occur while we're holding this entry.
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // We're using a No_Safepoint_Verifier to catch any place where we
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // might potentially do a GC at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // SystemDictionary::do_unloading() asserts that classes are only
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // unloaded at a safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
903 No_Safepoint_Verifier nosafepoint;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
904 return dictionary()->find(d_index, d_hash, class_name, loader_data,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
905 protection_domain, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 }
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Look for a loaded instance or array klass by name. Do not do any loading.
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // return NULL in case of error.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
912 Klass* SystemDictionary::find_instance_or_array_klass(Symbol* class_name,
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
913 Handle class_loader,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
914 Handle protection_domain,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
915 TRAPS) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
916 Klass* k = NULL;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
917 assert(class_name != NULL, "class name must be non NULL");
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
918
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
919 if (FieldType::is_array(class_name)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // The name refers to an array. Parse the name.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
921 // dimension and object_key in FieldArrayInfo are assigned as a
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
922 // side-effect of this call
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
923 FieldArrayInfo fd;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
924 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_(NULL));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
925 if (t != T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
926 k = Universe::typeArrayKlassObj(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
927 } else {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
928 k = SystemDictionary::find(fd.object_key(), class_loader, protection_domain, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929 }
a61af66fc99e Initial load
duke
parents:
diff changeset
930 if (k != NULL) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
931 k = Klass::cast(k)->array_klass_or_null(fd.dimension());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
933 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 k = find(class_name, class_loader, protection_domain, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
937 }
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Note: this method is much like resolve_from_stream, but
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // updates no supplemental data structures.
a61af66fc99e Initial load
duke
parents:
diff changeset
941 // TODO consolidate the two methods with a helper routine?
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
942 Klass* SystemDictionary::parse_stream(Symbol* class_name,
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
943 Handle class_loader,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
944 Handle protection_domain,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
945 ClassFileStream* st,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
946 KlassHandle host_klass,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
947 GrowableArray<Handle>* cp_patches,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
948 TRAPS) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
949 TempNewSymbol parsed_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // Parse the stream. Note that we do this even though this klass might
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // already be present in the SystemDictionary, otherwise we would not
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // throw potential ClassFormatErrors.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 //
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // Note: "name" is updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // Further note: a placeholder will be added for this class when
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // super classes are loaded (resolve_super_or_fail). We expect this
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // to be called for all classes but java.lang.Object; and we preload
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // java.lang.Object through resolve_or_fail, not this path.
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
962 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
963 protection_domain,
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
964 host_klass,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
965 cp_patches,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
966 parsed_name,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 875
diff changeset
967 true,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // We don't redefine the class, so we just need to clean up whether there
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // was an error or not (don't want to modify any system dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // data structures).
a61af66fc99e Initial load
duke
parents:
diff changeset
973 // Parsed name could be null if we threw an error before we got far
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // enough along to parse it -- in that case, there is nothing to clean up.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
975 if (parsed_name != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
976 ClassLoaderData* loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
977
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 unsigned int p_hash = placeholders()->compute_hash(parsed_name,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
979 loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
980 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
981 {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
983 placeholders()->find_and_remove(p_index, p_hash, parsed_name, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
984 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986 }
a61af66fc99e Initial load
duke
parents:
diff changeset
987
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
988 if (host_klass.not_null() && k.not_null()) {
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
989 assert(EnableInvokeDynamic, "");
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
990 // If it's anonymous, initialize it now, since nobody else will.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
991 k->class_loader_data()->record_dependency(host_klass(), CHECK_NULL);
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
992 k->set_host_klass(host_klass());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
993
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
994 {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
995 MutexLocker mu_r(Compile_lock, THREAD);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
996
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
997 // Add to class hierarchy, initialize vtables, and do possible
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
998 // deoptimizations.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
999 add_to_hierarchy(k, CHECK_NULL); // No exception, but can block
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1000
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1001 // But, do not add to system dictionary.
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1002 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1003
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1004 // Rewrite and patch constant pool here.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1005 k->link_class(THREAD);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1006 if (cp_patches != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1007 k->constants()->patch_resolved_references(cp_patches);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1008 }
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1009 k->eager_initialize(THREAD);
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1010
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1011 // notify jvmti
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1012 if (JvmtiExport::should_post_class_load()) {
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1013 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1014 JvmtiExport::post_class_load((JavaThread *) THREAD, k());
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1015 }
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1016 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1017 assert(host_klass.not_null() || cp_patches == NULL,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1018 "cp_patches only found with host_klass");
431
a45484ea312d 6653858: dynamic languages need to be able to load anonymous classes
jrose
parents: 196
diff changeset
1019
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 // Add a klass to the system from a stream (called by jni_DefineClass and
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // JVM_DefineClass).
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // Note: class_name can be NULL. In that case we do not know the name of
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 // the class until we have parsed the stream.
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1028 Klass* SystemDictionary::resolve_from_stream(Symbol* class_name,
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
1029 Handle class_loader,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
1030 Handle protection_domain,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
1031 ClassFileStream* st,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
1032 bool verify,
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
1033 TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1035 // Classloaders that support parallelism, e.g. bootstrap classloader,
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1036 // or all classloaders with UnsyncloadClass do not acquire lock here
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1037 bool DoObjectLock = true;
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1038 if (is_parallelCapable(class_loader)) {
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1039 DoObjectLock = false;
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1040 }
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1041
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1042 ClassLoaderData* loader_data = register_loader(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1043
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1044 // Make sure we are synchronized on the class loader before we proceed
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 check_loader_lock_contention(lockObject, THREAD);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1047 ObjectLocker ol(lockObject, THREAD, DoObjectLock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1049 TempNewSymbol parsed_name = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // Parse the stream. Note that we do this even though this klass might
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // already be present in the SystemDictionary, otherwise we would not
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 // throw potential ClassFormatErrors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // Note: "name" is updated.
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // Further note: a placeholder will be added for this class when
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // super classes are loaded (resolve_super_or_fail). We expect this
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 // to be called for all classes but java.lang.Object; and we preload
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // java.lang.Object through resolve_or_fail, not this path.
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 parsed_name,
973
ad6585fd4087 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 875
diff changeset
1065 verify,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 const char* pkg = "java/";
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 if (!HAS_PENDING_EXCEPTION &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 !class_loader.is_null() &&
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1071 parsed_name != NULL &&
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 !strncmp((const char*)parsed_name->bytes(), pkg, strlen(pkg))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 // It is illegal to define classes in the "java." package from
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // JVM_DefineClass or jni_DefineClass unless you're the bootclassloader
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 char* name = parsed_name->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 char* index = strrchr(name, '/');
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 *index = '\0'; // chop to just the package name
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 while ((index = strchr(name, '/')) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 *index = '.'; // replace '/' with '.' in package name
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 const char* fmt = "Prohibited package name: %s";
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 size_t len = strlen(fmt) + strlen(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 char* message = NEW_RESOURCE_ARRAY(char, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 jio_snprintf(message, len, fmt, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 Exceptions::_throw_msg(THREAD_AND_LOCATION,
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 vmSymbols::java_lang_SecurityException(), message);
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 if (!HAS_PENDING_EXCEPTION) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1091 assert(parsed_name != NULL, "Sanity");
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1092 assert(class_name == NULL || class_name == parsed_name, "name mismatch");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 // Verification prevents us from creating names with dots in them, this
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // asserts that that's the case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 assert(is_internal_format(parsed_name),
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 "external class name format used internally");
a61af66fc99e Initial load
duke
parents:
diff changeset
1097
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // Add class just loaded
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1099 // If a class loader supports parallel classloading handle parallel define requests
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1100 // find_or_define_instance_class may return a different InstanceKlass
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1101 if (is_parallelCapable(class_loader)) {
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1102 k = find_or_define_instance_class(class_name, class_loader, k, THREAD);
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1103 } else {
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1104 define_instance_class(k, THREAD);
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1105 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1107
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // If parsing the class file or define_instance_class failed, we
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // need to remove the placeholder added on our behalf. But we
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 // must make sure parsed_name is valid first (it won't be if we had
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 // a format error before the class was parsed far enough to
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 // find the name).
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1113 if (HAS_PENDING_EXCEPTION && parsed_name != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 unsigned int p_hash = placeholders()->compute_hash(parsed_name,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1115 loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1119 placeholders()->find_and_remove(p_index, p_hash, parsed_name, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // Make sure that we didn't leave a place holder in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // SystemDictionary; this is only done on success
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 debug_only( {
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 if (!HAS_PENDING_EXCEPTION) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1129 assert(parsed_name != NULL, "parsed_name is still null?");
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1130 Symbol* h_name = k->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1131 ClassLoaderData *defining_loader_data = k->class_loader_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1132
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1134
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1135 Klass* check = find_class(parsed_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 assert(check == k(), "should be present in the dictionary");
a61af66fc99e Initial load
duke
parents:
diff changeset
1137
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1138 Klass* check2 = find_class(h_name, defining_loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 assert(check == check2, "name inconsistancy in SystemDictionary");
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 } );
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 return k();
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6100
diff changeset
1147 void SystemDictionary::set_shared_dictionary(HashtableBucket<mtClass>* t, int length,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 int number_of_entries) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6100
diff changeset
1149 assert(length == _nof_buckets * sizeof(HashtableBucket<mtClass>),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 "bad shared dictionary size.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 _shared_dictionary = new Dictionary(_nof_buckets, t, number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // If there is a shared dictionary, then find the entry for the
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 // given shared system class, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1158 Klass* SystemDictionary::find_shared_class(Symbol* class_name) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 if (shared_dictionary() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1160 unsigned int d_hash = shared_dictionary()->compute_hash(class_name, NULL);
4864
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1161 int d_index = shared_dictionary()->hash_to_index(d_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1162
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 return shared_dictionary()->find_shared_class(d_index, d_hash, class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 // Load a class from the shared spaces (found through the shared system
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 // dictionary). Force the superclass and all interfaces to be loaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 // Update the class definition to include sibling classes and no
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 // subclasses (yet). [Classes in the shared space are not part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // object hierarchy until loaded.]
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 instanceKlassHandle SystemDictionary::load_shared_class(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1177 Symbol* class_name, Handle class_loader, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 instanceKlassHandle ik (THREAD, find_shared_class(class_name));
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 return load_shared_class(ik, class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 // Note well! Changes to this method may affect oop access order
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 // in the shared archive. Please take care to not make changes that
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // adversely affect cold start time by changing the oop access order
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 // that is specified in dump.cpp MarkAndMoveOrderedReadOnly and
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 // MarkAndMoveOrderedReadWrite closures.
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 instanceKlassHandle SystemDictionary::load_shared_class(
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 instanceKlassHandle ik, Handle class_loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 assert(class_loader.is_null(), "non-null classloader for shared class?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 if (ik.not_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 instanceKlassHandle nh = instanceKlassHandle(); // null Handle
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1192 Symbol* class_name = ik->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // Found the class, now load the superclass and interfaces. If they
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // are shared, add them to the main system dictionary and reset
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // their hierarchy references (supers, subs, and interfaces).
a61af66fc99e Initial load
duke
parents:
diff changeset
1197
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 if (ik->super() != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1199 Symbol* cn = ik->super()->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 resolve_super_or_fail(class_name, cn,
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 class_loader, Handle(), true, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1203
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1204 Array<Klass*>* interfaces = ik->local_interfaces();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 int num_interfaces = interfaces->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 for (int index = 0; index < num_interfaces; index++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1207 Klass* k = interfaces->at(index);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1208
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1209 // Note: can not use InstanceKlass::cast here because
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1210 // interfaces' InstanceKlass's C++ vtbls haven't been
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 // reinitialized yet (they will be once the interface classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // are loaded)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1213 Symbol* name = k->name();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 resolve_super_or_fail(class_name, name, class_loader, Handle(), false, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1216
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 // Adjust methods to recover missing data. They need addresses for
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // interpreter entry points and their default native method address
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // must be reset.
a61af66fc99e Initial load
duke
parents:
diff changeset
1220
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // Updating methods must be done under a lock so multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 // threads don't update these in parallel
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // Shared classes are all currently loaded by the bootstrap
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // classloader, so this will never cause a deadlock on
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // a custom class loader lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
1226
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 Handle lockObject = compute_loader_lock_object(class_loader, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 check_loader_lock_contention(lockObject, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 ObjectLocker ol(lockObject, THREAD, true);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1231 ik->restore_unshareable_info(CHECK_(nh));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1233
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 if (TraceClassLoading) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 tty->print("[Loaded %s", ik->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 tty->print(" from shared objects file");
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 tty->print_cr("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // notify a class loaded from shared object
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1241 ClassLoadingService::notify_class_loaded(InstanceKlass::cast(ik()),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 true /* shared class */);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 return ik;
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // Some classes on the bootstrap class path haven't been installed on the
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // system yet. Call the DownloadManager method to make them appear in the
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // bootstrap class path and try again to load the named class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // Note that with delegation class loaders all classes in another loader will
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // first try to call this so it'd better be fast!!
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 static instanceKlassHandle download_and_retry_class_load(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1254 Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1257 Klass* dlm = SystemDictionary::DownloadManager_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 instanceKlassHandle nk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 // If download manager class isn't loaded just return.
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 if (dlm == NULL) return nk;
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 { HandleMark hm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 Handle s = java_lang_String::create_from_symbol(class_name, CHECK_(nk));
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 Handle class_string = java_lang_String::externalize_classname(s, CHECK_(nk));
a61af66fc99e Initial load
duke
parents:
diff changeset
1267
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 // return value
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // Call the DownloadManager. We assume that it has a lock because
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // multiple classes could be not found and downloaded at the same time.
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 // class sun.misc.DownloadManager;
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 // public static String getBootClassPathEntryForClass(String className);
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 JavaCalls::call_static(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 KlassHandle(THREAD, dlm),
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1277 vmSymbols::getBootClassPathEntryForClass_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1278 vmSymbols::string_string_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 class_string,
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 CHECK_(nk));
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // Get result.string and add to bootclasspath
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 assert(result.get_type() == T_OBJECT, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 oop obj = (oop) result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 if (obj == NULL) { return nk; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
22
90f5ddc7297b 6646946: Kernel installation failed on Japanese and Chinese XP SP2 (VM part)
coleenp
parents: 0
diff changeset
1287 Handle h_obj(THREAD, obj);
90f5ddc7297b 6646946: Kernel installation failed on Japanese and Chinese XP SP2 (VM part)
coleenp
parents: 0
diff changeset
1288 char* new_class_name = java_lang_String::as_platform_dependent_str(h_obj,
90f5ddc7297b 6646946: Kernel installation failed on Japanese and Chinese XP SP2 (VM part)
coleenp
parents: 0
diff changeset
1289 CHECK_(nk));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // lock the loader
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 // we use this lock because JVMTI does.
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 Handle loader_lock(THREAD, SystemDictionary::system_loader_lock());
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 ObjectLocker ol(loader_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 // add the file to the bootclasspath
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 ClassLoader::update_class_path_entry_list(new_class_name, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 } // end HandleMark
a61af66fc99e Initial load
duke
parents:
diff changeset
1299
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (TraceClassLoading) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 ClassLoader::print_bootclasspath();
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 return ClassLoader::load_classfile(class_name, CHECK_(nk));
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1306
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1308 instanceKlassHandle SystemDictionary::load_instance_class(Symbol* class_name, Handle class_loader, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 instanceKlassHandle nh = instanceKlassHandle(); // null Handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 if (class_loader.is_null()) {
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1311
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 // Search the shared system dictionary for classes preloaded into the
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 // shared spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 instanceKlassHandle k;
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1315 {
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1316 PerfTraceTime vmtimer(ClassLoader::perf_shared_classload_time());
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1317 k = load_shared_class(class_name, class_loader, THREAD);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1318 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1319
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 if (k.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 // Use VM class loader
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1322 PerfTraceTime vmtimer(ClassLoader::perf_sys_classload_time());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 k = ClassLoader::load_classfile(class_name, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // If the VM class loader has failed to load the class, call the
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // DownloadManager class to make it magically appear on the classpath
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // and try again. This is only configured with the Kernel VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 if (k.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 k = download_and_retry_class_load(class_name, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1334
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1335 // find_or_define_instance_class may return a different InstanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 if (!k.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 k = find_or_define_instance_class(class_name, class_loader, k, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 // Use user specified class loader to load class. Call loadClass operation on class_loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1343
875
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1344 assert(THREAD->is_Java_thread(), "must be a JavaThread");
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1345 JavaThread* jt = (JavaThread*) THREAD;
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1346
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1347 PerfClassTraceTime vmtimer(ClassLoader::perf_app_classload_time(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1348 ClassLoader::perf_app_classload_selftime(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1349 ClassLoader::perf_app_classload_count(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1350 jt->get_thread_stat()->perf_recursion_counts_addr(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1351 jt->get_thread_stat()->perf_timers_addr(),
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1352 PerfClassTraceTime::CLASS_LOAD);
6a93908f268f 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 726
diff changeset
1353
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 Handle s = java_lang_String::create_from_symbol(class_name, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 // Translate to external class name format, i.e., convert '/' chars to '.'
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 Handle string = java_lang_String::externalize_classname(s, CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 JavaValue result(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
1359
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1360 KlassHandle spec_klass (THREAD, SystemDictionary::ClassLoader_klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1361
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1362 // Call public unsynchronized loadClass(String) directly for all class loaders
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1363 // for parallelCapable class loaders. JDK >=7, loadClass(String, boolean) will
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1364 // acquire a class-name based lock rather than the class loader object lock.
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1365 // JDK < 7 already acquire the class loader lock in loadClass(String, boolean),
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1366 // so the call to loadClassInternal() was not required.
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1367 //
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1368 // UnsyncloadClass flag means both call loadClass(String) and do
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1369 // not acquire the class loader lock even for class loaders that are
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1370 // not parallelCapable. This was a risky transitional
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1371 // flag for diagnostic purposes only. It is risky to call
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // custom class loaders without synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // WARNING If a custom class loader does NOT synchronizer findClass, or callers of
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1374 // findClass, the UnsyncloadClass flag risks unexpected timing bugs in the field.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 // Do NOT assume this will be supported in future releases.
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1376 //
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1377 // Added MustCallLoadClassInternal in case we discover in the field
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1378 // a customer that counts on this call
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1379 if (MustCallLoadClassInternal && has_loadClassInternal()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 JavaCalls::call_special(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 spec_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1383 vmSymbols::loadClassInternal_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1384 vmSymbols::string_class_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 JavaCalls::call_virtual(&result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 spec_klass,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1391 vmSymbols::loadClass_name(),
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1392 vmSymbols::string_class_signature(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 string,
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 CHECK_(nh));
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1396
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 assert(result.get_type() == T_OBJECT, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 oop obj = (oop) result.get_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
1399
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 // Primitive classes return null since forName() can not be
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 // used to obtain any of the Class objects representing primitives or void
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 if ((obj != NULL) && !(java_lang_Class::is_primitive(obj))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 instanceKlassHandle k =
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1404 instanceKlassHandle(THREAD, java_lang_Class::as_Klass(obj));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 // For user defined Java class loaders, check that the name returned is
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // the same as that requested. This check is done for the bootstrap
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 // loader when parsing the class file.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1408 if (class_name == k->name()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // Class is not found or has the wrong name, return NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 return nh;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 void SystemDictionary::define_instance_class(instanceKlassHandle k, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1419 ClassLoaderData* loader_data = k->class_loader_data();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1420 Handle class_loader_h(THREAD, loader_data->class_loader());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1421
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1422 for (uintx it = 0; it < GCExpandToAllocateDelayMillis; it++){}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1423
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1424 // for bootstrap and other parallel classloaders don't acquire lock,
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1425 // use placeholder token
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1426 // If a parallelCapable class loader calls define_instance_class instead of
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1427 // find_or_define_instance_class to get here, we have a timing
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1428 // hole with systemDictionary updates and check_constraints
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1429 if (!class_loader_h.is_null() && !is_parallelCapable(class_loader_h)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 assert(ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD,
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 compute_loader_lock_object(class_loader_h, THREAD)),
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 "define called without lock");
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1434
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 // Check class-loading constraints. Throw exception if violation is detected.
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 // Grabs and releases SystemDictionary_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 // The check_constraints/find_class call and update_dictionary sequence
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 // must be "atomic" for a specific class/classloader pair so we never
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 // define two different instanceKlasses for that class/classloader pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 // Existing classloaders will call define_instance_class with the
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 // classloader lock held
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 // Parallel classloaders will call find_or_define_instance_class
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 // which will require a token to perform the define class
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1444 Symbol* name_h = k->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1445 unsigned int d_hash = dictionary()->compute_hash(name_h, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 int d_index = dictionary()->hash_to_index(d_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 check_constraints(d_index, d_hash, k, class_loader_h, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
6751
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1449 // Register class just loaded with class loader (placed in Vector)
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1450 // Note we do this before updating the dictionary, as this can
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1451 // fail with an OutOfMemoryError (if it does, we will *not* put this
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1452 // class in the dictionary and will not update the class hierarchy).
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1453 // JVMTI FollowReferences needs to find the classes this way.
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1454 if (k->class_loader() != NULL) {
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1455 methodHandle m(THREAD, Universe::loader_addClass_method());
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1456 JavaValue result(T_VOID);
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1457 JavaCallArguments args(class_loader_h);
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1458 args.push_oop(Handle(THREAD, k->java_mirror()));
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1459 JavaCalls::call(&result, m, &args, CHECK);
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1460 }
2a48c84f1d04 7197269: NPG: FollowReferences has no ClassLoader -> Class link to follow
coleenp
parents: 6735
diff changeset
1461
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 // Add the new class. We need recompile lock during update of CHA.
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1464 unsigned int p_hash = placeholders()->compute_hash(name_h, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 MutexLocker mu_r(Compile_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 // Add to class hierarchy, initialize vtables, and do possible
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 // deoptimizations.
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 add_to_hierarchy(k, CHECK); // No exception, but can block
a61af66fc99e Initial load
duke
parents:
diff changeset
1472
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 // Add to systemDictionary - so other classes can see it.
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 // Grabs and releases SystemDictionary_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 update_dictionary(d_index, d_hash, p_index, p_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 k, class_loader_h, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 k->eager_initialize(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 // notify jvmti
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 if (JvmtiExport::should_post_class_load()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 JvmtiExport::post_class_load((JavaThread *) THREAD, k());
a61af66fc99e Initial load
duke
parents:
diff changeset
1484
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 // Support parallel classloading
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1489 // All parallel class loaders, including bootstrap classloader
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1490 // lock a placeholder entry for this class/class_loader pair
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1491 // to allow parallel defines of different classes for this class loader
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1492 // With AllowParallelDefine flag==true, in case they do not synchronize around
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1493 // FindLoadedClass/DefineClass, calls, we check for parallel
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 // loading for them, wait if a defineClass is in progress
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 // and return the initial requestor's results
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1496 // This flag does not apply to the bootstrap classloader.
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1497 // With AllowParallelDefine flag==false, call through to define_instance_class
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1498 // which will throw LinkageError: duplicate class definition.
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1499 // False is the requested default.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // For better performance, the class loaders should synchronize
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1501 // findClass(), i.e. FindLoadedClass/DefineClassIfAbsent or they
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // potentially waste time reading and parsing the bytestream.
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // Note: VM callers should ensure consistency of k/class_name,class_loader
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1504 instanceKlassHandle SystemDictionary::find_or_define_instance_class(Symbol* class_name, Handle class_loader, instanceKlassHandle k, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1505
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 instanceKlassHandle nh = instanceKlassHandle(); // null Handle
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1507 Symbol* name_h = k->name(); // passed in class_name may be null
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1508 ClassLoaderData* loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1509
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1510 unsigned int d_hash = dictionary()->compute_hash(name_h, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 int d_index = dictionary()->hash_to_index(d_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
1512
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 // Hold SD lock around find_class and placeholder creation for DEFINE_CLASS
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1514 unsigned int p_hash = placeholders()->compute_hash(name_h, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 int p_index = placeholders()->hash_to_index(p_hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 PlaceholderEntry* probe;
a61af66fc99e Initial load
duke
parents:
diff changeset
1517
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 // First check if class already defined
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1521 if (UnsyncloadClass || (is_parallelDefine(class_loader))) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1522 Klass* check = find_class(d_index, d_hash, name_h, loader_data);
1075
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1523 if (check != NULL) {
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1524 return(instanceKlassHandle(THREAD, check));
a75edfd400ea 6893504: LinkageError for bootstrap duplicate class definitions.
acorn
parents: 1039
diff changeset
1525 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1527
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 // Acquire define token for this class/classloader
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1529 probe = placeholders()->find_and_add(p_index, p_hash, name_h, loader_data, PlaceholderTable::DEFINE_CLASS, NULL, THREAD);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1530 // Wait if another thread defining in parallel
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1531 // All threads wait - even those that will throw duplicate class: otherwise
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1532 // caller is surprised by LinkageError: duplicate, but findLoadedClass fails
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1533 // if other thread has not finished updating dictionary
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1534 while (probe->definer() != NULL) {
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1535 SystemDictionary_lock->wait();
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1536 }
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1537 // Only special cases allow parallel defines and can use other thread's results
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1538 // Other cases fall through, and may run into duplicate defines
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1539 // caught by finding an entry in the SystemDictionary
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1540 if ((UnsyncloadClass || is_parallelDefine(class_loader)) && (probe->InstanceKlass() != NULL)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1542 placeholders()->find_and_remove(p_index, p_hash, name_h, loader_data, THREAD);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1543 SystemDictionary_lock->notify_all();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 #ifdef ASSERT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1545 Klass* check = find_class(d_index, d_hash, name_h, loader_data);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1546 assert(check != NULL, "definer missed recording success");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 #endif
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1548 return(instanceKlassHandle(THREAD, probe->InstanceKlass()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 } else {
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1550 // This thread will define the class (even if earlier thread tried and had an error)
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1551 probe->set_definer(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 define_instance_class(k, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
1556
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 Handle linkage_exception = Handle(); // null handle
a61af66fc99e Initial load
duke
parents:
diff changeset
1558
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 // definer must notify any waiting threads
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 MutexLocker mu(SystemDictionary_lock, THREAD);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1562 PlaceholderEntry* probe = placeholders()->get_entry(p_index, p_hash, name_h, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 assert(probe != NULL, "DEFINE_CLASS placeholder lost?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 if (probe != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 linkage_exception = Handle(THREAD,PENDING_EXCEPTION);
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 probe->set_instanceKlass(k());
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 probe->set_definer(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1573 placeholders()->find_and_remove(p_index, p_hash, name_h, loader_data, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1577
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 // Can't throw exception while holding lock due to rank ordering
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 if (linkage_exception() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 THROW_OOP_(linkage_exception(), nh); // throws exception and returns
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 Handle SystemDictionary::compute_loader_lock_object(Handle class_loader, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 // If class_loader is NULL we synchronize on _system_loader_lock_obj
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 if (class_loader.is_null()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 return Handle(THREAD, _system_loader_lock_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 return class_loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1593
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 // This method is added to check how often we have to wait to grab loader
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 // lock. The results are being recorded in the performance counters defined in
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 // ClassLoader::_sync_systemLoaderLockContentionRate and
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 // ClassLoader::_sync_nonSystemLoaderLockConteionRate.
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 void SystemDictionary::check_loader_lock_contention(Handle loader_lock, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 if (!UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1602
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 assert(!loader_lock.is_null(), "NULL lock object");
a61af66fc99e Initial load
duke
parents:
diff changeset
1604
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 if (ObjectSynchronizer::query_lock_ownership((JavaThread*)THREAD, loader_lock)
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 == ObjectSynchronizer::owner_other) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 // contention will likely happen, so increment the corresponding
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 // contention counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 if (loader_lock() == _system_loader_lock_obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 ClassLoader::sync_systemLoaderLockContentionRate()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 ClassLoader::sync_nonSystemLoaderLockContentionRate()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1616
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 // Lookup
a61af66fc99e Initial load
duke
parents:
diff changeset
1619
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1620 Klass* SystemDictionary::find_class(int index, unsigned int hash,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1621 Symbol* class_name,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1622 ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 assert_locked_or_safepoint(SystemDictionary_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1624 assert (index == dictionary()->index_for(class_name, loader_data),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 "incorrect index?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1626
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1627 Klass* k = dictionary()->find_class(index, hash, class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1630
a61af66fc99e Initial load
duke
parents:
diff changeset
1631
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 // Basic find on classes in the midst of being loaded
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1633 Symbol* SystemDictionary::find_placeholder(Symbol* class_name,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1634 ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 assert_locked_or_safepoint(SystemDictionary_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1636 unsigned int p_hash = placeholders()->compute_hash(class_name, loader_data);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1637 int p_index = placeholders()->hash_to_index(p_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1638 return placeholders()->find_entry(p_index, p_hash, class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640
a61af66fc99e Initial load
duke
parents:
diff changeset
1641
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 // Used for assertions and verification only
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1643 Klass* SystemDictionary::find_class(Symbol* class_name, ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 #ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 guarantee(VerifyBeforeGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 VerifyDuringGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 VerifyBeforeExit ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 VerifyAfterGC, "too expensive");
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 assert_locked_or_safepoint(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1651
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 // First look in the loaded class array
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1653 unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 int d_index = dictionary()->hash_to_index(d_hash);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1655 return find_class(d_index, d_hash, class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1657
a61af66fc99e Initial load
duke
parents:
diff changeset
1658
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 // Get the next class in the diictionary.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1660 Klass* SystemDictionary::try_get_next_class() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 return dictionary()->try_get_next_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1663
a61af66fc99e Initial load
duke
parents:
diff changeset
1664
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 // Update hierachy. This is done before the new klass has been added to the SystemDictionary. The Recompile_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 // is held, to ensure that the compiler is not using the class hierachy, and that deoptimization will kick in
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 // before a new class is used.
a61af66fc99e Initial load
duke
parents:
diff changeset
1669
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 void SystemDictionary::add_to_hierarchy(instanceKlassHandle k, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 assert(k.not_null(), "just checking");
2244
4f26f535a225 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 2177
diff changeset
1672 assert_locked_or_safepoint(Compile_lock);
4f26f535a225 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 2177
diff changeset
1673
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 // Link into hierachy. Make sure the vtables are initialized before linking into
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 k->append_to_sibling_list(); // add to superklass/sibling list
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 k->process_interfaces(THREAD); // handle all "implements" declarations
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1677 k->set_init_state(InstanceKlass::loaded);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 // Now flush all code that depended on old class hierarchy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 // Note: must be done *after* linking k into the hierarchy (was bug 12/9/97)
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 // Also, first reinitialize vtable because it may have gotten out of synch
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 // while the new class wasn't connected to the class hierarchy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 Universe::flush_dependents_on(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1684
a61af66fc99e Initial load
duke
parents:
diff changeset
1685
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 // GC support
a61af66fc99e Initial load
duke
parents:
diff changeset
1688
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 // Following roots during mark-sweep is separated in two phases.
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 // The first phase follows preloaded classes and all other system
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 // classes, since these will never get unloaded anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 // The second phase removes (unloads) unreachable classes from the
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 // system dictionary and follows the remaining classes' contents.
a61af66fc99e Initial load
duke
parents:
diff changeset
1696
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 void SystemDictionary::always_strong_oops_do(OopClosure* blk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 blk->do_oop(&_java_system_loader);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1699 blk->do_oop(&_system_loader_lock_obj);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1700
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1701 dictionary()->always_strong_oops_do(blk);
6864
dd2b66d09ccd 8000659: NPG: ClassCastExceptions are unexpectedly thrown when testing nashorn
stefank
parents: 6822
diff changeset
1702
dd2b66d09ccd 8000659: NPG: ClassCastExceptions are unexpectedly thrown when testing nashorn
stefank
parents: 6822
diff changeset
1703 // Visit extra methods
dd2b66d09ccd 8000659: NPG: ClassCastExceptions are unexpectedly thrown when testing nashorn
stefank
parents: 6822
diff changeset
1704 invoke_method_table()->oops_do(blk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1706
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1707 void SystemDictionary::always_strong_classes_do(KlassClosure* closure) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // Follow all system classes and temporary placeholders in dictionary
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1709 dictionary()->always_strong_classes_do(closure);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1710
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1711 // Placeholders. These represent classes we're actively loading.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1712 placeholders()->classes_do(closure);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
4864
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1715 // Calculate a "good" systemdictionary size based
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1716 // on predicted or current loaded classes count
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1717 int SystemDictionary::calculate_systemdictionary_size(int classcount) {
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1718 int newsize = _old_default_sdsize;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1719 if ((classcount > 0) && !DumpSharedSpaces) {
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1720 int desiredsize = classcount/_average_depth_goal;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1721 for (newsize = _primelist[_sdgeneration]; _sdgeneration < _prime_array_size -1;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1722 newsize = _primelist[++_sdgeneration]) {
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1723 if (desiredsize <= newsize) {
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1724 break;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1725 }
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1726 }
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1727 }
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1728 return newsize;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1729 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 bool SystemDictionary::do_unloading(BoolObjectClosure* is_alive) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1731 // First, mark for unload all ClassLoaderData referencing a dead class loader.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1732 bool has_dead_loaders = ClassLoaderDataGraph::do_unloading(is_alive);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1733 bool unloading_occurred = false;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1734 if (has_dead_loaders) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1735 unloading_occurred = dictionary()->do_unloading();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1736 constraints()->purge_loader_constraints();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1737 resolution_errors()->purge_resolution_errors();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1739 return unloading_occurred;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1740 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1741
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 void SystemDictionary::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 f->do_oop(&_java_system_loader);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1744 f->do_oop(&_system_loader_lock_obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1745
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 // Adjust dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 dictionary()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1748
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
1749 // Visit extra methods
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1750 invoke_method_table()->oops_do(f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1752
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1753 // Extended Class redefinition support.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1754 // If one of these classes is replaced, we need to replace it in these places.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1755 // KlassClosure::do_klass should take the address of a class but we can
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1756 // change that later.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1757 void SystemDictionary::preloaded_classes_do(KlassClosure* f) {
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1758 for (int k = (int)FIRST_WKID; k < (int)WKID_LIMIT; k++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1759 f->do_klass(_well_known_klasses[k]);
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1760 }
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 for (int i = 0; i < T_VOID+1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 if (_box_klasses[i] != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 assert(i >= T_BOOLEAN, "checking");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1766 f->do_klass(_box_klasses[i]);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1770
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1771 FilteredFieldsMap::classes_do(f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1773
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1774 void SystemDictionary::lazily_loaded_classes_do(KlassClosure* f) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1775 f->do_klass(_abstract_ownable_synchronizer_klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1777
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // Just the classes from defining class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 // Don't iterate over placeholders
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1780 void SystemDictionary::classes_do(void f(Klass*)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 dictionary()->classes_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1783
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 // Added for initialize_itable_for_klass
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 // Just the classes from defining class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 // Don't iterate over placeholders
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1787 void SystemDictionary::classes_do(void f(Klass*, TRAPS), TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 dictionary()->classes_do(f, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1790
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 // All classes, and their class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 // Don't iterate over placeholders
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1793 void SystemDictionary::classes_do(void f(Klass*, ClassLoaderData*)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 dictionary()->classes_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1796
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 // All classes, and their class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 // (added for helpers that use HandleMarks and ResourceMarks)
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 // Don't iterate over placeholders
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1800 void SystemDictionary::classes_do(void f(Klass*, ClassLoaderData*, TRAPS), TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 dictionary()->classes_do(f, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1803
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1804 void SystemDictionary::placeholders_do(void f(Symbol*)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 placeholders()->entries_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1807
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1808 void SystemDictionary::methods_do(void f(Method*)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 dictionary()->methods_do(f);
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1810 invoke_method_table()->methods_do(f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1812
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 // Lazily load klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 void SystemDictionary::load_abstract_ownable_synchronizer_klass(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 assert(JDK_Version::is_gte_jdk16x_version(), "Must be JDK 1.6 or later");
a61af66fc99e Initial load
duke
parents:
diff changeset
1818
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 // if multiple threads calling this function, only one thread will load
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 // the class. The other threads will find the loaded version once the
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // class is loaded.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1822 Klass* aos = _abstract_ownable_synchronizer_klass;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 if (aos == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1824 Klass* k = resolve_or_fail(vmSymbols::java_util_concurrent_locks_AbstractOwnableSynchronizer(), true, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 // Force a fence to prevent any read before the write completes
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 OrderAccess::fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 _abstract_ownable_synchronizer_klass = k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
1833
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 void SystemDictionary::initialize(TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 // Allocate arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 assert(dictionary() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 "SystemDictionary should only be initialized once");
4864
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1838 _sdgeneration = 0;
b2cd0ee8f778 7114376: Make system dictionary hashtable bucket array size configurable
acorn
parents: 4800
diff changeset
1839 _dictionary = new Dictionary(calculate_systemdictionary_size(PredictedLoadedClassCount));
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1840 _placeholders = new PlaceholderTable(_nof_buckets);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 _number_of_modifications = 0;
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1842 _loader_constraints = new LoaderConstraintTable(_loader_constraint_size);
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1843 _resolution_errors = new ResolutionErrorTable(_resolution_error_size);
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1793
diff changeset
1844 _invoke_method_table = new SymbolPropertyTable(_invoke_method_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1845
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 // Allocate private object used as system class loader lock
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1847 _system_loader_lock_obj = oopFactory::new_intArray(0, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // Initialize basic classes
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 initialize_preloaded_classes(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1852 // Compact table of directions on the initialization of klasses:
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1853 static const short wk_init_info[] = {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1854 #define WK_KLASS_INIT_INFO(name, symbol, option) \
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1855 ( ((int)vmSymbols::VM_SYMBOL_ENUM_NAME(symbol) \
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1856 << SystemDictionary::CEIL_LG_OPTION_LIMIT) \
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1857 | (int)SystemDictionary::option ),
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1858 WK_KLASSES_DO(WK_KLASS_INIT_INFO)
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1859 #undef WK_KLASS_INIT_INFO
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1860 0
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1861 };
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1862
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1863 bool SystemDictionary::initialize_wk_klass(WKID id, int init_opt, TRAPS) {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1864 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1865 int info = wk_init_info[id - FIRST_WKID];
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1866 int sid = (info >> CEIL_LG_OPTION_LIMIT);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
1867 Symbol* symbol = vmSymbols::symbol_at((vmSymbols::SID)sid);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1868 Klass** klassp = &_well_known_klasses[id];
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1869 bool must_load = (init_opt < SystemDictionary::Opt);
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1870 bool try_load = true;
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1871 if (init_opt == SystemDictionary::Opt_Kernel) {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1872 #ifndef KERNEL
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1873 try_load = false;
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1874 #endif //KERNEL
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1875 }
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1876 if ((*klassp) == NULL && try_load) {
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1877 if (must_load) {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1878 (*klassp) = resolve_or_fail(symbol, true, CHECK_0); // load required class
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1879 } else {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1880 (*klassp) = resolve_or_null(symbol, CHECK_0); // load optional klass
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1881 }
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1882 }
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
1883 return ((*klassp) != NULL);
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1884 }
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1885
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1886 void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS) {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1887 assert((int)start_id <= (int)limit_id, "IDs are out of order!");
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1888 for (int id = (int)start_id; id < (int)limit_id; id++) {
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1889 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1890 int info = wk_init_info[id - FIRST_WKID];
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1891 int sid = (info >> CEIL_LG_OPTION_LIMIT);
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1892 int opt = (info & right_n_bits(CEIL_LG_OPTION_LIMIT));
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1893
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1894 initialize_wk_klass((WKID)id, opt, CHECK);
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1895 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
1896
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
1897 // move the starting value forward to the limit:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
1898 start_id = limit_id;
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1899 }
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1900
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 void SystemDictionary::initialize_preloaded_classes(TRAPS) {
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1902 assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // Preload commonly used klasses
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1904 WKID scan = FIRST_WKID;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1905 // first do Object, then String, Class
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1906 if (UseSharedSpaces) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1907 initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Object_klass), scan, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1908 // Initialize the constant pool for the Object_class
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1909 InstanceKlass* ik = InstanceKlass::cast(Object_klass());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1910 ik->constants()->restore_unshareable_info(CHECK);
6733
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
1911 initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1912 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1913 initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1914 }
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1915
6057
8f972594effc 6924259: Remove String.count/String.offset
kvn
parents: 4864
diff changeset
1916 // Calculate offsets for String and Class classes since they are loaded and
8f972594effc 6924259: Remove String.count/String.offset
kvn
parents: 4864
diff changeset
1917 // can be used after this point.
8f972594effc 6924259: Remove String.count/String.offset
kvn
parents: 4864
diff changeset
1918 java_lang_String::compute_offsets();
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3852
diff changeset
1919 java_lang_Class::compute_offsets();
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1920
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 // Fixup mirrors for classes loaded before java.lang.Class.
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 // These calls iterate over the objects currently in the perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 // so calling them at this point is matters (not before when there
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 // are fewer objects and not later after there are more objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 // in the perm gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 Universe::initialize_basic_type_mirrors(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 Universe::fixup_mirrors(CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
1928
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1929 // do a bunch more:
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1930 initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Reference_klass), scan, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // Preload ref klasses and set reference types
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1933 InstanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER);
6735
aed758eda82a 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 6733
diff changeset
1934 InstanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1935
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1936 initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1937 InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1938 InstanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1939 InstanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1940 InstanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM);
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1941
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1942 // JSR 292 classes
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1943 WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 3785
diff changeset
1944 WKID jsr292_group_end = WK_KLASS_ENUM_NAME(VolatileCallSite_klass);
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1945 initialize_wk_klasses_until(jsr292_group_start, scan, CHECK);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1946 if (EnableInvokeDynamic) {
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1947 initialize_wk_klasses_through(jsr292_group_end, scan, CHECK);
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1948 } else {
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1949 // Skip the JSR 292 classes, if not enabled.
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2357
diff changeset
1950 scan = WKID(jsr292_group_end + 1);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
1951 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
1952
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1953 initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1954
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1955 _box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1956 _box_klasses[T_CHAR] = WK_KLASS(Character_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1957 _box_klasses[T_FLOAT] = WK_KLASS(Float_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1958 _box_klasses[T_DOUBLE] = WK_KLASS(Double_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1959 _box_klasses[T_BYTE] = WK_KLASS(Byte_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1960 _box_klasses[T_SHORT] = WK_KLASS(Short_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1961 _box_klasses[T_INT] = WK_KLASS(Integer_klass);
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
1962 _box_klasses[T_LONG] = WK_KLASS(Long_klass);
132
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1963 //_box_klasses[T_OBJECT] = WK_KLASS(object_klass);
60b728ec77c1 6652736: well known classes in system dictionary are inefficiently processed
jrose
parents: 22
diff changeset
1964 //_box_klasses[T_ARRAY] = WK_KLASS(object_klass);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1965
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 #ifdef KERNEL
3938
e6b1331a51d2 7086585: make Java field injection more flexible
never
parents: 3852
diff changeset
1967 if (DownloadManager_klass() == NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 warning("Cannot find sun/jkernel/DownloadManager");
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 #endif // KERNEL
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
1971
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 { // Compute whether we should use loadClass or loadClassInternal when loading classes.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1973 Method* method = InstanceKlass::cast(ClassLoader_klass())->find_method(vmSymbols::loadClassInternal_name(), vmSymbols::string_class_signature());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 _has_loadClassInternal = (method != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 { // Compute whether we should use checkPackageAccess or NOT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1977 Method* method = InstanceKlass::cast(ClassLoader_klass())->find_method(vmSymbols::checkPackageAccess_name(), vmSymbols::class_protectiondomain_signature());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 _has_checkPackageAccess = (method != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1981
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // Tells if a given klass is a box (wrapper class, such as java.lang.Integer).
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // If so, returns the basic type it holds. If not, returns T_OBJECT.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1984 BasicType SystemDictionary::box_klass_type(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 assert(k != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 for (int i = T_BOOLEAN; i < T_VOID+1; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 if (_box_klasses[i] == k)
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 return (BasicType)i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1992
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // Constraints on class loaders. The details of the algorithm can be
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // found in the OOPSLA'98 paper "Dynamic Class Loading in the Java
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // Virtual Machine" by Sheng Liang and Gilad Bracha. The basic idea is
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 // that the system dictionary needs to maintain a set of contraints that
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 // must be satisfied by all classes in the dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 // if defining is true, then LinkageError if already in systemDictionary
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1999 // if initiating loader, then ok if InstanceKlass matches existing entry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2000
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 void SystemDictionary::check_constraints(int d_index, unsigned int d_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 instanceKlassHandle k,
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 Handle class_loader, bool defining,
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 const char *linkage_error = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2007 Symbol* name = k->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2008 ClassLoaderData *loader_data = class_loader_data(class_loader);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2009
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2011
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2012 Klass* check = find_class(d_index, d_hash, name, loader_data);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2013 if (check != (Klass*)NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2014 // if different InstanceKlass - duplicate class definition,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 // else - ok, class loaded by a different thread in parallel,
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 // we should only have found it if it was done loading and ok to use
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 // system dictionary only holds instance classes, placeholders
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 // also holds array classes
a61af66fc99e Initial load
duke
parents:
diff changeset
2019
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2020 assert(check->oop_is_instance(), "noninstance in systemdictionary");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 if ((defining == true) || (k() != check)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 linkage_error = "loader (instance of %s): attempted duplicate class "
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 "definition for name: \"%s\"";
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2028
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 #ifdef ASSERT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2030 Symbol* ph_check = find_placeholder(name, loader_data);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2031 assert(ph_check == NULL || ph_check == name, "invalid symbol");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2033
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 if (linkage_error == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 if (constraints()->check_or_update(k, class_loader, name) == false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 linkage_error = "loader constraint violation: loader (instance of %s)"
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 " previously initiated loading for a different type with name \"%s\"";
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2041
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // Throw error now if needed (cannot throw while holding
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // SystemDictionary_lock because of rank ordering)
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 if (linkage_error) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 ResourceMark rm(THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 const char* class_loader_name = loader_name(class_loader());
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 char* type_name = k->name()->as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 size_t buflen = strlen(linkage_error) + strlen(class_loader_name) +
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 strlen(type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 jio_snprintf(buf, buflen, linkage_error, class_loader_name, type_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2056
a61af66fc99e Initial load
duke
parents:
diff changeset
2057
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // Update system dictionary - done after check_constraint and add_to_hierachy
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // have been called.
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 void SystemDictionary::update_dictionary(int d_index, unsigned int d_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 int p_index, unsigned int p_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 instanceKlassHandle k,
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // Compile_lock prevents systemDictionary updates during compilations
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 assert_locked_or_safepoint(Compile_lock);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2067 Symbol* name = k->name();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2068 ClassLoaderData *loader_data = class_loader_data(class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2069
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 MutexLocker mu1(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2072
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // See whether biased locking is enabled and if so set it for this
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // klass.
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // Note that this must be done past the last potential blocking
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 // point / safepoint. We enable biased locking lazily using a
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // VM_Operation to iterate the SystemDictionary and installing the
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2078 // biasable mark word into each InstanceKlass's prototype header.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // To avoid race conditions where we accidentally miss enabling the
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 // optimization for one class in the process of being added to the
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 // dictionary, we must not safepoint after the test of
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 // BiasedLocking::enabled().
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 if (UseBiasedLocking && BiasedLocking::enabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 // Set biased locking bit for all loaded classes; it will be
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 // cleared if revocation occurs too often for this type
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 // NOTE that we must only do this when the class is initally
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 // defined, not each time it is referenced from a new class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 if (k->class_loader() == class_loader()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 k->set_prototype_header(markOopDesc::biased_locking_prototype());
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2092
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2093 // Assign a classid if one has not already been assigned. The
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2094 // counter does not need to be atomically incremented since this
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2095 // is only done while holding the SystemDictionary_lock.
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2096 // All loaded classes get a unique ID.
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2097 TRACE_INIT_ID(k);
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3938
diff changeset
2098
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 // Check for a placeholder. If there, remove it and make a
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 // new system dictionary entry.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2101 placeholders()->find_and_remove(p_index, p_hash, name, loader_data, THREAD);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2102 Klass* sd_check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 if (sd_check == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2104 dictionary()->add_klass(name, loader_data, k);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 notice_modification();
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 #ifdef ASSERT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2108 sd_check = find_class(d_index, d_hash, name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 assert (sd_check != NULL, "should have entry in system dictionary");
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 // Changed to allow PH to remain to complete class circularity checking
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 // while only one thread can define a class at one time, multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 // classes can resolve the superclass for a class at one time,
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 // and the placeholder is used to track that
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2114 // Symbol* ph_check = find_placeholder(name, class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 // assert (ph_check == NULL, "should not have a placeholder entry");
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 SystemDictionary_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2120
a61af66fc99e Initial load
duke
parents:
diff changeset
2121
2244
4f26f535a225 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 2177
diff changeset
2122 // Try to find a class name using the loader constraints. The
4f26f535a225 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 2177
diff changeset
2123 // loader constraints might know about a class that isn't fully loaded
4f26f535a225 6354181: nsk.logging.stress.threads.scmhml001 fails assertion in "src/share/vm/oops/instanceKlass.cpp, 111"
never
parents: 2177
diff changeset
2124 // yet and these will be ignored.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2125 Klass* SystemDictionary::find_constrained_instance_or_array_klass(
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2126 Symbol* class_name, Handle class_loader, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2127
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 // First see if it has been loaded directly.
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 // Force the protection domain to be null. (This removes protection checks.)
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 Handle no_protection_domain;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2131 Klass* klass = find_instance_or_array_klass(class_name, class_loader,
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
2132 no_protection_domain, CHECK_NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 if (klass != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 return klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
2135
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 // Now look to see if it has been loaded elsewhere, and is subject to
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 // a loader constraint that would require this loader to return the
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 // klass that is already loaded.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2139 if (FieldType::is_array(class_name)) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2140 // For array classes, their Klass*s are not kept in the
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2141 // constraint table. The element Klass*s are.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2142 FieldArrayInfo fd;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2143 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_(NULL));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 if (t != T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 klass = Universe::typeArrayKlassObj(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 MutexLocker mu(SystemDictionary_lock, THREAD);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2148 klass = constraints()->find_constrained_klass(fd.object_key(), class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 }
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2150 // If element class already loaded, allocate array klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 if (klass != NULL) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2152 klass = Klass::cast(klass)->array_klass_or_null(fd.dimension());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 MutexLocker mu(SystemDictionary_lock, THREAD);
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 // Non-array classes are easy: simply check the constraint table.
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 klass = constraints()->find_constrained_klass(class_name, class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2159
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 return klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2164 bool SystemDictionary::add_loader_constraint(Symbol* class_name,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 Handle class_loader1,
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 Handle class_loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 Thread* THREAD) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2168 ClassLoaderData* loader_data1 = class_loader_data(class_loader1);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2169 ClassLoaderData* loader_data2 = class_loader_data(class_loader2);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2170
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2171 Symbol* constraint_name = NULL;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2172 if (!FieldType::is_array(class_name)) {
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2173 constraint_name = class_name;
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2174 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2175 // For array classes, their Klass*s are not kept in the
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2176 // constraint table. The element classes are.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2177 FieldArrayInfo fd;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2178 BasicType t = FieldType::get_array_info(class_name, fd, CHECK_(false));
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2179 // primitive types always pass
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2180 if (t != T_OBJECT) {
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2181 return true;
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2182 } else {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2183 constraint_name = fd.object_key();
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2184 }
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2185 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2186 unsigned int d_hash1 = dictionary()->compute_hash(constraint_name, loader_data1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 int d_index1 = dictionary()->hash_to_index(d_hash1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2188
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2189 unsigned int d_hash2 = dictionary()->compute_hash(constraint_name, loader_data2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 int d_index2 = dictionary()->hash_to_index(d_hash2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 {
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2192 MutexLocker mu_s(SystemDictionary_lock, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2193
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2194 // Better never do a GC while we're holding these oops
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2195 No_Safepoint_Verifier nosafepoint;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2196
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2197 Klass* klass1 = find_class(d_index1, d_hash1, constraint_name, loader_data1);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2198 Klass* klass2 = find_class(d_index2, d_hash2, constraint_name, loader_data2);
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2199 return constraints()->add_entry(constraint_name, klass1, class_loader1,
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2200 klass2, class_loader2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2203
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 // Add entry to resolution error table to record the error when the first
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 // attempt to resolve a reference to a class has failed.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2206 void SystemDictionary::add_resolution_error(constantPoolHandle pool, int which, Symbol* error) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 unsigned int hash = resolution_errors()->compute_hash(pool, which);
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 int index = resolution_errors()->hash_to_index(hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 MutexLocker ml(SystemDictionary_lock, Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 resolution_errors()->add_entry(index, hash, pool, which, error);
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2214
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2215 // Delete a resolution error for RedefineClasses for a constant pool is going away
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2216 void SystemDictionary::delete_resolution_error(ConstantPool* pool) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2217 resolution_errors()->delete_entry(pool);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2218 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2219
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 // Lookup resolution error table. Returns error if found, otherwise NULL.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2221 Symbol* SystemDictionary::find_resolution_error(constantPoolHandle pool, int which) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 unsigned int hash = resolution_errors()->compute_hash(pool, which);
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 int index = resolution_errors()->hash_to_index(hash);
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 MutexLocker ml(SystemDictionary_lock, Thread::current());
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 ResolutionErrorEntry* entry = resolution_errors()->find_entry(index, hash, pool, which);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2227 return (entry != NULL) ? entry->error() : (Symbol*)NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2230
a61af66fc99e Initial load
duke
parents:
diff changeset
2231
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2232 // Signature constraints ensure that callers and callees agree about
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2233 // the meaning of type names in their signatures. This routine is the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2234 // intake for constraints. It collects them from several places:
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2235 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2236 // * LinkResolver::resolve_method (if check_access is true) requires
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2237 // that the resolving class (the caller) and the defining class of
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2238 // the resolved method (the callee) agree on each type in the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2239 // method's signature.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2240 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2241 // * LinkResolver::resolve_interface_method performs exactly the same
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2242 // checks.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2243 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2244 // * LinkResolver::resolve_field requires that the constant pool
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2245 // attempting to link to a field agree with the field's defining
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2246 // class about the type of the field signature.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2247 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2248 // * klassVtable::initialize_vtable requires that, when a class
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2249 // overrides a vtable entry allocated by a superclass, that the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2250 // overriding method (i.e., the callee) agree with the superclass
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2251 // on each type in the method's signature.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2252 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2253 // * klassItable::initialize_itable requires that, when a class fills
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2254 // in its itables, for each non-abstract method installed in an
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2255 // itable, the method (i.e., the callee) agree with the interface
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2256 // on each type in the method's signature.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2257 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2258 // All those methods have a boolean (check_access, checkconstraints)
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2259 // which turns off the checks. This is used from specialized contexts
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2260 // such as bootstrapping, dumping, and debugging.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2261 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2262 // No direct constraint is placed between the class and its
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2263 // supertypes. Constraints are only placed along linked relations
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2264 // between callers and callees. When a method overrides or implements
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2265 // an abstract method in a supertype (superclass or interface), the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2266 // constraints are placed as if the supertype were the caller to the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2267 // overriding method. (This works well, since callers to the
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2268 // supertype have already established agreement between themselves and
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2269 // the supertype.) As a result of all this, a class can disagree with
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2270 // its supertype about the meaning of a type name, as long as that
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2271 // class neither calls a relevant method of the supertype, nor is
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2272 // called (perhaps via an override) from the supertype.
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2273 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2274 //
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2275 // SystemDictionary::check_signature_loaders(sig, l1, l2)
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2276 //
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 // Make sure all class components (including arrays) in the given
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 // signature will be resolved to the same class in both loaders.
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 // Returns the name of the type that failed a loader constraint check, or
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 // NULL if no constraint failed. The returned C string needs cleaning up
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
2281 // with a ResourceMark in the caller. No exception except OOME is thrown.
1336
0c3f888b7636 6626217: Fixed loader constraint array handling
acorn
parents: 1039
diff changeset
2282 // Arrays are not added to the loader constraint table, their elements are.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2283 char* SystemDictionary::check_signature_loaders(Symbol* signature,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 Handle loader1, Handle loader2,
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 bool is_method, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // Nothing to do if loaders are the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 if (loader1() == loader2()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2290
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2291 ResourceMark rm(THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 SignatureStream sig_strm(signature, is_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 while (!sig_strm.is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 if (sig_strm.is_object()) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2295 Symbol* s = sig_strm.as_symbol(CHECK_NULL);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2296 Symbol* sig = s;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 if (!add_loader_constraint(sig, loader1, loader2, THREAD)) {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2298 return sig->as_C_string();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 sig_strm.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2307 methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2308 Symbol* signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2309 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2310 methodHandle empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2311 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2312 assert(MethodHandles::is_signature_polymorphic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2313 MethodHandles::is_signature_polymorphic_intrinsic(iid) &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2314 iid != vmIntrinsics::_invokeGeneric,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2315 err_msg("must be a known MH intrinsic iid=%d: %s", iid, vmIntrinsics::name_at(iid)));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2316
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2317 unsigned int hash = invoke_method_table()->compute_hash(signature, iid);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2318 int index = invoke_method_table()->hash_to_index(hash);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2319 SymbolPropertyEntry* spe = invoke_method_table()->find_entry(index, hash, signature, iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2320 methodHandle m;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2321 if (spe == NULL || spe->method() == NULL) {
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2322 spe = NULL;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2323 // Must create lots of stuff here, but outside of the SystemDictionary lock.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2324 m = Method::make_method_handle_intrinsic(iid, signature, CHECK_(empty));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2325 CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_highest_tier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2326 methodHandle(), CompileThreshold, "MH", CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2327
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2328 // Now grab the lock. We might have to throw away the new method,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2329 // if a racing thread has managed to install one at the same time.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2330 {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2331 MutexLocker ml(SystemDictionary_lock, THREAD);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2332 spe = invoke_method_table()->find_entry(index, hash, signature, iid);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2333 if (spe == NULL)
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2334 spe = invoke_method_table()->add_entry(index, hash, signature, iid);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2335 if (spe->method() == NULL)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2336 spe->set_method(m());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2337 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2338 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2339
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2340 assert(spe != NULL && spe->method() != NULL, "");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2341 return spe->method();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2342 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2343
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2344 // Helper for unpacking the return value from linkMethod and linkCallSite.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2345 static methodHandle unpack_method_and_appendix(Handle mname,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2346 objArrayHandle appendix_box,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2347 Handle* appendix_result,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2348 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2349 methodHandle empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2350 if (mname.not_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2351 Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(mname());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2352 if (vmtarget != NULL && vmtarget->is_method()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2353 Method* m = (Method*)vmtarget;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2354 oop appendix = appendix_box->obj_at(0);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2355 if (TraceMethodHandles) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2356 #ifndef PRODUCT
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2357 tty->print("Linked method="INTPTR_FORMAT": ", m);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2358 m->print();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2359 if (appendix != NULL) { tty->print("appendix = "); appendix->print(); }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2360 tty->cr();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2361 #endif //PRODUCT
3363
167b70ff3abc 6939861: JVM should handle more conversion operations
never
parents: 3245
diff changeset
2362 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2363 (*appendix_result) = Handle(THREAD, appendix);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2364 return methodHandle(THREAD, m);
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2365 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2366 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2367 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad value from MethodHandleNatives", empty);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2368 return empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2369 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2370
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2371 methodHandle SystemDictionary::find_method_handle_invoker(Symbol* name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2372 Symbol* signature,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2373 KlassHandle accessing_klass,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2374 Handle *appendix_result,
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2375 Handle *method_type_result,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2376 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2377 methodHandle empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2378 assert(EnableInvokeDynamic, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2379 assert(!THREAD->is_Compiler_thread(), "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2380 Handle method_type =
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2381 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2382 if (false) { // FIXME: Decide if the Java upcall should resolve signatures.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2383 method_type = java_lang_String::create_from_symbol(signature, CHECK_(empty));
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2384 }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2385
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2386 KlassHandle mh_klass = SystemDictionary::MethodHandle_klass();
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2387 int ref_kind = JVM_REF_invokeVirtual;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2388 Handle name_str = StringTable::intern(name, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2389 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2390 assert(appendix_box->obj_at(0) == NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2391
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2392 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2393 JavaCallArguments args;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2394 args.push_oop(accessing_klass()->java_mirror());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2395 args.push_int(ref_kind);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2396 args.push_oop(mh_klass()->java_mirror());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2397 args.push_oop(name_str());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2398 args.push_oop(method_type());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2399 args.push_oop(appendix_box());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2400 JavaValue result(T_OBJECT);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2401 JavaCalls::call_static(&result,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2402 SystemDictionary::MethodHandleNatives_klass(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2403 vmSymbols::linkMethod_name(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2404 vmSymbols::linkMethod_signature(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2405 &args, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2406 Handle mname(THREAD, (oop) result.get_jobject());
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2407 (*method_type_result) = method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2408 return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
710
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
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2411
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
2412 // Ask Java code to find or construct a java.lang.invoke.MethodType for the given
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2413 // signature, as interpreted relative to the given class loader.
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2414 // Because of class loader constraints, all method handle usage must be
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2415 // consistent with this loader.
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2416 Handle SystemDictionary::find_method_handle_type(Symbol* signature,
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2417 KlassHandle accessing_klass,
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1339
diff changeset
2418 TRAPS) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2419 Handle empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2420 vmIntrinsics::ID null_iid = vmIntrinsics::_none; // distinct from all method handle invoker intrinsics
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2421 unsigned int hash = invoke_method_table()->compute_hash(signature, null_iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2422 int index = invoke_method_table()->hash_to_index(hash);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2423 SymbolPropertyEntry* spe = invoke_method_table()->find_entry(index, hash, signature, null_iid);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2424 if (spe != NULL && spe->method_type() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2425 assert(java_lang_invoke_MethodType::is_instance(spe->method_type()), "");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2426 return Handle(THREAD, spe->method_type());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2427 } else if (THREAD->is_Compiler_thread()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2428 warning("SystemDictionary::find_method_handle_type called from compiler thread"); // FIXME
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2429 return Handle(); // do not attempt from within compiler, unless it was cached
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2430 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2431
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2432 Handle class_loader, protection_domain;
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2433 bool is_on_bcp = true; // keep this true as long as we can materialize from the boot classloader
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2434 int npts = ArgumentCount(signature).size();
1142
4ce7240d622c 6914300: ciEnv should export all well known classes
never
parents: 1135
diff changeset
2435 objArrayHandle pts = oopFactory::new_objArray(SystemDictionary::Class_klass(), npts, CHECK_(empty));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2436 int arg = 0;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2437 Handle rt; // the return type from the signature
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2438 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2439 for (SignatureStream ss(signature); !ss.is_done(); ss.next()) {
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2440 oop mirror = NULL;
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2441 if (is_on_bcp) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2442 // Note: class_loader & protection_domain are both null at this point.
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2443 mirror = ss.as_java_mirror(class_loader, protection_domain,
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2444 SignatureStream::ReturnNull, CHECK_(empty));
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2445 if (mirror == NULL) {
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2446 // fall back from BCP to accessing_klass
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2447 if (accessing_klass.not_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2448 class_loader = Handle(THREAD, InstanceKlass::cast(accessing_klass())->class_loader());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2449 protection_domain = Handle(THREAD, InstanceKlass::cast(accessing_klass())->protection_domain());
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2450 }
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2451 is_on_bcp = false;
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2452 }
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2453 }
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2454 if (!is_on_bcp) {
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2455 // Resolve, throwing a real error if it doesn't work.
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2456 mirror = ss.as_java_mirror(class_loader, protection_domain,
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2457 SignatureStream::NCDFError, CHECK_(empty));
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2458 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2459 if (ss.at_return_type())
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2460 rt = Handle(THREAD, mirror);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2461 else
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2462 pts->obj_at_put(arg++, mirror);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2463
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2464 // Check accessibility.
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2465 if (ss.is_object() && accessing_klass.not_null()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2466 Klass* sel_klass = java_lang_Class::as_Klass(mirror);
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2467 mirror = NULL; // safety
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2468 // Emulate ConstantPool::verify_constant_pool_resolve.
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2469 if (Klass::cast(sel_klass)->oop_is_objArray())
6831
d8ce2825b193 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 6751
diff changeset
2470 sel_klass = ObjArrayKlass::cast(sel_klass)->bottom_klass();
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2471 if (Klass::cast(sel_klass)->oop_is_instance()) {
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2472 KlassHandle sel_kh(THREAD, sel_klass);
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2473 LinkResolver::check_klass_accessability(accessing_klass, sel_kh, CHECK_(empty));
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2474 }
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2475 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2476 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2477 assert(arg == npts, "");
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2478
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
2479 // call java.lang.invoke.MethodHandleNatives::findMethodType(Class rt, Class[] pts) -> MethodType
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2480 JavaCallArguments args(Handle(THREAD, rt()));
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2481 args.push_oop(pts());
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2482 JavaValue result(T_OBJECT);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2483 JavaCalls::call_static(&result,
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1339
diff changeset
2484 SystemDictionary::MethodHandleNatives_klass(),
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1339
diff changeset
2485 vmSymbols::findMethodHandleType_name(),
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
2486 vmSymbols::findMethodHandleType_signature(),
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2487 &args, CHECK_(empty));
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1660
diff changeset
2488 Handle method_type(THREAD, (oop) result.get_jobject());
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1660
diff changeset
2489
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2490 if (is_on_bcp) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2491 // We can cache this MethodType inside the JVM.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2492 MutexLocker ml(SystemDictionary_lock, THREAD);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2493 spe = invoke_method_table()->find_entry(index, hash, signature, null_iid);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2494 if (spe == NULL)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2495 spe = invoke_method_table()->add_entry(index, hash, signature, null_iid);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2496 if (spe->method_type() == NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2497 spe->set_method_type(method_type());
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1660
diff changeset
2498 }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1660
diff changeset
2499 }
1508
2ffde6cfe049 6939196: method handle signatures off the boot class path get linkage errors
jrose
parents: 1507
diff changeset
2500
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2501 // report back to the caller with the MethodType
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1660
diff changeset
2502 return method_type;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2503 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2504
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2505 // Ask Java code to find or construct a method handle constant.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2506 Handle SystemDictionary::link_method_handle_constant(KlassHandle caller,
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2507 int ref_kind, //e.g., JVM_REF_invokeVirtual
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2508 KlassHandle callee,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2509 Symbol* name_sym,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2510 Symbol* signature,
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2511 TRAPS) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2512 Handle empty;
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2513 Handle name = java_lang_String::create_from_symbol(name_sym, CHECK_(empty));
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2514 Handle type;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2515 if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2516 type = find_method_handle_type(signature, caller, CHECK_(empty));
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2517 } else {
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2518 ResourceMark rm(THREAD);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2519 SignatureStream ss(signature, false);
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2520 if (!ss.is_done()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2521 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(),
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2522 SignatureStream::NCDFError, CHECK_(empty));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2523 type = Handle(THREAD, mirror);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2524 ss.next();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2525 if (!ss.is_done()) type = Handle(); // error!
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2526 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2527 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2528 if (type.is_null()) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2529 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2530 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2531
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
2532 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2533 JavaCallArguments args;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2534 args.push_oop(caller->java_mirror()); // the referring class
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2535 args.push_int(ref_kind);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2536 args.push_oop(callee->java_mirror()); // the target class
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2537 args.push_oop(name());
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2538 args.push_oop(type());
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2539 JavaValue result(T_OBJECT);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2540 JavaCalls::call_static(&result,
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2541 SystemDictionary::MethodHandleNatives_klass(),
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2542 vmSymbols::linkMethodHandleConstant_name(),
2460
ed69575596ac 6981791: remove experimental code for JSR 292
jrose
parents: 2416
diff changeset
2543 vmSymbols::linkMethodHandleConstant_signature(),
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2544 &args, CHECK_(empty));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2545 return Handle(THREAD, (oop) result.get_jobject());
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
2546 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
2547
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2356
diff changeset
2548 // Ask Java code to find or construct a java.lang.invoke.CallSite for the given
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2549 // name and signature, as interpreted relative to the given class loader.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2550 methodHandle SystemDictionary::find_dynamic_call_site_invoker(KlassHandle caller,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2551 Handle bootstrap_specifier,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2552 Symbol* name,
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2553 Symbol* type,
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2554 Handle *appendix_result,
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2555 Handle *method_type_result,
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2556 TRAPS) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2557 methodHandle empty;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2558 Handle bsm, info;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2559 if (java_lang_invoke_MethodHandle::is_instance(bootstrap_specifier())) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2560 bsm = bootstrap_specifier;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2561 } else {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2562 assert(bootstrap_specifier->is_objArray(), "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2563 objArrayHandle args(THREAD, (objArrayOop) bootstrap_specifier());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2564 int len = args->length();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2565 assert(len >= 1, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2566 bsm = Handle(THREAD, args->obj_at(0));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2567 if (len > 1) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2568 objArrayOop args1 = oopFactory::new_objArray(SystemDictionary::Object_klass(), len-1, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2569 for (int i = 1; i < len; i++)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2570 args1->obj_at_put(i-1, args->obj_at(i));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2571 info = Handle(THREAD, args1);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2572 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2573 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2574 guarantee(java_lang_invoke_MethodHandle::is_instance(bsm()),
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
2575 "caller must supply a valid BSM");
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
2576
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2577 Handle method_name = java_lang_String::create_from_symbol(name, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2578 Handle method_type = find_method_handle_type(type, caller, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2579
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2580 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2581 assert(appendix_box->obj_at(0) == NULL, "");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2582
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2583 // call java.lang.invoke.MethodHandleNatives::linkCallSite(caller, bsm, name, mtype, info, &appendix)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2584 JavaCallArguments args;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2585 args.push_oop(caller->java_mirror());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2586 args.push_oop(bsm());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2587 args.push_oop(method_name());
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2588 args.push_oop(method_type());
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1339
diff changeset
2589 args.push_oop(info());
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2590 args.push_oop(appendix_box);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2591 JavaValue result(T_OBJECT);
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2592 JavaCalls::call_static(&result,
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1339
diff changeset
2593 SystemDictionary::MethodHandleNatives_klass(),
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2594 vmSymbols::linkCallSite_name(),
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2595 vmSymbols::linkCallSite_signature(),
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2596 &args, CHECK_(empty));
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2597 Handle mname(THREAD, (oop) result.get_jobject());
6822
f6b0eb4e44cf 7200949: JSR 292: rubybench/bench/time/bench_base64.rb fails with jruby.jar not on boot class path
twisti
parents: 6751
diff changeset
2598 (*method_type_result) = method_type;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6217
diff changeset
2599 return unpack_method_and_appendix(mname, appendix_box, appendix_result, THREAD);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2600 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
2601
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 // Since the identity hash code for symbols changes when the symbols are
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 // moved from the regular perm gen (hash in the mark word) to the shared
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 // spaces (hash is the address), the classes loaded into the dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 // may be in the wrong buckets.
a61af66fc99e Initial load
duke
parents:
diff changeset
2606
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 void SystemDictionary::reorder_dictionary() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 dictionary()->reorder_dictionary();
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2610
a61af66fc99e Initial load
duke
parents:
diff changeset
2611
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 void SystemDictionary::copy_buckets(char** top, char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 dictionary()->copy_buckets(top, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2615
a61af66fc99e Initial load
duke
parents:
diff changeset
2616
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 void SystemDictionary::copy_table(char** top, char* end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 dictionary()->copy_table(top, end);
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2620
a61af66fc99e Initial load
duke
parents:
diff changeset
2621
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 void SystemDictionary::reverse() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 dictionary()->reverse();
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 int SystemDictionary::number_of_classes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 return dictionary()->number_of_entries();
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2629
a61af66fc99e Initial load
duke
parents:
diff changeset
2630
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2633
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 void SystemDictionary::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 dictionary()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2636
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 // Placeholders
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 GCMutexLocker mu(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 placeholders()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2640
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 // loader constraints - print under SD_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 constraints()->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2644
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 void SystemDictionary::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 guarantee(dictionary() != NULL, "Verify of system dictionary failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 guarantee(constraints() != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 "Verify of loader constraints failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 guarantee(dictionary()->number_of_entries() >= 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 placeholders()->number_of_entries() >= 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 "Verify of system dictionary failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2654
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 // Verify dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 dictionary()->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 GCMutexLocker mu(SystemDictionary_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 placeholders()->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2660
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 // Verify constraint table
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 guarantee(constraints() != NULL, "Verify of loader constraints failed");
1258
38836cf1d8d2 6920977: G1: guarantee(k == probe->klass(),"klass should be in dictionary") fails
tonyp
parents: 1142
diff changeset
2663 constraints()->verify(dictionary(), placeholders());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2665
a61af66fc99e Initial load
duke
parents:
diff changeset
2666
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2667 void SystemDictionary::verify_obj_klass_present(Symbol* class_name,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2668 ClassLoaderData* loader_data) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 GCMutexLocker mu(SystemDictionary_lock);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2670 Symbol* name;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2671
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2672 Klass* probe = find_class(class_name, loader_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 if (probe == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 probe = SystemDictionary::find_shared_class(class_name);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2675 if (probe == NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2676 name = find_placeholder(class_name, loader_data);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2677 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 }
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2679 guarantee(probe != NULL || name != NULL,
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2001
diff changeset
2680 "Loaded klasses should be in SystemDictionary");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2682
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2684
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 // statistics code
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 class ClassStatistics: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 static int nclasses; // number of classes
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 static int nmethods; // number of methods
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 static int nmethoddata; // number of methodData
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 static int class_size; // size of class objects in words
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 static int method_size; // size of method objects in words
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 static int debug_size; // size of debug info in methods
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 static int methoddata_size; // size of methodData objects in words
a61af66fc99e Initial load
duke
parents:
diff changeset
2695
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2696 static void do_class(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 nclasses++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 class_size += k->size();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2699 if (k->oop_is_instance()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2700 InstanceKlass* ik = (InstanceKlass*)k;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 class_size += ik->methods()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 class_size += ik->constants()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 class_size += ik->local_interfaces()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 class_size += ik->transitive_interfaces()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 // We do not have to count implementors, since we only store one!
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2706 // SSS: How should these be accounted now that they have moved?
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2707 // class_size += ik->fields()->length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2711 static void do_method(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 nmethods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 method_size += m->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 // class loader uses same objArray for empty vectors, so don't count these
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 if (m->has_stackmap_table()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 method_size += m->stackmap_data()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2718
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2719 MethodData* mdo = m->method_data();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 if (mdo != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 nmethoddata++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 methoddata_size += mdo->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2725
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 static void print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 SystemDictionary::classes_do(do_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 SystemDictionary::methods_do(do_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 tty->print_cr("Class statistics:");
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 tty->print_cr("%d classes (%d bytes)", nclasses, class_size * oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 tty->print_cr("%d methods (%d bytes = %d base + %d debug info)", nmethods,
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 (method_size + debug_size) * oopSize, method_size * oopSize, debug_size * oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 tty->print_cr("%d methoddata (%d bytes)", nmethoddata, methoddata_size * oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2737
a61af66fc99e Initial load
duke
parents:
diff changeset
2738
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 int ClassStatistics::nclasses = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 int ClassStatistics::nmethods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 int ClassStatistics::nmethoddata = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 int ClassStatistics::class_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 int ClassStatistics::method_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 int ClassStatistics::debug_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 int ClassStatistics::methoddata_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2746
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 void SystemDictionary::print_class_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 ClassStatistics::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2751
a61af66fc99e Initial load
duke
parents:
diff changeset
2752
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 class MethodStatistics: AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 max_parameter_size = 10
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2759
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 static int _number_of_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 static int _number_of_final_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 static int _number_of_static_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 static int _number_of_native_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 static int _number_of_synchronized_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 static int _number_of_profiled_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 static int _number_of_bytecodes;
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 static int _parameter_size_profile[max_parameter_size];
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 static int _bytecodes_profile[Bytecodes::number_of_java_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
2769
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 static void initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 _number_of_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 _number_of_final_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 _number_of_static_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 _number_of_native_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 _number_of_synchronized_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 _number_of_profiled_methods = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 _number_of_bytecodes = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 for (int i = 0; i < max_parameter_size ; i++) _parameter_size_profile[i] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 for (int j = 0; j < Bytecodes::number_of_java_codes; j++) _bytecodes_profile [j] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2781
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2782 static void do_method(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 _number_of_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 // collect flag info
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 if (m->is_final() ) _number_of_final_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 if (m->is_static() ) _number_of_static_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 if (m->is_native() ) _number_of_native_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 if (m->is_synchronized()) _number_of_synchronized_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 if (m->method_data() != NULL) _number_of_profiled_methods++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 // collect parameter size info (add one for receiver, if any)
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 _parameter_size_profile[MIN2(m->size_of_parameters() + (m->is_static() ? 0 : 1), max_parameter_size - 1)]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 // collect bytecodes info
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 HandleMark hm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 BytecodeStream s(methodHandle(thread, m));
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 Bytecodes::Code c;
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 while ((c = s.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 _number_of_bytecodes++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 _bytecodes_profile[c]++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2804
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 static void print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 SystemDictionary::methods_do(do_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 // generate output
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 tty->print_cr("Method statistics (static):");
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 // flag distribution
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 tty->print_cr("%6d final methods %6.1f%%", _number_of_final_methods , _number_of_final_methods * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 tty->print_cr("%6d static methods %6.1f%%", _number_of_static_methods , _number_of_static_methods * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 tty->print_cr("%6d native methods %6.1f%%", _number_of_native_methods , _number_of_native_methods * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 tty->print_cr("%6d synchronized methods %6.1f%%", _number_of_synchronized_methods, _number_of_synchronized_methods * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 tty->print_cr("%6d profiled methods %6.1f%%", _number_of_profiled_methods, _number_of_profiled_methods * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 // parameter size profile
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 { int tot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 int avg = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 for (int i = 0; i < max_parameter_size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 int n = _parameter_size_profile[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 tot += n;
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 avg += n*i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 tty->print_cr("parameter size = %1d: %6d methods %5.1f%%", i, n, n * 100.0F / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 assert(tot == _number_of_methods, "should be the same");
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 tty->print_cr(" %6d methods 100.0%%", _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 tty->print_cr("(average parameter size = %3.1f including receiver, if any)", (float)avg / _number_of_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 // bytecodes profile
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 { int tot = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 for (int i = 0; i < Bytecodes::number_of_java_codes; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 if (Bytecodes::is_defined(i)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 Bytecodes::Code c = Bytecodes::cast(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 int n = _bytecodes_profile[c];
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 tot += n;
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 tty->print_cr("%9d %7.3f%% %s", n, n * 100.0F / _number_of_bytecodes, Bytecodes::name(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 assert(tot == _number_of_bytecodes, "should be the same");
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 tty->print_cr("%9d 100.000%%", _number_of_bytecodes);
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2850
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 int MethodStatistics::_number_of_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 int MethodStatistics::_number_of_final_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 int MethodStatistics::_number_of_static_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 int MethodStatistics::_number_of_native_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 int MethodStatistics::_number_of_synchronized_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 int MethodStatistics::_number_of_profiled_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 int MethodStatistics::_number_of_bytecodes;
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 int MethodStatistics::_parameter_size_profile[MethodStatistics::max_parameter_size];
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 int MethodStatistics::_bytecodes_profile[Bytecodes::number_of_java_codes];
a61af66fc99e Initial load
duke
parents:
diff changeset
2860
a61af66fc99e Initial load
duke
parents:
diff changeset
2861
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 void SystemDictionary::print_method_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 MethodStatistics::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2865
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 #endif // PRODUCT