8171855: Move package name transformations during module bootstrap into native code
Reviewed-by: alanb, acorn, lfoltan, mchung, plevart, hseigel, sspitsyn
--- 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
--- 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<Symbol*>* pkg_list = new GrowableArray<Symbol*>(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<Symbol*>* pkg_list = new GrowableArray<Symbol*>(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 : "",
--- 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);
--- 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))
--- 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
--- 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))