# HG changeset patch # User redestad # Date 1484822970 -3600 # Node ID add5006444431e85401fb1e0d7f17c9c50c90e42 # Parent 033b9f74b930817b2dadca731432bd4c6cdfe7e5 8171855: Move package name transformations during module bootstrap into native code Reviewed-by: alanb, acorn, lfoltan, mchung, plevart, hseigel, sspitsyn diff -r 033b9f74b930 -r add500644443 hotspot/make/symbols/symbols-unix --- a/hotspot/make/symbols/symbols-unix Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/make/symbols/symbols-unix Thu Jan 19 11:49:30 2017 +0100 @@ -192,4 +192,3 @@ JVM_AddReadsModule JVM_DefineModule JVM_SetBootLoaderUnnamedModule -JVM_GetModuleByPackageName diff -r 033b9f74b930 -r add500644443 hotspot/src/share/vm/classfile/modules.cpp --- a/hotspot/src/share/vm/classfile/modules.cpp Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/src/share/vm/classfile/modules.cpp Thu Jan 19 11:49:30 2017 +0100 @@ -39,8 +39,6 @@ #include "logging/log.hpp" #include "memory/resourceArea.hpp" #include "oops/instanceKlass.hpp" -#include "oops/objArrayKlass.hpp" -#include "oops/objArrayOop.inline.hpp" #include "runtime/arguments.hpp" #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" @@ -48,17 +46,17 @@ #include "utilities/stringUtils.hpp" #include "utilities/utf8.hpp" -static bool verify_module_name(char *module_name) { +static bool verify_module_name(const char *module_name) { if (module_name == NULL) return false; int len = (int)strlen(module_name); return (len > 0 && len <= Symbol::max_length()); } -bool Modules::verify_package_name(char *package_name) { +bool Modules::verify_package_name(const char* package_name) { if (package_name == NULL) return false; int len = (int)strlen(package_name); return (len > 0 && len <= Symbol::max_length() && - UTF8::is_legal_utf8((unsigned char *)package_name, len, false) && + UTF8::is_legal_utf8((const unsigned char *)package_name, len, false) && ClassFileParser::verify_unqualified_name(package_name, len, ClassFileParser::LegalClass)); } @@ -107,10 +105,8 @@ return java_lang_reflect_Module::module_entry(module_h(), CHECK_NULL); } -static PackageEntry* get_package_entry(ModuleEntry* module_entry, jstring package, TRAPS) { +static PackageEntry* get_package_entry(ModuleEntry* module_entry, const char* package_name, TRAPS) { ResourceMark rm(THREAD); - if (package == NULL) return NULL; - const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); if (package_name == NULL) return NULL; TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK_NULL); PackageEntryTable* package_entry_table = module_entry->loader_data()->packages(); @@ -139,7 +135,8 @@ } static void define_javabase_module(jobject module, jstring version, - jstring location, jobjectArray packages, TRAPS) { + jstring location, const char* const* packages, + jsize num_packages, TRAPS) { ResourceMark rm(THREAD); Handle module_handle(THREAD, JNIHandles::resolve(module)); @@ -164,21 +161,12 @@ } } - objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages)); - objArrayHandle packages_h(THREAD, packages_oop); - int num_packages = (packages_h == NULL ? 0 : packages_h->length()); // Check that the list of packages has no duplicates and that the // packages are syntactically ok. GrowableArray* pkg_list = new GrowableArray(num_packages); for (int x = 0; x < num_packages; x++) { - oop string_obj = packages_h->obj_at(x); - - if (string_obj == NULL || !string_obj->is_a(SystemDictionary::String_klass())) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Bad package name for module: " JAVA_BASE_NAME); - } - char *package_name = java_lang_String::as_utf8_string(string_obj); + const char *package_name = packages[x]; if (!Modules::verify_package_name(package_name)) { THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid package name: %s for module: " JAVA_BASE_NAME, package_name)); @@ -277,12 +265,24 @@ } void Modules::define_module(jobject module, jstring version, - jstring location, jobjectArray packages, TRAPS) { + jstring location, const char* const* packages, + jsize num_packages, TRAPS) { ResourceMark rm(THREAD); if (module == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "Null module object"); } + + if (num_packages < 0) { + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "num_packages must be >= 0"); + } + + if (packages == NULL && num_packages > 0) { + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "num_packages should be zero if packages is null"); + } + Handle module_handle(THREAD, JNIHandles::resolve(module)); if (!java_lang_reflect_Module::is_instance(module_handle())) { THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), @@ -297,7 +297,7 @@ // Special handling of java.base definition if (strcmp(module_name, JAVA_BASE_NAME) == 0) { - define_javabase_module(module, version, location, packages, CHECK); + define_javabase_module(module, version, location, packages, num_packages, CHECK); return; } @@ -311,21 +311,11 @@ } Handle h_loader = Handle(THREAD, loader); - objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages)); - objArrayHandle packages_h(THREAD, packages_oop); - int num_packages = (packages_h == NULL ? 0 : packages_h->length()); - // Check that the list of packages has no duplicates and that the // packages are syntactically ok. GrowableArray* pkg_list = new GrowableArray(num_packages); for (int x = 0; x < num_packages; x++) { - oop string_obj = packages_h->obj_at(x); - - if (string_obj == NULL || !string_obj->is_a(SystemDictionary::String_klass())) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - err_msg("Bad package name for module: %s", module_name)); - } - char *package_name = java_lang_String::as_utf8_string(string_obj); + const char* package_name = packages[x]; if (!verify_package_name(package_name)) { THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid package name: %s for module: %s", @@ -337,12 +327,15 @@ !SystemDictionary::is_platform_class_loader(h_loader) && strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { const char* class_loader_name = SystemDictionary::loader_name(h_loader()); - StringUtils::replace_no_expand(package_name, "/", "."); + size_t pkg_len = strlen(package_name); + char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len); + strncpy(pkg_name, package_name, pkg_len); + StringUtils::replace_no_expand(pkg_name, "/", "."); const char* msg_text1 = "Class loader (instance of): "; const char* msg_text2 = " tried to define prohibited package name: "; - size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1; + size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1; char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); - jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name); + jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message); } @@ -506,8 +499,8 @@ java_lang_reflect_Module::set_module_entry(module_handle(), unnamed_module); } -void Modules::add_module_exports(jobject from_module, jstring package, jobject to_module, TRAPS) { - if (package == NULL) { +void Modules::add_module_exports(jobject from_module, const char* package_name, jobject to_module, TRAPS) { + if (package_name == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "package is null"); } @@ -535,10 +528,9 @@ } } - PackageEntry *package_entry = get_package_entry(from_module_entry, package, CHECK); + PackageEntry *package_entry = get_package_entry(from_module_entry, package_name, CHECK); ResourceMark rm(THREAD); if (package_entry == NULL) { - const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Package %s not found in from_module %s", package_name != NULL ? package_name : "", @@ -566,7 +558,7 @@ } -void Modules::add_module_exports_qualified(jobject from_module, jstring package, +void Modules::add_module_exports_qualified(jobject from_module, const char* package, jobject to_module, TRAPS) { if (to_module == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), @@ -658,21 +650,15 @@ } -jobject Modules::get_module_by_package_name(jobject loader, jstring package, TRAPS) { +jobject Modules::get_module_by_package_name(jobject loader, const char* package_name, TRAPS) { ResourceMark rm(THREAD); assert(ModuleEntryTable::javabase_defined(), "Attempt to call get_module_from_pkg before " JAVA_BASE_NAME " is defined"); - if (NULL == package) { + if (package_name == NULL) { THROW_MSG_(vmSymbols::java_lang_NullPointerException(), "package is null", JNI_FALSE); } - const char* package_str = - java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); - if (NULL == package_str) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - "Invalid package", JNI_FALSE); - } Handle h_loader (THREAD, JNIHandles::resolve(loader)); // Check that loader is a subclass of java.lang.ClassLoader. @@ -681,7 +667,7 @@ "Class loader is not a subclass of java.lang.ClassLoader", JNI_FALSE); } - if (strlen(package_str) == 0) { + if (strlen(package_name) == 0) { // Return the unnamed module ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK_NULL); if (NULL == module_table) return NULL; @@ -689,24 +675,24 @@ return JNIHandles::make_local(THREAD, JNIHandles::resolve(unnamed_module->module())); } else { - TempNewSymbol package_sym = SymbolTable::new_symbol(package_str, CHECK_NULL); + TempNewSymbol package_sym = SymbolTable::new_symbol(package_name, CHECK_NULL); return get_module(package_sym, h_loader, CHECK_NULL); } return NULL; } -jobject Modules::get_named_module(Handle h_loader, const char* package_str, TRAPS) { +jobject Modules::get_named_module(Handle h_loader, const char* package_name, TRAPS) { assert(ModuleEntryTable::javabase_defined(), "Attempt to call get_named_module before " JAVA_BASE_NAME " is defined"); assert(h_loader.is_null() || java_lang_ClassLoader::is_subclass(h_loader->klass()), "Class loader is not a subclass of java.lang.ClassLoader"); - assert(package_str != NULL, "the package_str should not be NULL"); + assert(package_name != NULL, "the package_name should not be NULL"); - if (strlen(package_str) == 0) { + if (strlen(package_name) == 0) { return NULL; } - TempNewSymbol package_sym = SymbolTable::new_symbol(package_str, CHECK_NULL); + TempNewSymbol package_sym = SymbolTable::new_symbol(package_name, CHECK_NULL); const PackageEntry* const pkg_entry = get_package_entry_by_name(package_sym, h_loader, THREAD); const ModuleEntry* const module_entry = (pkg_entry != NULL ? pkg_entry->module() : NULL); @@ -732,14 +718,14 @@ return NULL; } -void Modules::add_module_package(jobject module, jstring package, TRAPS) { +void Modules::add_module_package(jobject module, const char* package_name, TRAPS) { ResourceMark rm(THREAD); if (module == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "module is null"); } - if (package == NULL) { + if (package_name == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "package is null"); } @@ -752,11 +738,6 @@ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "module cannot be an unnamed module"); } - char *package_name = java_lang_String::as_utf8_string( - JNIHandles::resolve_non_null(package)); - if (package_name == NULL) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad package"); - } if (!verify_package_name(package_name)) { THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid package name: %s", package_name)); @@ -769,12 +750,15 @@ !loader_data->is_platform_class_loader_data() && strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { const char* class_loader_name = SystemDictionary::loader_name(loader_data); - StringUtils::replace_no_expand(package_name, "/", "."); + size_t pkg_len = strlen(package_name); + char* pkg_name = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, pkg_len); + strncpy(pkg_name, package_name, pkg_len); + StringUtils::replace_no_expand(pkg_name, "/", "."); const char* msg_text1 = "Class loader (instance of): "; const char* msg_text2 = " tried to define prohibited package name: "; - size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1; + size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + pkg_len + 1; char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); - jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name); + jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, pkg_name); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message); } @@ -802,12 +786,12 @@ } // Export package in module to all unnamed modules. -void Modules::add_module_exports_to_all_unnamed(jobject module, jstring package, TRAPS) { +void Modules::add_module_exports_to_all_unnamed(jobject module, const char* package_name, TRAPS) { if (module == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "module is null"); } - if (package == NULL) { + if (package_name == NULL) { THROW_MSG(vmSymbols::java_lang_NullPointerException(), "package is null"); } @@ -818,10 +802,9 @@ } if (module_entry->is_named()) { // No-op for unnamed module. - PackageEntry *package_entry = get_package_entry(module_entry, package, CHECK); + PackageEntry *package_entry = get_package_entry(module_entry, package_name, CHECK); ResourceMark rm(THREAD); if (package_entry == NULL) { - const char *package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Package %s not found in module %s", package_name != NULL ? package_name : "", diff -r 033b9f74b930 -r add500644443 hotspot/src/share/vm/classfile/modules.hpp --- a/hotspot/src/share/vm/classfile/modules.hpp Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/src/share/vm/classfile/modules.hpp Thu Jan 19 11:49:30 2017 +0100 @@ -48,9 +48,12 @@ // * Packages contains a duplicate package name // * A package already exists in another module for this class loader // * Module is an unnamed module + // * num_packages is negative + // * num_packages is non-zero when packages is null // NullPointerExceptions are thrown if module is null. static void define_module(jobject module, jstring version, - jstring location, jobjectArray packages, TRAPS); + jstring location, const char* const* packages, + jsize num_packages, TRAPS); // Provides the java.lang.reflect.Module for the unnamed module defined // to the boot loader. @@ -72,7 +75,7 @@ // * Package is not syntactically correct // * Package is not defined for from_module's class loader // * Package is not in module from_module. - static void add_module_exports(jobject from_module, jstring package, jobject to_module, TRAPS); + static void add_module_exports(jobject from_module, const char* package, jobject to_module, TRAPS); // This does a qualified export of package in module from_module to module // to_module. The format for the package name must use "/' not ".". @@ -83,7 +86,7 @@ // * Package is not syntactically correct // * Package is not defined for from_module's class loader // * Package is not in module from_module. - static void add_module_exports_qualified(jobject from_module, jstring package, jobject to_module, TRAPS); + static void add_module_exports_qualified(jobject from_module, const char* package, jobject to_module, TRAPS); // add_reads_module adds module to_module to the list of modules that from_module // can read. If from_module is the same as to_module then this is a no-op. @@ -102,7 +105,7 @@ // NullPointerException is thrown if package is null. // IllegalArgumentException is thrown if loader is neither null nor a subtype of // java/lang/ClassLoader. - static jobject get_module_by_package_name(jobject loader, jstring package, TRAPS); + static jobject get_module_by_package_name(jobject loader, const char* package, TRAPS); static jobject get_named_module(Handle h_loader, const char* package, TRAPS); // If package is defined by loader, return the @@ -116,16 +119,16 @@ // * Module is unnamed // * Package is not syntactically correct // * Package is already defined for module's class loader. - static void add_module_package(jobject module, jstring package, TRAPS); + static void add_module_package(jobject module, const char* package, TRAPS); // Marks the specified package as exported to all unnamed modules. // If either module or package is null then NullPointerException is thrown. // If module or package is bad, or module is unnamed, or package is not in // module then IllegalArgumentException is thrown. - static void add_module_exports_to_all_unnamed(jobject module, jstring package, TRAPS); + static void add_module_exports_to_all_unnamed(jobject module, const char* package, TRAPS); // Return TRUE if package_name is syntactically valid, false otherwise. - static bool verify_package_name(char *package_name); + static bool verify_package_name(const char *package_name); // Return TRUE iff package is defined by loader static bool is_package_defined(Symbol* package_name, Handle h_loader, TRAPS); diff -r 033b9f74b930 -r add500644443 hotspot/src/share/vm/prims/jvm.cpp --- a/hotspot/src/share/vm/prims/jvm.cpp Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/src/share/vm/prims/jvm.cpp Thu Jan 19 11:49:30 2017 +0100 @@ -1009,9 +1009,9 @@ // Module support ////////////////////////////////////////////////////////////////////////////// JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version, - jstring location, jobjectArray packages)) + jstring location, const char* const* packages, jsize num_packages)) JVMWrapper("JVM_DefineModule"); - Modules::define_module(module, version, location, packages, CHECK); + Modules::define_module(module, version, location, packages, num_packages, CHECK); JVM_END JVM_ENTRY(void, JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module)) @@ -1019,17 +1019,17 @@ Modules::set_bootloader_unnamed_module(module, CHECK); JVM_END -JVM_ENTRY(void, JVM_AddModuleExports(JNIEnv *env, jobject from_module, jstring package, jobject to_module)) +JVM_ENTRY(void, JVM_AddModuleExports(JNIEnv *env, jobject from_module, const char* package, jobject to_module)) JVMWrapper("JVM_AddModuleExports"); Modules::add_module_exports_qualified(from_module, package, to_module, CHECK); JVM_END -JVM_ENTRY(void, JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, jstring package)) +JVM_ENTRY(void, JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, const char* package)) JVMWrapper("JVM_AddModuleExportsToAllUnnamed"); Modules::add_module_exports_to_all_unnamed(from_module, package, CHECK); JVM_END -JVM_ENTRY(void, JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package)) +JVM_ENTRY(void, JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, const char* package)) JVMWrapper("JVM_AddModuleExportsToAll"); Modules::add_module_exports(from_module, package, NULL, CHECK); JVM_END @@ -1039,16 +1039,11 @@ Modules::add_reads_module(from_module, source_module, CHECK); JVM_END -JVM_ENTRY (void, JVM_AddModulePackage(JNIEnv *env, jobject module, jstring package)) +JVM_ENTRY (void, JVM_AddModulePackage(JNIEnv *env, jobject module, const char* package)) JVMWrapper("JVM_AddModulePackage"); Modules::add_module_package(module, package, CHECK); JVM_END -JVM_ENTRY (jobject, JVM_GetModuleByPackageName(JNIEnv *env, jobject loader, jstring package)) - JVMWrapper("JVM_GetModuleByPackageName"); - return Modules::get_module_by_package_name(loader, package, THREAD); -JVM_END - // Reflection support ////////////////////////////////////////////////////////////////////////////// JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls)) diff -r 033b9f74b930 -r add500644443 hotspot/src/share/vm/prims/jvm.h --- a/hotspot/src/share/vm/prims/jvm.h Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/src/share/vm/prims/jvm.h Thu Jan 19 11:49:30 2017 +0100 @@ -412,30 +412,67 @@ * Module support funcions */ +/* + * Define a module with the specified packages and bind the module to the + * given class loader. + * module: module to define + * is_open: specifies if module is open (currently ignored) + * version: the module version + * location: the module location + * packages: list of packages in the module + * num_packages: number of packages in the module + */ JNIEXPORT void JNICALL JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version, - jstring location, jobjectArray packages); + jstring location, const char* const* packages, jsize num_packages); +/* + * Set the boot loader's unnamed module. + * module: boot loader's unnamed module + */ JNIEXPORT void JNICALL JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module); +/* + * Do a qualified export of a package. + * from_module: module containing the package to export + * package: name of the package to export + * to_module: module to export the package to + */ JNIEXPORT void JNICALL -JVM_AddModuleExports(JNIEnv *env, jobject from_module, jstring package, jobject to_module); +JVM_AddModuleExports(JNIEnv *env, jobject from_module, const char* package, jobject to_module); +/* + * Do an export of a package to all unnamed modules. + * from_module: module containing the package to export + * package: name of the package to export to all unnamed modules + */ JNIEXPORT void JNICALL -JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, jstring package); +JVM_AddModuleExportsToAllUnnamed(JNIEnv *env, jobject from_module, const char* package); +/* + * Do an unqualified export of a package. + * from_module: module containing the package to export + * package: name of the package to export + */ JNIEXPORT void JNICALL -JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package); +JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, const char* package); +/* + * Add a module to the list of modules that a given module can read. + * from_module: module requesting read access + * source_module: module that from_module wants to read + */ JNIEXPORT void JNICALL JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module); +/* + * Add a package to a module. + * module: module that will contain the package + * package: package to add to the module + */ JNIEXPORT void JNICALL -JVM_AddModulePackage(JNIEnv* env, jobject module, jstring package); - -JNIEXPORT jobject JNICALL -JVM_GetModuleByPackageName(JNIEnv* env, jobject loader, jstring package); +JVM_AddModulePackage(JNIEnv* env, jobject module, const char* package); /* * Reflection support functions diff -r 033b9f74b930 -r add500644443 hotspot/src/share/vm/prims/whitebox.cpp --- a/hotspot/src/share/vm/prims/whitebox.cpp Thu Jan 19 11:10:33 2017 +0100 +++ b/hotspot/src/share/vm/prims/whitebox.cpp Thu Jan 19 11:49:30 2017 +0100 @@ -40,6 +40,8 @@ #include "memory/universe.hpp" #include "memory/oopFactory.hpp" #include "oops/constantPool.hpp" +#include "oops/objArrayKlass.hpp" +#include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "prims/wbtestmethods/parserTests.hpp" #include "prims/whitebox.hpp" @@ -1403,19 +1405,52 @@ WB_ENTRY(void, WB_DefineModule(JNIEnv* env, jobject o, jobject module, jstring version, jstring location, jobjectArray packages)) - Modules::define_module(module, version, location, packages, CHECK); + ResourceMark rm(THREAD); + + objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages)); + objArrayHandle packages_h(THREAD, packages_oop); + int num_packages = (packages_h == NULL ? 0 : packages_h->length()); + + char** pkgs = NULL; + if (num_packages > 0) { + pkgs = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char*, num_packages); + for (int x = 0; x < num_packages; x++) { + oop pkg_str = packages_h->obj_at(x); + if (pkg_str == NULL || !pkg_str->is_a(SystemDictionary::String_klass())) { + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + err_msg("Bad package name")); + } + pkgs[x] = java_lang_String::as_utf8_string(pkg_str); + } + } + Modules::define_module(module, version, location, (const char* const*)pkgs, num_packages, CHECK); WB_END WB_ENTRY(void, WB_AddModuleExports(JNIEnv* env, jobject o, jobject from_module, jstring package, jobject to_module)) - Modules::add_module_exports_qualified(from_module, package, to_module, CHECK); + ResourceMark rm(THREAD); + char* package_name = NULL; + if (package != NULL) { + package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); + } + Modules::add_module_exports_qualified(from_module, package_name, to_module, CHECK); WB_END WB_ENTRY(void, WB_AddModuleExportsToAllUnnamed(JNIEnv* env, jobject o, jclass module, jstring package)) - Modules::add_module_exports_to_all_unnamed(module, package, CHECK); + ResourceMark rm(THREAD); + char* package_name = NULL; + if (package != NULL) { + package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); + } + Modules::add_module_exports_to_all_unnamed(module, package_name, CHECK); WB_END WB_ENTRY(void, WB_AddModuleExportsToAll(JNIEnv* env, jobject o, jclass module, jstring package)) - Modules::add_module_exports(module, package, NULL, CHECK); + ResourceMark rm(THREAD); + char* package_name = NULL; + if (package != NULL) { + package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); + } + Modules::add_module_exports(module, package_name, NULL, CHECK); WB_END WB_ENTRY(void, WB_AddReadsModule(JNIEnv* env, jobject o, jobject from_module, jobject source_module)) @@ -1423,11 +1458,21 @@ WB_END WB_ENTRY(void, WB_AddModulePackage(JNIEnv* env, jobject o, jclass module, jstring package)) - Modules::add_module_package(module, package, CHECK); + ResourceMark rm(THREAD); + char* package_name = NULL; + if (package != NULL) { + package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); + } + Modules::add_module_package(module, package_name, CHECK); WB_END WB_ENTRY(jobject, WB_GetModuleByPackageName(JNIEnv* env, jobject o, jobject loader, jstring package)) - return Modules::get_module_by_package_name(loader, package, THREAD); + ResourceMark rm(THREAD); + char* package_name = NULL; + if (package != NULL) { + package_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(package)); + } + return Modules::get_module_by_package_name(loader, package_name, THREAD); WB_END WB_ENTRY(jlong, WB_IncMetaspaceCapacityUntilGC(JNIEnv* env, jobject wb, jlong inc))