8169069: Module system implementation refresh (11/2016)

Co-authored-by: Lois Foltan <lois.foltan@oracle.com>
Co-authored-by: Harold Seigel <harold.seigel@oracle.com>
Co-authored-by: Mandy Chung <mandy.chung@oracle.com>
Co-authored-by: Serguei Spitsyn <serguei.spitsyn@oracle.com>
Co-authored-by: George Triantafillou <george.triantafillou@oracle.com>
Reviewed-by: lfoltan, acorn, ctornqvi, mchung
This commit is contained in:
Alan Bateman 2016-12-01 08:56:41 +00:00
parent 16734f37d5
commit 988690303a
110 changed files with 1885 additions and 773 deletions
hotspot
make
src
test
TEST.ROOT
compiler
gc
runtime
serviceability

@ -190,8 +190,6 @@ JVM_AddModuleExportsToAll
JVM_AddModuleExportsToAllUnnamed
JVM_AddModulePackage
JVM_AddReadsModule
JVM_CanReadModule
JVM_DefineModule
JVM_IsExportedToModule
JVM_SetBootLoaderUnnamedModule
JVM_GetModuleByPackageName

@ -55,6 +55,9 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \
$(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 @@ ifeq ($(TOOLCHAIN_TYPE), solstudio)
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

@ -30,9 +30,7 @@ module jdk.vm.ci {
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;
}

@ -36,6 +36,8 @@
#include "utilities/ostream.hpp"
#define UNNAMED_MODULE "Unnamed Module"
#define JAVAPKG "java/"
#define JAVAPKG_LEN 5
class ModuleClosure;

@ -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 @@ void Modules::define_module(jobject module, jstring version,
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 @@ void Modules::define_module(jobject module, jstring version,
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 @@ void Modules::define_module(jobject module, jstring version,
}
}
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 @@ void Modules::add_reads_module(jobject from_module, jobject to_module, TRAPS) {
}
}
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 @@ void Modules::add_module_package(jobject module, jstring package, TRAPS) {
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;

@ -93,24 +93,6 @@ public:
// 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);

@ -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") \

@ -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 @@ Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
// 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: ";

@ -3475,40 +3475,6 @@ JNI_ENTRY(jobject, jni_GetModule(JNIEnv* env, jclass clazz))
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 @@ struct JNINativeInterface_ jni_NativeInterface = {
// Module features
jni_GetModule,
jni_AddModuleReads,
jni_CanReadModule
jni_GetModule
};

@ -770,12 +770,6 @@ struct JNINativeInterface_ {
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 @@ struct JNIEnv_ {
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 */
};

@ -2001,37 +2001,6 @@ JNI_ENTRY_CHECKED(jobject,
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 @@ struct JNINativeInterface_ checked_jni_NativeInterface = {
// Module Features
checked_jni_GetModule,
checked_jni_AddModuleReads,
checked_jni_CanReadModule
checked_jni_GetModule
};

@ -1008,8 +1008,8 @@ JVM_END
// 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 @@ JVM_ENTRY (void, JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject so
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);

@ -413,8 +413,8 @@ JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader,
*/
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 @@ JVM_AddModuleExportsToAll(JNIEnv *env, jobject from_module, jstring package);
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);

@ -863,14 +863,12 @@ Agent_OnUnload_L(JavaVM *vm)</example>
</intro>
<intro id="bcimodules" label="Bytecode Instrumentation of code in modules">
Agents that instrument code in named modules may need to arrange for those
modules to read other modules. If code is instrumented to invoke a method
in a support class in another module, then the module of the instrumented
code should read the module of the supporting class. Furthermore, the
supporting class will only be accessible to the instrumented code if
it is <code>public</code> and in a package that is exported by its module.
Agents can use the JNI functions <code>CanReadModule</code> and
<code>AddModuleReads</code> to test and update a module to read another.
Agents can use the functions <functionlink id="AddModuleReads"/>,
<functionlink id="AddModuleExports"/>, <functionlink id="AddModuleOpens"/>,
<functionlink id="AddModuleUses"/> and <functionlink id="AddModuleProvides"/>
to update a module to expand the set of modules that it reads, the set of
packages that it exports or opens to other modules, or the services that it
uses and provides.
<p/>
As an aid to agents that deploy supporting classes on the search path of
the bootstrap class loader, or the search path of the class loader that
@ -6561,6 +6559,227 @@ class C2 extends C1 implements I2 {
</error>
</errors>
</function>
<function id="AddModuleReads" num="94" since="9">
<synopsis>Add Module Reads</synopsis>
<description>
Update a module to read another module. This function is a no-op
when <paramlink id="module"></paramlink> is an unnamed module.
This function facilitates the instrumentation of code
in named modules where that instrumentation requires
expanding the set of modules that a module reads.
</description>
<origin>new</origin>
<capabilities>
</capabilities>
<parameters>
<param id="module">
<ptrtype><jobject/></ptrtype>
<description>
The module to update.
</description>
</param>
<param id="to_module">
<ptrtype><jobject/></ptrtype>
<description>
The additional module to read.
</description>
</param>
</parameters>
<errors>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="module"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="to_module"></paramlink> is not a module object.
</error>
</errors>
</function>
<function id="AddModuleExports" num="95" since="9">
<synopsis>Add Module Exports</synopsis>
<description>
Update a module to export a package to another module.
This function is a no-op when <paramlink id="module"></paramlink>
is an unnamed module or an open module.
This function facilitates the instrumentation of code
in named modules where that instrumentation requires
expanding the set of packages that a module exports.
</description>
<origin>new</origin>
<capabilities>
</capabilities>
<parameters>
<param id="module">
<ptrtype><jobject/></ptrtype>
<description>
The module to update.
</description>
</param>
<param id="pkg_name">
<inbuf><char/></inbuf>
<description>
The exported package name.
</description>
</param>
<param id="to_module">
<ptrtype><jobject/></ptrtype>
<description>
The module the package is exported to.
If the <code>to_module</code> is not a subclass of
<code>java.lang.reflect.Module</code> this function returns
<errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>.
</description>
</param>
</parameters>
<errors>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="module"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="to_modules"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
If the package <paramlink id="pkg_name"></paramlink>
does not belong to the module.
</error>
</errors>
</function>
<function id="AddModuleOpens" num="96" since="9">
<synopsis>Add Module Opens</synopsis>
<description>
Update a module to open a package to another module.
This function is a no-op when <paramlink id="module"></paramlink>
is an unnamed module or an open module.
This function facilitates the instrumentation of code
in modules where that instrumentation requires
expanding the set of packages that a module opens to
other modules.
</description>
<origin>new</origin>
<capabilities>
</capabilities>
<parameters>
<param id="module">
<ptrtype><jobject/></ptrtype>
<description>
The module to update.
</description>
</param>
<param id="pkg_name">
<inbuf><char/></inbuf>
<description>
The package name of the package to open.
</description>
</param>
<param id="to_module">
<ptrtype><jobject/></ptrtype>
<description>
The module with the package to open.
If the <code>to_module</code> is not a subclass of
<code>java.lang.reflect.Module</code> this function returns
<errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>.
</description>
</param>
</parameters>
<errors>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="module"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="to_modules"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_ILLEGAL_ARGUMENT">
If the package <paramlink id="pkg_name"></paramlink>
does not belong to the module.
</error>
</errors>
</function>
<function id="AddModuleUses" num="97" since="9">
<synopsis>Add Module Uses</synopsis>
<description>
Updates a module to add a service to the set of services that
a module uses. This function is a no-op when the module
is an unnamed module.
This function facilitates the instrumentation of code
in named modules where that instrumentation requires
expanding the set of services that a module is using.
</description>
<origin>new</origin>
<capabilities>
</capabilities>
<parameters>
<param id="module">
<ptrtype><jobject/></ptrtype>
<description>
The module to update.
</description>
</param>
<param id="service">
<ptrtype><jclass/></ptrtype>
<description>
The service to use.
</description>
</param>
</parameters>
<errors>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="module"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_INVALID_CLASS">
If <paramlink id="service"></paramlink> is not a class object.
</error>
</errors>
</function>
<function id="AddModuleProvides" num="98" since="9">
<synopsis>Add Module Provides</synopsis>
<description>
Updates a module to add a service to the set of services that
a module provides. This function is a no-op when the module
is an unnamed module.
This function facilitates the instrumentation of code
in named modules where that instrumentation requires
changes to the services that are provided.
</description>
<origin>new</origin>
<capabilities>
</capabilities>
<parameters>
<param id="module">
<ptrtype><jobject/></ptrtype>
<description>
The module to update.
</description>
</param>
<param id="service">
<ptrtype><jclass/></ptrtype>
<description>
The service to provide.
</description>
</param>
<param id="impl_class">
<ptrtype><jclass/></ptrtype>
<description>
The implementation class for the provided service.
</description>
</param>
</parameters>
<errors>
<error id="JVMTI_ERROR_INVALID_MODULE">
If <paramlink id="module"></paramlink> is not a module object.
</error>
<error id="JVMTI_ERROR_INVALID_CLASS">
If <paramlink id="service"></paramlink> is not a class object.
</error>
<error id="JVMTI_ERROR_INVALID_CLASS">
If <paramlink id="impl_class"></paramlink> is not a class object.
</error>
</errors>
</function>
</category>
<category id="class" label="Class">
@ -11371,6 +11590,9 @@ myInit() {
<errorid id="JVMTI_ERROR_INVALID_FIELDID" num="25">
Invalid field.
</errorid>
<errorid id="JVMTI_ERROR_INVALID_MODULE" num="26">
Invalid module.
</errorid>
<errorid id="JVMTI_ERROR_INVALID_METHODID" num="23">
Invalid method.
</errorid>
@ -14492,17 +14714,17 @@ typedef void (JNICALL *jvmtiEventVMInit)
<change date="19 June 2013" version="1.2.3">
Added support for statically linked agents.
</change>
<change date="5 July 2016" version="9.0.0">
<change date="13 October 2016" version="9.0.0">
Support for modules:
- The majorversion is 9 now
- The ClassFileLoadHook events are not sent during the primordial phase anymore.
- Add new function GetAllModules
- Add new capability can_generate_early_vmstart
- Allow CompiledMethodLoad events at start phase
- Add new capability can_generate_early_class_hook_events
- Add new function GetNamedModule
</change>
<change date="16 August 2016" version="9.0.0">
- Add new capabilities:
- can_generate_early_vmstart
- can_generate_early_class_hook_events
- Add new functions:
- GetAllModules
- AddModuleReads, AddModuleExports, AddModuleOpens, AddModuleUses, AddModuleProvides
Clarified can_redefine_any_classes, can_retransform_any_classes and IsModifiableClass API to
disallow some implementation defined classes.
</change>

@ -227,6 +227,119 @@ JvmtiEnv::GetNamedModule(jobject class_loader, const char* package_name, jobject
} /* 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
//

@ -434,6 +434,165 @@ JvmtiExport::add_default_read_edges(Handle h_module, TRAPS) {
}
}
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) {

@ -218,6 +218,21 @@ class JvmtiExport : public AllStatic {
// 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;

@ -1415,14 +1415,6 @@ WB_ENTRY(void, WB_AddReadsModule(JNIEnv* env, jobject o, jobject from_module, jo
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 @@ static JNINativeMethod methods[] = {
(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;",

@ -170,6 +170,8 @@ bool needs_module_property_warning = false;
#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 @@ bool Arguments::is_internal_module_property(const char* property) {
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 @@ bool Arguments::parse_uintx(const char* value,
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 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m
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;

@ -285,6 +285,14 @@ void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name,
}
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)

@ -210,6 +210,7 @@ class JavaCalls: AllStatic {
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);

@ -47,8 +47,8 @@ requires.properties= \
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

@ -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
*/

@ -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
*/

@ -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

@ -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

@ -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

@ -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

@ -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
*/

@ -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

@ -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

@ -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

@ -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

@ -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
*/

@ -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

@ -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

@ -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
*/

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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
*/

@ -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
*/

@ -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
*/

@ -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
*/

@ -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
*/

@ -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
*/

@ -190,6 +190,7 @@ class TestStringDeduplicationTools {
"-Xmx" + Xmx + "m",
"-XX:+UseG1GC",
"-XX:+UnlockDiagnosticVMOptions",
"--add-opens=java.base/java.lang=ALL-UNNAMED",
"-XX:+VerifyAfterGC" // Always verify after GC
};

@ -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
*/

@ -38,7 +38,8 @@ public class TestGCBasher {
FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
Stream<Path> s = Files.walk(fs.getPath("/"));
for (Path p : (Iterable<Path>)s::iterator) {
if (p.toString().endsWith(".class")) {
if (p.toString().endsWith(".class") &&
!p.getFileName().toString().equals("module-info.class")) {
byte[] data = Files.readAllBytes(p);
Decompiler d = new Decompiler(data);
ClassInfo ci = d.getClassInfo();

@ -39,6 +39,10 @@ public class LocalLongTest {
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);

@ -52,6 +52,8 @@ public class StackTraceLogging {
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);
}

@ -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
*/

@ -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
*/

@ -100,7 +100,7 @@ public class GetSysPkgTest {
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);

@ -69,7 +69,7 @@ public class CheckRead {
// 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 @@ public class CheckRead {
// 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 @@ public class CheckRead {
// 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.

@ -69,7 +69,7 @@ public class DiffCL_CheckRead {
// 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 @@ public class DiffCL_CheckRead {
// 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 @@ public class DiffCL_CheckRead {
// 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.

@ -70,7 +70,7 @@ public class DiffCL_ExpQualOther {
// 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 @@ public class DiffCL_ExpQualOther {
// 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 @@ public class DiffCL_ExpQualOther {
// 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.

@ -68,7 +68,7 @@ public class DiffCL_ExpQualToM1 {
// 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 @@ public class DiffCL_ExpQualToM1 {
// 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.

@ -69,7 +69,7 @@ public class DiffCL_ExpUnqual {
// 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 @@ public class DiffCL_ExpUnqual {
// 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();

@ -68,7 +68,7 @@ public class DiffCL_PkgNotExp {
// 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 @@ public class DiffCL_PkgNotExp {
// 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.

@ -80,7 +80,7 @@ public class DiffCL_Umod {
// 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 @@ public class DiffCL_Umod {
// 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 @@ public class DiffCL_Umod {
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
new ModuleDescriptor.Builder("m1")
ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();

@ -75,7 +75,7 @@ public class DiffCL_UmodUpkg {
// 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 @@ public class DiffCL_UmodUpkg {
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
new ModuleDescriptor.Builder("m1")
ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();

@ -70,7 +70,7 @@ public class ExpQualOther {
// 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 @@ public class ExpQualOther {
// 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 @@ public class ExpQualOther {
// 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.

@ -58,7 +58,7 @@ public class ExpQualToM1 {
// 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 @@ public class ExpQualToM1 {
// 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.

@ -58,7 +58,7 @@ public class ExpUnqual {
// 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 @@ public class ExpUnqual {
// Packages: p2
// Packages exported: p2 is exported unqualifiedly
ModuleDescriptor descriptor_m2 =
new ModuleDescriptor.Builder("m2")
ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();

@ -71,7 +71,7 @@ public class ExportAllUnnamed {
// 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 @@ public class ExportAllUnnamed {
// 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.

@ -68,7 +68,7 @@ public class PkgNotExp {
// 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 @@ public class PkgNotExp {
// 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.

@ -80,7 +80,7 @@ public class Umod {
// 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 @@ public class Umod {
// 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 @@ public class Umod {
// Packages: p1
// Packages exported: p1 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
new ModuleDescriptor.Builder("m1")
ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p1")
.build();

@ -70,7 +70,7 @@ public class UmodDiffCL_ExpQualOther {
// 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 @@ public class UmodDiffCL_ExpQualOther {
// 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.

@ -70,7 +70,7 @@ public class UmodDiffCL_ExpUnqual {
// 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 @@ public class UmodDiffCL_ExpUnqual {
// Packages: p2
// Packages exported: none
ModuleDescriptor descriptor_m2 =
new ModuleDescriptor.Builder("m2")
ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();

@ -69,7 +69,7 @@ public class UmodDiffCL_PkgNotExp {
// 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 @@ public class UmodDiffCL_PkgNotExp {
// 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.

@ -75,7 +75,7 @@ public class UmodUPkg {
// 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 @@ public class UmodUPkg {
// Packages: p3
// Packages exported: p3 is exported unqualifiedly
ModuleDescriptor descriptor_m1 =
new ModuleDescriptor.Builder("m1")
ModuleDescriptor.module("m1")
.requires("java.base")
.exports("p3")
.build();

@ -70,7 +70,7 @@ public class UmodUpkgDiffCL_ExpQualOther {
// 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 @@ public class UmodUpkgDiffCL_ExpQualOther {
// 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.

@ -69,7 +69,7 @@ public class UmodUpkgDiffCL_NotExp {
// 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 @@ public class UmodUpkgDiffCL_NotExp {
// 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.

@ -69,7 +69,7 @@ public class UmodUpkg_ExpQualOther {
// 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 @@ public class UmodUpkg_ExpQualOther {
// 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 @@ public class UmodUpkg_ExpQualOther {
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
new ModuleDescriptor.Builder("m3")
ModuleDescriptor.module("m3")
.requires("java.base")
.build();

@ -67,7 +67,7 @@ public class UmodUpkg_NotExp {
// 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 @@ public class UmodUpkg_NotExp {
// 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.

@ -69,7 +69,7 @@ public class Umod_ExpQualOther {
// 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 @@ public class Umod_ExpQualOther {
// 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 @@ public class Umod_ExpQualOther {
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
new ModuleDescriptor.Builder("m3")
ModuleDescriptor.module("m3")
.requires("java.base")
.build();

@ -69,7 +69,7 @@ public class Umod_ExpUnqual {
// 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 @@ public class Umod_ExpUnqual {
// Packages: p2
// Packages exported: p2 is exported unqualifiedly
ModuleDescriptor descriptor_m2 =
new ModuleDescriptor.Builder("m2")
ModuleDescriptor.module("m2")
.requires("java.base")
.exports("p2")
.build();

@ -67,7 +67,7 @@ public class Umod_PkgNotExp {
// 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 @@ public class Umod_PkgNotExp {
// 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.

@ -72,6 +72,6 @@ public class IgnoreModulePropertiesTest {
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");
}
}

@ -33,6 +33,7 @@
*/
import static jdk.test.lib.Asserts.*;
import java.sql.Time;
public class JVMAddModulePackage {
@ -123,6 +124,29 @@ public class JVMAddModulePackage {
// 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 { }

@ -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 { }
}

@ -33,6 +33,7 @@
*/
import static jdk.test.lib.Asserts.*;
import java.sql.Time;
public class JVMDefineModule {
@ -238,6 +239,39 @@ public class JVMDefineModule {
}
}
// 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");

@ -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 { }
}

@ -73,17 +73,6 @@ public class ModuleHelper {
java.lang.reflect.ModuleHelper.addExportsNoSync((Module)m, pkg, (Module)null);
}
public static boolean CanReadModule(Object from, Object to) throws Throwable {
WhiteBox wb = WhiteBox.getWhiteBox();
return wb.CanReadModule(from, to);
}
public static boolean IsExportedToModule(Object from, String pkg,
Object to) throws Throwable {
WhiteBox wb = WhiteBox.getWhiteBox();
return wb.IsExportedToModule(from, pkg, to);
}
public static Module ModuleObject(String name, ClassLoader loader, String[] pkgs) throws Throwable {
Set<String> pkg_set = new HashSet<>();
if (pkgs != null) {
@ -95,7 +84,7 @@ public class ModuleHelper {
}
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);

@ -57,7 +57,7 @@ public class ModuleNonBuiltinCLMain {
// 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 @@ public class ModuleNonBuiltinCLMain {
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 @@ public class ModuleNonBuiltinCLMain {
// Packages: p3
// Packages exported: none
ModuleDescriptor descriptor_m3 =
new ModuleDescriptor.Builder("m3")
ModuleDescriptor.module("m3")
.requires("java.base")
.build();

@ -55,7 +55,7 @@ public class ModuleSameCLMain {
// 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 @@ public class ModuleSameCLMain {
// 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.

@ -35,10 +35,6 @@ public class GetModule {
}
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 @@ public class GetModule {
} 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 { }

@ -28,15 +28,3 @@ Java_GetModule_callGetModule(JNIEnv *env, jclass unused, jclass clazz) {
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;
}

@ -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

@ -32,7 +32,7 @@ import static jdk.test.lib.Asserts.assertTrue;
* @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 @@ public class AllModulesCommandTest implements DebuggeeLauncher.Listener {
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 @@ public class AllModulesCommandTest implements DebuggeeLauncher.Listener {
}
}
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);

@ -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);
}
}
}

Some files were not shown because too many files have changed in this diff Show More