# HG changeset patch # User alanb # Date 1480582601 0 # Node ID cefc81dc1d5205d64f7060fe2e58fd20e7040795 # Parent 6d23d5e6b916fefb46fb01c723d60717d24b3e4b 8169069: Module system implementation refresh (11/2016) Reviewed-by: lfoltan, acorn, ctornqvi, mchung Contributed-by: lois.foltan@oracle.com, harold.seigel@oracle.com, alan.bateman@oracle.com, mandy.chung@oracle.com, serguei.spitsyn@oracle.com, george.triantafillou@oracle.com diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/make/symbols/symbols-unix --- a/hotspot/make/symbols/symbols-unix Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/make/symbols/symbols-unix Thu Dec 01 08:56:41 2016 +0000 @@ -190,8 +190,6 @@ JVM_AddModuleExportsToAllUnnamed JVM_AddModulePackage JVM_AddReadsModule -JVM_CanReadModule JVM_DefineModule -JVM_IsExportedToModule JVM_SetBootLoaderUnnamedModule JVM_GetModuleByPackageName diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/make/test/JtregNative.gmk --- a/hotspot/make/test/JtregNative.gmk Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/make/test/JtregNative.gmk Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/jdk.vm.ci/share/classes/module-info.java --- a/hotspot/src/jdk.vm.ci/share/classes/module-info.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/jdk.vm.ci/share/classes/module-info.java Thu Dec 01 08:56:41 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; } diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/classfile/moduleEntry.hpp --- a/hotspot/src/share/vm/classfile/moduleEntry.hpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/classfile/moduleEntry.hpp Thu Dec 01 08:56:41 2016 +0000 @@ -36,6 +36,8 @@ #include "utilities/ostream.hpp" #define UNNAMED_MODULE "Unnamed Module" +#define JAVAPKG "java/" +#define JAVAPKG_LEN 5 class ModuleClosure; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/classfile/modules.cpp --- a/hotspot/src/share/vm/classfile/modules.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/classfile/modules.cpp Thu Dec 01 08:56:41 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; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/classfile/modules.hpp --- a/hotspot/src/share/vm/classfile/modules.hpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/classfile/modules.hpp Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/classfile/vmSymbols.hpp --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Dec 01 08:56:41 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") \ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/oops/instanceKlass.cpp --- a/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Dec 01 08:56:41 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: "; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jni.cpp --- a/hotspot/src/share/vm/prims/jni.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jni.cpp Thu Dec 01 08:56:41 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 }; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jni.h --- a/hotspot/src/share/vm/prims/jni.h Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jni.h Thu Dec 01 08:56:41 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 */ }; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jniCheck.cpp --- a/hotspot/src/share/vm/prims/jniCheck.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jniCheck.cpp Thu Dec 01 08:56:41 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 }; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvm.cpp --- a/hotspot/src/share/vm/prims/jvm.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvm.cpp Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvm.h --- a/hotspot/src/share/vm/prims/jvm.h Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvm.h Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvmti.xml --- a/hotspot/src/share/vm/prims/jvmti.xml Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvmti.xml Thu Dec 01 08:56:41 2016 +0000 @@ -863,14 +863,12 @@ - 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 public and in a package that is exported by its module. - Agents can use the JNI functions CanReadModule and - AddModuleReads to test and update a module to read another. + Agents can use the functions , + , , + and + 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.

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 @@ + + + Add Module Reads + + Update a module to read another module. This function is a no-op + when 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. + + new + + + + + + + The module to update. + + + + + + The additional module to read. + + + + + + If is not a module object. + + + If is not a module object. + + + + + + Add Module Exports + + Update a module to export a package to another module. + This function is a no-op when + 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. + + new + + + + + + + The module to update. + + + + + + The exported package name. + + + + + + The module the package is exported to. + If the to_module is not a subclass of + java.lang.reflect.Module this function returns + . + + + + + + If is not a module object. + + + If is not a module object. + + + If the package + does not belong to the module. + + + + + + Add Module Opens + + Update a module to open a package to another module. + This function is a no-op when + 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. + + new + + + + + + + The module to update. + + + + + + The package name of the package to open. + + + + + + The module with the package to open. + If the to_module is not a subclass of + java.lang.reflect.Module this function returns + . + + + + + + If is not a module object. + + + If is not a module object. + + + If the package + does not belong to the module. + + + + + + Add Module Uses + + 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. + + new + + + + + + + The module to update. + + + + + + The service to use. + + + + + + If is not a module object. + + + If is not a class object. + + + + + + Add Module Provides + + 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. + + new + + + + + + + The module to update. + + + + + + The service to provide. + + + + + + The implementation class for the provided service. + + + + + + If is not a module object. + + + If is not a class object. + + + If is not a class object. + + + + @@ -11371,6 +11590,9 @@ Invalid field. + + Invalid module. + Invalid method. @@ -14492,17 +14714,17 @@ Added support for statically linked agents. - + 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 - - + - 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvmtiEnv.cpp --- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Thu Dec 01 08:56:41 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 // diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvmtiExport.cpp --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Thu Dec 01 08:56:41 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) { diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/jvmtiExport.hpp --- a/hotspot/src/share/vm/prims/jvmtiExport.hpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp Thu Dec 01 08:56:41 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; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/prims/whitebox.cpp --- a/hotspot/src/share/vm/prims/whitebox.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/prims/whitebox.cpp Thu Dec 01 08:56:41 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;", diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/runtime/arguments.cpp --- a/hotspot/src/share/vm/runtime/arguments.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Dec 01 08:56:41 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; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/runtime/javaCalls.cpp --- a/hotspot/src/share/vm/runtime/javaCalls.cpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Dec 01 08:56:41 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) diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/src/share/vm/runtime/javaCalls.hpp --- a/hotspot/src/share/vm/runtime/javaCalls.hpp Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/src/share/vm/runtime/javaCalls.hpp Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/TEST.ROOT --- a/hotspot/test/TEST.ROOT Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/TEST.ROOT Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/c2/Test7190310_unsafe.java --- a/hotspot/test/compiler/c2/Test7190310_unsafe.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/c2/Test7190310_unsafe.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/codegen/Test8011901.java --- a/hotspot/test/compiler/codegen/Test8011901.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/codegen/Test8011901.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java --- a/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java --- a/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java --- a/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java --- a/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java --- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java --- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java --- a/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java --- a/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java --- a/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java --- a/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java --- a/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/runtime/Test8010927.java --- a/hotspot/test/compiler/runtime/Test8010927.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/runtime/Test8010927.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java --- a/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java --- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java --- a/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java --- a/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationFullGC.java --- a/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationInterned.java --- a/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java --- a/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java --- a/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationTableResize.java --- a/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationTools.java --- a/hotspot/test/gc/g1/TestStringDeduplicationTools.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTools.java Thu Dec 01 08:56:41 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 }; diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java --- a/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/gc/stress/gcbasher/TestGCBasher.java --- a/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Thu Dec 01 08:56:41 2016 +0000 @@ -38,7 +38,8 @@ FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); Stream s = Files.walk(fs.getPath("/")); for (Path p : (Iterable)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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/LocalLong/LocalLongTest.java --- a/hotspot/test/runtime/LocalLong/LocalLongTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/LocalLong/LocalLongTest.java Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/Throwable/StackTraceLogging.java --- a/hotspot/test/runtime/Throwable/StackTraceLogging.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/Throwable/StackTraceLogging.java Thu Dec 01 08:56:41 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); } diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/Throwable/TestThrowable.java --- a/hotspot/test/runtime/Throwable/TestThrowable.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/Throwable/TestThrowable.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java --- a/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Thu Dec 01 08:56:41 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 */ diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/getSysPackage/GetSysPkgTest.java --- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/CheckRead.java --- a/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java --- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java --- a/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java --- a/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java --- a/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/Umod.java --- a/hotspot/test/runtime/modules/AccessCheck/Umod.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java --- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java --- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java --- a/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java --- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Thu Dec 01 08:56:41 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"); } } diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/JVMAddModulePackage.java --- a/hotspot/test/runtime/modules/JVMAddModulePackage.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/JVMAddModulePackage.java Thu Dec 01 08:56:41 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 { } diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/JVMCanReadModule.java --- a/hotspot/test/runtime/modules/JVMCanReadModule.java Wed Nov 23 16:16:34 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 { } -} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/JVMDefineModule.java --- a/hotspot/test/runtime/modules/JVMDefineModule.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/JVMDefineModule.java Thu Dec 01 08:56:41 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"); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/JVMIsExportedToModule.java --- a/hotspot/test/runtime/modules/JVMIsExportedToModule.java Wed Nov 23 16:16:34 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 { } -} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/ModuleHelper.java --- a/hotspot/test/runtime/modules/ModuleHelper.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/ModuleHelper.java Thu Dec 01 08:56:41 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 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java --- a/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java --- a/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Thu Dec 01 08:56:41 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. diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/getModuleJNI/GetModule.java --- a/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Thu Dec 01 08:56:41 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 { } diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/runtime/modules/getModuleJNI/libGetModule.c --- a/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Thu Dec 01 08:56:41 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; -} - diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/attach/AttachWithStalePidFile.java --- a/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jdwp/AllModulesCommandTest.java --- a/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Thu Dec 01 08:56:41 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); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java --- a/hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java Wed Nov 23 16:16:34 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 { - - public JdwpCanReadCmd(long modId, long srcModId) { - super(3, 18, JdwpCanReadReply.class, 2 * refLen()); - putRefId(modId); - putRefId(srcModId); - } - -} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jdwp/JdwpCanReadReply.java --- a/hotspot/test/serviceability/jdwp/JdwpCanReadReply.java Wed Nov 23 16:16:34 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; - } - -} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java Thu Dec 01 08:56:41 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); + } + } +} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Thu Dec 01 08:56:41 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 +#include +#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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleReads/MyPackage/AddModuleReadsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/MyPackage/AddModuleReadsTest.java Thu Dec 01 08:56:41 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); + } + } +} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Thu Dec 01 08:56:41 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 +#include +#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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/AddModuleUsesAndProvidesTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/AddModuleUsesAndProvidesTest.java Thu Dec 01 08:56:41 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"); + } + } +} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/java/lang/TestProvider.java --- /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 08:56:41 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 providers() { + return ServiceLoader.load(TestProvider.class); + } +} diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/jdk/internal/test/TestProviderImpl.java --- /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 08:56:41 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() { } +} + diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Thu Dec 01 08:56:41 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 +#include +#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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java --- a/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Thu Dec 01 08:56:41 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(); diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/sa/TestInstanceKlassSize.java --- a/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Thu Dec 01 08:56:41 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 diff -r 6d23d5e6b916 -r cefc81dc1d52 hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java --- a/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Wed Nov 23 16:16:34 2016 +0000 +++ b/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Thu Dec 01 08:56:41 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