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:
parent
16734f37d5
commit
988690303a
hotspot
make
src
jdk.vm.ci/share/classes
share/vm
test
TEST.ROOT
compiler
c2
codegen
escapeAnalysis
intrinsics
bigInteger
unsafe
jvmci
compilerToVM
jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test
rangechecks
runtime
unsafe
GetUnsafeObjectG1PreBarrier.javaJdkInternalMiscUnsafeAccessTestBoolean.javaJdkInternalMiscUnsafeAccessTestByte.javaJdkInternalMiscUnsafeAccessTestChar.javaJdkInternalMiscUnsafeAccessTestDouble.javaJdkInternalMiscUnsafeAccessTestFloat.javaJdkInternalMiscUnsafeAccessTestInt.javaJdkInternalMiscUnsafeAccessTestLong.javaJdkInternalMiscUnsafeAccessTestObject.javaJdkInternalMiscUnsafeAccessTestShort.javaJdkInternalMiscUnsafeUnalignedAccess.javaTestUnsafeLoadControl.java
gc
g1
TestStringDeduplicationAgeThreshold.javaTestStringDeduplicationFullGC.javaTestStringDeduplicationInterned.javaTestStringDeduplicationPrintOptions.javaTestStringDeduplicationTableRehash.javaTestStringDeduplicationTableResize.javaTestStringDeduplicationTools.javaTestStringDeduplicationYoungGC.java
stress/gcbasher
runtime
LocalLong
Throwable
getSysPackage
modules
AccessCheck
CheckRead.javaDiffCL_CheckRead.javaDiffCL_ExpQualOther.javaDiffCL_ExpQualToM1.javaDiffCL_ExpUnqual.javaDiffCL_PkgNotExp.javaDiffCL_Umod.javaDiffCL_UmodUpkg.javaExpQualOther.javaExpQualToM1.javaExpUnqual.javaExportAllUnnamed.javaPkgNotExp.javaUmod.javaUmodDiffCL_ExpQualOther.javaUmodDiffCL_ExpUnqual.javaUmodDiffCL_PkgNotExp.javaUmodUPkg.javaUmodUpkgDiffCL_ExpQualOther.javaUmodUpkgDiffCL_NotExp.javaUmodUpkg_ExpQualOther.javaUmodUpkg_NotExp.javaUmod_ExpQualOther.javaUmod_ExpUnqual.javaUmod_PkgNotExp.java
IgnoreModulePropertiesTest.javaJVMAddModulePackage.javaJVMCanReadModule.javaJVMDefineModule.javaJVMIsExportedToModule.javaModuleHelper.javaModuleStress
getModuleJNI
serviceability
attach
jdwp
jvmti/AddModuleExportsAndOpens/MyPackage
@ -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);
|
||||
|
59
hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java
Normal file
59
hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java
Normal file
@ -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
Loading…
x
Reference in New Issue
Block a user