Mercurial > hg > graal-jvmci-8
annotate src/share/vm/classfile/systemDictionary.hpp @ 1091:6aa7255741f3
6906727: UseCompressedOops: some card-marking fixes related to object arrays
Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17).
Reviewed-by: kvn, coleenp, jmasa
author | ysr |
---|---|
date | Thu, 03 Dec 2009 15:01:57 -0800 |
parents | ad6585fd4087 |
children | 389049f3f393 a75edfd400ea |
rev | line source |
---|---|
0 | 1 /* |
579 | 2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 // The system dictionary stores all loaded classes and maps: | |
26 // | |
27 // [class name,class loader] -> class i.e. [symbolOop,oop] -> klassOop | |
28 // | |
29 // Classes are loaded lazily. The default VM class loader is | |
30 // represented as NULL. | |
31 | |
32 // The underlying data structure is an open hash table with a fixed number | |
33 // of buckets. During loading the loader object is locked, (for the VM loader | |
34 // a private lock object is used). Class loading can thus be done concurrently, | |
35 // but only by different loaders. | |
36 // | |
37 // During loading a placeholder (name, loader) is temporarily placed in | |
38 // a side data structure, and is used to detect ClassCircularityErrors | |
39 // and to perform verification during GC. A GC can occur in the midst | |
40 // of class loading, as we call out to Java, have to take locks, etc. | |
41 // | |
42 // When class loading is finished, a new entry is added to the system | |
43 // dictionary and the place holder is removed. Note that the protection | |
44 // domain field of the system dictionary has not yet been filled in when | |
45 // the "real" system dictionary entry is created. | |
46 // | |
47 // Clients of this class who are interested in finding if a class has | |
48 // been completely loaded -- not classes in the process of being loaded -- | |
49 // can read the SystemDictionary unlocked. This is safe because | |
50 // - entries are only deleted at safepoints | |
51 // - readers cannot come to a safepoint while actively examining | |
52 // an entry (an entry cannot be deleted from under a reader) | |
53 // - entries must be fully formed before they are available to concurrent | |
54 // readers (we must ensure write ordering) | |
55 // | |
56 // Note that placeholders are deleted at any time, as they are removed | |
57 // when a class is completely loaded. Therefore, readers as well as writers | |
58 // of placeholders must hold the SystemDictionary_lock. | |
59 // | |
60 | |
61 class Dictionary; | |
62 class PlaceholderTable; | |
63 class LoaderConstraintTable; | |
64 class HashtableBucket; | |
65 class ResolutionErrorTable; | |
710 | 66 class SymbolPropertyTable; |
0 | 67 |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
68 // Certain classes are preloaded, such as java.lang.Object and java.lang.String. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
69 // They are all "well-known", in the sense that no class loader is allowed |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
70 // to provide a different definition. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
71 // |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
72 // These klasses must all have names defined in vmSymbols. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
73 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
74 #define WK_KLASS_ENUM_NAME(kname) kname##_knum |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
75 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
76 // Each well-known class has a short klass name (like object_klass), |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
77 // a vmSymbol name (like java_lang_Object), and a flag word |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
78 // that makes some minor distinctions, like whether the klass |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
79 // is preloaded, optional, release-specific, etc. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
80 // The order of these definitions is significant; it is the order in which |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
81 // preloading is actually performed by initialize_preloaded_classes. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
82 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
83 #define WK_KLASSES_DO(template) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
84 /* well-known classes */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
85 template(object_klass, java_lang_Object, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
86 template(string_klass, java_lang_String, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
87 template(class_klass, java_lang_Class, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
88 template(cloneable_klass, java_lang_Cloneable, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
89 template(classloader_klass, java_lang_ClassLoader, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
90 template(serializable_klass, java_io_Serializable, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
91 template(system_klass, java_lang_System, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
92 template(throwable_klass, java_lang_Throwable, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
93 template(error_klass, java_lang_Error, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
94 template(threaddeath_klass, java_lang_ThreadDeath, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
95 template(exception_klass, java_lang_Exception, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
96 template(runtime_exception_klass, java_lang_RuntimeException, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
97 template(protectionDomain_klass, java_security_ProtectionDomain, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
98 template(AccessControlContext_klass, java_security_AccessControlContext, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
99 template(classNotFoundException_klass, java_lang_ClassNotFoundException, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
100 template(noClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
101 template(linkageError_klass, java_lang_LinkageError, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
102 template(ClassCastException_klass, java_lang_ClassCastException, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
103 template(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
104 template(virtualMachineError_klass, java_lang_VirtualMachineError, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
105 template(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
106 template(StackOverflowError_klass, java_lang_StackOverflowError, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
107 template(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
108 template(reference_klass, java_lang_ref_Reference, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
109 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
110 /* Preload ref klasses and set reference types */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
111 template(soft_reference_klass, java_lang_ref_SoftReference, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
112 template(weak_reference_klass, java_lang_ref_WeakReference, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
113 template(final_reference_klass, java_lang_ref_FinalReference, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
114 template(phantom_reference_klass, java_lang_ref_PhantomReference, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
115 template(finalizer_klass, java_lang_ref_Finalizer, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
116 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
117 template(thread_klass, java_lang_Thread, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
118 template(threadGroup_klass, java_lang_ThreadGroup, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
119 template(properties_klass, java_util_Properties, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
120 template(reflect_accessible_object_klass, java_lang_reflect_AccessibleObject, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
121 template(reflect_field_klass, java_lang_reflect_Field, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
122 template(reflect_method_klass, java_lang_reflect_Method, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
123 template(reflect_constructor_klass, java_lang_reflect_Constructor, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
124 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
125 /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
126 /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
127 /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
128 template(reflect_magic_klass, sun_reflect_MagicAccessorImpl, Opt) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
129 template(reflect_method_accessor_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
130 template(reflect_constructor_accessor_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
131 template(reflect_delegating_classloader_klass, sun_reflect_DelegatingClassLoader, Opt) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
132 template(reflect_constant_pool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
133 template(reflect_unsafe_static_field_accessor_impl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
134 \ |
710 | 135 /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \ |
136 template(MethodHandle_klass, java_dyn_MethodHandle, Opt) \ | |
137 template(MemberName_klass, sun_dyn_MemberName, Opt) \ | |
138 template(MethodHandleImpl_klass, sun_dyn_MethodHandleImpl, Opt) \ | |
139 template(AdapterMethodHandle_klass, sun_dyn_AdapterMethodHandle, Opt) \ | |
140 template(BoundMethodHandle_klass, sun_dyn_BoundMethodHandle, Opt) \ | |
141 template(DirectMethodHandle_klass, sun_dyn_DirectMethodHandle, Opt) \ | |
142 template(MethodType_klass, java_dyn_MethodType, Opt) \ | |
143 template(MethodTypeForm_klass, java_dyn_MethodTypeForm, Opt) \ | |
144 template(WrongMethodTypeException_klass, java_dyn_WrongMethodTypeException, Opt) \ | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
145 template(Linkage_klass, java_dyn_Linkage, Opt) \ |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
146 template(CallSite_klass, java_dyn_CallSite, Opt) \ |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
147 template(CallSiteImpl_klass, sun_dyn_CallSiteImpl, Opt) \ |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
148 template(Dynamic_klass, java_dyn_Dynamic, Opt) \ |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
149 /* Note: MethodHandle must be first, and Dynamic last in group */ \ |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
150 \ |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
151 template(vector_klass, java_util_Vector, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
152 template(hashtable_klass, java_util_Hashtable, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
153 template(stringBuffer_klass, java_lang_StringBuffer, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
154 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
155 /* It's NULL in non-1.4 JDKs. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
156 template(stackTraceElement_klass, java_lang_StackTraceElement, Opt) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
157 /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
158 /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
159 template(java_nio_Buffer_klass, java_nio_Buffer, Opt) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
160 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
161 /* If this class isn't present, it won't be referenced. */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
162 template(sun_misc_AtomicLongCSImpl_klass, sun_misc_AtomicLongCSImpl, Opt) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
163 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
164 template(sun_jkernel_DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
165 \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
166 /* Preload boxing klasses */ \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
167 template(boolean_klass, java_lang_Boolean, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
168 template(char_klass, java_lang_Character, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
169 template(float_klass, java_lang_Float, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
170 template(double_klass, java_lang_Double, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
171 template(byte_klass, java_lang_Byte, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
172 template(short_klass, java_lang_Short, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
173 template(int_klass, java_lang_Integer, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
174 template(long_klass, java_lang_Long, Pre) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
175 /*end*/ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
176 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
177 |
0 | 178 class SystemDictionary : AllStatic { |
179 friend class VMStructs; | |
180 friend class CompactingPermGenGen; | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
181 friend class SystemDictionaryHandles; |
0 | 182 NOT_PRODUCT(friend class instanceKlassKlass;) |
183 | |
184 public: | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
185 enum WKID { |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
186 NO_WKID = 0, |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
187 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
188 #define WK_KLASS_ENUM(name, ignore_s, ignore_o) WK_KLASS_ENUM_NAME(name), |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
189 WK_KLASSES_DO(WK_KLASS_ENUM) |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
190 #undef WK_KLASS_ENUM |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
191 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
192 WKID_LIMIT, |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
193 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
194 FIRST_WKID = NO_WKID + 1 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
195 }; |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
196 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
197 enum InitOption { |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
198 Pre, // preloaded; error if not present |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
199 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
200 // Order is significant. Options before this point require resolve_or_fail. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
201 // Options after this point will use resolve_or_null instead. |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
202 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
203 Opt, // preload tried; NULL if not present |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
204 Opt_Only_JDK14NewRef, // preload tried; use only with NewReflection |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
205 Opt_Only_JDK15, // preload tried; use only with JDK1.5+ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
206 Opt_Kernel, // preload tried only #ifdef KERNEL |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
207 OPTION_LIMIT, |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
208 CEIL_LG_OPTION_LIMIT = 4 // OPTION_LIMIT <= (1<<CEIL_LG_OPTION_LIMIT) |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
209 }; |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
210 |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
211 |
0 | 212 // Returns a class with a given class name and class loader. Loads the |
213 // class if needed. If not found a NoClassDefFoundError or a | |
214 // ClassNotFoundException is thrown, depending on the value on the | |
215 // throw_error flag. For most uses the throw_error argument should be set | |
216 // to true. | |
217 | |
218 static klassOop resolve_or_fail(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS); | |
219 // Convenient call for null loader and protection domain. | |
220 static klassOop resolve_or_fail(symbolHandle class_name, bool throw_error, TRAPS); | |
221 private: | |
222 // handle error translation for resolve_or_null results | |
223 static klassOop handle_resolution_exception(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS); | |
224 | |
225 public: | |
226 | |
227 // Returns a class with a given class name and class loader. | |
228 // Loads the class if needed. If not found NULL is returned. | |
229 static klassOop resolve_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); | |
230 // Version with null loader and protection domain | |
231 static klassOop resolve_or_null(symbolHandle class_name, TRAPS); | |
232 | |
233 // Resolve a superclass or superinterface. Called from ClassFileParser, | |
234 // parse_interfaces, resolve_instance_class_or_null, load_shared_class | |
235 // "child_name" is the class whose super class or interface is being resolved. | |
236 static klassOop resolve_super_or_fail(symbolHandle child_name, | |
237 symbolHandle class_name, | |
238 Handle class_loader, | |
239 Handle protection_domain, | |
240 bool is_superclass, | |
241 TRAPS); | |
242 | |
243 // Parse new stream. This won't update the system dictionary or | |
244 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses. | |
245 static klassOop parse_stream(symbolHandle class_name, | |
246 Handle class_loader, | |
247 Handle protection_domain, | |
248 ClassFileStream* st, | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
249 TRAPS) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
250 KlassHandle nullHandle; |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
251 return parse_stream(class_name, class_loader, protection_domain, st, nullHandle, NULL, THREAD); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
252 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
253 static klassOop parse_stream(symbolHandle class_name, |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
254 Handle class_loader, |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
255 Handle protection_domain, |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
256 ClassFileStream* st, |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
257 KlassHandle host_klass, |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
258 GrowableArray<Handle>* cp_patches, |
0 | 259 TRAPS); |
260 | |
261 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) | |
973
ad6585fd4087
6830542: Performance: JVM_DefineClass already verified.
acorn
parents:
726
diff
changeset
|
262 static klassOop resolve_from_stream(symbolHandle class_name, Handle class_loader, |
ad6585fd4087
6830542: Performance: JVM_DefineClass already verified.
acorn
parents:
726
diff
changeset
|
263 Handle protection_domain, |
ad6585fd4087
6830542: Performance: JVM_DefineClass already verified.
acorn
parents:
726
diff
changeset
|
264 ClassFileStream* st, bool verify, TRAPS); |
0 | 265 |
266 // Lookup an already loaded class. If not found NULL is returned. | |
267 static klassOop find(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); | |
268 | |
269 // Lookup an already loaded instance or array class. | |
270 // Do not make any queries to class loaders; consult only the cache. | |
271 // If not found NULL is returned. | |
272 static klassOop find_instance_or_array_klass(symbolHandle class_name, | |
273 Handle class_loader, | |
274 Handle protection_domain, | |
275 TRAPS); | |
276 | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
277 // If the given name is known to vmSymbols, return the well-know klass: |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
278 static klassOop find_well_known_klass(symbolOop class_name); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
279 |
0 | 280 // Lookup an instance or array class that has already been loaded |
281 // either into the given class loader, or else into another class | |
282 // loader that is constrained (via loader constraints) to produce | |
283 // a consistent class. Do not take protection domains into account. | |
284 // Do not make any queries to class loaders; consult only the cache. | |
285 // Return NULL if the class is not found. | |
286 // | |
287 // This function is a strict superset of find_instance_or_array_klass. | |
288 // This function (the unchecked version) makes a conservative prediction | |
289 // of the result of the checked version, assuming successful lookup. | |
290 // If both functions return non-null, they must return the same value. | |
291 // Also, the unchecked version may sometimes be non-null where the | |
292 // checked version is null. This can occur in several ways: | |
293 // 1. No query has yet been made to the class loader. | |
294 // 2. The class loader was queried, but chose not to delegate. | |
295 // 3. ClassLoader.checkPackageAccess rejected a proposed protection domain. | |
296 // 4. Loading was attempted, but there was a linkage error of some sort. | |
297 // In all of these cases, the loader constraints on this type are | |
298 // satisfied, and it is safe for classes in the given class loader | |
299 // to manipulate strongly-typed values of the found class, subject | |
300 // to local linkage and access checks. | |
301 static klassOop find_constrained_instance_or_array_klass(symbolHandle class_name, | |
302 Handle class_loader, | |
303 TRAPS); | |
304 | |
305 // Iterate over all klasses in dictionary | |
306 // Just the classes from defining class loaders | |
307 static void classes_do(void f(klassOop)); | |
308 // Added for initialize_itable_for_klass to handle exceptions | |
309 static void classes_do(void f(klassOop, TRAPS), TRAPS); | |
310 // All classes, and their class loaders | |
311 static void classes_do(void f(klassOop, oop)); | |
312 // All classes, and their class loaders | |
313 // (added for helpers that use HandleMarks and ResourceMarks) | |
314 static void classes_do(void f(klassOop, oop, TRAPS), TRAPS); | |
315 // All entries in the placeholder table and their class loaders | |
316 static void placeholders_do(void f(symbolOop, oop)); | |
317 | |
318 // Iterate over all methods in all klasses in dictionary | |
319 static void methods_do(void f(methodOop)); | |
320 | |
321 // Garbage collection support | |
322 | |
323 // This method applies "blk->do_oop" to all the pointers to "system" | |
324 // classes and loaders. | |
325 static void always_strong_oops_do(OopClosure* blk); | |
326 static void always_strong_classes_do(OopClosure* blk); | |
327 // This method applies "blk->do_oop" to all the placeholders. | |
328 static void placeholders_do(OopClosure* blk); | |
329 | |
330 // Unload (that is, break root links to) all unmarked classes and | |
331 // loaders. Returns "true" iff something was unloaded. | |
332 static bool do_unloading(BoolObjectClosure* is_alive); | |
333 | |
334 // Applies "f->do_oop" to all root oops in the system dictionary. | |
335 static void oops_do(OopClosure* f); | |
336 | |
337 // System loader lock | |
338 static oop system_loader_lock() { return _system_loader_lock_obj; } | |
339 | |
340 private: | |
341 // Traverses preloaded oops: various system classes. These are | |
342 // guaranteed to be in the perm gen. | |
343 static void preloaded_oops_do(OopClosure* f); | |
344 static void lazily_loaded_oops_do(OopClosure* f); | |
345 | |
346 public: | |
347 // Sharing support. | |
348 static void reorder_dictionary(); | |
349 static void copy_buckets(char** top, char* end); | |
350 static void copy_table(char** top, char* end); | |
351 static void reverse(); | |
352 static void set_shared_dictionary(HashtableBucket* t, int length, | |
353 int number_of_entries); | |
354 // Printing | |
355 static void print() PRODUCT_RETURN; | |
356 static void print_class_statistics() PRODUCT_RETURN; | |
357 static void print_method_statistics() PRODUCT_RETURN; | |
358 | |
359 // Number of contained klasses | |
360 // This is both fully loaded classes and classes in the process | |
361 // of being loaded | |
362 static int number_of_classes(); | |
363 | |
364 // Monotonically increasing counter which grows as classes are | |
365 // loaded or modifications such as hot-swapping or setting/removing | |
366 // of breakpoints are performed | |
367 static inline int number_of_modifications() { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; } | |
368 // Needed by evolution and breakpoint code | |
369 static inline void notice_modification() { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications; } | |
370 | |
371 // Verification | |
372 static void verify(); | |
373 | |
374 #ifdef ASSERT | |
375 static bool is_internal_format(symbolHandle class_name); | |
376 #endif | |
377 | |
378 // Verify class is in dictionary | |
379 static void verify_obj_klass_present(Handle obj, | |
380 symbolHandle class_name, | |
381 Handle class_loader); | |
382 | |
383 // Initialization | |
384 static void initialize(TRAPS); | |
385 | |
386 // Fast access to commonly used classes (preloaded) | |
387 static klassOop check_klass(klassOop k) { | |
388 assert(k != NULL, "preloaded klass not initialized"); | |
389 return k; | |
390 } | |
391 | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
392 static klassOop check_klass_Pre(klassOop k) { return check_klass(k); } |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
393 static klassOop check_klass_Opt(klassOop k) { return k; } |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
394 static klassOop check_klass_Opt_Kernel(klassOop k) { return k; } //== Opt |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
395 static klassOop check_klass_Opt_Only_JDK15(klassOop k) { |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
396 assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only"); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
397 return k; |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
398 } |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
399 static klassOop check_klass_Opt_Only_JDK14NewRef(klassOop k) { |
0 | 400 assert(JDK_Version::is_gte_jdk14x_version() && UseNewReflection, "JDK 1.4 only"); |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
401 // despite the optional loading, if you use this it must be present: |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
402 return check_klass(k); |
0 | 403 } |
404 | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
405 static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
406 static void initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
407 static void initialize_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) { |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
408 int limit = (int)end_id + 1; |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
409 initialize_wk_klasses_until((WKID) limit, start_id, THREAD); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
410 } |
0 | 411 |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
412 public: |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
413 #define WK_KLASS_DECLARE(name, ignore_symbol, option) \ |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
414 static klassOop name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
415 WK_KLASSES_DO(WK_KLASS_DECLARE); |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
416 #undef WK_KLASS_DECLARE |
0 | 417 |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
418 // Local definition for direct access to the private array: |
147 | 419 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] |
0 | 420 |
421 static klassOop box_klass(BasicType t) { | |
422 assert((uint)t < T_VOID+1, "range check"); | |
423 return check_klass(_box_klasses[t]); | |
424 } | |
425 static BasicType box_klass_type(klassOop k); // inverse of box_klass | |
426 | |
427 // methods returning lazily loaded klasses | |
428 // The corresponding method to load the class must be called before calling them. | |
429 static klassOop abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); } | |
430 | |
431 static void load_abstract_ownable_synchronizer_klass(TRAPS); | |
432 | |
433 private: | |
434 // Tells whether ClassLoader.loadClassInternal is present | |
435 static bool has_loadClassInternal() { return _has_loadClassInternal; } | |
436 | |
437 public: | |
438 // Tells whether ClassLoader.checkPackageAccess is present | |
439 static bool has_checkPackageAccess() { return _has_checkPackageAccess; } | |
440 | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
441 static bool class_klass_loaded() { return WK_KLASS(class_klass) != NULL; } |
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
442 static bool cloneable_klass_loaded() { return WK_KLASS(cloneable_klass) != NULL; } |
0 | 443 |
444 // Returns default system loader | |
445 static oop java_system_loader(); | |
446 | |
447 // Compute the default system loader | |
448 static void compute_java_system_loader(TRAPS); | |
449 | |
450 private: | |
451 // Mirrors for primitive classes (created eagerly) | |
452 static oop check_mirror(oop m) { | |
453 assert(m != NULL, "mirror not initialized"); | |
454 return m; | |
455 } | |
456 | |
457 public: | |
458 // Note: java_lang_Class::primitive_type is the inverse of java_mirror | |
459 | |
460 // Check class loader constraints | |
461 static bool add_loader_constraint(symbolHandle name, Handle loader1, | |
462 Handle loader2, TRAPS); | |
463 static char* check_signature_loaders(symbolHandle signature, Handle loader1, | |
464 Handle loader2, bool is_method, TRAPS); | |
465 | |
710 | 466 // JSR 292 |
467 // find the java.dyn.MethodHandles::invoke method for a given signature | |
468 static methodOop find_method_handle_invoke(symbolHandle signature, | |
469 Handle class_loader, | |
470 Handle protection_domain, | |
471 TRAPS); | |
472 // ask Java to compute the java.dyn.MethodType object for a given signature | |
473 static Handle compute_method_handle_type(symbolHandle signature, | |
474 Handle class_loader, | |
475 Handle protection_domain, | |
476 TRAPS); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
477 // ask Java to create a dynamic call site, while linking an invokedynamic op |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
478 static Handle make_dynamic_call_site(KlassHandle caller, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
479 int caller_method_idnum, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
480 int caller_bci, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
481 symbolHandle name, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
482 methodHandle mh_invoke, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
483 TRAPS); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
484 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
485 // coordinate with Java about bootstrap methods |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
486 static Handle find_bootstrap_method(KlassHandle caller, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
487 // This argument is non-null only when a |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
488 // classfile attribute has been found: |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
489 KlassHandle search_bootstrap_klass, |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
490 TRAPS); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
491 |
0 | 492 // Utility for printing loader "name" as part of tracing constraints |
493 static const char* loader_name(oop loader) { | |
494 return ((loader) == NULL ? "<bootloader>" : | |
495 instanceKlass::cast((loader)->klass())->name()->as_C_string() ); | |
496 } | |
497 | |
498 // Record the error when the first attempt to resolve a reference from a constant | |
499 // pool entry to a class fails. | |
500 static void add_resolution_error(constantPoolHandle pool, int which, symbolHandle error); | |
501 static symbolOop find_resolution_error(constantPoolHandle pool, int which); | |
502 | |
503 private: | |
504 | |
505 enum Constants { | |
506 _loader_constraint_size = 107, // number of entries in constraint table | |
507 _resolution_error_size = 107, // number of entries in resolution error table | |
710 | 508 _invoke_method_size = 139, // number of entries in invoke method table |
0 | 509 _nof_buckets = 1009 // number of buckets in hash table |
510 }; | |
511 | |
512 | |
513 // Static variables | |
514 | |
515 // Hashtable holding loaded classes. | |
516 static Dictionary* _dictionary; | |
517 | |
518 // Hashtable holding placeholders for classes being loaded. | |
519 static PlaceholderTable* _placeholders; | |
520 | |
521 // Hashtable holding classes from the shared archive. | |
522 static Dictionary* _shared_dictionary; | |
523 | |
524 // Monotonically increasing counter which grows with | |
525 // _number_of_classes as well as hot-swapping and breakpoint setting | |
526 // and removal. | |
527 static int _number_of_modifications; | |
528 | |
529 // Lock object for system class loader | |
530 static oop _system_loader_lock_obj; | |
531 | |
532 // Constraints on class loaders | |
533 static LoaderConstraintTable* _loader_constraints; | |
534 | |
535 // Resolution errors | |
536 static ResolutionErrorTable* _resolution_errors; | |
537 | |
710 | 538 // Invoke methods (JSR 292) |
539 static SymbolPropertyTable* _invoke_method_table; | |
540 | |
0 | 541 public: |
542 // for VM_CounterDecay iteration support | |
543 friend class CounterDecay; | |
544 static klassOop try_get_next_class(); | |
545 | |
546 private: | |
547 static void validate_protection_domain(instanceKlassHandle klass, | |
548 Handle class_loader, | |
549 Handle protection_domain, TRAPS); | |
550 | |
551 friend class VM_PopulateDumpSharedSpace; | |
552 friend class TraversePlaceholdersClosure; | |
553 static Dictionary* dictionary() { return _dictionary; } | |
554 static Dictionary* shared_dictionary() { return _shared_dictionary; } | |
555 static PlaceholderTable* placeholders() { return _placeholders; } | |
556 static LoaderConstraintTable* constraints() { return _loader_constraints; } | |
557 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } | |
710 | 558 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; } |
0 | 559 |
560 // Basic loading operations | |
561 static klassOop resolve_instance_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); | |
562 static klassOop resolve_array_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); | |
563 static instanceKlassHandle handle_parallel_super_load(symbolHandle class_name, symbolHandle supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); | |
564 // Wait on SystemDictionary_lock; unlocks lockObject before | |
565 // waiting; relocks lockObject with correct recursion count | |
566 // after waiting, but before reentering SystemDictionary_lock | |
567 // to preserve lock order semantics. | |
568 static void double_lock_wait(Handle lockObject, TRAPS); | |
569 static void define_instance_class(instanceKlassHandle k, TRAPS); | |
570 static instanceKlassHandle find_or_define_instance_class(symbolHandle class_name, | |
571 Handle class_loader, | |
572 instanceKlassHandle k, TRAPS); | |
573 static instanceKlassHandle load_shared_class(symbolHandle class_name, | |
574 Handle class_loader, TRAPS); | |
575 static instanceKlassHandle load_shared_class(instanceKlassHandle ik, | |
576 Handle class_loader, TRAPS); | |
577 static instanceKlassHandle load_instance_class(symbolHandle class_name, Handle class_loader, TRAPS); | |
578 static Handle compute_loader_lock_object(Handle class_loader, TRAPS); | |
579 static void check_loader_lock_contention(Handle loader_lock, TRAPS); | |
514 | 580 static bool is_parallelCapable(Handle class_loader); |
0 | 581 |
582 static klassOop find_shared_class(symbolHandle class_name); | |
583 | |
584 // Setup link to hierarchy | |
585 static void add_to_hierarchy(instanceKlassHandle k, TRAPS); | |
586 | |
587 private: | |
588 // We pass in the hashtable index so we can calculate it outside of | |
589 // the SystemDictionary_lock. | |
590 | |
591 // Basic find on loaded classes | |
592 static klassOop find_class(int index, unsigned int hash, | |
593 symbolHandle name, Handle loader); | |
594 | |
595 // Basic find on classes in the midst of being loaded | |
596 static symbolOop find_placeholder(int index, unsigned int hash, | |
597 symbolHandle name, Handle loader); | |
598 | |
599 // Basic find operation of loaded classes and classes in the midst | |
600 // of loading; used for assertions and verification only. | |
601 static oop find_class_or_placeholder(symbolHandle class_name, | |
602 Handle class_loader); | |
603 | |
604 // Updating entry in dictionary | |
605 // Add a completely loaded class | |
606 static void add_klass(int index, symbolHandle class_name, | |
607 Handle class_loader, KlassHandle obj); | |
608 | |
609 // Add a placeholder for a class being loaded | |
610 static void add_placeholder(int index, | |
611 symbolHandle class_name, | |
612 Handle class_loader); | |
613 static void remove_placeholder(int index, | |
614 symbolHandle class_name, | |
615 Handle class_loader); | |
616 | |
617 // Performs cleanups after resolve_super_or_fail. This typically needs | |
618 // to be called on failure. | |
619 // Won't throw, but can block. | |
620 static void resolution_cleanups(symbolHandle class_name, | |
621 Handle class_loader, | |
622 TRAPS); | |
623 | |
624 // Initialization | |
625 static void initialize_preloaded_classes(TRAPS); | |
626 | |
627 // Class loader constraints | |
628 static void check_constraints(int index, unsigned int hash, | |
629 instanceKlassHandle k, Handle loader, | |
630 bool defining, TRAPS); | |
631 static void update_dictionary(int d_index, unsigned int d_hash, | |
632 int p_index, unsigned int p_hash, | |
633 instanceKlassHandle k, Handle loader, TRAPS); | |
634 | |
635 // Variables holding commonly used klasses (preloaded) | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
636 static klassOop _well_known_klasses[]; |
0 | 637 |
638 // Lazily loaded klasses | |
639 static volatile klassOop _abstract_ownable_synchronizer_klass; | |
640 | |
132
60b728ec77c1
6652736: well known classes in system dictionary are inefficiently processed
jrose
parents:
0
diff
changeset
|
641 // table of box klasses (int_klass, etc.) |
0 | 642 static klassOop _box_klasses[T_VOID+1]; |
643 | |
644 static oop _java_system_loader; | |
645 | |
646 static bool _has_loadClassInternal; | |
647 static bool _has_checkPackageAccess; | |
648 }; | |
665
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
649 |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
650 // Cf. vmSymbols vs. vmSymbolHandles |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
651 class SystemDictionaryHandles : AllStatic { |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
652 public: |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
653 #define WK_KLASS_HANDLE_DECLARE(name, ignore_symbol, option) \ |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
654 static KlassHandle name() { \ |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
655 SystemDictionary::name(); \ |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
656 klassOop* loc = &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \ |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
657 return KlassHandle(loc, true); \ |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
658 } |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
659 WK_KLASSES_DO(WK_KLASS_HANDLE_DECLARE); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
660 #undef WK_KLASS_HANDLE_DECLARE |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
661 |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
662 static KlassHandle box_klass(BasicType t); |
c89f86385056
6814659: separable cleanups and subroutines for 6655638
jrose
parents:
579
diff
changeset
|
663 }; |