224 // class if needed. If not found a NoClassDefFoundError or a |
224 // class if needed. If not found a NoClassDefFoundError or a |
225 // ClassNotFoundException is thrown, depending on the value on the |
225 // ClassNotFoundException is thrown, depending on the value on the |
226 // throw_error flag. For most uses the throw_error argument should be set |
226 // throw_error flag. For most uses the throw_error argument should be set |
227 // to true. |
227 // to true. |
228 |
228 |
229 static klassOop resolve_or_fail(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS); |
229 static klassOop resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS); |
230 // Convenient call for null loader and protection domain. |
230 // Convenient call for null loader and protection domain. |
231 static klassOop resolve_or_fail(symbolHandle class_name, bool throw_error, TRAPS); |
231 static klassOop resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS); |
232 private: |
232 private: |
233 // handle error translation for resolve_or_null results |
233 // handle error translation for resolve_or_null results |
234 static klassOop handle_resolution_exception(symbolHandle class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS); |
234 static klassOop handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS); |
235 |
235 |
236 public: |
236 public: |
237 |
237 |
238 // Returns a class with a given class name and class loader. |
238 // Returns a class with a given class name and class loader. |
239 // Loads the class if needed. If not found NULL is returned. |
239 // Loads the class if needed. If not found NULL is returned. |
240 static klassOop resolve_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); |
240 static klassOop resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); |
241 // Version with null loader and protection domain |
241 // Version with null loader and protection domain |
242 static klassOop resolve_or_null(symbolHandle class_name, TRAPS); |
242 static klassOop resolve_or_null(Symbol* class_name, TRAPS); |
243 |
243 |
244 // Resolve a superclass or superinterface. Called from ClassFileParser, |
244 // Resolve a superclass or superinterface. Called from ClassFileParser, |
245 // parse_interfaces, resolve_instance_class_or_null, load_shared_class |
245 // parse_interfaces, resolve_instance_class_or_null, load_shared_class |
246 // "child_name" is the class whose super class or interface is being resolved. |
246 // "child_name" is the class whose super class or interface is being resolved. |
247 static klassOop resolve_super_or_fail(symbolHandle child_name, |
247 static klassOop resolve_super_or_fail(Symbol* child_name, |
248 symbolHandle class_name, |
248 Symbol* class_name, |
249 Handle class_loader, |
249 Handle class_loader, |
250 Handle protection_domain, |
250 Handle protection_domain, |
251 bool is_superclass, |
251 bool is_superclass, |
252 TRAPS); |
252 TRAPS); |
253 |
253 |
254 // Parse new stream. This won't update the system dictionary or |
254 // Parse new stream. This won't update the system dictionary or |
255 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses. |
255 // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses. |
256 static klassOop parse_stream(symbolHandle class_name, |
256 static klassOop parse_stream(Symbol* class_name, |
257 Handle class_loader, |
257 Handle class_loader, |
258 Handle protection_domain, |
258 Handle protection_domain, |
259 ClassFileStream* st, |
259 ClassFileStream* st, |
260 TRAPS) { |
260 TRAPS) { |
261 KlassHandle nullHandle; |
261 KlassHandle nullHandle; |
262 return parse_stream(class_name, class_loader, protection_domain, st, nullHandle, NULL, THREAD); |
262 return parse_stream(class_name, class_loader, protection_domain, st, nullHandle, NULL, THREAD); |
263 } |
263 } |
264 static klassOop parse_stream(symbolHandle class_name, |
264 static klassOop parse_stream(Symbol* class_name, |
265 Handle class_loader, |
265 Handle class_loader, |
266 Handle protection_domain, |
266 Handle protection_domain, |
267 ClassFileStream* st, |
267 ClassFileStream* st, |
268 KlassHandle host_klass, |
268 KlassHandle host_klass, |
269 GrowableArray<Handle>* cp_patches, |
269 GrowableArray<Handle>* cp_patches, |
270 TRAPS); |
270 TRAPS); |
271 |
271 |
272 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) |
272 // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) |
273 static klassOop resolve_from_stream(symbolHandle class_name, Handle class_loader, |
273 static klassOop resolve_from_stream(Symbol* class_name, Handle class_loader, |
274 Handle protection_domain, |
274 Handle protection_domain, |
275 ClassFileStream* st, bool verify, TRAPS); |
275 ClassFileStream* st, bool verify, TRAPS); |
276 |
276 |
277 // Lookup an already loaded class. If not found NULL is returned. |
277 // Lookup an already loaded class. If not found NULL is returned. |
278 static klassOop find(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); |
278 static klassOop find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); |
279 |
279 |
280 // Lookup an already loaded instance or array class. |
280 // Lookup an already loaded instance or array class. |
281 // Do not make any queries to class loaders; consult only the cache. |
281 // Do not make any queries to class loaders; consult only the cache. |
282 // If not found NULL is returned. |
282 // If not found NULL is returned. |
283 static klassOop find_instance_or_array_klass(symbolHandle class_name, |
283 static klassOop find_instance_or_array_klass(Symbol* class_name, |
284 Handle class_loader, |
284 Handle class_loader, |
285 Handle protection_domain, |
285 Handle protection_domain, |
286 TRAPS); |
286 TRAPS); |
287 |
287 |
288 // If the given name is known to vmSymbols, return the well-know klass: |
288 // If the given name is known to vmSymbols, return the well-know klass: |
289 static klassOop find_well_known_klass(symbolOop class_name); |
289 static klassOop find_well_known_klass(Symbol* class_name); |
290 |
290 |
291 // Lookup an instance or array class that has already been loaded |
291 // Lookup an instance or array class that has already been loaded |
292 // either into the given class loader, or else into another class |
292 // either into the given class loader, or else into another class |
293 // loader that is constrained (via loader constraints) to produce |
293 // loader that is constrained (via loader constraints) to produce |
294 // a consistent class. Do not take protection domains into account. |
294 // a consistent class. Do not take protection domains into account. |
467 |
467 |
468 public: |
468 public: |
469 // Note: java_lang_Class::primitive_type is the inverse of java_mirror |
469 // Note: java_lang_Class::primitive_type is the inverse of java_mirror |
470 |
470 |
471 // Check class loader constraints |
471 // Check class loader constraints |
472 static bool add_loader_constraint(symbolHandle name, Handle loader1, |
472 static bool add_loader_constraint(Symbol* name, Handle loader1, |
473 Handle loader2, TRAPS); |
473 Handle loader2, TRAPS); |
474 static char* check_signature_loaders(symbolHandle signature, Handle loader1, |
474 static char* check_signature_loaders(Symbol* signature, Handle loader1, |
475 Handle loader2, bool is_method, TRAPS); |
475 Handle loader2, bool is_method, TRAPS); |
476 |
476 |
477 // JSR 292 |
477 // JSR 292 |
478 // find the java.dyn.MethodHandles::invoke method for a given signature |
478 // find the java.dyn.MethodHandles::invoke method for a given signature |
479 static methodOop find_method_handle_invoke(symbolHandle name, |
479 static methodOop find_method_handle_invoke(Symbol* name, |
480 symbolHandle signature, |
480 Symbol* signature, |
481 KlassHandle accessing_klass, |
481 KlassHandle accessing_klass, |
482 TRAPS); |
482 TRAPS); |
483 // ask Java to compute a java.dyn.MethodType object for a given signature |
483 // ask Java to compute a java.dyn.MethodType object for a given signature |
484 static Handle find_method_handle_type(symbolHandle signature, |
484 static Handle find_method_handle_type(Symbol* signature, |
485 KlassHandle accessing_klass, |
485 KlassHandle accessing_klass, |
486 bool for_invokeGeneric, |
486 bool for_invokeGeneric, |
487 bool& return_bcp_flag, |
487 bool& return_bcp_flag, |
488 TRAPS); |
488 TRAPS); |
489 // ask Java to compute a java.dyn.MethodHandle object for a given CP entry |
489 // ask Java to compute a java.dyn.MethodHandle object for a given CP entry |
490 static Handle link_method_handle_constant(KlassHandle caller, |
490 static Handle link_method_handle_constant(KlassHandle caller, |
491 int ref_kind, //e.g., JVM_REF_invokeVirtual |
491 int ref_kind, //e.g., JVM_REF_invokeVirtual |
492 KlassHandle callee, |
492 KlassHandle callee, |
493 symbolHandle name, |
493 Symbol* name, |
494 symbolHandle signature, |
494 Symbol* signature, |
495 TRAPS); |
495 TRAPS); |
496 // ask Java to create a dynamic call site, while linking an invokedynamic op |
496 // ask Java to create a dynamic call site, while linking an invokedynamic op |
497 static Handle make_dynamic_call_site(Handle bootstrap_method, |
497 static Handle make_dynamic_call_site(Handle bootstrap_method, |
498 // Callee information: |
498 // Callee information: |
499 symbolHandle name, |
499 Symbol* name, |
500 methodHandle signature_invoker, |
500 methodHandle signature_invoker, |
501 Handle info, |
501 Handle info, |
502 // Caller information: |
502 // Caller information: |
503 methodHandle caller_method, |
503 methodHandle caller_method, |
504 int caller_bci, |
504 int caller_bci, |
578 static LoaderConstraintTable* constraints() { return _loader_constraints; } |
578 static LoaderConstraintTable* constraints() { return _loader_constraints; } |
579 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } |
579 static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } |
580 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; } |
580 static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; } |
581 |
581 |
582 // Basic loading operations |
582 // Basic loading operations |
583 static klassOop resolve_instance_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); |
583 static klassOop resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); |
584 static klassOop resolve_array_class_or_null(symbolHandle class_name, Handle class_loader, Handle protection_domain, TRAPS); |
584 static klassOop resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); |
585 static instanceKlassHandle handle_parallel_super_load(symbolHandle class_name, symbolHandle supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); |
585 static instanceKlassHandle handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); |
586 // Wait on SystemDictionary_lock; unlocks lockObject before |
586 // Wait on SystemDictionary_lock; unlocks lockObject before |
587 // waiting; relocks lockObject with correct recursion count |
587 // waiting; relocks lockObject with correct recursion count |
588 // after waiting, but before reentering SystemDictionary_lock |
588 // after waiting, but before reentering SystemDictionary_lock |
589 // to preserve lock order semantics. |
589 // to preserve lock order semantics. |
590 static void double_lock_wait(Handle lockObject, TRAPS); |
590 static void double_lock_wait(Handle lockObject, TRAPS); |
591 static void define_instance_class(instanceKlassHandle k, TRAPS); |
591 static void define_instance_class(instanceKlassHandle k, TRAPS); |
592 static instanceKlassHandle find_or_define_instance_class(symbolHandle class_name, |
592 static instanceKlassHandle find_or_define_instance_class(Symbol* class_name, |
593 Handle class_loader, |
593 Handle class_loader, |
594 instanceKlassHandle k, TRAPS); |
594 instanceKlassHandle k, TRAPS); |
595 static instanceKlassHandle load_shared_class(symbolHandle class_name, |
595 static instanceKlassHandle load_shared_class(Symbol* class_name, |
596 Handle class_loader, TRAPS); |
596 Handle class_loader, TRAPS); |
597 static instanceKlassHandle load_shared_class(instanceKlassHandle ik, |
597 static instanceKlassHandle load_shared_class(instanceKlassHandle ik, |
598 Handle class_loader, TRAPS); |
598 Handle class_loader, TRAPS); |
599 static instanceKlassHandle load_instance_class(symbolHandle class_name, Handle class_loader, TRAPS); |
599 static instanceKlassHandle load_instance_class(Symbol* class_name, Handle class_loader, TRAPS); |
600 static Handle compute_loader_lock_object(Handle class_loader, TRAPS); |
600 static Handle compute_loader_lock_object(Handle class_loader, TRAPS); |
601 static void check_loader_lock_contention(Handle loader_lock, TRAPS); |
601 static void check_loader_lock_contention(Handle loader_lock, TRAPS); |
602 static bool is_parallelCapable(Handle class_loader); |
602 static bool is_parallelCapable(Handle class_loader); |
603 static bool is_parallelDefine(Handle class_loader); |
603 static bool is_parallelDefine(Handle class_loader); |
604 |
604 |
605 static klassOop find_shared_class(symbolHandle class_name); |
605 static klassOop find_shared_class(Symbol* class_name); |
606 |
606 |
607 // Setup link to hierarchy |
607 // Setup link to hierarchy |
608 static void add_to_hierarchy(instanceKlassHandle k, TRAPS); |
608 static void add_to_hierarchy(instanceKlassHandle k, TRAPS); |
609 |
609 |
610 private: |
610 private: |
611 // We pass in the hashtable index so we can calculate it outside of |
611 // We pass in the hashtable index so we can calculate it outside of |
612 // the SystemDictionary_lock. |
612 // the SystemDictionary_lock. |
613 |
613 |
614 // Basic find on loaded classes |
614 // Basic find on loaded classes |
615 static klassOop find_class(int index, unsigned int hash, |
615 static klassOop find_class(int index, unsigned int hash, |
616 symbolHandle name, Handle loader); |
616 Symbol* name, Handle loader); |
|
617 static klassOop find_class(Symbol* class_name, Handle class_loader); |
617 |
618 |
618 // Basic find on classes in the midst of being loaded |
619 // Basic find on classes in the midst of being loaded |
619 static symbolOop find_placeholder(int index, unsigned int hash, |
620 static Symbol* find_placeholder(Symbol* name, Handle loader); |
620 symbolHandle name, Handle loader); |
|
621 |
|
622 // Basic find operation of loaded classes and classes in the midst |
|
623 // of loading; used for assertions and verification only. |
|
624 static oop find_class_or_placeholder(symbolHandle class_name, |
|
625 Handle class_loader); |
|
626 |
621 |
627 // Updating entry in dictionary |
622 // Updating entry in dictionary |
628 // Add a completely loaded class |
623 // Add a completely loaded class |
629 static void add_klass(int index, symbolHandle class_name, |
624 static void add_klass(int index, Symbol* class_name, |
630 Handle class_loader, KlassHandle obj); |
625 Handle class_loader, KlassHandle obj); |
631 |
626 |
632 // Add a placeholder for a class being loaded |
627 // Add a placeholder for a class being loaded |
633 static void add_placeholder(int index, |
628 static void add_placeholder(int index, |
634 symbolHandle class_name, |
629 Symbol* class_name, |
635 Handle class_loader); |
630 Handle class_loader); |
636 static void remove_placeholder(int index, |
631 static void remove_placeholder(int index, |
637 symbolHandle class_name, |
632 Symbol* class_name, |
638 Handle class_loader); |
633 Handle class_loader); |
639 |
634 |
640 // Performs cleanups after resolve_super_or_fail. This typically needs |
635 // Performs cleanups after resolve_super_or_fail. This typically needs |
641 // to be called on failure. |
636 // to be called on failure. |
642 // Won't throw, but can block. |
637 // Won't throw, but can block. |
643 static void resolution_cleanups(symbolHandle class_name, |
638 static void resolution_cleanups(Symbol* class_name, |
644 Handle class_loader, |
639 Handle class_loader, |
645 TRAPS); |
640 TRAPS); |
646 |
641 |
647 // Initialization |
642 // Initialization |
648 static void initialize_preloaded_classes(TRAPS); |
643 static void initialize_preloaded_classes(TRAPS); |