--- a/hotspot/.hgignore Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/.hgignore Thu Dec 01 21:40:08 2016 +0000
@@ -8,7 +8,6 @@
^src/share/tools/IdealGraphVisualizer/dist/
^src/share/tools/IdealGraphVisualizer/nbplatform/
.igv.log
-^.hgtip
.DS_Store
^\.mx.jvmci/env
^\.mx.jvmci/.*\.pyc
--- a/hotspot/make/symbols/symbols-unix Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/make/symbols/symbols-unix Thu Dec 01 21:40:08 2016 +0000
@@ -190,8 +190,6 @@
JVM_AddModuleExportsToAllUnnamed
JVM_AddModulePackage
JVM_AddReadsModule
-JVM_CanReadModule
JVM_DefineModule
-JVM_IsExportedToModule
JVM_SetBootLoaderUnnamedModule
JVM_GetModuleByPackageName
--- a/hotspot/make/test/JtregNative.gmk Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/make/test/JtregNative.gmk Thu Dec 01 21:40:08 2016 +0000
@@ -55,6 +55,9 @@
$(HOTSPOT_TOPDIR)/test/compiler/calls \
$(HOTSPOT_TOPDIR)/test/compiler/native \
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \
+ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleReads \
+ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleExportsAndOpens \
+ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleUsesAndProvides \
$(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \
$(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetModulesInfo \
@@ -81,6 +84,9 @@
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_liboverflow := -lc
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libSimpleClassFileLoadHook := -lc
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libGetNamedModuleTest := -lc
+ BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleReadsTest := -lc
+ BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleExportsAndOpensTest := -lc
+ BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleUsesAndProvidesTest := -lc
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassFileLoadHook := -lc
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassLoadPrepare := -lc
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAThreadStart := -lc
--- a/hotspot/src/jdk.vm.ci/share/classes/module-info.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/module-info.java Thu Dec 01 21:40:08 2016 +0000
@@ -30,9 +30,7 @@
uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory;
provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with
- jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory;
- provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with
- jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory;
- provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with
+ jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory,
+ jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory,
jdk.vm.ci.hotspot.sparc.SPARCHotSpotJVMCIBackendFactory;
}
--- a/hotspot/src/share/vm/classfile/moduleEntry.hpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/classfile/moduleEntry.hpp Thu Dec 01 21:40:08 2016 +0000
@@ -36,6 +36,8 @@
#include "utilities/ostream.hpp"
#define UNNAMED_MODULE "Unnamed Module"
+#define JAVAPKG "java/"
+#define JAVAPKG_LEN 5
class ModuleClosure;
--- a/hotspot/src/share/vm/classfile/modules.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/classfile/modules.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -34,6 +34,7 @@
#include "classfile/packageEntry.hpp"
#include "classfile/stringTable.hpp"
#include "classfile/symbolTable.hpp"
+#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
#include "logging/log.hpp"
#include "memory/resourceArea.hpp"
@@ -44,6 +45,7 @@
#include "runtime/handles.inline.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/reflection.hpp"
+#include "utilities/stringUtils.hpp"
#include "utilities/utf8.hpp"
static bool verify_module_name(char *module_name) {
@@ -290,6 +292,14 @@
const char* module_version = get_module_version(version);
+ oop loader = java_lang_reflect_Module::loader(module_handle());
+ // Make sure loader is not the jdk.internal.reflect.DelegatingClassLoader.
+ if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) {
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
+ "Class loader is an invalid delegating class loader");
+ }
+ 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());
@@ -310,6 +320,21 @@
err_msg("Invalid package name: %s for module: %s",
package_name, module_name));
}
+
+ // Only modules defined to either the boot or platform class loader, can define a "java/" package.
+ if (!h_loader.is_null() &&
+ !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, "/", ".");
+ 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;
+ 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);
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
+ }
+
Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
// append_if_missing() returns FALSE if entry already exists.
if (!pkg_list->append_if_missing(pkg_symbol)) {
@@ -319,20 +344,6 @@
}
}
- oop loader = java_lang_reflect_Module::loader(module_handle());
- // Make sure loader is not the sun.reflect.DelegatingClassLoader.
- if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- "Class loader is an invalid delegating class loader");
- }
- Handle h_loader = Handle(THREAD, loader);
-
- // Check that loader is a subclass of java.lang.ClassLoader.
- if (loader != NULL && !java_lang_ClassLoader::is_subclass(h_loader->klass())) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
- "Class loader is not a subclass of java.lang.ClassLoader");
- }
-
ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK);
assert(module_table != NULL, "module entry table shouldn't be null");
@@ -595,122 +606,6 @@
}
}
-jboolean Modules::can_read_module(jobject asking_module, jobject target_module, TRAPS) {
- if (asking_module == NULL) {
- THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
- "asking_module is null", JNI_FALSE);
- }
-
- ModuleEntry* asking_module_entry = get_module_entry(asking_module, CHECK_false);
- if (asking_module_entry == NULL) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- "asking_module is invalid", JNI_FALSE);
- }
-
- // Calling can_read_all_unnamed() with NULL tests if a module is loose.
- if (target_module == NULL) {
- return asking_module_entry->can_read_all_unnamed();
- }
-
- ModuleEntry* target_module_entry = get_module_entry(target_module, CHECK_false);
- if (target_module_entry == NULL) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- "target_module is invalid", JNI_FALSE);
- }
-
- ResourceMark rm(THREAD);
- log_debug(modules)("can_read_module(): module %s trying to read module %s, allowed = %s",
- asking_module_entry->is_named() ?
- asking_module_entry->name()->as_C_string() : UNNAMED_MODULE,
- target_module_entry->is_named() ?
- target_module_entry->name()->as_C_string() : UNNAMED_MODULE,
- BOOL_TO_STR(asking_module_entry == target_module_entry ||
- (asking_module_entry->can_read_all_unnamed() &&
- !target_module_entry->is_named()) ||
- asking_module_entry->can_read(target_module_entry)));
-
- // Return true if:
- // 1. the modules are the same, or
- // 2. the asking_module is unnamed (because unnamed modules read everybody), or
- // 3. the asking_module is loose and the target module is unnamed, or
- // 4. if can_read() returns true.
- if (asking_module_entry == target_module_entry ||
- (asking_module_entry->can_read_all_unnamed() && !target_module_entry->is_named())) {
- return true;
- }
- return asking_module_entry->can_read(target_module_entry);
-}
-
-jboolean Modules::is_exported_to_module(jobject from_module, jstring package,
- jobject to_module, TRAPS) {
- if (package == NULL) {
- THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
- "package is null", JNI_FALSE);
- }
- if (from_module == NULL) {
- THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
- "from_module is null", JNI_FALSE);
- }
- ModuleEntry* from_module_entry = get_module_entry(from_module, CHECK_false);
- if (from_module_entry == NULL) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- "from_module is invalid", JNI_FALSE);
- }
- ModuleEntry* to_module_entry;
- if (to_module == NULL) {
- THROW_MSG_(vmSymbols::java_lang_NullPointerException(),
- "to_module is null", JNI_FALSE);
- }
- to_module_entry = get_module_entry(to_module, CHECK_false);
- if (to_module_entry == NULL) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- "to_module is invalid", JNI_FALSE);
- }
-
- PackageEntry *package_entry = get_package_entry(from_module_entry, package,
- CHECK_false);
- ResourceMark rm(THREAD);
- if (package_entry == NULL) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Package not found in from_module: %s",
- from_module_entry->is_named() ?
- from_module_entry->name()->as_C_string() : UNNAMED_MODULE),
- JNI_FALSE);
- }
- if (package_entry->module() != from_module_entry) {
- THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Package: %s found in module %s, not in from_module: %s",
- package_entry->name()->as_C_string(),
- package_entry->module()->is_named() ?
- package_entry->module()->name()->as_C_string() : UNNAMED_MODULE,
- from_module_entry->is_named() ?
- from_module_entry->name()->as_C_string() : UNNAMED_MODULE),
- JNI_FALSE);
- }
-
- log_debug(modules)("is_exported_to_module: package %s from module %s checking"
- " if exported to module %s, exported? = %s",
- package_entry->name()->as_C_string(),
- from_module_entry->is_named() ?
- from_module_entry->name()->as_C_string() : UNNAMED_MODULE,
- to_module_entry->is_named() ?
- to_module_entry->name()->as_C_string() : UNNAMED_MODULE,
- BOOL_TO_STR(!from_module_entry->is_named() ||
- package_entry->is_unqual_exported() ||
- from_module_entry == to_module_entry ||
- package_entry->is_qexported_to(to_module_entry)));
-
- // Return true if:
- // 1. from_module is unnamed because unnamed modules export all their packages (by default), or
- // 2. if the package is unqualifiedly exported, or
- // 3. if the modules are the same, or
- // 4. if the package is exported to to_module
- return (!from_module_entry->is_named() ||
- package_entry->is_unqual_exported() ||
- from_module_entry == to_module_entry ||
- package_entry->is_qexported_to(to_module_entry));
-}
-
// This method is called by JFR and JNI.
jobject Modules::get_module(jclass clazz, TRAPS) {
assert(ModuleEntryTable::javabase_defined(), "Attempt to call get_module before java.base is defined");
@@ -860,11 +755,27 @@
err_msg("Invalid package name: %s", package_name));
}
+ ClassLoaderData *loader_data = module_entry->loader_data();
+
+ // Only modules defined to either the boot or platform class loader, can define a "java/" package.
+ if (!loader_data->is_the_null_class_loader_data() &&
+ !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, "/", ".");
+ 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;
+ 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);
+ THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message);
+ }
+
log_debug(modules)("add_module_package(): Adding package %s to module %s",
package_name, module_entry->name()->as_C_string());
TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK);
- PackageEntryTable* package_table = module_entry->loader_data()->packages();
+ PackageEntryTable* package_table = loader_data->packages();
assert(package_table != NULL, "Missing package_table");
bool pkg_exists = false;
--- a/hotspot/src/share/vm/classfile/modules.hpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/classfile/modules.hpp Thu Dec 01 21:40:08 2016 +0000
@@ -93,24 +93,6 @@
// module does not exist.
static void add_reads_module(jobject from_module, jobject to_module, TRAPS);
- // can_read_module returns TRUE if module asking_module can read module target_module,
- // or if they are the same module, or if the asking_module is loose and target_module
- // is null.
- //
- // Throws IllegalArgumentException if:
- // * either asking_module or target_module is not a java.lang.reflect.Module
- static jboolean can_read_module(jobject asking_module, jobject target_module, TRAPS);
-
- // If package is valid then this returns TRUE if module from_module exports
- // package to module to_module, if from_module and to_module are the same
- // module, or if package is exported without qualification.
- //
- // IllegalArgumentException is throw if:
- // * Either to_module or from_module does not exist
- // * package is syntactically incorrect
- // * package is not in from_module
- static jboolean is_exported_to_module(jobject from_module, jstring package, jobject to_module, TRAPS);
-
// Return the java.lang.reflect.Module object for this class object.
static jobject get_module(jclass clazz, TRAPS);
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Dec 01 21:40:08 2016 +0000
@@ -451,8 +451,6 @@
template(loader_name, "loader") \
template(module_name, "module") \
template(getModule_name, "getModule") \
- template(addReads_name, "addReads") \
- template(addReads_signature, "(Ljava/lang/reflect/Module;Ljava/lang/reflect/Module;)V") \
template(input_stream_void_signature, "(Ljava/io/InputStream;)V") \
template(definePackage_name, "definePackage") \
template(definePackage_signature, "(Ljava/lang/String;Ljava/lang/reflect/Module;)Ljava/lang/Package;") \
@@ -645,6 +643,15 @@
/* JVMTI/java.lang.instrument support and VM Attach mechanism */ \
template(jdk_internal_module_Modules, "jdk/internal/module/Modules") \
template(jdk_internal_vm_VMSupport, "jdk/internal/vm/VMSupport") \
+ template(addReads_name, "addReads") \
+ template(addReads_signature, "(Ljava/lang/reflect/Module;Ljava/lang/reflect/Module;)V") \
+ template(addExports_name, "addExports") \
+ template(addOpens_name, "addOpens") \
+ template(addExports_signature, "(Ljava/lang/reflect/Module;Ljava/lang/String;Ljava/lang/reflect/Module;)V") \
+ template(addUses_name, "addUses") \
+ template(addUses_signature, "(Ljava/lang/reflect/Module;Ljava/lang/Class;)V") \
+ template(addProvides_name, "addProvides") \
+ template(addProvides_signature, "(Ljava/lang/reflect/Module;Ljava/lang/Class;Ljava/lang/Class;)V") \
template(transformedByAgent_name, "transformedByAgent") \
template(transformedByAgent_signature, "(Ljava/lang/reflect/Module;)V") \
template(appendToClassPathForInstrumentation_name, "appendToClassPathForInstrumentation") \
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -26,6 +26,7 @@
#include "classfile/classFileParser.hpp"
#include "classfile/classFileStream.hpp"
#include "classfile/javaClasses.hpp"
+#include "classfile/moduleEntry.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/systemDictionaryShared.hpp"
#include "classfile/verifier.hpp"
@@ -2383,18 +2384,17 @@
// Only boot and platform class loaders can define classes in "java/" packages.
void InstanceKlass::check_prohibited_package(Symbol* class_name,
- Handle class_loader,
- TRAPS) {
- const char* javapkg = "java/";
+ Handle class_loader,
+ TRAPS) {
ResourceMark rm(THREAD);
if (!class_loader.is_null() &&
!SystemDictionary::is_platform_class_loader(class_loader) &&
class_name != NULL &&
- strncmp(class_name->as_C_string(), javapkg, strlen(javapkg)) == 0) {
+ strncmp(class_name->as_C_string(), JAVAPKG, JAVAPKG_LEN) == 0) {
TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK);
assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'");
char* name = pkg_name->as_C_string();
- const char* class_loader_name = InstanceKlass::cast(class_loader()->klass())->name()->as_C_string();
+ const char* class_loader_name = SystemDictionary::loader_name(class_loader());
StringUtils::replace_no_expand(name, "/", ".");
const char* msg_text1 = "Class loader (instance of): ";
const char* msg_text2 = " tried to load prohibited package name: ";
--- a/hotspot/src/share/vm/prims/jni.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jni.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -3475,40 +3475,6 @@
JNI_END
-JNI_ENTRY(void, jni_AddModuleReads(JNIEnv* env, jobject m1, jobject m2))
- JNIWrapper("AddModuleReads");
- if (m1 == NULL || m2 == NULL) {
- THROW(vmSymbols::java_lang_NullPointerException());
- }
- JavaValue result(T_VOID);
- Handle m1_h(THREAD, JNIHandles::resolve(m1));
- if (!java_lang_reflect_Module::is_instance(m1_h())) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad m1 object");
- }
- Handle m2_h(THREAD, JNIHandles::resolve(m2));
- if (!java_lang_reflect_Module::is_instance(m2_h())) {
- THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad m2 object");
- }
- JavaCalls::call_static(&result,
- KlassHandle(THREAD, SystemDictionary::module_Modules_klass()),
- vmSymbols::addReads_name(),
- vmSymbols::addReads_signature(),
- m1_h,
- m2_h,
- THREAD);
-JNI_END
-
-
-JNI_ENTRY(jboolean, jni_CanReadModule(JNIEnv* env, jobject m1, jobject m2))
- JNIWrapper("CanReadModule");
- if (m1 == NULL || m2 == NULL) {
- THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
- }
- jboolean res = Modules::can_read_module(m1, m2, CHECK_false);
- return res;
-JNI_END
-
-
// Structure containing all jni functions
struct JNINativeInterface_ jni_NativeInterface = {
NULL,
@@ -3792,9 +3758,7 @@
// Module features
- jni_GetModule,
- jni_AddModuleReads,
- jni_CanReadModule
+ jni_GetModule
};
--- a/hotspot/src/share/vm/prims/jni.h Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jni.h Thu Dec 01 21:40:08 2016 +0000
@@ -770,12 +770,6 @@
jobject (JNICALL *GetModule)
(JNIEnv* env, jclass clazz);
-
- void (JNICALL *AddModuleReads)
- (JNIEnv* env, jobject m1, jobject m2);
-
- jboolean (JNICALL *CanReadModule)
- (JNIEnv* env, jobject m1, jobject m2);
};
/*
@@ -1874,14 +1868,6 @@
return functions->GetModule(this, clazz);
}
- void AddModuleReads(jobject fromModule, jobject sourceModule) {
- functions->AddModuleReads(this, fromModule, sourceModule);
- }
-
- jboolean CanReadModule(jobject askingModule, jobject sourceModule) {
- return functions->CanReadModule(this, askingModule, sourceModule);
- }
-
#endif /* __cplusplus */
};
--- a/hotspot/src/share/vm/prims/jniCheck.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jniCheck.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -2001,37 +2001,6 @@
return result;
JNI_END
-JNI_ENTRY_CHECKED(void,
- checked_jni_AddModuleReads(JNIEnv *env,
- jobject fromModule,
- jobject sourceModule))
- functionEnter(thr);
- IN_VM(
- jniCheck::validate_object(thr, fromModule);
- if (sourceModule != NULL) {
- jniCheck::validate_object(thr, sourceModule);
- }
- )
- UNCHECKED()->AddModuleReads(env,fromModule,sourceModule);
- functionExit(thr);
-JNI_END
-
-JNI_ENTRY_CHECKED(jboolean,
- checked_jni_CanReadModule(JNIEnv *env,
- jobject askingModule,
- jobject sourceModule))
- functionEnter(thr);
- IN_VM(
- jniCheck::validate_object(thr, askingModule);
- if (sourceModule != NULL) {
- jniCheck::validate_object(thr, sourceModule);
- }
- )
- jboolean result = UNCHECKED()->CanReadModule(env,askingModule,sourceModule);
- functionExit(thr);
- return result;
-JNI_END
-
/*
* Structure containing all checked jni functions
*/
@@ -2317,9 +2286,7 @@
// Module Features
- checked_jni_GetModule,
- checked_jni_AddModuleReads,
- checked_jni_CanReadModule
+ checked_jni_GetModule
};
--- a/hotspot/src/share/vm/prims/jvm.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvm.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -1008,8 +1008,8 @@
// Module support //////////////////////////////////////////////////////////////////////////////
-JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jstring version, jstring location,
- jobjectArray packages))
+JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version,
+ jstring location, jobjectArray packages))
JVMWrapper("JVM_DefineModule");
Modules::define_module(module, version, location, packages, CHECK);
JVM_END
@@ -1039,16 +1039,6 @@
Modules::add_reads_module(from_module, source_module, CHECK);
JVM_END
-JVM_ENTRY(jboolean, JVM_CanReadModule(JNIEnv *env, jobject asking_module, jobject source_module))
- JVMWrapper("JVM_CanReadModule");
- return Modules::can_read_module(asking_module, source_module, THREAD);
-JVM_END
-
-JVM_ENTRY(jboolean, JVM_IsExportedToModule(JNIEnv *env, jobject from_module, jstring package, jobject to_module))
- JVMWrapper("JVM_IsExportedToModule");
- return Modules::is_exported_to_module(from_module, package, to_module, THREAD);
-JVM_END
-
JVM_ENTRY (void, JVM_AddModulePackage(JNIEnv *env, jobject module, jstring package))
JVMWrapper("JVM_AddModulePackage");
Modules::add_module_package(module, package, CHECK);
--- a/hotspot/src/share/vm/prims/jvm.h Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvm.h Thu Dec 01 21:40:08 2016 +0000
@@ -413,8 +413,8 @@
*/
JNIEXPORT void JNICALL
-JVM_DefineModule(JNIEnv *env, jobject module, jstring version, jstring location,
- jobjectArray packages);
+JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version,
+ jstring location, jobjectArray packages);
JNIEXPORT void JNICALL
JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module);
@@ -431,12 +431,6 @@
JNIEXPORT void JNICALL
JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module);
-JNIEXPORT jboolean JNICALL
-JVM_CanReadModule(JNIEnv *env, jobject asking_module, jobject source_module);
-
-JNIEXPORT jboolean JNICALL
-JVM_IsExportedToModule(JNIEnv *env, jobject from_module, jstring package, jobject to_module);
-
JNIEXPORT void JNICALL
JVM_AddModulePackage(JNIEnv* env, jobject module, jstring package);
--- a/hotspot/src/share/vm/prims/jvmti.xml Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmti.xml Thu Dec 01 21:40:08 2016 +0000
@@ -863,14 +863,12 @@
</intro>
<intro id="bcimodules" label="Bytecode Instrumentation of code in modules">
- Agents that instrument code in named modules may need to arrange for those
- modules to read other modules. If code is instrumented to invoke a method
- in a support class in another module, then the module of the instrumented
- code should read the module of the supporting class. Furthermore, the
- supporting class will only be accessible to the instrumented code if
- it is <code>public</code> and in a package that is exported by its module.
- Agents can use the JNI functions <code>CanReadModule</code> and
- <code>AddModuleReads</code> to test and update a module to read another.
+ Agents can use the functions <functionlink id="AddModuleReads"/>,
+ <functionlink id="AddModuleExports"/>, <functionlink id="AddModuleOpens"/>,
+ <functionlink id="AddModuleUses"/> and <functionlink id="AddModuleProvides"/>
+ to update a module to expand the set of modules that it reads, the set of
+ packages that it exports or opens to other modules, or the services that it
+ uses and provides.
<p/>
As an aid to agents that deploy supporting classes on the search path of
the bootstrap class loader, or the search path of the class loader that
@@ -6561,6 +6559,227 @@
</error>
</errors>
</function>
+
+ <function id="AddModuleReads" num="94" since="9">
+ <synopsis>Add Module Reads</synopsis>
+ <description>
+ Update a module to read another module. This function is a no-op
+ when <paramlink id="module"></paramlink> is an unnamed module.
+ This function facilitates the instrumentation of code
+ in named modules where that instrumentation requires
+ expanding the set of modules that a module reads.
+ </description>
+ <origin>new</origin>
+ <capabilities>
+ </capabilities>
+ <parameters>
+ <param id="module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module to update.
+ </description>
+ </param>
+ <param id="to_module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The additional module to read.
+ </description>
+ </param>
+ </parameters>
+ <errors>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="module"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="to_module"></paramlink> is not a module object.
+ </error>
+ </errors>
+ </function>
+
+ <function id="AddModuleExports" num="95" since="9">
+ <synopsis>Add Module Exports</synopsis>
+ <description>
+ Update a module to export a package to another module.
+ This function is a no-op when <paramlink id="module"></paramlink>
+ is an unnamed module or an open module.
+ This function facilitates the instrumentation of code
+ in named modules where that instrumentation requires
+ expanding the set of packages that a module exports.
+ </description>
+ <origin>new</origin>
+ <capabilities>
+ </capabilities>
+ <parameters>
+ <param id="module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module to update.
+ </description>
+ </param>
+ <param id="pkg_name">
+ <inbuf><char/></inbuf>
+ <description>
+ The exported package name.
+ </description>
+ </param>
+ <param id="to_module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module the package is exported to.
+ If the <code>to_module</code> is not a subclass of
+ <code>java.lang.reflect.Module</code> this function returns
+ <errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>.
+ </description>
+ </param>
+ </parameters>
+ <errors>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="module"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="to_modules"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
+ If the package <paramlink id="pkg_name"></paramlink>
+ does not belong to the module.
+ </error>
+ </errors>
+ </function>
+
+ <function id="AddModuleOpens" num="96" since="9">
+ <synopsis>Add Module Opens</synopsis>
+ <description>
+ Update a module to open a package to another module.
+ This function is a no-op when <paramlink id="module"></paramlink>
+ is an unnamed module or an open module.
+ This function facilitates the instrumentation of code
+ in modules where that instrumentation requires
+ expanding the set of packages that a module opens to
+ other modules.
+ </description>
+ <origin>new</origin>
+ <capabilities>
+ </capabilities>
+ <parameters>
+ <param id="module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module to update.
+ </description>
+ </param>
+ <param id="pkg_name">
+ <inbuf><char/></inbuf>
+ <description>
+ The package name of the package to open.
+ </description>
+ </param>
+ <param id="to_module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module with the package to open.
+ If the <code>to_module</code> is not a subclass of
+ <code>java.lang.reflect.Module</code> this function returns
+ <errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>.
+ </description>
+ </param>
+ </parameters>
+ <errors>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="module"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="to_modules"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
+ If the package <paramlink id="pkg_name"></paramlink>
+ does not belong to the module.
+ </error>
+ </errors>
+ </function>
+
+ <function id="AddModuleUses" num="97" since="9">
+ <synopsis>Add Module Uses</synopsis>
+ <description>
+ Updates a module to add a service to the set of services that
+ a module uses. This function is a no-op when the module
+ is an unnamed module.
+ This function facilitates the instrumentation of code
+ in named modules where that instrumentation requires
+ expanding the set of services that a module is using.
+ </description>
+ <origin>new</origin>
+ <capabilities>
+ </capabilities>
+ <parameters>
+ <param id="module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module to update.
+ </description>
+ </param>
+ <param id="service">
+ <ptrtype><jclass/></ptrtype>
+ <description>
+ The service to use.
+ </description>
+ </param>
+ </parameters>
+ <errors>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="module"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_CLASS">
+ If <paramlink id="service"></paramlink> is not a class object.
+ </error>
+ </errors>
+ </function>
+
+ <function id="AddModuleProvides" num="98" since="9">
+ <synopsis>Add Module Provides</synopsis>
+ <description>
+ Updates a module to add a service to the set of services that
+ a module provides. This function is a no-op when the module
+ is an unnamed module.
+ This function facilitates the instrumentation of code
+ in named modules where that instrumentation requires
+ changes to the services that are provided.
+ </description>
+ <origin>new</origin>
+ <capabilities>
+ </capabilities>
+ <parameters>
+ <param id="module">
+ <ptrtype><jobject/></ptrtype>
+ <description>
+ The module to update.
+ </description>
+ </param>
+ <param id="service">
+ <ptrtype><jclass/></ptrtype>
+ <description>
+ The service to provide.
+ </description>
+ </param>
+ <param id="impl_class">
+ <ptrtype><jclass/></ptrtype>
+ <description>
+ The implementation class for the provided service.
+ </description>
+ </param>
+ </parameters>
+ <errors>
+ <error id="JVMTI_ERROR_INVALID_MODULE">
+ If <paramlink id="module"></paramlink> is not a module object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_CLASS">
+ If <paramlink id="service"></paramlink> is not a class object.
+ </error>
+ <error id="JVMTI_ERROR_INVALID_CLASS">
+ If <paramlink id="impl_class"></paramlink> is not a class object.
+ </error>
+ </errors>
+ </function>
+
</category>
<category id="class" label="Class">
@@ -11371,6 +11590,9 @@
<errorid id="JVMTI_ERROR_INVALID_FIELDID" num="25">
Invalid field.
</errorid>
+ <errorid id="JVMTI_ERROR_INVALID_MODULE" num="26">
+ Invalid module.
+ </errorid>
<errorid id="JVMTI_ERROR_INVALID_METHODID" num="23">
Invalid method.
</errorid>
@@ -14492,17 +14714,17 @@
<change date="19 June 2013" version="1.2.3">
Added support for statically linked agents.
</change>
- <change date="5 July 2016" version="9.0.0">
+ <change date="13 October 2016" version="9.0.0">
Support for modules:
- The majorversion is 9 now
- The ClassFileLoadHook events are not sent during the primordial phase anymore.
- - Add new function GetAllModules
- - Add new capability can_generate_early_vmstart
- Allow CompiledMethodLoad events at start phase
- - Add new capability can_generate_early_class_hook_events
- - Add new function GetNamedModule
- </change>
- <change date="16 August 2016" version="9.0.0">
+ - Add new capabilities:
+ - can_generate_early_vmstart
+ - can_generate_early_class_hook_events
+ - Add new functions:
+ - GetAllModules
+ - AddModuleReads, AddModuleExports, AddModuleOpens, AddModuleUses, AddModuleProvides
Clarified can_redefine_any_classes, can_retransform_any_classes and IsModifiableClass API to
disallow some implementation defined classes.
</change>
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -227,6 +227,119 @@
} /* end GetNamedModule */
+// module - pre-checked for NULL
+// to_module - pre-checked for NULL
+jvmtiError
+JvmtiEnv::AddModuleReads(jobject module, jobject to_module) {
+ JavaThread* THREAD = JavaThread::current();
+
+ // check module
+ Handle h_module(THREAD, JNIHandles::resolve(module));
+ if (!java_lang_reflect_Module::is_instance(h_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ // check to_module
+ Handle h_to_module(THREAD, JNIHandles::resolve(to_module));
+ if (!java_lang_reflect_Module::is_instance(h_to_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ return JvmtiExport::add_module_reads(h_module, h_to_module, THREAD);
+} /* end AddModuleReads */
+
+
+// module - pre-checked for NULL
+// pkg_name - pre-checked for NULL
+// to_module - pre-checked for NULL
+jvmtiError
+JvmtiEnv::AddModuleExports(jobject module, const char* pkg_name, jobject to_module) {
+ JavaThread* THREAD = JavaThread::current();
+ Handle h_pkg = java_lang_String::create_from_str(pkg_name, THREAD);
+
+ // check module
+ Handle h_module(THREAD, JNIHandles::resolve(module));
+ if (!java_lang_reflect_Module::is_instance(h_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ // check to_module
+ Handle h_to_module(THREAD, JNIHandles::resolve(to_module));
+ if (!java_lang_reflect_Module::is_instance(h_to_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ return JvmtiExport::add_module_exports(h_module, h_pkg, h_to_module, THREAD);
+} /* end AddModuleExports */
+
+
+// module - pre-checked for NULL
+// pkg_name - pre-checked for NULL
+// to_module - pre-checked for NULL
+jvmtiError
+JvmtiEnv::AddModuleOpens(jobject module, const char* pkg_name, jobject to_module) {
+ JavaThread* THREAD = JavaThread::current();
+ Handle h_pkg = java_lang_String::create_from_str(pkg_name, THREAD);
+
+ // check module
+ Handle h_module(THREAD, JNIHandles::resolve(module));
+ if (!java_lang_reflect_Module::is_instance(h_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ // check to_module
+ Handle h_to_module(THREAD, JNIHandles::resolve(to_module));
+ if (!java_lang_reflect_Module::is_instance(h_to_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ return JvmtiExport::add_module_opens(h_module, h_pkg, h_to_module, THREAD);
+} /* end AddModuleOpens */
+
+
+// module - pre-checked for NULL
+// service - pre-checked for NULL
+jvmtiError
+JvmtiEnv::AddModuleUses(jobject module, jclass service) {
+ JavaThread* THREAD = JavaThread::current();
+
+ // check module
+ Handle h_module(THREAD, JNIHandles::resolve(module));
+ if (!java_lang_reflect_Module::is_instance(h_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ // check service
+ Handle h_service(THREAD, JNIHandles::resolve_external_guard(service));
+ if (!java_lang_Class::is_instance(h_service()) ||
+ java_lang_Class::is_primitive(h_service())) {
+ return JVMTI_ERROR_INVALID_CLASS;
+ }
+ return JvmtiExport::add_module_uses(h_module, h_service, THREAD);
+} /* end AddModuleUses */
+
+
+// module - pre-checked for NULL
+// service - pre-checked for NULL
+// impl_class - pre-checked for NULL
+jvmtiError
+JvmtiEnv::AddModuleProvides(jobject module, jclass service, jclass impl_class) {
+ JavaThread* THREAD = JavaThread::current();
+
+ // check module
+ Handle h_module(THREAD, JNIHandles::resolve(module));
+ if (!java_lang_reflect_Module::is_instance(h_module())) {
+ return JVMTI_ERROR_INVALID_MODULE;
+ }
+ // check service
+ Handle h_service(THREAD, JNIHandles::resolve_external_guard(service));
+ if (!java_lang_Class::is_instance(h_service()) ||
+ java_lang_Class::is_primitive(h_service())) {
+ return JVMTI_ERROR_INVALID_CLASS;
+ }
+ // check impl_class
+ Handle h_impl_class(THREAD, JNIHandles::resolve_external_guard(impl_class));
+ if (!java_lang_Class::is_instance(h_impl_class()) ||
+ java_lang_Class::is_primitive(h_impl_class())) {
+ return JVMTI_ERROR_INVALID_CLASS;
+ }
+ return JvmtiExport::add_module_provides(h_module, h_service, h_impl_class, THREAD);
+} /* end AddModuleProvides */
+
+
//
// Class functions
//
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -434,6 +434,165 @@
}
}
+jvmtiError
+JvmtiExport::add_module_reads(Handle module, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+
+ // Invoke the addReads method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addReads_name(),
+ vmSymbols::addReads_signature(),
+ module,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+ assert(!pkg_name.is_null(), "pkg_name should always be set");
+
+ // Invoke the addExports method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addExports_name(),
+ vmSymbols::addExports_signature(),
+ module,
+ pkg_name,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
+ return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ }
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+ assert(!pkg_name.is_null(), "pkg_name should always be set");
+
+ // Invoke the addOpens method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addOpens_name(),
+ vmSymbols::addExports_signature(),
+ module,
+ pkg_name,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
+ return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ }
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_uses(Handle module, Handle service, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!service.is_null(), "service should always be set");
+
+ // Invoke the addUses method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addUses_name(),
+ vmSymbols::addUses_signature(),
+ module,
+ service,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!service.is_null(), "service should always be set");
+ assert(!impl_class.is_null(), "impl_class should always be set");
+
+ // Invoke the addProvides method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addProvides_name(),
+ vmSymbols::addProvides_signature(),
+ module,
+ service,
+ impl_class,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
void
JvmtiExport::decode_version_values(jint version, int * major, int * minor,
int * micro) {
--- a/hotspot/src/share/vm/prims/jvmtiExport.hpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp Thu Dec 01 21:40:08 2016 +0000
@@ -218,6 +218,21 @@
// Add read edges to the unnamed modules of the bootstrap and app class loaders
static void add_default_read_edges(Handle h_module, TRAPS) NOT_JVMTI_RETURN;
+ // Add a read edge to the module
+ static jvmtiError add_module_reads(Handle module, Handle to_module, TRAPS);
+
+ // Updates a module to export a package
+ static jvmtiError add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS);
+
+ // Updates a module to open a package
+ static jvmtiError add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS);
+
+ // Add a used service to the module
+ static jvmtiError add_module_uses(Handle module, Handle service, TRAPS);
+
+ // Add a service provider to the module
+ static jvmtiError add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS);
+
// let JVMTI know that the JVM_OnLoad code is running
static void enter_onload_phase() NOT_JVMTI_RETURN;
--- a/hotspot/src/share/vm/prims/whitebox.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -1415,14 +1415,6 @@
Modules::add_reads_module(from_module, source_module, CHECK);
WB_END
-WB_ENTRY(jboolean, WB_CanReadModule(JNIEnv* env, jobject o, jobject asking_module, jobject source_module))
- return Modules::can_read_module(asking_module, source_module, THREAD);
-WB_END
-
-WB_ENTRY(jboolean, WB_IsExportedToModule(JNIEnv* env, jobject o, jobject from_module, jstring package, jobject to_module))
- return Modules::is_exported_to_module(from_module, package, to_module, THREAD);
-WB_END
-
WB_ENTRY(void, WB_AddModulePackage(JNIEnv* env, jobject o, jclass module, jstring package))
Modules::add_module_package(module, package, CHECK);
WB_END
@@ -1866,10 +1858,6 @@
(void*)&WB_AddModuleExports },
{CC"AddReadsModule", CC"(Ljava/lang/Object;Ljava/lang/Object;)V",
(void*)&WB_AddReadsModule },
- {CC"CanReadModule", CC"(Ljava/lang/Object;Ljava/lang/Object;)Z",
- (void*)&WB_CanReadModule },
- {CC"IsExportedToModule", CC"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z",
- (void*)&WB_IsExportedToModule },
{CC"AddModulePackage", CC"(Ljava/lang/Object;Ljava/lang/String;)V",
(void*)&WB_AddModulePackage },
{CC"GetModuleByPackageName", CC"(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;",
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -170,6 +170,8 @@
#define ADDEXPORTS_LEN 10
#define ADDREADS "addreads"
#define ADDREADS_LEN 8
+#define ADDOPENS "addopens"
+#define ADDOPENS_LEN 8
#define PATCH "patch"
#define PATCH_LEN 5
#define ADDMODS "addmods"
@@ -196,6 +198,7 @@
const char* property_suffix = property + MODULE_PROPERTY_PREFIX_LEN;
if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) ||
matches_property_suffix(property_suffix, ADDREADS, ADDREADS_LEN) ||
+ matches_property_suffix(property_suffix, ADDOPENS, ADDOPENS_LEN) ||
matches_property_suffix(property_suffix, PATCH, PATCH_LEN) ||
matches_property_suffix(property_suffix, ADDMODS, ADDMODS_LEN) ||
matches_property_suffix(property_suffix, LIMITMODS, LIMITMODS_LEN) ||
@@ -2555,6 +2558,7 @@
unsigned int addreads_count = 0;
unsigned int addexports_count = 0;
+unsigned int addopens_count = 0;
unsigned int addmods_count = 0;
unsigned int patch_mod_count = 0;
@@ -2809,6 +2813,10 @@
if (!create_numbered_property("jdk.module.addexports", tail, addexports_count++)) {
return JNI_ENOMEM;
}
+ } else if (match_option(option, "--add-opens=", &tail)) {
+ if (!create_numbered_property("jdk.module.addopens", tail, addopens_count++)) {
+ return JNI_ENOMEM;
+ }
} else if (match_option(option, "--add-modules=", &tail)) {
if (!create_numbered_property("jdk.module.addmods", tail, addmods_count++)) {
return JNI_ENOMEM;
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Dec 01 21:40:08 2016 +0000
@@ -285,6 +285,14 @@
}
+void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) {
+ JavaCallArguments args; // One oop argument
+ args.push_oop(arg1);
+ args.push_oop(arg2);
+ args.push_oop(arg3);
+ call_static(result, klass, name, signature, &args, CHECK);
+}
+
// -------------------------------------------------
// Implementation of JavaCalls (low level)
--- a/hotspot/src/share/vm/runtime/javaCalls.hpp Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/src/share/vm/runtime/javaCalls.hpp Thu Dec 01 21:40:08 2016 +0000
@@ -210,6 +210,7 @@
static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS);
static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS);
+ static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS);
// Low-level interface
static void call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS);
--- a/hotspot/test/TEST.ROOT Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/TEST.ROOT Thu Dec 01 21:40:08 2016 +0000
@@ -47,8 +47,8 @@
vm.gc.ConcMarkSweep \
vm.debug
-# Tests using jtreg 4.2 b03 features
-requiredVersion=4.2 b03
+# Tests using jtreg 4.2 b04 features
+requiredVersion=4.2 b04
# Path to libraries in the topmost test directory. This is needed so @library
# does not need ../../ notation to reach them
--- a/hotspot/test/compiler/c2/Test7190310_unsafe.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/c2/Test7190310_unsafe.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,8 @@
* @test
* @bug 7190310
* @summary Inlining WeakReference.get(), and hoisting $referent may lead to non-terminating loops
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
+ * @modules java.base/java.lang.ref:open
*
* @run main/othervm -Xbatch compiler.c2.Test7190310_unsafe
*/
--- a/hotspot/test/compiler/codegen/Test8011901.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/codegen/Test8011901.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8011901
* @summary instruct xaddL_no_res shouldn't allow 64 bit constants.
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -XX:-BackgroundCompilation compiler.codegen.Test8011901
*/
--- a/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8038048
* @summary assert(null_obj->escape_state() == PointsToNode::NoEscape,etc)
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+DoEscapeAnalysis
* -XX:-TieredCompilation -Xbatch
--- a/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -27,7 +27,8 @@
* @bug 8130150 8131779 8139907
* @summary Verify that the Montgomery multiply and square intrinsic works and correctly checks their arguments.
* @requires vm.flavor == "server"
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.math:open
* @library /test/lib
*
* @build sun.hotspot.WhiteBox
--- a/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8150465
* @summary Unsafe methods to produce uninitialized arrays
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -ea -Diters=200 -Xint
* compiler.intrinsics.unsafe.AllocateUninitializedArray
--- a/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8136473
* @summary Mismatched stores on same slice possible with Unsafe.Put*Unaligned methods
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation
* compiler.intrinsics.unsafe.TestUnsafeUnalignedMismatchedAccesses
--- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 6653795
* @summary C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main compiler.intrinsics.unsafe.UnsafeGetAddressTest
*/
--- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8143930
* @summary C1 LinearScan asserts when compiling two back-to-back CompareAndSwapLongs
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run testng/othervm -Diters=200000 -XX:TieredStopAtLevel=1
* compiler.intrinsics.unsafe.UnsafeTwoCASLong
--- a/hotspot/test/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java Thu Dec 01 21:40:08 2016 +0000
@@ -30,6 +30,7 @@
* java.compiler
* java.instrument
* java.management
+ * jdk.attach
*
* @run main/othervm compiler.jsr292.RedefineMethodUsedByMultipleMethodHandles
*/
@@ -42,7 +43,6 @@
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes;
-import javax.tools.ToolProvider;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -132,7 +132,7 @@
int p = vmName.indexOf('@');
assert p != -1 : "VM name not in <pid>@<host> format: " + vmName;
String pid = vmName.substring(0, p);
- ClassLoader cl = ToolProvider.getSystemToolClassLoader();
+ ClassLoader cl = ClassLoader.getSystemClassLoader();
Class<?> c = Class.forName("com.sun.tools.attach.VirtualMachine", true, cl);
Method attach = c.getDeclaredMethod("attach", String.class);
Method loadAgent = c.getDeclaredMethod("loadAgent", String.class);
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -27,8 +27,8 @@
* @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
* @library / /test/lib
* @library ../common/patches
- * @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules java.base/jdk.internal.misc:+open
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open
*
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* jdk.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -27,10 +27,10 @@
* @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
* @library / /test/lib
* @library ../common/patches
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @modules java.base/jdk.internal.org.objectweb.asm
* java.base/jdk.internal.org.objectweb.asm.tree
- * jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open
* jdk.vm.ci/jdk.vm.ci.code
* jdk.vm.ci/jdk.vm.ci.meta
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
--- a/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,8 +26,8 @@
* @bug 8136421
* @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
* @library /test/lib /
- * @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules java.base/jdk.internal.misc:open
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot:open
* jdk.vm.ci/jdk.vm.ci.runtime
* @run main/othervm -XX:+UnlockExperimentalVMOptions
* -Dcompiler.jvmci.compilerToVM.JVM_RegisterJVMCINatives.positive=true
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -27,9 +27,10 @@
* @bug 8161068
* @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64")
* @library /test/lib /compiler/jvmci/jdk.vm.ci.hotspot.test/src
+ * @modules java.base/java.lang.invoke:+open
* @modules jdk.vm.ci/jdk.vm.ci.meta
* jdk.vm.ci/jdk.vm.ci.runtime
- * jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open
* @run testng/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* jdk.vm.ci.hotspot.test.MethodHandleAccessProviderTest
*/
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/RedefineClassTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/RedefineClassTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -27,6 +27,7 @@
* @library ../../../../../
* @modules jdk.vm.ci/jdk.vm.ci.meta
* jdk.vm.ci/jdk.vm.ci.runtime
+ * jdk.attach
* java.base/jdk.internal.misc
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.runtime.test.RedefineClassTest
*/
@@ -37,7 +38,6 @@
import org.junit.Assert;
import org.junit.Test;
-import javax.tools.ToolProvider;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -137,7 +137,7 @@
int p = vmName.indexOf('@');
assumeTrue(p != -1);
String pid = vmName.substring(0, p);
- ClassLoader cl = ToolProvider.getSystemToolClassLoader();
+ ClassLoader cl = ClassLoader.getSystemClassLoader();
Class<?> c = Class.forName("com.sun.tools.attach.VirtualMachine", true, cl);
Method attach = c.getDeclaredMethod("attach", String.class);
Method loadAgent = c.getDeclaredMethod("loadAgent", String.class, String.class);
--- a/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8073480
* @summary explicit range checks should be recognized by C2
* @library /test/lib /
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @build sun.hotspot.WhiteBox
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* @run main/othervm -ea -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
--- a/hotspot/test/compiler/runtime/Test8010927.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/runtime/Test8010927.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8010927
* @summary Kitchensink crashed with SIGSEGV, Problematic frame: v ~StubRoutines::checkcast_arraycopy
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @build sun.hotspot.WhiteBox
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
--- a/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8016474
* @summary The bug only happens with C1 and G1 using a different ObjectAlignmentInBytes than KlassAlignmentInBytes (which is 8)
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32
* compiler.unsafe.GetUnsafeObjectG1PreBarrier
*/
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for boolean
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for byte
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for char
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for double
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for float
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for int
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for long
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for Object
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,7 @@
* @bug 8143628
* @summary Test unsafe access for short
*
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
* @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort
* @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort
* @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8158260
* @summary Test unaligned Unsafe accesses
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -Diters=20000 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation
* compiler.unsafe.JdkInternalMiscUnsafeUnalignedAccess
--- a/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8077504
* @summary Unsafe load can loose control dependency and cause crash
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:+open
*
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement
* compiler.unsafe.TestUnsafeLoadControl
--- a/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/g1/TestStringDeduplicationTools.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationTools.java Thu Dec 01 21:40:08 2016 +0000
@@ -190,6 +190,7 @@
"-Xmx" + Xmx + "m",
"-XX:+UseG1GC",
"-XX:+UnlockDiagnosticVMOptions",
+ "--add-opens=java.base/java.lang=ALL-UNNAMED",
"-XX:+VerifyAfterGC" // Always verify after GC
};
--- a/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Thu Dec 01 21:40:08 2016 +0000
@@ -28,7 +28,8 @@
* @key gc
* @requires vm.gc.G1
* @library /test/lib
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* java.management
*/
--- a/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Thu Dec 01 21:40:08 2016 +0000
@@ -38,7 +38,8 @@
FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
Stream<Path> s = Files.walk(fs.getPath("/"));
for (Path p : (Iterable<Path>)s::iterator) {
- if (p.toString().endsWith(".class")) {
+ if (p.toString().endsWith(".class") &&
+ !p.getFileName().toString().equals("module-info.class")) {
byte[] data = Files.readAllBytes(p);
Decompiler d = new Decompiler(data);
ClassInfo ci = d.getClassInfo();
--- a/hotspot/test/runtime/LocalLong/LocalLongTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/LocalLong/LocalLongTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -39,6 +39,10 @@
public static void main(String... args) throws Exception {
if (Platform.is64bit()) {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xint",
+ "--add-opens",
+ "java.base/java.lang=ALL-UNNAMED",
+ "--add-opens",
+ "java.base/java.lang.invoke=ALL-UNNAMED",
"LocalLongHelper");
OutputAnalyzer o = new OutputAnalyzer(pb.start());
o.shouldHaveExitValue(0);
--- a/hotspot/test/runtime/Throwable/StackTraceLogging.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/Throwable/StackTraceLogging.java Thu Dec 01 21:40:08 2016 +0000
@@ -52,6 +52,8 @@
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:stacktrace=info",
"-XX:MaxJavaStackTraceDepth=1024",
+ "--add-opens",
+ "java.base/java.lang=ALL-UNNAMED",
"TestThrowable");
analyzeOutputOn(pb);
}
--- a/hotspot/test/runtime/Throwable/TestThrowable.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/Throwable/TestThrowable.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,8 @@
* @test
* @bug 8150778
* @summary Test exception depths, and code to get stack traces
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* @library /test/lib
* @run main/othervm -XX:MaxJavaStackTraceDepth=1024 TestThrowable
*/
--- a/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Thu Dec 01 21:40:08 2016 +0000
@@ -25,7 +25,8 @@
* @test
* @bug 8033735
* @summary check backtrace field introspection
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* @run main ThrowableIntrospectionSegfault
*/
--- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -100,7 +100,7 @@
ClassFileInstaller.writeClassToDisk("GetSysPkg_package/GetSysClass", klassbuf);
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:bl_dir",
- "--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator +
+ "--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator +
System.getProperty("test.classes"), "GetSysPkgTest", "do_tests");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldHaveExitValue(0);
--- a/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m3")
.exports("p1")
@@ -80,9 +80,9 @@
// Packages: p2
// Packages exported: p2 is exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Define module: m3
@@ -90,10 +90,10 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.requires("m2")
- .conceals("p3")
+ .contains("p3")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m3")
.exports("p1")
@@ -80,9 +80,9 @@
// Packages: p2
// Packages exported: p2 is exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Define module: m3
@@ -90,10 +90,10 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.requires("m2")
- .conceals("p3")
+ .contains("p3")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -70,7 +70,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.requires("m3")
@@ -82,9 +82,9 @@
// Packages: p2
// Packages exported: p2 is exported to m3
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m3")
+ .exports("p2", Set.of("m3"))
.build();
// Define module: m3
@@ -92,10 +92,10 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.requires("m2")
- .conceals("p3")
+ .contains("p3")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Thu Dec 01 21:40:08 2016 +0000
@@ -68,7 +68,7 @@
// Packages: p1
// Packages exported: p1 is exported to unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -79,9 +79,9 @@
// Packages: p2
// Packages exported: package p2 is exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -80,7 +80,7 @@
// Packages: p2
// Packages exported: package p2 is exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -68,7 +68,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -79,9 +79,9 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p2")
+ .contains("p2")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Thu Dec 01 21:40:08 2016 +0000
@@ -80,7 +80,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
@@ -129,7 +129,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
@@ -178,7 +178,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Thu Dec 01 21:40:08 2016 +0000
@@ -75,7 +75,7 @@
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();
@@ -124,7 +124,7 @@
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -70,7 +70,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.requires("m3")
@@ -82,9 +82,9 @@
// Packages: p2
// Packages exported: p2 is exported to m3
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m3")
+ .exports("p2", Set.of("m3"))
.build();
// Define module: m3
@@ -92,10 +92,10 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.requires("m2")
- .conceals("p3")
+ .contains("p3")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Thu Dec 01 21:40:08 2016 +0000
@@ -58,7 +58,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -69,9 +69,9 @@
// Packages: p2
// Packages exported: p2 is exported qualifiedly to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Thu Dec 01 21:40:08 2016 +0000
@@ -58,7 +58,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -69,7 +69,7 @@
// Packages: p2
// Packages exported: p2 is exported unqualifiedly
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Thu Dec 01 21:40:08 2016 +0000
@@ -71,7 +71,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -81,9 +81,9 @@
// Packages: p2
// Packages exported: p2 is exported unqualifiedly
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -68,7 +68,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -79,9 +79,9 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p2")
+ .contains("p2")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/Umod.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod.java Thu Dec 01 21:40:08 2016 +0000
@@ -80,7 +80,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
@@ -126,7 +126,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
@@ -172,7 +172,7 @@
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -70,7 +70,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -80,9 +80,9 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Thu Dec 01 21:40:08 2016 +0000
@@ -70,7 +70,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -80,7 +80,7 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -79,9 +79,9 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p2")
+ .contains("p2")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Thu Dec 01 21:40:08 2016 +0000
@@ -75,7 +75,7 @@
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();
@@ -121,7 +121,7 @@
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -70,7 +70,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -80,9 +80,9 @@
// Packages: p6
// Packages exported: p6 exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p6", "m1")
+ .exports("p6", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -79,9 +79,9 @@
// Packages: p6
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p6")
+ .contains("p6")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.requires("m3")
@@ -80,9 +80,9 @@
// Packages: p6
// Packages exported: p6 is exported to m3
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p6", "m3")
+ .exports("p6", Set.of("m3"))
.build();
// Define module: m3
@@ -90,7 +90,7 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -67,7 +67,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -77,9 +77,9 @@
// Packages: p6
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p6")
+ .contains("p6")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.requires("m3")
@@ -80,9 +80,9 @@
// Packages: p2
// Packages exported: p2 is exported to m3
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m3")
+ .exports("p2", Set.of("m3"))
.build();
// Define module: m3
@@ -90,7 +90,7 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Thu Dec 01 21:40:08 2016 +0000
@@ -69,7 +69,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -79,7 +79,7 @@
// Packages: p2
// Packages exported: p2 is exported unqualifiedly
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Thu Dec 01 21:40:08 2016 +0000
@@ -67,7 +67,7 @@
// Packages: none
// Packages exported: none
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.build();
@@ -77,9 +77,9 @@
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .conceals("p2")
+ .contains("p2")
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -72,6 +72,6 @@
testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "WARNING: Unknown module: xyzz");
testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0",
"WARNING: package xyzz not in java.base");
- testOption("--patch-module", "=d", "jdk.module.patch.0", "IllegalArgumentException");
+ testOption("--patch-module", "=d", "jdk.module.patch.0", "Missing module name");
}
}
--- a/hotspot/test/runtime/modules/JVMAddModulePackage.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/JVMAddModulePackage.java Thu Dec 01 21:40:08 2016 +0000
@@ -33,6 +33,7 @@
*/
import static jdk.test.lib.Asserts.*;
+import java.sql.Time;
public class JVMAddModulePackage {
@@ -123,6 +124,29 @@
// Expected
}
+ // Add package named "java" to an module defined to a class loader other than the boot or platform loader.
+ try {
+ // module1 is defined to a MyClassLoader class loader.
+ ModuleHelper.AddModulePackage(module1, "java/foo");
+ throw new RuntimeException("Failed to get the expected IAE");
+ } catch(IllegalArgumentException e) {
+ if (!e.getMessage().contains("prohibited package name")) {
+ throw new RuntimeException("Failed to get expected IAE message for prohibited package name: " + e.getMessage());
+ }
+ }
+
+ // Package "javabar" should be ok
+ ModuleHelper.AddModulePackage(module1, "javabar");
+
+ // Package named "java" defined to the boot class loader, should be ok
+ Object module_javabase = module1.getClass().getModule();
+ ModuleHelper.AddModulePackage(module_javabase, "java/foo");
+
+ // Package named "java" defined to the platform class loader, should be ok
+ // The module java.sql is defined to the platform class loader.
+ java.sql.Time jst = new java.sql.Time(45000); // milliseconds
+ Object module_javasql = jst.getClass().getModule();
+ ModuleHelper.AddModulePackage(module_javasql, "java/foo");
}
static class MyClassLoader extends ClassLoader { }
--- a/hotspot/test/runtime/modules/JVMCanReadModule.java Thu Dec 01 21:01:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @modules java.base/jdk.internal.misc
- * @library /test/lib ..
- * @build sun.hotspot.WhiteBox
- * @compile/module=java.base java/lang/reflect/ModuleHelper.java
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI JVMCanReadModule
- */
-
-import static jdk.test.lib.Asserts.*;
-
-public class JVMCanReadModule {
-
- public static void main(String args[]) throws Throwable {
- MyClassLoader asking_cl = new MyClassLoader();
- MyClassLoader target_cl = new MyClassLoader();
- Object asking_module, target_module;
- boolean result;
-
- asking_module = ModuleHelper.ModuleObject("asking_module", asking_cl, new String[] { "mypackage" });
- assertNotNull(asking_module, "Module should not be null");
- ModuleHelper.DefineModule(asking_module, "9.0", "asking_module/here", new String[] { "mypackage" });
- target_module = ModuleHelper.ModuleObject("target_module", target_cl, new String[] { "yourpackage" });
- assertNotNull(target_module, "Module should not be null");
- ModuleHelper.DefineModule(target_module, "9.0", "target_module/here", new String[] { "yourpackage" });
-
- // Set up relationship
- ModuleHelper.AddReadsModule(asking_module, target_module);
-
- // Null asking_module argument, expect an NPE
- try {
- result = ModuleHelper.CanReadModule(null, target_module);
- throw new RuntimeException("Failed to get the expected NPE");
- } catch(NullPointerException e) {
- // Expected
- }
-
- // Bad asking_module argument, expect an IAE
- try {
- result = ModuleHelper.CanReadModule(asking_cl, target_module);
- throw new RuntimeException("Failed to get the expected IAE");
- } catch(IllegalArgumentException e) {
- // Expected
- }
-
- // Bad target_module argument, expect an IAE
- try {
- result = ModuleHelper.CanReadModule(asking_module, asking_cl);
- throw new RuntimeException("Failed to get the expected IAE");
- } catch(IllegalArgumentException e) {
- // Expected
- }
-
- // Verify strict modules can not read the unnamed module
- result = ModuleHelper.CanReadModule(target_module, null);
- assertFalse(result, "target_module can not read unnamed module");
-
- // Verify asking_module can read itself
- result = ModuleHelper.CanReadModule(asking_module, asking_module);
- assertTrue(result, "asking_module can read itself");
-
- // Verify asking_module can read target_module
- result = ModuleHelper.CanReadModule(asking_module, target_module);
- assertTrue(result, "asking_module can read target_module");
-
- // Verify target_module cannot read asking_module
- result = ModuleHelper.CanReadModule(target_module, asking_module);
- assertTrue(!result, "target_module cannot read asking_module");
- }
-
- static class MyClassLoader extends ClassLoader { }
-}
--- a/hotspot/test/runtime/modules/JVMDefineModule.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/JVMDefineModule.java Thu Dec 01 21:40:08 2016 +0000
@@ -33,6 +33,7 @@
*/
import static jdk.test.lib.Asserts.*;
+import java.sql.Time;
public class JVMDefineModule {
@@ -238,6 +239,39 @@
}
}
+ // Package named "java" defined to a class loader other than the boot or platform class loader, expect an IAE
+ m = ModuleHelper.ModuleObject("modulejavapkg1", cl, new String[] { "java/foo" });
+ try {
+ // module m is defined to an instance of MyClassLoader class loader
+ ModuleHelper.DefineModule(m, "9.0", "modulejavapkg1", new String[] { "java/foo" });
+ throw new RuntimeException("Failed to get expected IAE for package java/foo");
+ } catch(IllegalArgumentException e) {
+ if (!e.getMessage().contains("prohibited package name")) {
+ throw new RuntimeException("Failed to get expected IAE message for prohibited package name: " + e.getMessage());
+ }
+ }
+
+ // Package named "javabar" defined to a class loader other than the boot or platform class loader, should be ok
+ m = ModuleHelper.ModuleObject("modulejavapkg2", cl, new String[] { "javabar" });
+ assertNotNull(m, "Module should not be null");
+ ModuleHelper.DefineModule(m, "9.0", "modulejavapkg2", new String[] { "javabar" });
+
+ // Package named "java" defined to the boot class loader, should be ok
+ // m's type is a java.lang.Object, module is java.base
+ // java.base module is defined to the boot loader
+ ClassLoader boot_loader = m.getClass().getClassLoader();
+ m = ModuleHelper.ModuleObject("modulejavapkg3", boot_loader, new String[] { "java/foo" });
+ assertNotNull(m, "Module should not be null");
+ ModuleHelper.DefineModule(m, "9.0", "modulejavapkg3", new String[] { "java/foo" });
+
+ // Package named "java" defined to the platform class loader, should be ok
+ // java.sql module defined to the platform class loader.
+ java.sql.Time jst = new java.sql.Time(45 * 1000);
+ ClassLoader platform_loader = jst.getClass().getClassLoader();
+ m = ModuleHelper.ModuleObject("modulejavapkg4", platform_loader, new String[] { "java/foo" });
+ assertNotNull(m, "Module should not be null");
+ ModuleHelper.DefineModule(m, "9.0", "modulejavapkg4", new String[] { "java/foo" });
+
// module version that is null, should be okay
m = ModuleHelper.ModuleObject("module8", cl, new String[] { "a_package_8" });
assertNotNull(m, "Module should not be null");
--- a/hotspot/test/runtime/modules/JVMIsExportedToModule.java Thu Dec 01 21:01:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @modules java.base/jdk.internal.misc
- * @library /test/lib ..
- * @build sun.hotspot.WhiteBox
- * @compile/module=java.base java/lang/reflect/ModuleHelper.java
- * @run main ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI JVMIsExportedToModule
- */
-
-import static jdk.test.lib.Asserts.*;
-
-public class JVMIsExportedToModule {
-
- public static void main(String args[]) throws Throwable {
- MyClassLoader from_cl = new MyClassLoader();
- MyClassLoader to_cl = new MyClassLoader();
- Object from_module, to_module;
- boolean result;
-
- from_module = ModuleHelper.ModuleObject("from_module", from_cl, new String[] { "mypackage", "this/package" });
- assertNotNull(from_module, "Module from_module should not be null");
- ModuleHelper.DefineModule(from_module, "9.0", "from_module/here", new String[] { "mypackage", "this/package" });
- to_module = ModuleHelper.ModuleObject("to_module", to_cl, new String[] { "yourpackage", "that/package" });
- assertNotNull(to_module, "Module to_module should not be null");
- ModuleHelper.DefineModule(to_module, "9.0", "to_module/here", new String[] { "yourpackage", "that/package" });
-
- Object unnamed_module = JVMIsExportedToModule.class.getModule();
- assertNotNull(unnamed_module, "Module unnamed_module should not be null");
-
- // Null from_module argument, expect an NPE
- try {
- result = ModuleHelper.IsExportedToModule(null, "mypackage", to_module);
- throw new RuntimeException("Failed to get the expected NPE for null from_module");
- } catch(NullPointerException e) {
- // Expected
- }
-
- // Null to_module argument, expect an NPE
- try {
- result = ModuleHelper.IsExportedToModule(from_module, "mypackage", null);
- throw new RuntimeException("Failed to get expected NPE for null to_module");
- } catch(NullPointerException e) {
- // Expected
- }
-
- // Null package argument, expect an NPE
- try {
- result = ModuleHelper.IsExportedToModule(from_module, null, to_module);
- throw new RuntimeException("Failed to get the expected NPE for null package");
- } catch(NullPointerException e) {
- // Expected
- }
-
- // Bad from_module argument, expect an IAE
- try {
- result = ModuleHelper.IsExportedToModule(to_cl, "mypackage", to_module);
- throw new RuntimeException("Failed to get the expected IAE for bad from_module");
- } catch(IllegalArgumentException e) {
- // Expected
- }
-
- // Bad to_module argument, expect an IAE
- try {
- result = ModuleHelper.IsExportedToModule(from_module, "mypackage", from_cl);
- throw new RuntimeException("Failed to get the expected IAE");
- } catch(IllegalArgumentException e) {
- // Expected
- }
-
- // Check that package is exported to its own module
- result = ModuleHelper.IsExportedToModule(from_module, "mypackage", from_module);
- assertTrue(result, "Package is always exported to itself");
-
- // Package is not in to_module, expect an IAE
- try {
- result = ModuleHelper.IsExportedToModule(from_module, "yourpackage", from_cl);
- throw new RuntimeException("Failed to get the expected IAE for package not in to_module");
- } catch(IllegalArgumentException e) {
- // Expected
- }
-
- // Package is accessible when exported to unnamed module
- ModuleHelper.AddModuleExportsToAll(from_module, "mypackage");
- result = ModuleHelper.IsExportedToModule(from_module, "mypackage", to_module);
- assertTrue(result, "Package exported to unnamed module is visible to named module");
-
- result = ModuleHelper.IsExportedToModule(from_module, "mypackage", unnamed_module);
- assertTrue(result, "Package exported to unnamed module is visible to unnamed module");
-
- // Package is accessible only to named module when exported to named module
- ModuleHelper.AddModuleExports(from_module, "this/package", to_module);
- result = ModuleHelper.IsExportedToModule(from_module, "this/package", to_module);
- assertTrue(result, "Package exported to named module is visible to named module");
- result = ModuleHelper.IsExportedToModule(from_module, "this/package", unnamed_module);
- assertTrue(!result, "Package exported to named module is not visible to unnamed module");
- }
-
- static class MyClassLoader extends ClassLoader { }
-}
--- a/hotspot/test/runtime/modules/ModuleHelper.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleHelper.java Thu Dec 01 21:40:08 2016 +0000
@@ -73,17 +73,6 @@
java.lang.reflect.ModuleHelper.addExportsNoSync((Module)m, pkg, (Module)null);
}
- public static boolean CanReadModule(Object from, Object to) throws Throwable {
- WhiteBox wb = WhiteBox.getWhiteBox();
- return wb.CanReadModule(from, to);
- }
-
- public static boolean IsExportedToModule(Object from, String pkg,
- Object to) throws Throwable {
- WhiteBox wb = WhiteBox.getWhiteBox();
- return wb.IsExportedToModule(from, pkg, to);
- }
-
public static Module ModuleObject(String name, ClassLoader loader, String[] pkgs) throws Throwable {
Set<String> pkg_set = new HashSet<>();
if (pkgs != null) {
@@ -95,7 +84,7 @@
}
ModuleDescriptor descriptor =
- new ModuleDescriptor.Builder(name).conceals(pkg_set).build();
+ ModuleDescriptor.module(name).contains(pkg_set).build();
URI uri = URI.create("module:/" + name);
return java.lang.reflect.ModuleHelper.newModule(loader, descriptor);
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Thu Dec 01 21:40:08 2016 +0000
@@ -57,7 +57,7 @@
// Packages: p1
// Packages exported: p1 is exported to unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -71,7 +71,7 @@
targets.add("m1");
targets.add("m3");
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
.requires("m3")
.exports("p2", targets)
@@ -82,7 +82,7 @@
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
- new ModuleDescriptor.Builder("m3")
+ ModuleDescriptor.module("m3")
.requires("java.base")
.build();
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Thu Dec 01 21:40:08 2016 +0000
@@ -55,7 +55,7 @@
// Packages: p1
// Packages exported: p1 is exported to unqualifiedly
ModuleDescriptor descriptor_m1 =
- new ModuleDescriptor.Builder("m1")
+ ModuleDescriptor.module("m1")
.requires("java.base")
.requires("m2")
.exports("p1")
@@ -66,9 +66,9 @@
// Packages: p2
// Packages exported: package p2 is exported to m1
ModuleDescriptor descriptor_m2 =
- new ModuleDescriptor.Builder("m2")
+ ModuleDescriptor.module("m2")
.requires("java.base")
- .exports("p2", "m1")
+ .exports("p2", Set.of("m1"))
.build();
// Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Thu Dec 01 21:40:08 2016 +0000
@@ -35,10 +35,6 @@
}
static native Object callGetModule(java.lang.Class clazz);
- static native void callAddModuleReads(java.lang.reflect.Module from_module,
- java.lang.reflect.Module source_module);
- static native boolean callCanReadModule(java.lang.reflect.Module asking_module,
- java.lang.reflect.Module source_module);
public static void main(String[] args) {
Module module;
@@ -144,71 +140,6 @@
} catch(NullPointerException e) {
// Expected
}
-
-
- // Tests for JNI_AddModuleReads() //
-
- Module javaScriptingModule = javax.script.Bindings.class.getModule();
- if (javaScriptingModule == null) {
- throw new RuntimeException("Failed to get java.scripting module");
- }
- Module javaLoggingModule = java.util.logging.Level.class.getModule();
- if (javaLoggingModule == null) {
- throw new RuntimeException("Failed to get java.logging module");
- }
-
- if (callCanReadModule(javaLoggingModule, javaScriptingModule)) {
- throw new RuntimeException(
- "Expected FALSE because javaLoggingModule cannot read javaScriptingModule");
- }
-
- callAddModuleReads(javaLoggingModule, javaScriptingModule);
- callAddModuleReads(javaScriptingModule, GetModule.class.getModule()); // unnamed module
-
- try {
- callAddModuleReads(null, javaLoggingModule);
- throw new RuntimeException(
- "Expected NullPointerException for bad from_module not thrown");
- } catch(NullPointerException e) {
- // expected
- }
-
- try {
- callAddModuleReads(javaLoggingModule, null);
- throw new RuntimeException(
- "Expected NullPointerException for bad source_module not thrown");
- } catch(NullPointerException e) {
- // expected
- }
-
-
- // Tests for JNI_CanReadModule() //
-
- if (!callCanReadModule(javaLoggingModule, javaScriptingModule)) {
- throw new RuntimeException(
- "Expected TRUE because javaLoggingModule can read javaScriptingModule");
- }
-
- if (callCanReadModule(javaBaseModule, javaScriptingModule)) {
- throw new RuntimeException(
- "Expected FALSE because javaBaseModule cannnot read javaScriptingModule");
- }
-
- try {
- callCanReadModule(javaLoggingModule, null);
- throw new RuntimeException(
- "Expected NullPointerException for bad sourceModule not thrown");
- } catch(NullPointerException e) {
- // expected
- }
-
- try {
- callCanReadModule(null, javaScriptingModule);
- throw new RuntimeException(
- "Expected NullPointerException for bad asking_module not thrown");
- } catch(NullPointerException e) {
- // expected
- }
}
static class MyClassLoader extends ClassLoader { }
--- a/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Thu Dec 01 21:40:08 2016 +0000
@@ -28,15 +28,3 @@
jobject res = (jobject)((*env)->GetModule(env, clazz));
return res;
}
-
-JNIEXPORT void JNICALL
-Java_GetModule_callAddModuleReads(JNIEnv *env, jclass unused, jobject from_module, jobject source_module) {
- (*env)->AddModuleReads(env, from_module, source_module);
-}
-
-JNIEXPORT jboolean JNICALL
-Java_GetModule_callCanReadModule(JNIEnv *env, jclass unused, jobject asking_module, jobject source_module) {
- jboolean res = (*env)->CanReadModule(env, asking_module, source_module);
- return res;
-}
-
--- a/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Thu Dec 01 21:40:08 2016 +0000
@@ -26,7 +26,8 @@
* @bug 7162400
* @key regression
* @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues
- * @modules java.base/jdk.internal.misc
+ * @modules java.base/jdk.internal.misc:open
+ * @modules java.base/java.lang:open
* @modules jdk.attach/sun.tools.attach
* @library /test/lib
* @run main AttachWithStalePidFile
--- a/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -32,7 +32,7 @@
* @test
* @summary Tests the modules-related JDWP commands
* @library /test/lib
- * @ignore 8168478
+ * @ignore 8170541
* @modules jdk.jdwp.agent
* @modules java.base/jdk.internal.misc
* @compile AllModulesCommandTestDebuggee.java
@@ -96,8 +96,7 @@
if (modName != null) { // JDWP reports unnamed modules, ignore them
jdwpModuleNames.add(modName);
}
- // Assert the JDWP CANREAD and CLASSLOADER commands
- assertCanRead(modId, modName);
+ // Assert the CLASSLOADER commands
assertClassLoader(modId, modName);
}
@@ -134,13 +133,6 @@
}
}
- private void assertCanRead(long modId, String modName) throws IOException {
- // Simple assert for the CANREAD command
- JdwpCanReadReply reply = new JdwpCanReadCmd(modId, modId).send(channel);
- assertReply(reply);
- assertTrue(reply.canRead(), "canRead() reports false for reading from the same module '" + modName + "', moduleId=" + modId);
- }
-
private void assertClassLoader(long modId, String modName) throws IOException {
// Verify that the module classloader id is valid
JdwpClassLoaderReply reply = new JdwpClassLoaderCmd(modId).send(channel);
--- a/hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java Thu Dec 01 21:01:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * The JDWP CANREAD command
- */
-public class JdwpCanReadCmd extends JdwpCmd<JdwpCanReadReply> {
-
- public JdwpCanReadCmd(long modId, long srcModId) {
- super(3, 18, JdwpCanReadReply.class, 2 * refLen());
- putRefId(modId);
- putRefId(srcModId);
- }
-
-}
--- a/hotspot/test/serviceability/jdwp/JdwpCanReadReply.java Thu Dec 01 21:01:52 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-import java.io.DataInputStream;
-import java.io.IOException;
-
-/**
- * The reply to the JDWP CANREAD command
- */
-public class JdwpCanReadReply extends JdwpReply {
-
- private boolean canRead;
-
- protected void parseData(DataInputStream ds) throws IOException {
- canRead = (ds.read() != 0);
- }
-
- public boolean canRead() {
- return canRead;
- }
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package MyPackage;
+
+/**
+ * @test
+ * @summary Verifies the JVMTI AddModuleExports and AddModuleOpens API
+ * @compile AddModuleExportsAndOpensTest.java
+ * @run main/othervm/native -agentlib:AddModuleExportsAndOpensTest MyPackage.AddModuleExportsAndOpensTest
+ */
+
+import java.io.PrintStream;
+import java.lang.reflect.Module;
+
+public class AddModuleExportsAndOpensTest {
+
+ static {
+ try {
+ System.loadLibrary("AddModuleExportsAndOpensTest");
+ } catch (UnsatisfiedLinkError ule) {
+ System.err.println("Could not load AddModuleExportsAndOpensTest library");
+ System.err.println("java.library.path: "
+ + System.getProperty("java.library.path"));
+ throw ule;
+ }
+ }
+
+ native static int check(Module baseModule, Module thisModule);
+
+ public static void main(String args[]) {
+ Module baseModule = Object.class.getModule();
+ Module thisModule = AddModuleExportsAndOpensTest.class.getClassLoader().getUnnamedModule();
+ int status = check(baseModule, thisModule);
+ if (status != 0) {
+ throw new RuntimeException("Non-zero status returned from the agent: " + status);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "jvmti.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef JNI_ENV_ARG
+
+#ifdef __cplusplus
+#define JNI_ENV_ARG(x, y) y
+#define JNI_ENV_PTR(x) x
+#else
+#define JNI_ENV_ARG(x,y) x, y
+#define JNI_ENV_PTR(x) (*x)
+#endif
+
+#endif
+
+#define TranslateError(err) "JVMTI error"
+
+#define PASSED 0
+#define FAILED 2
+
+static const char *EXC_CNAME = "java/lang/Exception";
+static const char* MOD_CNAME = "Ljava/lang/reflect/Module;";
+
+static jvmtiEnv *jvmti = NULL;
+static jint result = PASSED;
+
+static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
+
+JNIEXPORT
+jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
+ return JNI_VERSION_1_8;
+}
+
+static
+jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
+ jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
+ JVMTI_VERSION_9);
+ if (res != JNI_OK || jvmti == NULL) {
+ printf(" Error: wrong result of a valid call to GetEnv!\n");
+ return JNI_ERR;
+ }
+
+ return JNI_OK;
+}
+
+static
+jint throw_exc(JNIEnv *env, char *msg) {
+ jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+
+ if (exc_class == NULL) {
+ printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
+ return -1;
+ }
+ return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+}
+
+static
+jclass jlrM(JNIEnv *env) {
+ jclass cls = NULL;
+
+ cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME));
+ if (cls == NULL) {
+ printf(" Error in JNI FindClass: %s\n", MOD_CNAME);
+ }
+ return cls;
+}
+
+jmethodID
+get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) {
+ jmethodID method = NULL;
+
+ method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig);
+ if (method == NULL) {
+ printf(" Error in JNI GetMethodID %s with signature %s", name, sig);
+ }
+ return method;
+}
+
+static
+jboolean is_exported(JNIEnv *env, jobject module, const char* pkg, jboolean open) {
+ static jmethodID mIsExported = NULL;
+ jstring jstr = NULL;
+ jboolean res = JNI_FALSE;
+
+ if (mIsExported == NULL) {
+ const char* sign = "(Ljava/lang/String;)Z";
+ const char* name = open ? "isOpen" : "isExported";
+ mIsExported = get_method(env, jlrM(env), name, sign);
+ }
+ jstr = JNI_ENV_PTR(env)->NewStringUTF(JNI_ENV_ARG(env, pkg));
+ res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module),
+ mIsExported, jstr);
+ return res;
+}
+
+static
+jboolean is_exported_to(JNIEnv *env, jobject module, const char* pkg, jobject to_module,
+ jboolean open) {
+ static jmethodID mIsExportedTo = NULL;
+ jstring jstr = NULL;
+ jboolean res = JNI_FALSE;
+
+ if (mIsExportedTo == NULL) {
+ const char* sign = "(Ljava/lang/String;Ljava/lang/reflect/Module;)Z";
+ const char* name = open ? "isOpen" : "isExported";
+ mIsExportedTo = get_method(env, jlrM(env), name, sign);
+ }
+ jstr = JNI_ENV_PTR(env)->NewStringUTF(JNI_ENV_ARG(env, pkg));
+ res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module),
+ mIsExportedTo, jstr, to_module);
+ return res;
+}
+
+static
+jvmtiError add_module_exports(jobject baseModule, const char* pkg, jobject thisModule,
+ jboolean open) {
+ jvmtiError err = JVMTI_ERROR_NONE;
+ if (open) {
+ err = (*jvmti)->AddModuleOpens(jvmti, baseModule, pkg, thisModule);
+ } else {
+ err = (*jvmti)->AddModuleExports(jvmti, baseModule, pkg, thisModule);
+ }
+ return err;
+}
+
+static
+jint check_add_module_exports(JNIEnv *env,
+ jclass cls,
+ jobject baseModule,
+ jobject thisModule,
+ jboolean open) {
+ static char strbuf[128] = { '\0' };
+ jvmtiError err = JVMTI_ERROR_NONE;
+ const char* pkg = open ? "jdk.internal.math"
+ : "jdk.internal.misc";
+ const char* bad_pkg = "my.bad.pkg";
+ const char* jvmti_fn = open ? "AddModuleOpens"
+ : "AddModuleExports";
+ jboolean exported = JNI_FALSE;
+
+ // Export from NULL module
+ printf("Check #N1:\n");
+ err = add_module_exports(NULL, pkg, thisModule, open);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#N1: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #N1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");
+ return FAILED;
+ }
+
+ // Export NULL package
+ printf("Check #N2:\n");
+ err = add_module_exports(baseModule, NULL, thisModule, open);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#N2: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #N2: failed to return JVMTI_ERROR_NULL_POINTER for pkg==NULL");
+ return FAILED;
+ }
+
+ // Export to NULL module
+ printf("Check #N3:\n");
+ err = add_module_exports(baseModule, pkg, NULL, open);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#N3: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #N3: failed to return JVMTI_ERROR_NULL_POINTER for to_module==NULL");
+ return FAILED;
+ }
+
+ // Export a bad package
+ printf("Check #I0:\n");
+ err = add_module_exports(baseModule, bad_pkg, thisModule, open);
+ if (err != JVMTI_ERROR_ILLEGAL_ARGUMENT) {
+ printf("#I0: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #I0: did not get expected JVMTI_ERROR_ILLEGAL_ARGUMENT for invalid package");
+ return FAILED;
+ }
+
+ // Export from invalid module (cls)
+ printf("Check #I1:\n");
+ err = add_module_exports((jobject)cls, pkg, thisModule, open);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#I1: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #I1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module");
+ return FAILED;
+ }
+
+ // Export to invalid module (cls)
+ printf("Check #I2:\n");
+ err = add_module_exports(baseModule, pkg, (jobject)cls, open);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#I2: jvmtiError from %s: %d\n", jvmti_fn, err);
+ throw_exc(env, "Check #I2: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid to_module");
+ return FAILED;
+ }
+
+ // Check the pkg is not exported from baseModule to thisModule
+ printf("Check #C0:\n");
+ exported = is_exported_to(env, baseModule, pkg, thisModule, open);
+ if (exported != JNI_FALSE) {
+ sprintf(strbuf, "Check #C0: unexpected export of %s from base to this", pkg);
+ throw_exc(env, strbuf);
+ return FAILED;
+ }
+
+ // Add export of the pkg from baseModule to thisModule
+ printf("Check #C1:\n");
+ err = add_module_exports(baseModule, pkg, thisModule, open);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#C1: jvmtiError from %s: %d\n", jvmti_fn, err);
+ sprintf(strbuf, "Check #C1: error in add export of %s from base to this", pkg);
+ throw_exc(env, strbuf);
+ return FAILED;
+ }
+
+ // Check the pkg is exported from baseModule to thisModule
+ printf("Check #C2:\n");
+ exported = is_exported_to(env, baseModule, pkg, thisModule, open);
+ if (exported == JNI_FALSE) {
+ sprintf(strbuf, "Check #C2: failed to export %s from base to this", pkg);
+ throw_exc(env, strbuf);
+ return FAILED;
+ }
+
+ // Check the pkg is not exported to all modules
+ printf("Check #C3:\n");
+ exported = is_exported(env, baseModule, pkg, open);
+ if (exported != JNI_FALSE) {
+ sprintf(strbuf, "Check #C3: unexpected export of %s from base to all modules", pkg);
+ throw_exc(env, strbuf);
+ return FAILED;
+ }
+ return PASSED;
+}
+
+JNIEXPORT jint JNICALL
+Java_MyPackage_AddModuleExportsAndOpensTest_check(JNIEnv *env,
+ jclass cls,
+ jobject baseModule,
+ jobject thisModule) {
+ if (jvmti == NULL) {
+ throw_exc(env, "JVMTI client was not properly loaded!\n");
+ return FAILED;
+ }
+
+ printf("\n*** Checks for JVMTI AddModuleExports ***\n\n");
+ result = check_add_module_exports(env, cls, baseModule, thisModule, JNI_FALSE);
+ if (result != PASSED) {
+ return result;
+ }
+
+ printf("\n*** Checks for JVMTI AddModuleOpens ***\n\n");
+ result = check_add_module_exports(env, cls, baseModule, thisModule, JNI_TRUE);
+ if (result != PASSED) {
+ return result;
+ }
+ return result;
+}
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleReads/MyPackage/AddModuleReadsTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package MyPackage;
+
+/**
+ * @test
+ * @summary Verifies the JVMTI AddModuleReads API
+ * @compile AddModuleReadsTest.java
+ * @run main/othervm/native -agentlib:AddModuleReadsTest MyPackage.AddModuleReadsTest
+ */
+
+import java.io.PrintStream;
+import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Module;
+
+public class AddModuleReadsTest {
+
+ static {
+ try {
+ System.loadLibrary("AddModuleReadsTest");
+ } catch (UnsatisfiedLinkError ule) {
+ System.err.println("Could not load AddModuleReadsTest library");
+ System.err.println("java.library.path: "
+ + System.getProperty("java.library.path"));
+ throw ule;
+ }
+ }
+
+ native static int check(Module unnamed, Module base, Module instrument);
+
+ public static void main(String args[]) {
+ Module unnamed = AddModuleReadsTest.class.getClassLoader().getUnnamedModule();
+ Module base = Object.class.getModule();
+ Module instrument = Instrumentation.class.getModule();
+ int status = check(unnamed, base, instrument);
+ if (status != 0) {
+ throw new RuntimeException("Non-zero status returned from the agent: " + status);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "jvmti.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef JNI_ENV_ARG
+
+#ifdef __cplusplus
+#define JNI_ENV_ARG(x, y) y
+#define JNI_ENV_PTR(x) x
+#else
+#define JNI_ENV_ARG(x,y) x, y
+#define JNI_ENV_PTR(x) (*x)
+#endif
+
+#endif
+
+#define TranslateError(err) "JVMTI error"
+
+#define PASSED 0
+#define FAILED 2
+
+static const char *EXC_CNAME = "java/lang/Exception";
+static const char* MOD_CNAME = "Ljava/lang/reflect/Module;";
+
+static jvmtiEnv *jvmti = NULL;
+static jint result = PASSED;
+
+static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
+
+JNIEXPORT
+jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
+ return JNI_VERSION_1_8;
+}
+
+static
+jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
+ jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
+ JVMTI_VERSION_9);
+ if (res != JNI_OK || jvmti == NULL) {
+ printf(" Error: wrong result of a valid call to GetEnv!\n");
+ return JNI_ERR;
+ }
+ return JNI_OK;
+}
+
+static
+jint throw_exc(JNIEnv *env, char *msg) {
+ jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+
+ if (exc_class == NULL) {
+ printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
+ return -1;
+ }
+ return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+}
+
+static
+jclass jlrM(JNIEnv *env) {
+ jclass cls = NULL;
+
+ cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME));
+ if (cls == NULL) {
+ printf(" Error in JNI FindClass: %s\n", MOD_CNAME);
+ }
+ return cls;
+}
+
+jmethodID
+get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) {
+ jmethodID method = NULL;
+
+ method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig);
+ if (method == NULL) {
+ printf(" Error in JNI GetMethodID %s with signature %s", name, sig);
+ }
+ return method;
+}
+
+static
+jboolean can_module_read(JNIEnv *env, jobject module, jobject to_module) {
+ static jmethodID mCanRead = NULL;
+ jboolean res = JNI_FALSE;
+
+ if (mCanRead == NULL) {
+ const char* sign = "(Ljava/lang/reflect/Module;)Z";
+ mCanRead = get_method(env, jlrM(env), "canRead", sign);
+ }
+ res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module),
+ mCanRead, to_module);
+ return res;
+}
+
+static
+jint check_add_module_reads(JNIEnv *env,
+ jclass cls,
+ jobject unnamedModule,
+ jobject baseModule,
+ jobject instrModule) {
+ jvmtiError err = JVMTI_ERROR_NONE;
+ jboolean can = JNI_FALSE;
+
+ // Add an invalid read edge from NULL module
+ printf("Check #N1:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, NULL, baseModule);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#N1: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #N1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");
+ return FAILED;
+ }
+
+ // Add an invalid read edge to NULL module
+ printf("Check #N2:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, baseModule, NULL);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#N2: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #N2: failed to return JVMTI_ERROR_NULL_POINTER for to_module==NULL");
+ return FAILED;
+ }
+
+ // Add an invalid read edge from invalid module (cls)
+ printf("Check #I1:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, cls, baseModule);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#I1: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #I1: failed to return JVMTI_ERROR_INVALID_MODULE for module==cls");
+ return FAILED;
+ }
+
+ // Add an invalid read edge to invalid module (cls)
+ printf("Check #I2:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, baseModule, cls);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#I2: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #I2: failed to return JVMTI_ERROR_INVALID_MODULE for to_module==cls");
+ return FAILED;
+ }
+
+ // Check the edge baseModule->instrModule is absent
+ printf("Check #C0:\n");
+ can = can_module_read(env, baseModule, instrModule);
+ if (can != JNI_FALSE) {
+ throw_exc(env, "Check #C0: read edge from base to instr is unexpected");
+ return FAILED;
+ }
+
+ // Add read edge baseModule->instrModule
+ printf("Check #C1:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, baseModule, instrModule);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#C1: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #C1: error in add reads from base to instr");
+ return FAILED;
+ }
+
+ // Check the read edge baseModule->instrModule is present now
+ printf("Check #C2:\n");
+ can = can_module_read(env, baseModule, instrModule);
+ if (can == JNI_FALSE) {
+ throw_exc(env, "Check #C2: failed to add reads from base to instr");
+ return FAILED;
+ }
+
+ // Check the read edge baseModule->unnamedModule is absent
+ printf("Check #C3:\n");
+ can = can_module_read(env, baseModule, unnamedModule);
+ if (can != JNI_FALSE) {
+ throw_exc(env, "Check #C3: got unexpected read edge from base to unnamed");
+ return FAILED;
+ }
+
+ // Add read edge baseModule->unnamedModule
+ printf("Check #C4:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, baseModule, unnamedModule);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#C4: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #C4: failed to ignore adding read edge from base to unnamed");
+ return FAILED;
+ }
+
+ // Check the read edge baseModule->unnamedModule is present now
+ printf("Check #C5:\n");
+ can = can_module_read(env, baseModule, unnamedModule);
+ if (can == JNI_FALSE) {
+ throw_exc(env, "Check #C5: did not get expected read edge from base to unnamed");
+ return FAILED;
+ }
+
+ // Check the read edge unnamedModule->instrModule is absent
+ printf("Check #C6:\n");
+ can = can_module_read(env, unnamedModule, instrModule);
+ if (can == JNI_FALSE) {
+ throw_exc(env, "Check #C6: did not get expected read edge from unnamed to instr");
+ return FAILED;
+ }
+
+ // Add read edge unnamedModule->instrModule
+ printf("Check #C7:\n");
+ err = (*jvmti)->AddModuleReads(jvmti, unnamedModule, instrModule);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#C7: jvmtiError from AddModuleReads: %d\n", err);
+ throw_exc(env, "Check #C7: failed to ignore adding read edge from unnamed to instr");
+ return FAILED;
+ }
+ return PASSED;
+}
+
+JNIEXPORT jint JNICALL
+Java_MyPackage_AddModuleReadsTest_check(JNIEnv *env,
+ jclass cls,
+ jobject unnamedModule,
+ jobject baseModule,
+ jobject instrModule) {
+ if (jvmti == NULL) {
+ throw_exc(env, "JVMTI client was not properly loaded!\n");
+ return FAILED;
+ }
+
+ printf("\n*** Checks for JVMTI AddModuleReads ***\n\n");
+ result = check_add_module_reads(env, cls, unnamedModule, baseModule, instrModule);
+ if (result != PASSED) {
+ return result;
+ }
+ return result;
+}
+
+#ifdef __cplusplus
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/AddModuleUsesAndProvidesTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package MyPackage;
+
+/**
+ * @test
+ * @summary Basic test for JVMTI AddModuleUses and AddModuleProvides
+ * @build java.base/java.lang.TestProvider
+ * java.base/jdk.internal.test.TestProviderImpl
+ * @compile AddModuleUsesAndProvidesTest.java
+ * @run main/othervm/native -agentlib:AddModuleUsesAndProvidesTest MyPackage.AddModuleUsesAndProvidesTest
+ */
+
+import java.io.PrintStream;
+import java.lang.TestProvider;
+import java.lang.reflect.Module;
+
+public class AddModuleUsesAndProvidesTest {
+
+ static {
+ try {
+ System.loadLibrary("AddModuleUsesAndProvidesTest");
+ } catch (UnsatisfiedLinkError ule) {
+ System.err.println("Could not load AddModuleUsesAndProvidesTest library");
+ System.err.println("java.library.path: "
+ + System.getProperty("java.library.path"));
+ throw ule;
+ }
+ }
+
+ native static int checkUses(Module baseModule, Class<?> service);
+ native static int checkProvides(Module baseModule, Class<?> service, Class<?> serviceImpl);
+
+ public static void main(String args[]) throws Exception {
+ Module baseModule = Object.class.getModule();
+ Class<?> service = TestProvider.class;
+ Class<?> serviceImpl = Class.forName("jdk.internal.test.TestProviderImpl");
+
+ System.out.println("\n*** Checks for JVMTI AddModuleUses ***\n");
+
+ int status = checkUses(baseModule, service);
+ if (status != 0) {
+ throw new RuntimeException("Non-zero status returned from the agent: " + status);
+ }
+
+ System.out.println("\n*** Checks for JVMTI AddModuleProvides ***\n");
+
+ System.out.println("Check #PC1:");
+ if (TestProvider.providers().iterator().hasNext()) {
+ throw new RuntimeException("Check #PC1: Unexpectedly service is provided");
+ }
+
+ status = checkProvides(baseModule, service, serviceImpl);
+ if (status != 0) {
+ throw new RuntimeException("Non-zero status returned from the agent: " + status);
+ }
+
+ System.out.println("Check #PC3:");
+ if (!TestProvider.providers().iterator().hasNext()) {
+ throw new RuntimeException("Check #PC3: Unexpectedly service is not provided");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/java/lang/TestProvider.java Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.lang;
+
+import java.util.ServiceLoader;
+
+public interface TestProvider {
+ public static Iterable<TestProvider> providers() {
+ return ServiceLoader.load(TestProvider.class);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/jdk/internal/test/TestProviderImpl.java Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.internal.test;
+
+import java.lang.TestProvider;
+
+public class TestProviderImpl implements TestProvider {
+ public TestProviderImpl() { }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Thu Dec 01 21:40:08 2016 +0000
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "jvmti.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef JNI_ENV_ARG
+
+#ifdef __cplusplus
+#define JNI_ENV_ARG(x, y) y
+#define JNI_ENV_PTR(x) x
+#else
+#define JNI_ENV_ARG(x,y) x, y
+#define JNI_ENV_PTR(x) (*x)
+#endif
+
+#endif
+
+#define TranslateError(err) "JVMTI error"
+
+#define PASSED 0
+#define FAILED 2
+
+static const char *EXC_CNAME = "java/lang/Exception";
+static const char* MOD_CNAME = "Ljava/lang/reflect/Module;";
+
+static jvmtiEnv *jvmti = NULL;
+static jint result = PASSED;
+
+static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
+
+JNIEXPORT
+jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {
+ return Agent_Initialize(jvm, options, reserved);
+}
+
+JNIEXPORT
+jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
+ return JNI_VERSION_1_8;
+}
+
+static
+jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {
+ jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
+ JVMTI_VERSION_9);
+ if (res != JNI_OK || jvmti == NULL) {
+ printf(" Error: wrong result of a valid call to GetEnv!\n");
+ return JNI_ERR;
+ }
+
+ return JNI_OK;
+}
+
+static
+jint throw_exc(JNIEnv *env, char *msg) {
+ jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+
+ if (exc_class == NULL) {
+ printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
+ return -1;
+ }
+ return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+}
+
+static
+jclass jlrM(JNIEnv *env) {
+ jclass cls = NULL;
+
+ cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME));
+ if (cls == NULL) {
+ printf(" Error in JNI FindClass: %s\n", MOD_CNAME);
+ }
+ return cls;
+}
+
+jmethodID
+get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) {
+ jmethodID method = NULL;
+
+ method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig);
+ if (method == NULL) {
+ printf(" Error in JNI GetMethodID %s with signature %s", name, sig);
+ }
+ return method;
+}
+
+static
+jboolean can_use_service(JNIEnv *env, jobject module, jclass service) {
+ static jmethodID mCanUse = NULL;
+ jboolean res = JNI_FALSE;
+
+ if (mCanUse == NULL) {
+ const char* sign = "(Ljava/lang/Class;)Z";
+ mCanUse = get_method(env, jlrM(env), "canUse", sign);
+ }
+ res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module),
+ mCanUse, service);
+ return res;
+}
+
+JNIEXPORT jint JNICALL
+Java_MyPackage_AddModuleUsesAndProvidesTest_checkUses(JNIEnv *env,
+ jclass cls,
+ jobject baseModule,
+ jclass service) {
+ jvmtiError err = JVMTI_ERROR_NONE;
+ jboolean used = JNI_FALSE;
+
+ // Add a service to use to NULL module
+ printf("Check #UN1:\n");
+ err = (*jvmti)->AddModuleUses(jvmti, NULL, service);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#UN1: jvmtiError from AddModuleUses: %d\n", err);
+ throw_exc(env, "Check #UN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");
+ return FAILED;
+ }
+
+ // Add NULL service to use to baseModule
+ printf("Check #UN2:\n");
+ err = (*jvmti)->AddModuleUses(jvmti, baseModule, NULL);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#UN2: jvmtiError from AddModuleUses: %d\n", err);
+ throw_exc(env, "Check #UN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL");
+ return FAILED;
+ }
+
+ // Add service to use to invalid module (cls)
+ printf("Check #UI1:\n");
+ err = (*jvmti)->AddModuleUses(jvmti, (jobject)cls, service);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#UI1: jvmtiError from AddModuleUses: %d\n", err);
+ throw_exc(env, "Check #UI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module");
+ return FAILED;
+ }
+
+ // Add invalid service (thisModule) to use to baseModule
+ printf("Check #UI2:\n");
+ err = (*jvmti)->AddModuleUses(jvmti, baseModule, baseModule);
+ if (err != JVMTI_ERROR_INVALID_CLASS) {
+ printf("#UI2: jvmtiError from AddModuleUses: %d\n", err);
+ throw_exc(env, "Check #UI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service");
+ return FAILED;
+ }
+
+ // Check if the service can not be used
+ printf("Check #UC1:\n");
+ used = can_use_service(env, baseModule, service);
+ if (used != JNI_FALSE) {
+ throw_exc(env, "Check #UC1: unexpected use of service");
+ return FAILED;
+ }
+
+ // Add uses of a correct service
+ printf("Check #UC2:\n");
+ err = (*jvmti)->AddModuleUses(jvmti, baseModule, service);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#UC2: jvmtiError from AddModuleUses: %d\n", err);
+ throw_exc(env, "Check #UC2: got unexpected JVMTI error");
+ return FAILED;
+ }
+
+ // Check if the service can not be used
+ printf("Check #UC3:\n");
+ used = can_use_service(env, baseModule, service);
+ if (used == JNI_FALSE) {
+ throw_exc(env, "Check #UC3: service can not be used unexpectedly");
+ return FAILED;
+ }
+ fflush(0);
+ return PASSED;
+}
+
+JNIEXPORT jint JNICALL
+Java_MyPackage_AddModuleUsesAndProvidesTest_checkProvides(JNIEnv *env,
+ jclass cls,
+ jobject baseModule,
+ jclass service,
+ jclass serviceImpl) {
+ jvmtiError err = JVMTI_ERROR_NONE;
+ jboolean provided = JNI_FALSE;
+
+ // Add provides to NULL module
+ printf("Check #PN1:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, NULL, service, serviceImpl);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#PN1: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");
+ return FAILED;
+ }
+
+ // Add provides with NULL service
+ printf("Check #PN2:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, baseModule, NULL, serviceImpl);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#PN2: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL");
+ return FAILED;
+ }
+
+ // Add provides with NULL serviceImpl
+ printf("Check #PN3:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, NULL);
+ if (err != JVMTI_ERROR_NULL_POINTER) {
+ printf("#PN3: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PN3: failed to return JVMTI_ERROR_NULL_POINTER for serviceImpl==NULL");
+ return FAILED;
+ }
+
+ // Add provides to invalid module (cls)
+ printf("Check #PI1:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, (jobject)cls, service, serviceImpl);
+ if (err != JVMTI_ERROR_INVALID_MODULE) {
+ printf("#PI1: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module");
+ return FAILED;
+ }
+
+ // Add provides with invalid service (baseModule)
+ printf("Check #PI2:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, baseModule, baseModule, serviceImpl);
+ if (err != JVMTI_ERROR_INVALID_CLASS) {
+ printf("#PI2: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service");
+ return FAILED;
+ }
+
+ // Add provides with invalid serviceImpl (baseModule)
+ printf("Check #PI3:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, baseModule);
+ if (err != JVMTI_ERROR_INVALID_CLASS) {
+ printf("#PI3: jvmtiError from AddModuleProvides: %d\n", err);
+ throw_exc(env, "Check #PI3: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid serviceImpl");
+ return FAILED;
+ }
+
+ // Add provides to baseModule with correct service and serviceImpl
+ printf("Check #PC2:\n");
+ err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, serviceImpl);
+ if (err != JVMTI_ERROR_NONE) {
+ printf("#PC2: jvmtiError from AddModuleExports: %d\n", err);
+ throw_exc(env, "Check #PC2: error in add provides to baseModule with correct service and serviceImpl");
+ return FAILED;
+ }
+ fflush(0);
+ return PASSED;
+}
+
+#ifdef __cplusplus
+}
+#endif
--- a/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Thu Dec 01 21:40:08 2016 +0000
@@ -72,8 +72,7 @@
// Load a new named module
ModuleDescriptor descriptor
- = new ModuleDescriptor.Builder(MY_MODULE_NAME)
- .build();
+ = ModuleDescriptor.module(MY_MODULE_NAME).build();
ModuleFinder finder = finderOf(descriptor);
ClassLoader loader = new ClassLoader() {};
Configuration parent = Layer.boot().configuration();
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Thu Dec 01 21:40:08 2016 +0000
@@ -46,6 +46,7 @@
* @library /test/lib
* @modules java.base/jdk.internal.misc
* @compile -XDignore.symbol.file=true
+ * --add-modules=jdk.hotspot.agent
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Thu Dec 01 21:01:52 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Thu Dec 01 21:40:08 2016 +0000
@@ -39,6 +39,7 @@
* @library /test/lib
* @modules java.base/jdk.internal.misc
* @compile -XDignore.symbol.file=true
+ * --add-modules=jdk.hotspot.agent
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED
* --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED