|
28 | 28 | #include "classfile/classLoaderExt.hpp"
|
29 | 29 | #include "classfile/javaClasses.inline.hpp"
|
30 | 30 | #include "classfile/symbolTable.hpp"
|
31 |
| -#include "classfile/systemDictionaryShared.hpp" |
| 31 | +#include "classfile/systemDictionary.hpp" |
32 | 32 | #include "classfile/vmSymbols.hpp"
|
33 | 33 | #include "memory/oopFactory.hpp"
|
34 | 34 | #include "memory/resourceArea.hpp"
|
|
38 | 38 | #include "runtime/javaCalls.hpp"
|
39 | 39 | #include "services/threadService.hpp"
|
40 | 40 |
|
| 41 | +InstanceKlass* UnregisteredClasses::_UnregisteredClassLoader_klass = nullptr; |
| 42 | + |
| 43 | +void UnregisteredClasses::initialize(TRAPS) { |
| 44 | + if (_UnregisteredClassLoader_klass == nullptr) { |
| 45 | + // no need for synchronization as this function is called single-threaded. |
| 46 | + Symbol* klass_name = SymbolTable::new_symbol("jdk/internal/misc/CDS$UnregisteredClassLoader"); |
| 47 | + Klass* k = SystemDictionary::resolve_or_fail(klass_name, true, CHECK); |
| 48 | + _UnregisteredClassLoader_klass = InstanceKlass::cast(k); |
| 49 | + } |
| 50 | +} |
| 51 | + |
41 | 52 | // Load the class of the given name from the location given by path. The path is specified by
|
42 | 53 | // the "source:" in the class list file (see classListParser.cpp), and can be a directory or
|
43 | 54 | // a JAR file.
|
44 |
| -InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, TRAPS) { |
| 55 | +InstanceKlass* UnregisteredClasses::load_class(Symbol* name, const char* path, |
| 56 | + Handle super_class, objArrayHandle interfaces, TRAPS) { |
45 | 57 | assert(name != nullptr, "invariant");
|
46 | 58 | assert(CDSConfig::is_dumping_static_archive(), "this function is only used with -Xshare:dump");
|
47 | 59 |
|
48 | 60 | PerfClassTraceTime vmtimer(ClassLoader::perf_app_classload_time(),
|
49 | 61 | THREAD->get_thread_stat()->perf_timers_addr(),
|
50 | 62 | PerfClassTraceTime::CLASS_LOAD);
|
51 | 63 |
|
| 64 | + // Call CDS$UnregisteredClassLoader::load(String name, Class<?> superClass, Class<?>[] interfaces) |
| 65 | + Symbol* methodName = SymbolTable::new_symbol("load"); |
| 66 | + Symbol* methodSignature = SymbolTable::new_symbol("(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Class;"); |
52 | 67 | Symbol* path_symbol = SymbolTable::new_symbol(path);
|
53 |
| - Symbol* findClass = SymbolTable::new_symbol("findClass"); |
54 |
| - Handle url_classloader = get_url_classloader(path_symbol, CHECK_NULL); |
| 68 | + Handle classloader = get_classloader(path_symbol, CHECK_NULL); |
55 | 69 | Handle ext_class_name = java_lang_String::externalize_classname(name, CHECK_NULL);
|
56 | 70 |
|
57 | 71 | JavaValue result(T_OBJECT);
|
58 |
| - JavaCallArguments args(2); |
59 |
| - args.set_receiver(url_classloader); |
| 72 | + JavaCallArguments args(3); |
| 73 | + args.set_receiver(classloader); |
60 | 74 | args.push_oop(ext_class_name);
|
| 75 | + args.push_oop(super_class); |
| 76 | + args.push_oop(interfaces); |
61 | 77 | JavaCalls::call_virtual(&result,
|
62 |
| - vmClasses::URLClassLoader_klass(), |
63 |
| - findClass, |
64 |
| - vmSymbols::string_class_signature(), |
| 78 | + UnregisteredClassLoader_klass(), |
| 79 | + methodName, |
| 80 | + methodSignature, |
65 | 81 | &args,
|
66 | 82 | CHECK_NULL);
|
67 | 83 | assert(result.get_type() == T_OBJECT, "just checking");
|
68 | 84 | oop obj = result.get_oop();
|
69 | 85 | return InstanceKlass::cast(java_lang_Class::as_Klass(obj));
|
70 | 86 | }
|
71 | 87 |
|
72 |
| -class URLClassLoaderTable : public ResourceHashtable< |
| 88 | +class UnregisteredClasses::ClassLoaderTable : public ResourceHashtable< |
73 | 89 | Symbol*, OopHandle,
|
74 | 90 | 137, // prime number
|
75 | 91 | AnyObj::C_HEAP> {};
|
76 | 92 |
|
77 |
| -static URLClassLoaderTable* _url_classloader_table = nullptr; |
| 93 | +static UnregisteredClasses::ClassLoaderTable* _classloader_table = nullptr; |
78 | 94 |
|
79 |
| -Handle UnregisteredClasses::create_url_classloader(Symbol* path, TRAPS) { |
| 95 | +Handle UnregisteredClasses::create_classloader(Symbol* path, TRAPS) { |
80 | 96 | ResourceMark rm(THREAD);
|
81 | 97 | JavaValue result(T_OBJECT);
|
82 | 98 | Handle path_string = java_lang_String::create_from_str(path->as_C_string(), CHECK_NH);
|
83 |
| - JavaCalls::call_static(&result, |
84 |
| - vmClasses::jdk_internal_loader_ClassLoaders_klass(), |
85 |
| - vmSymbols::toFileURL_name(), |
86 |
| - vmSymbols::toFileURL_signature(), |
87 |
| - path_string, CHECK_NH); |
88 |
| - assert(result.get_type() == T_OBJECT, "just checking"); |
89 |
| - oop url_h = result.get_oop(); |
90 |
| - objArrayHandle urls = oopFactory::new_objArray_handle(vmClasses::URL_klass(), 1, CHECK_NH); |
91 |
| - urls->obj_at_put(0, url_h); |
92 |
| - |
93 |
| - Handle url_classloader = JavaCalls::construct_new_instance( |
94 |
| - vmClasses::URLClassLoader_klass(), |
95 |
| - vmSymbols::url_array_classloader_void_signature(), |
96 |
| - urls, Handle(), CHECK_NH); |
97 |
| - return url_classloader; |
| 99 | + Handle classloader = JavaCalls::construct_new_instance( |
| 100 | + UnregisteredClassLoader_klass(), |
| 101 | + vmSymbols::string_void_signature(), |
| 102 | + path_string, CHECK_NH); |
| 103 | + return classloader; |
98 | 104 | }
|
99 | 105 |
|
100 |
| -Handle UnregisteredClasses::get_url_classloader(Symbol* path, TRAPS) { |
101 |
| - if (_url_classloader_table == nullptr) { |
102 |
| - _url_classloader_table = new (mtClass)URLClassLoaderTable(); |
| 106 | +Handle UnregisteredClasses::get_classloader(Symbol* path, TRAPS) { |
| 107 | + if (_classloader_table == nullptr) { |
| 108 | + _classloader_table = new (mtClass)ClassLoaderTable(); |
103 | 109 | }
|
104 |
| - OopHandle* url_classloader_ptr = _url_classloader_table->get(path); |
105 |
| - if (url_classloader_ptr != nullptr) { |
106 |
| - return Handle(THREAD, (*url_classloader_ptr).resolve()); |
| 110 | + OopHandle* classloader_ptr = _classloader_table->get(path); |
| 111 | + if (classloader_ptr != nullptr) { |
| 112 | + return Handle(THREAD, (*classloader_ptr).resolve()); |
107 | 113 | } else {
|
108 |
| - Handle url_classloader = create_url_classloader(path, CHECK_NH); |
109 |
| - _url_classloader_table->put(path, OopHandle(Universe::vm_global(), url_classloader())); |
| 114 | + Handle classloader = create_classloader(path, CHECK_NH); |
| 115 | + _classloader_table->put(path, OopHandle(Universe::vm_global(), classloader())); |
110 | 116 | path->increment_refcount();
|
111 |
| - return url_classloader; |
| 117 | + return classloader; |
112 | 118 | }
|
113 | 119 | }
|
0 commit comments