1/*
2 * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_CLASSFILE_SYSTEMDICTIONARY_HPP
26#define SHARE_CLASSFILE_SYSTEMDICTIONARY_HPP
27
28#include "classfile/classLoaderData.hpp"
29#include "oops/objArrayOop.hpp"
30#include "oops/symbol.hpp"
31#include "runtime/java.hpp"
32#include "runtime/mutexLocker.hpp"
33#include "runtime/reflectionUtils.hpp"
34#include "runtime/signature.hpp"
35#include "utilities/hashtable.hpp"
36
37// The dictionary in each ClassLoaderData stores all loaded classes, either
38// initiatied by its class loader or defined by its class loader:
39//
40// class loader -> ClassLoaderData -> [class, protection domain set]
41//
42// Classes are loaded lazily. The default VM class loader is
43// represented as NULL.
44
45// The underlying data structure is an open hash table (Dictionary) per
46// ClassLoaderData with a fixed number of buckets. During loading the
47// class loader object is locked, (for the VM loader a private lock object is used).
48// The global SystemDictionary_lock is held for all additions into the ClassLoaderData
49// dictionaries. TODO: fix lock granularity so that class loading can
50// be done concurrently, but only by different loaders.
51//
52// During loading a placeholder (name, loader) is temporarily placed in
53// a side data structure, and is used to detect ClassCircularityErrors
54// and to perform verification during GC. A GC can occur in the midst
55// of class loading, as we call out to Java, have to take locks, etc.
56//
57// When class loading is finished, a new entry is added to the dictionary
58// of the class loader and the placeholder is removed. Note that the protection
59// domain field of the dictionary entry has not yet been filled in when
60// the "real" dictionary entry is created.
61//
62// Clients of this class who are interested in finding if a class has
63// been completely loaded -- not classes in the process of being loaded --
64// can read the dictionary unlocked. This is safe because
65// - entries are only deleted at safepoints
66// - readers cannot come to a safepoint while actively examining
67// an entry (an entry cannot be deleted from under a reader)
68// - entries must be fully formed before they are available to concurrent
69// readers (we must ensure write ordering)
70//
71// Note that placeholders are deleted at any time, as they are removed
72// when a class is completely loaded. Therefore, readers as well as writers
73// of placeholders must hold the SystemDictionary_lock.
74//
75
76class BootstrapInfo;
77class ClassFileStream;
78class Dictionary;
79class PlaceholderTable;
80class LoaderConstraintTable;
81template <MEMFLAGS F> class HashtableBucket;
82class ResolutionErrorTable;
83class SymbolPropertyTable;
84class ProtectionDomainCacheTable;
85class ProtectionDomainCacheEntry;
86class GCTimer;
87class OopStorage;
88
89#define WK_KLASS_ENUM_NAME(kname) kname##_knum
90
91// Certain classes, such as java.lang.Object and java.lang.String,
92// are "well-known", in the sense that no class loader is allowed
93// to provide a different definition.
94//
95// Each well-known class has a short klass name (like object_klass),
96// and a vmSymbol name (like java_lang_Object).
97//
98// The order of these definitions is significant: the classes are
99// resolved during early VM start-up by resolve_well_known_classes
100// in this order. Changing the order may require careful restructuring
101// of the VM start-up sequence.
102//
103#define WK_KLASSES_DO(do_klass) \
104 /* well-known classes */ \
105 do_klass(Object_klass, java_lang_Object ) \
106 do_klass(String_klass, java_lang_String ) \
107 do_klass(Class_klass, java_lang_Class ) \
108 do_klass(Cloneable_klass, java_lang_Cloneable ) \
109 do_klass(ClassLoader_klass, java_lang_ClassLoader ) \
110 do_klass(Serializable_klass, java_io_Serializable ) \
111 do_klass(System_klass, java_lang_System ) \
112 do_klass(Throwable_klass, java_lang_Throwable ) \
113 do_klass(Error_klass, java_lang_Error ) \
114 do_klass(ThreadDeath_klass, java_lang_ThreadDeath ) \
115 do_klass(Exception_klass, java_lang_Exception ) \
116 do_klass(RuntimeException_klass, java_lang_RuntimeException ) \
117 do_klass(SecurityManager_klass, java_lang_SecurityManager ) \
118 do_klass(ProtectionDomain_klass, java_security_ProtectionDomain ) \
119 do_klass(AccessControlContext_klass, java_security_AccessControlContext ) \
120 do_klass(AccessController_klass, java_security_AccessController ) \
121 do_klass(SecureClassLoader_klass, java_security_SecureClassLoader ) \
122 do_klass(ClassNotFoundException_klass, java_lang_ClassNotFoundException ) \
123 do_klass(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError ) \
124 do_klass(LinkageError_klass, java_lang_LinkageError ) \
125 do_klass(ClassCastException_klass, java_lang_ClassCastException ) \
126 do_klass(ArrayStoreException_klass, java_lang_ArrayStoreException ) \
127 do_klass(VirtualMachineError_klass, java_lang_VirtualMachineError ) \
128 do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError ) \
129 do_klass(StackOverflowError_klass, java_lang_StackOverflowError ) \
130 do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException ) \
131 do_klass(Reference_klass, java_lang_ref_Reference ) \
132 \
133 /* ref klasses and set reference types */ \
134 do_klass(SoftReference_klass, java_lang_ref_SoftReference ) \
135 do_klass(WeakReference_klass, java_lang_ref_WeakReference ) \
136 do_klass(FinalReference_klass, java_lang_ref_FinalReference ) \
137 do_klass(PhantomReference_klass, java_lang_ref_PhantomReference ) \
138 do_klass(Finalizer_klass, java_lang_ref_Finalizer ) \
139 \
140 do_klass(Thread_klass, java_lang_Thread ) \
141 do_klass(ThreadGroup_klass, java_lang_ThreadGroup ) \
142 do_klass(Properties_klass, java_util_Properties ) \
143 do_klass(Module_klass, java_lang_Module ) \
144 do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject ) \
145 do_klass(reflect_Field_klass, java_lang_reflect_Field ) \
146 do_klass(reflect_Parameter_klass, java_lang_reflect_Parameter ) \
147 do_klass(reflect_Method_klass, java_lang_reflect_Method ) \
148 do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor ) \
149 \
150 /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \
151 /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
152 do_klass(reflect_MagicAccessorImpl_klass, reflect_MagicAccessorImpl ) \
153 do_klass(reflect_MethodAccessorImpl_klass, reflect_MethodAccessorImpl ) \
154 do_klass(reflect_ConstructorAccessorImpl_klass, reflect_ConstructorAccessorImpl ) \
155 do_klass(reflect_DelegatingClassLoader_klass, reflect_DelegatingClassLoader ) \
156 do_klass(reflect_ConstantPool_klass, reflect_ConstantPool ) \
157 do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, reflect_UnsafeStaticFieldAccessorImpl ) \
158 do_klass(reflect_CallerSensitive_klass, reflect_CallerSensitive ) \
159 \
160 /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
161 do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle ) \
162 do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle ) \
163 do_klass(VarHandle_klass, java_lang_invoke_VarHandle ) \
164 do_klass(MemberName_klass, java_lang_invoke_MemberName ) \
165 do_klass(ResolvedMethodName_klass, java_lang_invoke_ResolvedMethodName ) \
166 do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives ) \
167 do_klass(LambdaForm_klass, java_lang_invoke_LambdaForm ) \
168 do_klass(MethodType_klass, java_lang_invoke_MethodType ) \
169 do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError ) \
170 do_klass(CallSite_klass, java_lang_invoke_CallSite ) \
171 do_klass(Context_klass, java_lang_invoke_MethodHandleNatives_CallSiteContext ) \
172 do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite ) \
173 do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite ) \
174 do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite ) \
175 /* Note: MethodHandle must be first, and VolatileCallSite last in group */ \
176 \
177 do_klass(AssertionStatusDirectives_klass, java_lang_AssertionStatusDirectives ) \
178 do_klass(StringBuffer_klass, java_lang_StringBuffer ) \
179 do_klass(StringBuilder_klass, java_lang_StringBuilder ) \
180 do_klass(UnsafeConstants_klass, jdk_internal_misc_UnsafeConstants ) \
181 do_klass(internal_Unsafe_klass, jdk_internal_misc_Unsafe ) \
182 do_klass(module_Modules_klass, jdk_internal_module_Modules ) \
183 \
184 /* support for CDS */ \
185 do_klass(ByteArrayInputStream_klass, java_io_ByteArrayInputStream ) \
186 do_klass(URL_klass, java_net_URL ) \
187 do_klass(Jar_Manifest_klass, java_util_jar_Manifest ) \
188 do_klass(jdk_internal_loader_ClassLoaders_klass, jdk_internal_loader_ClassLoaders ) \
189 do_klass(jdk_internal_loader_ClassLoaders_AppClassLoader_klass, jdk_internal_loader_ClassLoaders_AppClassLoader) \
190 do_klass(jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass, jdk_internal_loader_ClassLoaders_PlatformClassLoader) \
191 do_klass(CodeSource_klass, java_security_CodeSource ) \
192 \
193 do_klass(StackTraceElement_klass, java_lang_StackTraceElement ) \
194 \
195 /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
196 do_klass(nio_Buffer_klass, java_nio_Buffer ) \
197 \
198 /* Stack Walking */ \
199 do_klass(StackWalker_klass, java_lang_StackWalker ) \
200 do_klass(AbstractStackWalker_klass, java_lang_StackStreamFactory_AbstractStackWalker ) \
201 do_klass(StackFrameInfo_klass, java_lang_StackFrameInfo ) \
202 do_klass(LiveStackFrameInfo_klass, java_lang_LiveStackFrameInfo ) \
203 \
204 /* support for stack dump lock analysis */ \
205 do_klass(java_util_concurrent_locks_AbstractOwnableSynchronizer_klass, java_util_concurrent_locks_AbstractOwnableSynchronizer) \
206 \
207 /* boxing klasses */ \
208 do_klass(Boolean_klass, java_lang_Boolean ) \
209 do_klass(Character_klass, java_lang_Character ) \
210 do_klass(Float_klass, java_lang_Float ) \
211 do_klass(Double_klass, java_lang_Double ) \
212 do_klass(Byte_klass, java_lang_Byte ) \
213 do_klass(Short_klass, java_lang_Short ) \
214 do_klass(Integer_klass, java_lang_Integer ) \
215 do_klass(Long_klass, java_lang_Long ) \
216 \
217 /* force inline of iterators */ \
218 do_klass(Iterator_klass, java_util_Iterator ) \
219 \
220 /*end*/
221
222
223class SystemDictionary : AllStatic {
224 friend class BootstrapInfo;
225 friend class VMStructs;
226 friend class SystemDictionaryHandles;
227
228 public:
229 enum WKID {
230 NO_WKID = 0,
231
232 #define WK_KLASS_ENUM(name, symbol) WK_KLASS_ENUM_NAME(name), WK_KLASS_ENUM_NAME(symbol) = WK_KLASS_ENUM_NAME(name),
233 WK_KLASSES_DO(WK_KLASS_ENUM)
234 #undef WK_KLASS_ENUM
235
236 WKID_LIMIT,
237
238 FIRST_WKID = NO_WKID + 1
239 };
240
241 // Returns a class with a given class name and class loader. Loads the
242 // class if needed. If not found a NoClassDefFoundError or a
243 // ClassNotFoundException is thrown, depending on the value on the
244 // throw_error flag. For most uses the throw_error argument should be set
245 // to true.
246
247 static Klass* resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS);
248 // Convenient call for null loader and protection domain.
249 static Klass* resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS);
250protected:
251 // handle error translation for resolve_or_null results
252 static Klass* handle_resolution_exception(Symbol* class_name, bool throw_error, Klass* klass, TRAPS);
253
254public:
255
256 // Returns a class with a given class name and class loader.
257 // Loads the class if needed. If not found NULL is returned.
258 static Klass* resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
259 // Version with null loader and protection domain
260 static Klass* resolve_or_null(Symbol* class_name, TRAPS);
261
262 // Resolve a superclass or superinterface. Called from ClassFileParser,
263 // parse_interfaces, resolve_instance_class_or_null, load_shared_class
264 // "child_name" is the class whose super class or interface is being resolved.
265 static InstanceKlass* resolve_super_or_fail(Symbol* child_name,
266 Symbol* class_name,
267 Handle class_loader,
268 Handle protection_domain,
269 bool is_superclass,
270 TRAPS);
271
272 // Parse new stream. This won't update the dictionary or
273 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses.
274 // Also used by Unsafe_DefineAnonymousClass
275 static InstanceKlass* parse_stream(Symbol* class_name,
276 Handle class_loader,
277 Handle protection_domain,
278 ClassFileStream* st,
279 TRAPS) {
280 return parse_stream(class_name,
281 class_loader,
282 protection_domain,
283 st,
284 NULL, // unsafe_anonymous_host
285 NULL, // cp_patches
286 THREAD);
287 }
288 static InstanceKlass* parse_stream(Symbol* class_name,
289 Handle class_loader,
290 Handle protection_domain,
291 ClassFileStream* st,
292 const InstanceKlass* unsafe_anonymous_host,
293 GrowableArray<Handle>* cp_patches,
294 TRAPS);
295
296 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
297 static InstanceKlass* resolve_from_stream(Symbol* class_name,
298 Handle class_loader,
299 Handle protection_domain,
300 ClassFileStream* st,
301 TRAPS);
302
303 // Lookup an already loaded class. If not found NULL is returned.
304 static Klass* find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
305
306 // Lookup an already loaded instance or array class.
307 // Do not make any queries to class loaders; consult only the cache.
308 // If not found NULL is returned.
309 static Klass* find_instance_or_array_klass(Symbol* class_name,
310 Handle class_loader,
311 Handle protection_domain,
312 TRAPS);
313
314 // Lookup an instance or array class that has already been loaded
315 // either into the given class loader, or else into another class
316 // loader that is constrained (via loader constraints) to produce
317 // a consistent class. Do not take protection domains into account.
318 // Do not make any queries to class loaders; consult only the cache.
319 // Return NULL if the class is not found.
320 //
321 // This function is a strict superset of find_instance_or_array_klass.
322 // This function (the unchecked version) makes a conservative prediction
323 // of the result of the checked version, assuming successful lookup.
324 // If both functions return non-null, they must return the same value.
325 // Also, the unchecked version may sometimes be non-null where the
326 // checked version is null. This can occur in several ways:
327 // 1. No query has yet been made to the class loader.
328 // 2. The class loader was queried, but chose not to delegate.
329 // 3. ClassLoader.checkPackageAccess rejected a proposed protection domain.
330 // 4. Loading was attempted, but there was a linkage error of some sort.
331 // In all of these cases, the loader constraints on this type are
332 // satisfied, and it is safe for classes in the given class loader
333 // to manipulate strongly-typed values of the found class, subject
334 // to local linkage and access checks.
335 static Klass* find_constrained_instance_or_array_klass(Symbol* class_name,
336 Handle class_loader,
337 TRAPS);
338
339 static void classes_do(MetaspaceClosure* it);
340 // Iterate over all methods in all klasses
341
342 static void methods_do(void f(Method*));
343
344 // Garbage collection support
345
346 // Unload (that is, break root links to) all unmarked classes and
347 // loaders. Returns "true" iff something was unloaded.
348 static bool do_unloading(GCTimer* gc_timer);
349
350 // Applies "f->do_oop" to all root oops in the system dictionary.
351 static void oops_do(OopClosure* f);
352
353 // System loader lock
354 static oop system_loader_lock() { return _system_loader_lock_obj; }
355
356 // Protection Domain Table
357 static ProtectionDomainCacheTable* pd_cache_table() { return _pd_cache_table; }
358
359public:
360 // Printing
361 static void print();
362 static void print_on(outputStream* st);
363 static void dump(outputStream* st, bool verbose);
364
365 // Monotonically increasing counter which grows as classes are
366 // loaded or modifications such as hot-swapping or setting/removing
367 // of breakpoints are performed
368 static inline int number_of_modifications() { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; }
369 // Needed by evolution and breakpoint code
370 static inline void notice_modification() { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications; }
371
372 // Verification
373 static void verify();
374
375 // Initialization
376 static void initialize(TRAPS);
377
378 // Checked fast access to the well-known classes -- so that you don't try to use them
379 // before they are resolved.
380 static InstanceKlass* check_klass(InstanceKlass* k) {
381 assert(k != NULL, "klass not loaded");
382 return k;
383 }
384
385 static bool resolve_wk_klass(WKID id, TRAPS);
386 static void resolve_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS);
387 static void resolve_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) {
388 int limit = (int)end_id + 1;
389 resolve_wk_klasses_until((WKID) limit, start_id, THREAD);
390 }
391
392public:
393 #define WK_KLASS_DECLARE(name, symbol) \
394 static InstanceKlass* name() { return check_klass(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
395 static InstanceKlass** name##_addr() { \
396 return &_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \
397 } \
398 static bool name##_is_loaded() { \
399 return _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] != NULL; \
400 }
401 WK_KLASSES_DO(WK_KLASS_DECLARE);
402 #undef WK_KLASS_DECLARE
403
404 static InstanceKlass* well_known_klass(WKID id) {
405 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
406 return _well_known_klasses[id];
407 }
408
409 static InstanceKlass** well_known_klass_addr(WKID id) {
410 assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
411 return &_well_known_klasses[id];
412 }
413 static void well_known_klasses_do(MetaspaceClosure* it);
414
415 // Local definition for direct access to the private array:
416 #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
417
418 static InstanceKlass* box_klass(BasicType t) {
419 assert((uint)t < T_VOID+1, "range check");
420 return check_klass(_box_klasses[t]);
421 }
422 static BasicType box_klass_type(Klass* k); // inverse of box_klass
423#ifdef ASSERT
424 static bool is_well_known_klass(Klass* k) {
425 return is_well_known_klass(k->name());
426 }
427 static bool is_well_known_klass(Symbol* class_name);
428#endif
429
430protected:
431 // Returns the class loader data to be used when looking up/updating the
432 // system dictionary.
433 static ClassLoaderData *class_loader_data(Handle class_loader) {
434 return ClassLoaderData::class_loader_data(class_loader());
435 }
436
437public:
438 // Tells whether ClassLoader.checkPackageAccess is present
439 static bool has_checkPackageAccess() { return _has_checkPackageAccess; }
440
441 static bool Parameter_klass_loaded() { return WK_KLASS(reflect_Parameter_klass) != NULL; }
442 static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; }
443 static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; }
444 static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; }
445 static bool ClassLoader_klass_loaded() { return WK_KLASS(ClassLoader_klass) != NULL; }
446
447 // Returns java system loader
448 static oop java_system_loader();
449
450 // Returns java platform loader
451 static oop java_platform_loader();
452
453 // Compute the java system and platform loaders
454 static void compute_java_loaders(TRAPS);
455
456 // Register a new class loader
457 static ClassLoaderData* register_loader(Handle class_loader);
458protected:
459 // Mirrors for primitive classes (created eagerly)
460 static oop check_mirror(oop m) {
461 assert(m != NULL, "mirror not initialized");
462 return m;
463 }
464
465public:
466 // Note: java_lang_Class::primitive_type is the inverse of java_mirror
467
468 // Check class loader constraints
469 static bool add_loader_constraint(Symbol* name, Handle loader1,
470 Handle loader2, TRAPS);
471 static Symbol* check_signature_loaders(Symbol* signature, Handle loader1,
472 Handle loader2, bool is_method, TRAPS);
473
474 // JSR 292
475 // find a java.lang.invoke.MethodHandle.invoke* method for a given signature
476 // (asks Java to compute it if necessary, except in a compiler thread)
477 static methodHandle find_method_handle_invoker(Klass* klass,
478 Symbol* name,
479 Symbol* signature,
480 Klass* accessing_klass,
481 Handle *appendix_result,
482 TRAPS);
483 // for a given signature, find the internal MethodHandle method (linkTo* or invokeBasic)
484 // (does not ask Java, since this is a low-level intrinsic defined by the JVM)
485 static methodHandle find_method_handle_intrinsic(vmIntrinsics::ID iid,
486 Symbol* signature,
487 TRAPS);
488
489 // compute java_mirror (java.lang.Class instance) for a type ("I", "[[B", "LFoo;", etc.)
490 // Either the accessing_klass or the CL/PD can be non-null, but not both.
491 static Handle find_java_mirror_for_type(Symbol* signature,
492 Klass* accessing_klass,
493 Handle class_loader,
494 Handle protection_domain,
495 SignatureStream::FailureMode failure_mode,
496 TRAPS);
497 static Handle find_java_mirror_for_type(Symbol* signature,
498 Klass* accessing_klass,
499 SignatureStream::FailureMode failure_mode,
500 TRAPS) {
501 // callee will fill in CL/PD from AK, if they are needed
502 return find_java_mirror_for_type(signature, accessing_klass, Handle(), Handle(),
503 failure_mode, THREAD);
504 }
505
506
507 // fast short-cut for the one-character case:
508 static oop find_java_mirror_for_type(char signature_char);
509
510 // find a java.lang.invoke.MethodType object for a given signature
511 // (asks Java to compute it if necessary, except in a compiler thread)
512 static Handle find_method_handle_type(Symbol* signature,
513 Klass* accessing_klass,
514 TRAPS);
515
516 // find a java.lang.Class object for a given signature
517 static Handle find_field_handle_type(Symbol* signature,
518 Klass* accessing_klass,
519 TRAPS);
520
521 // ask Java to compute a java.lang.invoke.MethodHandle object for a given CP entry
522 static Handle link_method_handle_constant(Klass* caller,
523 int ref_kind, //e.g., JVM_REF_invokeVirtual
524 Klass* callee,
525 Symbol* name,
526 Symbol* signature,
527 TRAPS);
528
529 // ask Java to compute a constant by invoking a BSM given a Dynamic_info CP entry
530 static void invoke_bootstrap_method(BootstrapInfo& bootstrap_specifier, TRAPS);
531
532 // Record the error when the first attempt to resolve a reference from a constant
533 // pool entry to a class fails.
534 static void add_resolution_error(const constantPoolHandle& pool, int which, Symbol* error,
535 Symbol* message);
536 static void delete_resolution_error(ConstantPool* pool);
537 static Symbol* find_resolution_error(const constantPoolHandle& pool, int which,
538 Symbol** message);
539
540
541 static ProtectionDomainCacheEntry* cache_get(Handle protection_domain);
542
543 protected:
544
545 enum Constants {
546 _loader_constraint_size = 107, // number of entries in constraint table
547 _resolution_error_size = 107, // number of entries in resolution error table
548 _invoke_method_size = 139, // number of entries in invoke method table
549 _placeholder_table_size = 1009 // number of entries in hash table for placeholders
550 };
551
552
553 // Static tables owned by the SystemDictionary
554
555 // Hashtable holding placeholders for classes being loaded.
556 static PlaceholderTable* _placeholders;
557
558 // Monotonically increasing counter which grows with
559 // loading classes as well as hot-swapping and breakpoint setting
560 // and removal.
561 static int _number_of_modifications;
562
563 // Lock object for system class loader
564 static oop _system_loader_lock_obj;
565
566 // Constraints on class loaders
567 static LoaderConstraintTable* _loader_constraints;
568
569 // Resolution errors
570 static ResolutionErrorTable* _resolution_errors;
571
572 // Invoke methods (JSR 292)
573 static SymbolPropertyTable* _invoke_method_table;
574
575 // ProtectionDomain cache
576 static ProtectionDomainCacheTable* _pd_cache_table;
577
578 // VM weak OopStorage object.
579 static OopStorage* _vm_weak_oop_storage;
580
581protected:
582 static void validate_protection_domain(InstanceKlass* klass,
583 Handle class_loader,
584 Handle protection_domain, TRAPS);
585
586 friend class VM_PopulateDumpSharedSpace;
587 friend class TraversePlaceholdersClosure;
588 static PlaceholderTable* placeholders() { return _placeholders; }
589 static LoaderConstraintTable* constraints() { return _loader_constraints; }
590 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; }
591 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; }
592
593 // Basic loading operations
594 static InstanceKlass* resolve_instance_class_or_null_helper(Symbol* name,
595 Handle class_loader,
596 Handle protection_domain,
597 TRAPS);
598 static InstanceKlass* resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
599 static Klass* resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
600 static InstanceKlass* handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS);
601 // Wait on SystemDictionary_lock; unlocks lockObject before
602 // waiting; relocks lockObject with correct recursion count
603 // after waiting, but before reentering SystemDictionary_lock
604 // to preserve lock order semantics.
605 static void double_lock_wait(Handle lockObject, TRAPS);
606 static void define_instance_class(InstanceKlass* k, TRAPS);
607 static InstanceKlass* find_or_define_instance_class(Symbol* class_name,
608 Handle class_loader,
609 InstanceKlass* k, TRAPS);
610 static bool is_shared_class_visible(Symbol* class_name, InstanceKlass* ik,
611 Handle class_loader, TRAPS);
612 static InstanceKlass* load_shared_class(InstanceKlass* ik,
613 Handle class_loader,
614 Handle protection_domain,
615 const ClassFileStream *cfs,
616 TRAPS);
617 static InstanceKlass* load_shared_boot_class(Symbol* class_name,
618 TRAPS);
619 static InstanceKlass* load_instance_class(Symbol* class_name, Handle class_loader, TRAPS);
620 static Handle compute_loader_lock_object(Handle class_loader, TRAPS);
621 static void check_loader_lock_contention(Handle loader_lock, TRAPS);
622 static bool is_parallelCapable(Handle class_loader);
623 static bool is_parallelDefine(Handle class_loader);
624
625public:
626 static bool is_system_class_loader(oop class_loader);
627 static bool is_platform_class_loader(oop class_loader);
628
629 // Returns TRUE if the method is a non-public member of class java.lang.Object.
630 static bool is_nonpublic_Object_method(Method* m) {
631 assert(m != NULL, "Unexpected NULL Method*");
632 return !m->is_public() && m->method_holder() == SystemDictionary::Object_klass();
633 }
634
635 static void initialize_oop_storage();
636 static OopStorage* vm_weak_oop_storage();
637
638protected:
639 // Setup link to hierarchy
640 static void add_to_hierarchy(InstanceKlass* k, TRAPS);
641
642 // Basic find on loaded classes
643 static InstanceKlass* find_class(unsigned int hash,
644 Symbol* name, Dictionary* dictionary);
645 static InstanceKlass* find_class(Symbol* class_name, ClassLoaderData* loader_data);
646
647 // Basic find on classes in the midst of being loaded
648 static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data);
649
650 // Add a placeholder for a class being loaded
651 static void add_placeholder(int index,
652 Symbol* class_name,
653 ClassLoaderData* loader_data);
654 static void remove_placeholder(int index,
655 Symbol* class_name,
656 ClassLoaderData* loader_data);
657
658 // Performs cleanups after resolve_super_or_fail. This typically needs
659 // to be called on failure.
660 // Won't throw, but can block.
661 static void resolution_cleanups(Symbol* class_name,
662 ClassLoaderData* loader_data,
663 TRAPS);
664
665 // Resolve well-known classes so they can be used like SystemDictionary::String_klass()
666 static void resolve_well_known_classes(TRAPS);
667
668 // Class loader constraints
669 static void check_constraints(unsigned int hash,
670 InstanceKlass* k, Handle loader,
671 bool defining, TRAPS);
672 static void update_dictionary(unsigned int d_hash,
673 int p_index, unsigned int p_hash,
674 InstanceKlass* k, Handle loader,
675 TRAPS);
676
677 static InstanceKlass* _well_known_klasses[];
678
679 // table of box klasses (int_klass, etc.)
680 static InstanceKlass* _box_klasses[T_VOID+1];
681
682private:
683 static oop _java_system_loader;
684 static oop _java_platform_loader;
685
686 static bool _has_checkPackageAccess;
687
688public:
689 static TableStatistics placeholders_statistics();
690 static TableStatistics loader_constraints_statistics();
691 static TableStatistics protection_domain_cache_statistics();
692};
693
694#endif // SHARE_CLASSFILE_SYSTEMDICTIONARY_HPP
695