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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
579
0fbdb4381b99 6814575: Update copyright year
xdono
parents: 514
diff changeset
2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // The system dictionary stores all loaded classes and maps:
a61af66fc99e Initial load
duke
parents:
diff changeset
26 //
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // [class name,class loader] -> class i.e. [symbolOop,oop] -> klassOop
a61af66fc99e Initial load
duke
parents:
diff changeset
28 //
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Classes are loaded lazily. The default VM class loader is
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // represented as NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // The underlying data structure is an open hash table with a fixed number
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // of buckets. During loading the loader object is locked, (for the VM loader
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // a private lock object is used). Class loading can thus be done concurrently,
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // but only by different loaders.
a61af66fc99e Initial load
duke
parents:
diff changeset
36 //
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // During loading a placeholder (name, loader) is temporarily placed in
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // a side data structure, and is used to detect ClassCircularityErrors
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // and to perform verification during GC. A GC can occur in the midst
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // of class loading, as we call out to Java, have to take locks, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
41 //
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // When class loading is finished, a new entry is added to the system
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // dictionary and the place holder is removed. Note that the protection
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // domain field of the system dictionary has not yet been filled in when
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // the "real" system dictionary entry is created.
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // Clients of this class who are interested in finding if a class has
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // been completely loaded -- not classes in the process of being loaded --
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // can read the SystemDictionary unlocked. This is safe because
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // - entries are only deleted at safepoints
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // - readers cannot come to a safepoint while actively examining
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // an entry (an entry cannot be deleted from under a reader)
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // - entries must be fully formed before they are available to concurrent
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // readers (we must ensure write ordering)
a61af66fc99e Initial load
duke
parents:
diff changeset
55 //
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Note that placeholders are deleted at any time, as they are removed
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // when a class is completely loaded. Therefore, readers as well as writers
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // of placeholders must hold the SystemDictionary_lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class Dictionary;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class PlaceholderTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class LoaderConstraintTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class HashtableBucket;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class ResolutionErrorTable;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
66 class SymbolPropertyTable;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
135 /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
136 template(MethodHandle_klass, java_dyn_MethodHandle, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
137 template(MemberName_klass, sun_dyn_MemberName, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
138 template(MethodHandleImpl_klass, sun_dyn_MethodHandleImpl, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
139 template(AdapterMethodHandle_klass, sun_dyn_AdapterMethodHandle, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
140 template(BoundMethodHandle_klass, sun_dyn_BoundMethodHandle, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
141 template(DirectMethodHandle_klass, sun_dyn_DirectMethodHandle, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
142 template(MethodType_klass, java_dyn_MethodType, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
143 template(MethodTypeForm_klass, java_dyn_MethodTypeForm, Opt) \
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
178 class SystemDictionary : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 friend class CompactingPermGenGen;
665
c89f86385056 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 579
diff changeset
181 friend class SystemDictionaryHandles;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 NOT_PRODUCT(friend class instanceKlassKlass;)
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Returns a class with a given class name and class loader. Loads the
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // class if needed. If not found a NoClassDefFoundError or a
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // ClassNotFoundException is thrown, depending on the value on the
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // throw_error flag. For most uses the throw_error argument should be set
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // to true.
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 static klassOop resolve_or_fail(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Convenient call for null loader and protection domain.
a61af66fc99e Initial load
duke
parents:
diff changeset
220 static klassOop resolve_or_fail(symbolHandle class_name, bool throw_error, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // handle error translation for resolve_or_null results
a61af66fc99e Initial load
duke
parents:
diff changeset
223 static klassOop handle_resolution_exception(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Returns a class with a given class name and class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Loads the class if needed. If not found NULL is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 static klassOop resolve_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Version with null loader and protection domain
a61af66fc99e Initial load
duke
parents:
diff changeset
231 static klassOop resolve_or_null(symbolHandle class_name, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Resolve a superclass or superinterface. Called from ClassFileParser,
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // parse_interfaces, resolve_instance_class_or_null, load_shared_class
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // "child_name" is the class whose super class or interface is being resolved.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 static klassOop resolve_super_or_fail(symbolHandle child_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
237 symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
238 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
239 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
240 bool is_superclass,
a61af66fc99e Initial load
duke
parents:
diff changeset
241 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // Parse new stream. This won't update the system dictionary or
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
245 static klassOop parse_stream(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
246 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
247 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
259 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Lookup an already loaded class. If not found NULL is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
267 static klassOop find(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Lookup an already loaded instance or array class.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // Do not make any queries to class loaders; consult only the cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // If not found NULL is returned.
a61af66fc99e Initial load
duke
parents:
diff changeset
272 static klassOop find_instance_or_array_klass(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
273 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
274 Handle protection_domain,
a61af66fc99e Initial load
duke
parents:
diff changeset
275 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
280 // Lookup an instance or array class that has already been loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // either into the given class loader, or else into another class
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // loader that is constrained (via loader constraints) to produce
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // a consistent class. Do not take protection domains into account.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Do not make any queries to class loaders; consult only the cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // Return NULL if the class is not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
286 //
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // This function is a strict superset of find_instance_or_array_klass.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // This function (the unchecked version) makes a conservative prediction
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // of the result of the checked version, assuming successful lookup.
a61af66fc99e Initial load
duke
parents:
diff changeset
290 // If both functions return non-null, they must return the same value.
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // Also, the unchecked version may sometimes be non-null where the
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // checked version is null. This can occur in several ways:
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // 1. No query has yet been made to the class loader.
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // 2. The class loader was queried, but chose not to delegate.
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // 3. ClassLoader.checkPackageAccess rejected a proposed protection domain.
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // 4. Loading was attempted, but there was a linkage error of some sort.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // In all of these cases, the loader constraints on this type are
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // satisfied, and it is safe for classes in the given class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // to manipulate strongly-typed values of the found class, subject
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // to local linkage and access checks.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 static klassOop find_constrained_instance_or_array_klass(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
302 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
303 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Iterate over all klasses in dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // Just the classes from defining class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
307 static void classes_do(void f(klassOop));
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Added for initialize_itable_for_klass to handle exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static void classes_do(void f(klassOop, TRAPS), TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // All classes, and their class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
311 static void classes_do(void f(klassOop, oop));
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // All classes, and their class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // (added for helpers that use HandleMarks and ResourceMarks)
a61af66fc99e Initial load
duke
parents:
diff changeset
314 static void classes_do(void f(klassOop, oop, TRAPS), TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // All entries in the placeholder table and their class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
316 static void placeholders_do(void f(symbolOop, oop));
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Iterate over all methods in all klasses in dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
319 static void methods_do(void f(methodOop));
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // Garbage collection support
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // This method applies "blk->do_oop" to all the pointers to "system"
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // classes and loaders.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 static void always_strong_oops_do(OopClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 static void always_strong_classes_do(OopClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // This method applies "blk->do_oop" to all the placeholders.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 static void placeholders_do(OopClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Unload (that is, break root links to) all unmarked classes and
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // loaders. Returns "true" iff something was unloaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
332 static bool do_unloading(BoolObjectClosure* is_alive);
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Applies "f->do_oop" to all root oops in the system dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
335 static void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // System loader lock
a61af66fc99e Initial load
duke
parents:
diff changeset
338 static oop system_loader_lock() { return _system_loader_lock_obj; }
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // Traverses preloaded oops: various system classes. These are
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // guaranteed to be in the perm gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 static void preloaded_oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
344 static void lazily_loaded_oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Sharing support.
a61af66fc99e Initial load
duke
parents:
diff changeset
348 static void reorder_dictionary();
a61af66fc99e Initial load
duke
parents:
diff changeset
349 static void copy_buckets(char** top, char* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 static void copy_table(char** top, char* end);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 static void reverse();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 static void set_shared_dictionary(HashtableBucket* t, int length,
a61af66fc99e Initial load
duke
parents:
diff changeset
353 int number_of_entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
355 static void print() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 static void print_class_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 static void print_method_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // Number of contained klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // This is both fully loaded classes and classes in the process
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // of being loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
362 static int number_of_classes();
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 // Monotonically increasing counter which grows as classes are
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // loaded or modifications such as hot-swapping or setting/removing
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // of breakpoints are performed
a61af66fc99e Initial load
duke
parents:
diff changeset
367 static inline int number_of_modifications() { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Needed by evolution and breakpoint code
a61af66fc99e Initial load
duke
parents:
diff changeset
369 static inline void notice_modification() { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications; }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // Verification
a61af66fc99e Initial load
duke
parents:
diff changeset
372 static void verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
375 static bool is_internal_format(symbolHandle class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
376 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // Verify class is in dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
379 static void verify_obj_klass_present(Handle obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
380 symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
381 Handle class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
384 static void initialize(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // Fast access to commonly used classes (preloaded)
a61af66fc99e Initial load
duke
parents:
diff changeset
387 static klassOop check_klass(klassOop k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(k != NULL, "preloaded klass not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
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
83c868b757c0 6701024: SAJDI functionality is broken
jrose
parents: 132
diff changeset
419 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 static klassOop box_klass(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 assert((uint)t < T_VOID+1, "range check");
a61af66fc99e Initial load
duke
parents:
diff changeset
423 return check_klass(_box_klasses[t]);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 static BasicType box_klass_type(klassOop k); // inverse of box_klass
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // methods returning lazily loaded klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // The corresponding method to load the class must be called before calling them.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 static klassOop abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 static void load_abstract_ownable_synchronizer_klass(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
434 // Tells whether ClassLoader.loadClassInternal is present
a61af66fc99e Initial load
duke
parents:
diff changeset
435 static bool has_loadClassInternal() { return _has_loadClassInternal; }
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // Tells whether ClassLoader.checkPackageAccess is present
a61af66fc99e Initial load
duke
parents:
diff changeset
439 static bool has_checkPackageAccess() { return _has_checkPackageAccess; }
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // Returns default system loader
a61af66fc99e Initial load
duke
parents:
diff changeset
445 static oop java_system_loader();
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Compute the default system loader
a61af66fc99e Initial load
duke
parents:
diff changeset
448 static void compute_java_system_loader(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // Mirrors for primitive classes (created eagerly)
a61af66fc99e Initial load
duke
parents:
diff changeset
452 static oop check_mirror(oop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 assert(m != NULL, "mirror not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
454 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Note: java_lang_Class::primitive_type is the inverse of java_mirror
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // Check class loader constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
461 static bool add_loader_constraint(symbolHandle name, Handle loader1,
a61af66fc99e Initial load
duke
parents:
diff changeset
462 Handle loader2, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
463 static char* check_signature_loaders(symbolHandle signature, Handle loader1,
a61af66fc99e Initial load
duke
parents:
diff changeset
464 Handle loader2, bool is_method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
465
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
466 // JSR 292
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
467 // find the java.dyn.MethodHandles::invoke method for a given signature
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
468 static methodOop find_method_handle_invoke(symbolHandle signature,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
469 Handle class_loader,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
470 Handle protection_domain,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
471 TRAPS);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
472 // ask Java to compute the java.dyn.MethodType object for a given signature
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
473 static Handle compute_method_handle_type(symbolHandle signature,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
474 Handle class_loader,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
475 Handle protection_domain,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // Utility for printing loader "name" as part of tracing constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
493 static const char* loader_name(oop loader) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 return ((loader) == NULL ? "<bootloader>" :
a61af66fc99e Initial load
duke
parents:
diff changeset
495 instanceKlass::cast((loader)->klass())->name()->as_C_string() );
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // Record the error when the first attempt to resolve a reference from a constant
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // pool entry to a class fails.
a61af66fc99e Initial load
duke
parents:
diff changeset
500 static void add_resolution_error(constantPoolHandle pool, int which, symbolHandle error);
a61af66fc99e Initial load
duke
parents:
diff changeset
501 static symbolOop find_resolution_error(constantPoolHandle pool, int which);
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 enum Constants {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 _loader_constraint_size = 107, // number of entries in constraint table
a61af66fc99e Initial load
duke
parents:
diff changeset
507 _resolution_error_size = 107, // number of entries in resolution error table
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
508 _invoke_method_size = 139, // number of entries in invoke method table
0
a61af66fc99e Initial load
duke
parents:
diff changeset
509 _nof_buckets = 1009 // number of buckets in hash table
a61af66fc99e Initial load
duke
parents:
diff changeset
510 };
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // Static variables
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // Hashtable holding loaded classes.
a61af66fc99e Initial load
duke
parents:
diff changeset
516 static Dictionary* _dictionary;
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 // Hashtable holding placeholders for classes being loaded.
a61af66fc99e Initial load
duke
parents:
diff changeset
519 static PlaceholderTable* _placeholders;
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Hashtable holding classes from the shared archive.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 static Dictionary* _shared_dictionary;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Monotonically increasing counter which grows with
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // _number_of_classes as well as hot-swapping and breakpoint setting
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // and removal.
a61af66fc99e Initial load
duke
parents:
diff changeset
527 static int _number_of_modifications;
a61af66fc99e Initial load
duke
parents:
diff changeset
528
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // Lock object for system class loader
a61af66fc99e Initial load
duke
parents:
diff changeset
530 static oop _system_loader_lock_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
531
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // Constraints on class loaders
a61af66fc99e Initial load
duke
parents:
diff changeset
533 static LoaderConstraintTable* _loader_constraints;
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // Resolution errors
a61af66fc99e Initial load
duke
parents:
diff changeset
536 static ResolutionErrorTable* _resolution_errors;
a61af66fc99e Initial load
duke
parents:
diff changeset
537
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
538 // Invoke methods (JSR 292)
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
539 static SymbolPropertyTable* _invoke_method_table;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
540
0
a61af66fc99e Initial load
duke
parents:
diff changeset
541 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // for VM_CounterDecay iteration support
a61af66fc99e Initial load
duke
parents:
diff changeset
543 friend class CounterDecay;
a61af66fc99e Initial load
duke
parents:
diff changeset
544 static klassOop try_get_next_class();
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
547 static void validate_protection_domain(instanceKlassHandle klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
548 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
549 Handle protection_domain, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 friend class VM_PopulateDumpSharedSpace;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 friend class TraversePlaceholdersClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 static Dictionary* dictionary() { return _dictionary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 static Dictionary* shared_dictionary() { return _shared_dictionary; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 static PlaceholderTable* placeholders() { return _placeholders; }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 static LoaderConstraintTable* constraints() { return _loader_constraints; }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 665
diff changeset
558 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Basic loading operations
a61af66fc99e Initial load
duke
parents:
diff changeset
561 static klassOop resolve_instance_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 static klassOop resolve_array_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 static instanceKlassHandle handle_parallel_super_load(symbolHandle class_name, symbolHandle supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // Wait on SystemDictionary_lock; unlocks lockObject before
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // waiting; relocks lockObject with correct recursion count
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // after waiting, but before reentering SystemDictionary_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // to preserve lock order semantics.
a61af66fc99e Initial load
duke
parents:
diff changeset
568 static void double_lock_wait(Handle lockObject, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
569 static void define_instance_class(instanceKlassHandle k, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
570 static instanceKlassHandle find_or_define_instance_class(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
571 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
572 instanceKlassHandle k, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 static instanceKlassHandle load_shared_class(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
574 Handle class_loader, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
575 static instanceKlassHandle load_shared_class(instanceKlassHandle ik,
a61af66fc99e Initial load
duke
parents:
diff changeset
576 Handle class_loader, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 static instanceKlassHandle load_instance_class(symbolHandle class_name, Handle class_loader, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 static Handle compute_loader_lock_object(Handle class_loader, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 static void check_loader_lock_contention(Handle loader_lock, TRAPS);
514
c81d2ef51ca3 4670071: loadClassInternal is too restrictive.
acorn
parents: 431
diff changeset
580 static bool is_parallelCapable(Handle class_loader);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582 static klassOop find_shared_class(symbolHandle class_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // Setup link to hierarchy
a61af66fc99e Initial load
duke
parents:
diff changeset
585 static void add_to_hierarchy(instanceKlassHandle k, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // We pass in the hashtable index so we can calculate it outside of
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // the SystemDictionary_lock.
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Basic find on loaded classes
a61af66fc99e Initial load
duke
parents:
diff changeset
592 static klassOop find_class(int index, unsigned int hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
593 symbolHandle name, Handle loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // Basic find on classes in the midst of being loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
596 static symbolOop find_placeholder(int index, unsigned int hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
597 symbolHandle name, Handle loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // Basic find operation of loaded classes and classes in the midst
a61af66fc99e Initial load
duke
parents:
diff changeset
600 // of loading; used for assertions and verification only.
a61af66fc99e Initial load
duke
parents:
diff changeset
601 static oop find_class_or_placeholder(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
602 Handle class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // Updating entry in dictionary
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // Add a completely loaded class
a61af66fc99e Initial load
duke
parents:
diff changeset
606 static void add_klass(int index, symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
607 Handle class_loader, KlassHandle obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
608
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // Add a placeholder for a class being loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
610 static void add_placeholder(int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
611 symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
612 Handle class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 static void remove_placeholder(int index,
a61af66fc99e Initial load
duke
parents:
diff changeset
614 symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
615 Handle class_loader);
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // Performs cleanups after resolve_super_or_fail. This typically needs
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // to be called on failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // Won't throw, but can block.
a61af66fc99e Initial load
duke
parents:
diff changeset
620 static void resolution_cleanups(symbolHandle class_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
621 Handle class_loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
622 TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
625 static void initialize_preloaded_classes(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // Class loader constraints
a61af66fc99e Initial load
duke
parents:
diff changeset
628 static void check_constraints(int index, unsigned int hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
629 instanceKlassHandle k, Handle loader,
a61af66fc99e Initial load
duke
parents:
diff changeset
630 bool defining, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
631 static void update_dictionary(int d_index, unsigned int d_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
632 int p_index, unsigned int p_hash,
a61af66fc99e Initial load
duke
parents:
diff changeset
633 instanceKlassHandle k, Handle loader, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // Lazily loaded klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
639 static volatile klassOop _abstract_ownable_synchronizer_klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
642 static klassOop _box_klasses[T_VOID+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 static oop _java_system_loader;
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 static bool _has_loadClassInternal;
a61af66fc99e Initial load
duke
parents:
diff changeset
647 static bool _has_checkPackageAccess;
a61af66fc99e Initial load
duke
parents:
diff changeset
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 };