67 oop name_oop = java_lang_Module::name(module);
68 if (name_oop == NULL) {
69 THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), "Null module name");
70 }
71 char* module_name = java_lang_String::as_utf8_string(name_oop);
72 if (!verify_module_name(module_name)) {
73 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
74 err_msg("Invalid module name: %s",
75 module_name != NULL ? module_name : "NULL"));
76 }
77 return module_name;
78 }
79
80 static const char* get_module_version(jstring version) {
81 if (version == NULL) {
82 return NULL;
83 }
84 return java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(version));
85 }
86
87 static ModuleEntryTable* get_module_entry_table(Handle h_loader, TRAPS) {
88 // This code can be called during start-up, before the classLoader's classLoader data got
89 // created. So, call register_loader() to make sure the classLoader data gets created.
90 ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader, CHECK_NULL);
91 return loader_cld->modules();
92 }
93
94 static PackageEntryTable* get_package_entry_table(Handle h_loader, TRAPS) {
95 // This code can be called during start-up, before the classLoader's classLoader data got
96 // created. So, call register_loader() to make sure the classLoader data gets created.
97 ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader, CHECK_NULL);
98 return loader_cld->packages();
99 }
100
101 static ModuleEntry* get_module_entry(jobject module, TRAPS) {
102 Handle module_h(THREAD, JNIHandles::resolve(module));
103 if (!java_lang_Module::is_instance(module_h())) {
104 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
105 "module is not an instance of type java.lang.Module");
106 }
107 return java_lang_Module::module_entry(module_h(), CHECK_NULL);
108 }
109
110 static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) {
111 ResourceMark rm(THREAD);
112 if (package_name == NULL) return NULL;
113 TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
114 PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
115 assert(package_entry_table != NULL, "Unexpected null package entry table");
116 return package_entry_table->lookup_only(pkg_symbol);
117 }
118
119 static PackageEntry* get_package_entry_by_name(Symbol* package,
120 Handle h_loader,
121 TRAPS) {
122 if (package != NULL) {
123 ResourceMark rm(THREAD);
124 if (Modules::verify_package_name(package->as_C_string())) {
125 PackageEntryTable* const package_entry_table =
126 get_package_entry_table(h_loader, CHECK_NULL);
127 assert(package_entry_table != NULL, "Unexpected null package entry table");
128 return package_entry_table->lookup_only(package);
129 }
130 }
131 return NULL;
132 }
133
134 bool Modules::is_package_defined(Symbol* package, Handle h_loader, TRAPS) {
135 PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
136 return res != NULL;
137 }
138
139 static void define_javabase_module(jobject module, jstring version,
140 jstring location, const char* const* packages,
141 jsize num_packages, TRAPS) {
142 ResourceMark rm(THREAD);
143
144 Handle module_handle(THREAD, JNIHandles::resolve(module));
145
146 // Obtain java.base's module version
168 GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
169 for (int x = 0; x < num_packages; x++) {
170 const char *package_name = packages[x];
171 if (!Modules::verify_package_name(package_name)) {
172 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
173 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
174 }
175 Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
176 pkg_list->append(pkg_symbol);
177 }
178
179 // Validate java_base's loader is the boot loader.
180 oop loader = java_lang_Module::loader(module_handle());
181 if (loader != NULL) {
182 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
183 "Class loader must be the boot class loader");
184 }
185 Handle h_loader(THREAD, loader);
186
187 // Ensure the boot loader's PackageEntryTable has been created
188 PackageEntryTable* package_table = get_package_entry_table(h_loader, CHECK);
189 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table");
190
191 // Ensure java.base's ModuleEntry has been created
192 assert(ModuleEntryTable::javabase_moduleEntry() != NULL, "No ModuleEntry for " JAVA_BASE_NAME);
193
194 bool duplicate_javabase = false;
195 {
196 MutexLocker m1(Module_lock, THREAD);
197
198 if (ModuleEntryTable::javabase_defined()) {
199 duplicate_javabase = true;
200 } else {
201
202 // Verify that all java.base packages created during bootstrapping are in
203 // pkg_list. If any are not in pkg_list, than a non-java.base class was
204 // loaded erroneously pre java.base module definition.
205 package_table->verify_javabase_packages(pkg_list);
206
207 // loop through and add any new packages for java.base
208 PackageEntry* pkg;
328 !SystemDictionary::is_platform_class_loader(h_loader()) &&
329 (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 &&
330 (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) {
331 const char* class_loader_name = SystemDictionary::loader_name(h_loader());
332 size_t pkg_len = strlen(package_name);
333 char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
334 strncpy(pkg_name, package_name, pkg_len);
335 StringUtils::replace_no_expand(pkg_name, "/", ".");
336 const char* msg_text1 = "Class loader (instance of): ";
337 const char* msg_text2 = " tried to define prohibited package name: ";
338 size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
339 char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
340 jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
341 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
342 }
343
344 Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
345 pkg_list->append(pkg_symbol);
346 }
347
348 ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK);
349 assert(module_table != NULL, "module entry table shouldn't be null");
350
351 // Create symbol* entry for module name.
352 TempNewSymbol module_symbol = SymbolTable::new_symbol(module_name, CHECK);
353
354 bool dupl_modules = false;
355
356 // Create symbol* entry for module version.
357 TempNewSymbol version_symbol;
358 if (module_version != NULL) {
359 version_symbol = SymbolTable::new_symbol(module_version, CHECK);
360 } else {
361 version_symbol = NULL;
362 }
363
364 // Create symbol* entry for module location.
365 const char* module_location = NULL;
366 TempNewSymbol location_symbol = NULL;
367 if (location != NULL) {
368 module_location =
369 java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(location));
370 if (module_location != NULL) {
371 location_symbol = SymbolTable::new_symbol(module_location, CHECK);
372 }
373 }
374
375 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(h_loader());
376 assert(loader_data != NULL, "class loader data shouldn't be null");
377
378 PackageEntryTable* package_table = NULL;
379 PackageEntry* existing_pkg = NULL;
380 {
381 MutexLocker ml(Module_lock, THREAD);
382
383 if (num_packages > 0) {
384 package_table = get_package_entry_table(h_loader, CHECK);
385 assert(package_table != NULL, "Missing package_table");
386
387 // Check that none of the packages exist in the class loader's package table.
388 for (int x = 0; x < pkg_list->length(); x++) {
389 existing_pkg = package_table->lookup_only(pkg_list->at(x));
390 if (existing_pkg != NULL) {
391 // This could be because the module was already defined. If so,
392 // report that error instead of the package error.
393 if (module_table->lookup_only(module_symbol) != NULL) {
394 dupl_modules = true;
395 }
396 break;
397 }
398 }
399 } // if (num_packages > 0)...
400
401 // Add the module and its packages.
402 if (!dupl_modules && existing_pkg == NULL) {
403 // Create the entry for this module in the class loader's module entry table.
404 ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,
|
67 oop name_oop = java_lang_Module::name(module);
68 if (name_oop == NULL) {
69 THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), "Null module name");
70 }
71 char* module_name = java_lang_String::as_utf8_string(name_oop);
72 if (!verify_module_name(module_name)) {
73 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
74 err_msg("Invalid module name: %s",
75 module_name != NULL ? module_name : "NULL"));
76 }
77 return module_name;
78 }
79
80 static const char* get_module_version(jstring version) {
81 if (version == NULL) {
82 return NULL;
83 }
84 return java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(version));
85 }
86
87 static ModuleEntryTable* get_module_entry_table(Handle h_loader) {
88 // This code can be called during start-up, before the classLoader's classLoader data got
89 // created. So, call register_loader() to make sure the classLoader data gets created.
90 ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader);
91 return loader_cld->modules();
92 }
93
94 static PackageEntryTable* get_package_entry_table(Handle h_loader) {
95 // This code can be called during start-up, before the classLoader's classLoader data got
96 // created. So, call register_loader() to make sure the classLoader data gets created.
97 ClassLoaderData *loader_cld = SystemDictionary::register_loader(h_loader);
98 return loader_cld->packages();
99 }
100
101 static ModuleEntry* get_module_entry(jobject module, TRAPS) {
102 oop m = JNIHandles::resolve(module);
103 if (!java_lang_Module::is_instance(m)) {
104 THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(),
105 "module is not an instance of type java.lang.Module");
106 }
107 return java_lang_Module::module_entry(m);
108 }
109
110 static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) {
111 ResourceMark rm(THREAD);
112 if (package_name == NULL) return NULL;
113 TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL);
114 PackageEntryTable* package_entry_table = module_entry->loader_data()->packages();
115 assert(package_entry_table != NULL, "Unexpected null package entry table");
116 return package_entry_table->lookup_only(pkg_symbol);
117 }
118
119 static PackageEntry* get_package_entry_by_name(Symbol* package,
120 Handle h_loader,
121 TRAPS) {
122 if (package != NULL) {
123 ResourceMark rm(THREAD);
124 if (Modules::verify_package_name(package->as_C_string())) {
125 PackageEntryTable* const package_entry_table =
126 get_package_entry_table(h_loader);
127 assert(package_entry_table != NULL, "Unexpected null package entry table");
128 return package_entry_table->lookup_only(package);
129 }
130 }
131 return NULL;
132 }
133
134 bool Modules::is_package_defined(Symbol* package, Handle h_loader, TRAPS) {
135 PackageEntry* res = get_package_entry_by_name(package, h_loader, CHECK_false);
136 return res != NULL;
137 }
138
139 static void define_javabase_module(jobject module, jstring version,
140 jstring location, const char* const* packages,
141 jsize num_packages, TRAPS) {
142 ResourceMark rm(THREAD);
143
144 Handle module_handle(THREAD, JNIHandles::resolve(module));
145
146 // Obtain java.base's module version
168 GrowableArray<Symbol*>* pkg_list = new GrowableArray<Symbol*>(num_packages);
169 for (int x = 0; x < num_packages; x++) {
170 const char *package_name = packages[x];
171 if (!Modules::verify_package_name(package_name)) {
172 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
173 err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name));
174 }
175 Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
176 pkg_list->append(pkg_symbol);
177 }
178
179 // Validate java_base's loader is the boot loader.
180 oop loader = java_lang_Module::loader(module_handle());
181 if (loader != NULL) {
182 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
183 "Class loader must be the boot class loader");
184 }
185 Handle h_loader(THREAD, loader);
186
187 // Ensure the boot loader's PackageEntryTable has been created
188 PackageEntryTable* package_table = get_package_entry_table(h_loader);
189 assert(pkg_list->length() == 0 || package_table != NULL, "Bad package_table");
190
191 // Ensure java.base's ModuleEntry has been created
192 assert(ModuleEntryTable::javabase_moduleEntry() != NULL, "No ModuleEntry for " JAVA_BASE_NAME);
193
194 bool duplicate_javabase = false;
195 {
196 MutexLocker m1(Module_lock, THREAD);
197
198 if (ModuleEntryTable::javabase_defined()) {
199 duplicate_javabase = true;
200 } else {
201
202 // Verify that all java.base packages created during bootstrapping are in
203 // pkg_list. If any are not in pkg_list, than a non-java.base class was
204 // loaded erroneously pre java.base module definition.
205 package_table->verify_javabase_packages(pkg_list);
206
207 // loop through and add any new packages for java.base
208 PackageEntry* pkg;
328 !SystemDictionary::is_platform_class_loader(h_loader()) &&
329 (strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0 &&
330 (package_name[JAVAPKG_LEN] == '/' || package_name[JAVAPKG_LEN] == '\0'))) {
331 const char* class_loader_name = SystemDictionary::loader_name(h_loader());
332 size_t pkg_len = strlen(package_name);
333 char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len);
334 strncpy(pkg_name, package_name, pkg_len);
335 StringUtils::replace_no_expand(pkg_name, "/", ".");
336 const char* msg_text1 = "Class loader (instance of): ";
337 const char* msg_text2 = " tried to define prohibited package name: ";
338 size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1;
339 char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len);
340 jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name);
341 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
342 }
343
344 Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
345 pkg_list->append(pkg_symbol);
346 }
347
348 ModuleEntryTable* module_table = get_module_entry_table(h_loader);
349 assert(module_table != NULL, "module entry table shouldn't be null");
350
351 // Create symbol* entry for module name.
352 TempNewSymbol module_symbol = SymbolTable::new_symbol(module_name, CHECK);
353
354 bool dupl_modules = false;
355
356 // Create symbol* entry for module version.
357 TempNewSymbol version_symbol;
358 if (module_version != NULL) {
359 version_symbol = SymbolTable::new_symbol(module_version, CHECK);
360 } else {
361 version_symbol = NULL;
362 }
363
364 // Create symbol* entry for module location.
365 const char* module_location = NULL;
366 TempNewSymbol location_symbol = NULL;
367 if (location != NULL) {
368 module_location =
369 java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(location));
370 if (module_location != NULL) {
371 location_symbol = SymbolTable::new_symbol(module_location, CHECK);
372 }
373 }
374
375 ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(h_loader());
376 assert(loader_data != NULL, "class loader data shouldn't be null");
377
378 PackageEntryTable* package_table = NULL;
379 PackageEntry* existing_pkg = NULL;
380 {
381 MutexLocker ml(Module_lock, THREAD);
382
383 if (num_packages > 0) {
384 package_table = get_package_entry_table(h_loader);
385 assert(package_table != NULL, "Missing package_table");
386
387 // Check that none of the packages exist in the class loader's package table.
388 for (int x = 0; x < pkg_list->length(); x++) {
389 existing_pkg = package_table->lookup_only(pkg_list->at(x));
390 if (existing_pkg != NULL) {
391 // This could be because the module was already defined. If so,
392 // report that error instead of the package error.
393 if (module_table->lookup_only(module_symbol) != NULL) {
394 dupl_modules = true;
395 }
396 break;
397 }
398 }
399 } // if (num_packages > 0)...
400
401 // Add the module and its packages.
402 if (!dupl_modules && existing_pkg == NULL) {
403 // Create the entry for this module in the class loader's module entry table.
404 ModuleEntry* module_entry = module_table->locked_create_entry_or_null(module_handle,
|