--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.services/src/jdk/vm/ci/services/Services.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.services/src/jdk/vm/ci/services/Services.java Thu Aug 11 17:02:27 2016 +0000
@@ -57,7 +57,7 @@
if (jvmci != requestorModule) {
for (String pkg : jvmci.getPackages()) {
// Export all JVMCI packages dynamically instead
- // of requiring a long list of -XaddExports
+ // of requiring a long list of --add-exports
// options on the JVM command line.
if (!jvmci.isExported(pkg, requestorModule)) {
jvmci.addExports(pkg, requestorModule);
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Thu Aug 11 17:02:27 2016 +0000
@@ -140,7 +140,7 @@
PerfCounter* ClassLoader::_isUnsyncloadClass = NULL;
PerfCounter* ClassLoader::_load_instance_class_failCounter = NULL;
-GrowableArray<ModuleClassPathList*>* ClassLoader::_xpatch_entries = NULL;
+GrowableArray<ModuleClassPathList*>* ClassLoader::_patch_mod_entries = NULL;
GrowableArray<ModuleClassPathList*>* ClassLoader::_exploded_entries = NULL;
ClassPathEntry* ClassLoader::_jrt_entry = NULL;
ClassPathEntry* ClassLoader::_first_append_entry = NULL;
@@ -685,27 +685,27 @@
}
#endif
-// Construct the array of module/path pairs as specified to -Xpatch
+// Construct the array of module/path pairs as specified to --patch-module
// for the boot loader to search ahead of the jimage, if the class being
-// loaded is defined to a module that has been specified to -Xpatch.
-void ClassLoader::setup_xpatch_entries() {
+// loaded is defined to a module that has been specified to --patch-module.
+void ClassLoader::setup_patch_mod_entries() {
Thread* THREAD = Thread::current();
- GrowableArray<ModuleXPatchPath*>* xpatch_args = Arguments::get_xpatchprefix();
- int num_of_entries = xpatch_args->length();
+ GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
+ int num_of_entries = patch_mod_args->length();
- assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with -Xpatch");
- assert(!UseSharedSpaces, "UseSharedSpaces not supported with -Xpatch");
+ assert(!DumpSharedSpaces, "DumpSharedSpaces not supported with --patch-module");
+ assert(!UseSharedSpaces, "UseSharedSpaces not supported with --patch-module");
- // Set up the boot loader's _xpatch_entries list
- _xpatch_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
+ // Set up the boot loader's _patch_mod_entries list
+ _patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
for (int i = 0; i < num_of_entries; i++) {
- const char* module_name = (xpatch_args->at(i))->module_name();
+ const char* module_name = (patch_mod_args->at(i))->module_name();
Symbol* const module_sym = SymbolTable::lookup(module_name, (int)strlen(module_name), CHECK);
assert(module_sym != NULL, "Failed to obtain Symbol for module name");
ModuleClassPathList* module_cpl = new ModuleClassPathList(module_sym);
- char* class_path = (xpatch_args->at(i))->path_string();
+ char* class_path = (patch_mod_args->at(i))->path_string();
int len = (int)strlen(class_path);
int end = 0;
// Iterate over the module's class path entries
@@ -735,10 +735,10 @@
}
}
- // Record the module into the list of -Xpatch entries only if
+ // Record the module into the list of --patch-module entries only if
// valid ClassPathEntrys have been created
if (module_cpl->module_first_entry() != NULL) {
- _xpatch_entries->push(module_cpl);
+ _patch_mod_entries->push(module_cpl);
}
}
}
@@ -1020,9 +1020,9 @@
ClassPathEntry* e;
tty->print("[bootclasspath= ");
- // Print -Xpatch module/path specifications first
- if (_xpatch_entries != NULL) {
- print_module_entry_table(_xpatch_entries);
+ // Print --patch-module module/path specifications first
+ if (_patch_mod_entries != NULL) {
+ print_module_entry_table(_patch_mod_entries);
}
// [jimage | exploded modules build]
@@ -1341,7 +1341,7 @@
return file_name;
}
-// Search either the xpatch or exploded build entries for class
+// Search either the patch-module or exploded build entries for class
ClassFileStream* ClassLoader::search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
const char* const class_name, const char* const file_name, TRAPS) {
ClassFileStream* stream = NULL;
@@ -1366,7 +1366,7 @@
int num_of_entries = module_list->length();
const Symbol* class_module_name = mod_entry->name();
- // Loop through all the modules in either the xpatch or exploded entries looking for module
+ // Loop through all the modules in either the patch-module or exploded entries looking for module
for (int i = 0; i < num_of_entries; i++) {
ModuleClassPathList* module_cpl = module_list->at(i);
Symbol* module_cpl_name = module_cpl->module_name();
@@ -1378,7 +1378,7 @@
while (e != NULL) {
stream = e->open_stream(file_name, CHECK_NULL);
// No context.check is required since CDS is not supported
- // for an exploded modules build or if -Xpatch is specified.
+ // for an exploded modules build or if --patch-module is specified.
if (NULL != stream) {
return stream;
}
@@ -1420,32 +1420,32 @@
// If DumpSharedSpaces is true boot loader visibility boundaries are set to:
// - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
- // No -Xpatch entries or exploded module builds are included since CDS
- // is not supported if -Xpatch or exploded module builds are used.
+ // No --patch-module entries or exploded module builds are included since CDS
+ // is not supported if --patch-module or exploded module builds are used.
//
// If search_append_only is true, boot loader visibility boundaries are
// set to be _first_append_entry to the end. This includes:
// [-Xbootclasspath/a]; [jvmti appended entries]
//
// If both DumpSharedSpaces and search_append_only are false, boot loader
- // visibility boundaries are set to be the -Xpatch entries plus the base piece.
+ // visibility boundaries are set to be the --patch-module entries plus the base piece.
// This would include:
- // [-Xpatch:<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
+ // [--patch-module=<module>=<file>(<pathsep><file>)*]; [jimage | exploded module build]
//
// DumpSharedSpaces and search_append_only are mutually exclusive and cannot
// be true at the same time.
assert(!(DumpSharedSpaces && search_append_only), "DumpSharedSpaces and search_append_only are both true");
- // Load Attempt #1: -Xpatch
- // Determine the class' defining module. If it appears in the _xpatch_entries,
+ // Load Attempt #1: --patch-module
+ // Determine the class' defining module. If it appears in the _patch_mod_entries,
// attempt to load the class from those locations specific to the module.
- // Specifications to -Xpatch can contain a partial number of classes
+ // Specifications to --patch-module can contain a partial number of classes
// that are part of the overall module definition. So if a particular class is not
// found within its module specification, the search should continue to Load Attempt #2.
- // Note: The -Xpatch entries are never searched if the boot loader's
+ // Note: The --patch-module entries are never searched if the boot loader's
// visibility boundary is limited to only searching the append entries.
- if (_xpatch_entries != NULL && !search_append_only && !DumpSharedSpaces) {
- stream = search_module_entries(_xpatch_entries, class_name, file_name, CHECK_NULL);
+ if (_patch_mod_entries != NULL && !search_append_only && !DumpSharedSpaces) {
+ stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
}
// Load Attempt #2: [jimage | exploded build]
@@ -1650,11 +1650,11 @@
// Create the moduleEntry for java.base
create_javabase();
- // Setup the list of module/path pairs for -Xpatch processing
+ // Setup the list of module/path pairs for --patch-module processing
// This must be done after the SymbolTable is created in order
// to use fast_compare on module names instead of a string compare.
- if (Arguments::get_xpatchprefix() != NULL) {
- setup_xpatch_entries();
+ if (Arguments::get_patch_mod_prefix() != NULL) {
+ setup_patch_mod_entries();
}
// Setup the initial java.base/path pair for the exploded build entries.
--- a/hotspot/src/share/vm/classfile/classLoader.hpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp Thu Aug 11 17:02:27 2016 +0000
@@ -150,7 +150,7 @@
// ModuleClassPathList contains a linked list of ClassPathEntry's
// that have been specified for a specific module. Currently,
-// the only way to specify a module/path pair is via the -Xpatch
+// the only way to specify a module/path pair is via the --patch-module
// command line option.
class ModuleClassPathList : public CHeapObj<mtClass> {
private:
@@ -213,8 +213,8 @@
static PerfCounter* _load_instance_class_failCounter;
// The boot class path consists of 3 ordered pieces:
- // 1. the module/path pairs specified to -Xpatch
- // -Xpatch:<module>=<file>(<pathsep><file>)*
+ // 1. the module/path pairs specified to --patch-module
+ // --patch-module=<module>=<file>(<pathsep><file>)*
// 2. the base piece
// [jimage | build with exploded modules]
// 3. boot loader append path
@@ -223,8 +223,8 @@
// The boot loader must obey this order when attempting
// to load a class.
- // 1. Contains the module/path pairs specified to -Xpatch
- static GrowableArray<ModuleClassPathList*>* _xpatch_entries;
+ // 1. Contains the module/path pairs specified to --patch-module
+ static GrowableArray<ModuleClassPathList*>* _patch_mod_entries;
// 2. the base piece
// Contains the ClassPathEntry of the modular java runtime image.
@@ -256,11 +256,11 @@
// Initialization:
// - setup the boot loader's system class path
- // - setup the boot loader's xpatch entries, if present
+ // - setup the boot loader's patch mod entries, if present
// - create the ModuleEntry for java.base
static void setup_bootstrap_search_path();
static void setup_search_path(const char *class_path, bool setting_bootstrap);
- static void setup_xpatch_entries();
+ static void setup_patch_mod_entries();
static void create_javabase();
static void load_zip_library();
@@ -363,7 +363,7 @@
// Add a module's exploded directory to the boot loader's exploded module build list
static void add_to_exploded_build_list(Symbol* module_name, TRAPS);
- // Attempt load of individual class from either the xpatch or exploded modules build lists
+ // Attempt load of individual class from either the patched or exploded modules build lists
static ClassFileStream* search_module_entries(const GrowableArray<ModuleClassPathList*>* const module_list,
const char* const class_name,
const char* const file_name, TRAPS);
--- a/hotspot/src/share/vm/memory/filemap.cpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/memory/filemap.cpp Thu Aug 11 17:02:27 2016 +0000
@@ -911,8 +911,8 @@
return false;
}
- if (Arguments::get_xpatchprefix() != NULL) {
- FileMapInfo::fail_continue("The shared archive file cannot be used with -Xpatch.");
+ if (Arguments::get_patch_mod_prefix() != NULL) {
+ FileMapInfo::fail_continue("The shared archive file cannot be used with --patch-module.");
return false;
}
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Thu Aug 11 17:02:27 2016 +0000
@@ -24,6 +24,8 @@
#include "precompiled.hpp"
#include "classfile/classLoaderExt.hpp"
+#include "classfile/javaClasses.inline.hpp"
+#include "classfile/stringTable.hpp"
#include "classfile/modules.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
@@ -224,6 +226,7 @@
return JVMTI_ERROR_NONE;
} /* end GetNamedModule */
+
//
// Class functions
//
@@ -3465,28 +3468,35 @@
JvmtiEnv::GetSystemProperties(jint* count_ptr, char*** property_ptr) {
jvmtiError err = JVMTI_ERROR_NONE;
- *count_ptr = Arguments::PropertyList_count(Arguments::system_properties());
-
+ // Get the number of readable properties.
+ *count_ptr = Arguments::PropertyList_readable_count(Arguments::system_properties());
+
+ // Allocate memory to hold the exact number of readable properties.
err = allocate(*count_ptr * sizeof(char *), (unsigned char **)property_ptr);
if (err != JVMTI_ERROR_NONE) {
return err;
}
- int i = 0 ;
- for (SystemProperty* p = Arguments::system_properties(); p != NULL && i < *count_ptr; p = p->next(), i++) {
- const char *key = p->key();
- char **tmp_value = *property_ptr+i;
- err = allocate((strlen(key)+1) * sizeof(char), (unsigned char**)tmp_value);
- if (err == JVMTI_ERROR_NONE) {
- strcpy(*tmp_value, key);
- } else {
- // clean up previously allocated memory.
- for (int j=0; j<i; j++) {
- Deallocate((unsigned char*)*property_ptr+j);
+ int readable_count = 0;
+ // Loop through the system properties until all the readable properties are found.
+ for (SystemProperty* p = Arguments::system_properties(); p != NULL && readable_count < *count_ptr; p = p->next()) {
+ if (p->is_readable()) {
+ const char *key = p->key();
+ char **tmp_value = *property_ptr+readable_count;
+ readable_count++;
+ err = allocate((strlen(key)+1) * sizeof(char), (unsigned char**)tmp_value);
+ if (err == JVMTI_ERROR_NONE) {
+ strcpy(*tmp_value, key);
+ } else {
+ // clean up previously allocated memory.
+ for (int j=0; j<readable_count; j++) {
+ Deallocate((unsigned char*)*property_ptr+j);
+ }
+ Deallocate((unsigned char*)property_ptr);
+ break;
}
- Deallocate((unsigned char*)property_ptr);
- break;
}
}
+ assert(err != JVMTI_ERROR_NONE || readable_count == *count_ptr, "Bad readable property count");
return err;
} /* end GetSystemProperties */
@@ -3498,7 +3508,8 @@
jvmtiError err = JVMTI_ERROR_NONE;
const char *value;
- value = Arguments::PropertyList_get_value(Arguments::system_properties(), property);
+ // Return JVMTI_ERROR_NOT_AVAILABLE if property is not readable or doesn't exist.
+ value = Arguments::PropertyList_get_readable_value(Arguments::system_properties(), property);
if (value == NULL) {
err = JVMTI_ERROR_NOT_AVAILABLE;
} else {
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Aug 11 17:02:27 2016 +0000
@@ -110,7 +110,7 @@
SystemProperty *Arguments::_java_class_path = NULL;
SystemProperty *Arguments::_jdk_boot_class_path_append = NULL;
-GrowableArray<ModuleXPatchPath*> *Arguments::_xpatchprefix = NULL;
+GrowableArray<ModulePatchPath*> *Arguments::_patch_mod_prefix = NULL;
PathString *Arguments::_system_boot_class_path = NULL;
bool Arguments::_has_jimage = false;
@@ -161,6 +161,30 @@
}
}
+bool needs_module_property_warning = false;
+
+#define MODULE_PROPERTY_PREFIX "jdk.module"
+#define MODULE_PROPERTY_PREFIX_LEN 10
+#define MODULE_MAIN_PROPERTY "jdk.module.main"
+#define MODULE_MAIN_PROPERTY_LEN 15
+
+// Return TRUE if option matches property, or property=, or property..
+static bool matches_property_prefix(const char* option, const char* property, size_t len) {
+ return (strncmp(option, property, len) == 0) &&
+ (option[len] == '=' || option[len] == '.' || option[len] == '\0');
+}
+
+// Return true if the property is either "jdk.module" or starts with "jdk.module.",
+// but does not start with "jdk.module.main".
+// Return false if jdk.module.main because jdk.module.main and jdk.module.main.class
+// are valid non-internal system properties.
+// "property" should be passed without the leading "-D".
+bool Arguments::is_internal_module_property(const char* property) {
+ assert((strncmp(property, "-D", 2) != 0), "Unexpected leading -D");
+ return (matches_property_prefix(property, MODULE_PROPERTY_PREFIX, MODULE_PROPERTY_PREFIX_LEN) &&
+ !matches_property_prefix(property, MODULE_MAIN_PROPERTY, MODULE_MAIN_PROPERTY_LEN));
+}
+
// Process java launcher properties.
void Arguments::process_sun_java_launcher_properties(JavaVMInitArgs* args) {
// See if sun.java.launcher, sun.java.launcher.is_altjvm or
@@ -197,7 +221,7 @@
_system_boot_class_path = new PathString(NULL);
PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.name",
- "Java Virtual Machine Specification", false));
+ "Java Virtual Machine Specification", false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.version", VM_Version::vm_release(), false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.name", VM_Version::vm_name(), false));
PropertyList_add(&_system_properties, new SystemProperty("java.vm.info", VM_Version::vm_info_string(), true));
@@ -1198,7 +1222,7 @@
return PropertyList_get_value(system_properties(), key);
}
-bool Arguments::add_property(const char* prop) {
+bool Arguments::add_property(const char* prop, PropertyWriteable writeable, PropertyInternal internal) {
const char* eq = strchr(prop, '=');
const char* key;
const char* value = "";
@@ -1228,7 +1252,9 @@
// private and are processed in process_sun_java_launcher_properties();
// the sun.java.launcher property is passed on to the java application
} else if (strcmp(key, "sun.boot.library.path") == 0) {
- PropertyList_unique_add(&_system_properties, key, value, true);
+ // append is true, writable is true, internal is false
+ PropertyList_unique_add(&_system_properties, key, value, AppendProperty,
+ WriteableProperty, ExternalProperty);
} else {
if (strcmp(key, "sun.java.command") == 0) {
char *old_java_command = _java_command;
@@ -1248,7 +1274,7 @@
}
// Create new property and add at the end of the list
- PropertyList_unique_add(&_system_properties, key, value);
+ PropertyList_unique_add(&_system_properties, key, value, AddProperty, writeable, internal);
}
if (key != prop) {
@@ -1260,9 +1286,9 @@
return true;
}
-// sets or adds a module name to the jdk.launcher.addmods property
+// sets or adds a module name to the jdk.module.addmods property
bool Arguments::append_to_addmods_property(const char* module_name) {
- const char* key = "jdk.launcher.addmods";
+ const char* key = "jdk.module.addmods";
const char* old_value = Arguments::get_property(key);
size_t buf_len = strlen(key) + strlen(module_name) + 2;
if (old_value != NULL) {
@@ -1277,7 +1303,7 @@
} else {
jio_snprintf(new_value, buf_len, "%s=%s,%s", key, old_value, module_name);
}
- bool added = add_property(new_value);
+ bool added = add_property(new_value, UnwriteableProperty, InternalProperty);
FreeHeap(new_value);
return added;
}
@@ -1287,14 +1313,14 @@
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
const char* unsupported_properties[5] = { "jdk.module.main",
"jdk.module.path",
- "jdk.upgrade.module.path",
- "jdk.launcher.addmods",
- "jdk.launcher.limitmods" };
+ "jdk.module.upgrade.path",
+ "jdk.module.addmods",
+ "jdk.module.limitmods" };
const char* unsupported_options[5] = { "-m",
- "-modulepath",
- "-upgrademodulepath",
- "-addmods",
- "-limitmods" };
+ "--module-path",
+ "--upgrade-module-path",
+ "--add-modules",
+ "--limit-modules" };
SystemProperty* sp = system_properties();
while (sp != NULL) {
for (int i = 0; i < 5; i++) {
@@ -1326,7 +1352,7 @@
// Ensure Agent_OnLoad has the correct initial values.
// This may not be the final mode; mode may change later in onload phase.
PropertyList_unique_add(&_system_properties, "java.vm.info",
- VM_Version::vm_info_string(), false);
+ VM_Version::vm_info_string(), AddProperty, UnwriteableProperty, ExternalProperty);
UseInterpreter = true;
UseCompiler = true;
@@ -2516,6 +2542,41 @@
return false;
}
+unsigned int addreads_count = 0;
+unsigned int addexports_count = 0;
+unsigned int patch_mod_count = 0;
+const char* add_modules_value = NULL;
+
+bool Arguments::create_property(const char* prop_name, const char* prop_value, PropertyInternal internal) {
+ size_t prop_len = strlen(prop_name) + strlen(prop_value) + 2;
+ char* property = AllocateHeap(prop_len, mtArguments);
+ int ret = jio_snprintf(property, prop_len, "%s=%s", prop_name, prop_value);
+ if (ret < 0 || ret >= (int)prop_len) {
+ FreeHeap(property);
+ return false;
+ }
+ bool added = add_property(property, UnwriteableProperty, internal);
+ FreeHeap(property);
+ return added;
+}
+
+bool Arguments::create_numbered_property(const char* prop_base_name, const char* prop_value, unsigned int count) {
+ // Make sure count is < 1,000. Otherwise, memory allocation will be too small.
+ if (count < 1000) {
+ size_t prop_len = strlen(prop_base_name) + strlen(prop_value) + 5;
+ char* property = AllocateHeap(prop_len, mtArguments);
+ int ret = jio_snprintf(property, prop_len, "%s.%d=%s", prop_base_name, count, prop_value);
+ if (ret < 0 || ret >= (int)prop_len) {
+ FreeHeap(property);
+ return false;
+ }
+ bool added = add_property(property, UnwriteableProperty, InternalProperty);
+ FreeHeap(property);
+ return added;
+ }
+ return false;
+}
+
Arguments::ArgsRange Arguments::parse_memory_size(const char* s,
julong* long_arg,
julong min_size) {
@@ -2528,7 +2589,7 @@
jint Arguments::parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
const JavaVMInitArgs *java_options_args,
const JavaVMInitArgs *cmd_line_args) {
- bool xpatch_javabase = false;
+ bool patch_mod_javabase = false;
// Save default settings for some mode flags
Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
@@ -2545,20 +2606,20 @@
// Parse args structure generated from JAVA_TOOL_OPTIONS environment
// variable (if present).
- jint result = parse_each_vm_init_arg(java_tool_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
+ jint result = parse_each_vm_init_arg(java_tool_options_args, &patch_mod_javabase, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
// Parse args structure generated from the command line flags.
- result = parse_each_vm_init_arg(cmd_line_args, &xpatch_javabase, Flag::COMMAND_LINE);
+ result = parse_each_vm_init_arg(cmd_line_args, &patch_mod_javabase, Flag::COMMAND_LINE);
if (result != JNI_OK) {
return result;
}
// Parse args structure generated from the _JAVA_OPTIONS environment
// variable (if present) (mimics classic VM)
- result = parse_each_vm_init_arg(java_options_args, &xpatch_javabase, Flag::ENVIRON_VAR);
+ result = parse_each_vm_init_arg(java_options_args, &patch_mod_javabase, Flag::ENVIRON_VAR);
if (result != JNI_OK) {
return result;
}
@@ -2617,7 +2678,35 @@
return false;
}
-jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin) {
+int Arguments::process_patch_mod_option(const char* patch_mod_tail, bool* patch_mod_javabase) {
+ // --patch-module=<module>=<file>(<pathsep><file>)*
+ assert(patch_mod_tail != NULL, "Unexpected NULL patch-module value");
+ // Find the equal sign between the module name and the path specification
+ const char* module_equal = strchr(patch_mod_tail, '=');
+ if (module_equal == NULL) {
+ jio_fprintf(defaultStream::output_stream(), "Missing '=' in --patch-module specification\n");
+ return JNI_ERR;
+ } else {
+ // Pick out the module name
+ size_t module_len = module_equal - patch_mod_tail;
+ char* module_name = NEW_C_HEAP_ARRAY_RETURN_NULL(char, module_len+1, mtArguments);
+ if (module_name != NULL) {
+ memcpy(module_name, patch_mod_tail, module_len);
+ *(module_name + module_len) = '\0';
+ // The path piece begins one past the module_equal sign
+ add_patch_mod_prefix(module_name, module_equal + 1, patch_mod_javabase);
+ FREE_C_HEAP_ARRAY(char, module_name);
+ if (!create_numbered_property("jdk.module.patch", patch_mod_tail, patch_mod_count++)) {
+ return JNI_ENOMEM;
+ }
+ } else {
+ return JNI_ENOMEM;
+ }
+ }
+ return JNI_OK;
+}
+
+jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_mod_javabase, Flag::Flags origin) {
// For match_option to return remaining or value part of option string
const char* tail;
@@ -2701,6 +2790,34 @@
#endif // !INCLUDE_JVMTI
add_init_library(name, options);
}
+ } else if (match_option(option, "--add-reads=", &tail)) {
+ if (!create_numbered_property("jdk.module.addreads", tail, addreads_count++)) {
+ return JNI_ENOMEM;
+ }
+ } else if (match_option(option, "--add-exports=", &tail)) {
+ if (!create_numbered_property("jdk.module.addexports", tail, addexports_count++)) {
+ return JNI_ENOMEM;
+ }
+ } else if (match_option(option, "--add-modules=", &tail)) {
+ add_modules_value = tail;
+ } else if (match_option(option, "--limit-modules=", &tail)) {
+ if (!create_property("jdk.module.limitmods", tail, InternalProperty)) {
+ return JNI_ENOMEM;
+ }
+ } else if (match_option(option, "--module-path=", &tail)) {
+ if (!create_property("jdk.module.path", tail, ExternalProperty)) {
+ return JNI_ENOMEM;
+ }
+ } else if (match_option(option, "--upgrade-module-path=", &tail)) {
+ if (!create_property("jdk.module.upgrade.path", tail, ExternalProperty)) {
+ return JNI_ENOMEM;
+ }
+ } else if (match_option(option, "--patch-module=", &tail)) {
+ // --patch-module=<module>=<file>(<pathsep><file>)*
+ int res = process_patch_mod_option(tail, patch_mod_javabase);
+ if (res != JNI_OK) {
+ return res;
+ }
// -agentlib and -agentpath
} else if (match_option(option, "-agentlib:", &tail) ||
(is_absolute_path = match_option(option, "-agentpath:", &tail))) {
@@ -2992,6 +3109,13 @@
"-Djava.ext.dirs=%s is not supported. Use -classpath instead.\n", value);
return JNI_EINVAL;
}
+ // Check for module related properties. They must be set using the modules
+ // options. For example: use "--add-modules=java.sql", not
+ // "-Djdk.module.addmods=java.sql"
+ if (is_internal_module_property(option->optionString + 2)) {
+ needs_module_property_warning = true;
+ continue;
+ }
if (!add_property(tail)) {
return JNI_ENOMEM;
@@ -3012,33 +3136,6 @@
return JNI_ERR;
#endif
}
- if (match_option(option, "-Djdk.launcher.patch.", &tail)) {
- // -Djdk.launcher.patch.#=<module>=<file>(<pathsep><file>)*
- // The number, #, specified will be increasing with each -Xpatch
- // specified on the command line.
- // Pick up module name, following the -D property's equal sign.
- const char* property_equal = strchr(tail, '=');
- if (property_equal == NULL) {
- jio_fprintf(defaultStream::output_stream(), "Missing '=' in -Xpatch specification\n");
- return JNI_ERR;
- } else {
- // Find the equal sign between the module name and the path specification
- const char* module_equal = strchr(property_equal + 1, '=');
- if (module_equal == NULL) {
- jio_fprintf(defaultStream::output_stream(), "Bad value for -Xpatch, no module name specified\n");
- return JNI_ERR;
- } else {
- // Pick out the module name, in between the two equal signs
- size_t module_len = module_equal - property_equal - 1;
- char* module_name = NEW_C_HEAP_ARRAY(char, module_len+1, mtArguments);
- memcpy(module_name, property_equal + 1, module_len);
- *(module_name + module_len) = '\0';
- // The path piece begins one past the module_equal sign
- Arguments::add_xpatchprefix(module_name, module_equal + 1, xpatch_javabase);
- FREE_C_HEAP_ARRAY(char, module_name);
- }
- }
- }
// -Xint
} else if (match_option(option, "-Xint")) {
set_mode_flags(_int);
@@ -3298,25 +3395,25 @@
return JNI_OK;
}
-void Arguments::add_xpatchprefix(const char* module_name, const char* path, bool* xpatch_javabase) {
- // For java.base check for duplicate -Xpatch options being specified on the command line.
+void Arguments::add_patch_mod_prefix(const char* module_name, const char* path, bool* patch_mod_javabase) {
+ // For java.base check for duplicate --patch-module options being specified on the command line.
// This check is only required for java.base, all other duplicate module specifications
// will be checked during module system initialization. The module system initialization
// will throw an ExceptionInInitializerError if this situation occurs.
if (strcmp(module_name, "java.base") == 0) {
- if (*xpatch_javabase) {
- vm_exit_during_initialization("Cannot specify java.base more than once to -Xpatch");
+ if (*patch_mod_javabase) {
+ vm_exit_during_initialization("Cannot specify java.base more than once to --patch-module");
} else {
- *xpatch_javabase = true;
+ *patch_mod_javabase = true;
}
}
- // Create GrowableArray lazily, only if -Xpatch has been specified
- if (_xpatchprefix == NULL) {
- _xpatchprefix = new (ResourceObj::C_HEAP, mtArguments) GrowableArray<ModuleXPatchPath*>(10, true);
- }
-
- _xpatchprefix->push(new ModuleXPatchPath(module_name, path));
+ // Create GrowableArray lazily, only if --patch-module has been specified
+ if (_patch_mod_prefix == NULL) {
+ _patch_mod_prefix = new (ResourceObj::C_HEAP, mtArguments) GrowableArray<ModulePatchPath*>(10, true);
+ }
+
+ _patch_mod_prefix->push(new ModulePatchPath(module_name, path));
}
// Remove all empty paths from the app classpath (if IgnoreEmptyClassPaths is enabled)
@@ -3441,6 +3538,15 @@
return JNI_ERR;
}
+ // Append the value of the last --add-modules option specified on the command line.
+ // This needs to be done here, to prevent overwriting possible values written
+ // to the jdk.module.addmods property by -javaagent and other options.
+ if (add_modules_value != NULL) {
+ if (!append_to_addmods_property(add_modules_value)) {
+ return JNI_ENOMEM;
+ }
+ }
+
// This must be done after all arguments have been processed.
// java_compiler() true means set to "NONE" or empty.
if (java_compiler() && !xdebug_mode()) {
@@ -3795,9 +3901,9 @@
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
- if (Arguments::get_xpatchprefix() != NULL) {
+ if (Arguments::get_patch_mod_prefix() != NULL) {
vm_exit_during_initialization(
- "Cannot use the following option when dumping the shared archive", "-Xpatch");
+ "Cannot use the following option when dumping the shared archive: --patch-module");
}
if (RequireSharedSpaces) {
@@ -4180,6 +4286,11 @@
hotspotrc, hotspotrc);
}
+ if (needs_module_property_warning) {
+ warning("Ignoring system property options whose names start with '-Djdk.module'."
+ " They are reserved for internal use.");
+ }
+
#if defined(_ALLBSD_SOURCE) || defined(AIX) // UseLargePages is not yet supported on BSD and AIX.
UNSUPPORTED_OPTION(UseLargePages);
#endif
@@ -4404,6 +4515,18 @@
return count;
}
+// Return the number of readable properties.
+int Arguments::PropertyList_readable_count(SystemProperty* pl) {
+ int count = 0;
+ while(pl != NULL) {
+ if (pl->is_readable()) {
+ count++;
+ }
+ pl = pl->next();
+ }
+ return count;
+}
+
const char* Arguments::PropertyList_get_value(SystemProperty *pl, const char* key) {
assert(key != NULL, "just checking");
SystemProperty* prop;
@@ -4413,6 +4536,27 @@
return NULL;
}
+// Return the value of the requested property provided that it is a readable property.
+const char* Arguments::PropertyList_get_readable_value(SystemProperty *pl, const char* key) {
+ assert(key != NULL, "just checking");
+ SystemProperty* prop;
+ // Return the property value if the keys match and the property is not internal or
+ // it's the special internal property "jdk.boot.class.path.append".
+ for (prop = pl; prop != NULL; prop = prop->next()) {
+ if (strcmp(key, prop->key()) == 0) {
+ if (!prop->internal()) {
+ return prop->value();
+ } else if (strcmp(key, "jdk.boot.class.path.append") == 0) {
+ return prop->value();
+ } else {
+ // Property is internal and not jdk.boot.class.path.append so return NULL.
+ return NULL;
+ }
+ }
+ }
+ return NULL;
+}
+
const char* Arguments::PropertyList_get_key_at(SystemProperty *pl, int index) {
int count = 0;
const char* ret_val = NULL;
@@ -4457,11 +4601,12 @@
}
}
-void Arguments::PropertyList_add(SystemProperty** plist, const char* k, const char* v) {
+void Arguments::PropertyList_add(SystemProperty** plist, const char* k, const char* v,
+ bool writeable, bool internal) {
if (plist == NULL)
return;
- SystemProperty* new_p = new SystemProperty(k, v, true);
+ SystemProperty* new_p = new SystemProperty(k, v, writeable, internal);
PropertyList_add(plist, new_p);
}
@@ -4470,7 +4615,9 @@
}
// This add maintains unique property key in the list.
-void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v, jboolean append) {
+void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v,
+ PropertyAppendable append, PropertyWriteable writeable,
+ PropertyInternal internal) {
if (plist == NULL)
return;
@@ -4478,16 +4625,16 @@
SystemProperty* prop;
for (prop = *plist; prop != NULL; prop = prop->next()) {
if (strcmp(k, prop->key()) == 0) {
- if (append) {
+ if (append == AppendProperty) {
prop->append_value(v);
} else {
- prop->set_writeable_value(v);
+ prop->set_value(v);
}
return;
}
}
- PropertyList_add(plist, k, v);
+ PropertyList_add(plist, k, v, writeable == WriteableProperty, internal == InternalProperty);
}
// Copies src into buf, replacing "%%" with "%" and "%p" with pid
--- a/hotspot/src/share/vm/runtime/arguments.hpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Thu Aug 11 17:02:27 2016 +0000
@@ -43,7 +43,7 @@
// PathString is used as:
// - the underlying value for a SystemProperty
-// - the path portion of an -Xpatch module/path pair
+// - the path portion of an --patch-module module/path pair
// - the string that represents the system boot class path, Arguments::_system_boot_class_path.
class PathString : public CHeapObj<mtArguments> {
protected:
@@ -107,13 +107,13 @@
}
};
-// ModuleXPatchPath records the module/path pair as specified to -Xpatch.
-class ModuleXPatchPath : public CHeapObj<mtInternal> {
+// ModulePatchPath records the module/path pair as specified to --patch-module.
+class ModulePatchPath : public CHeapObj<mtInternal> {
private:
char* _module_name;
PathString* _path;
public:
- ModuleXPatchPath(const char* module_name, const char* path) {
+ ModulePatchPath(const char* module_name, const char* path) {
assert(module_name != NULL && path != NULL, "Invalid module name or path value");
size_t len = strlen(module_name) + 1;
_module_name = AllocateHeap(len, mtInternal);
@@ -121,7 +121,7 @@
_path = new PathString(path);
}
- ~ModuleXPatchPath() {
+ ~ModulePatchPath() {
if (_module_name != NULL) {
FreeHeap(_module_name);
_module_name = NULL;
@@ -158,6 +158,10 @@
SystemProperty* next() const { return _next; }
void set_next(SystemProperty* next) { _next = next; }
+ bool is_readable() const {
+ return !_internal || strcmp(_key, "jdk.boot.class.path.append") == 0;
+ }
+
// A system property should only have its value set
// via an external interface if it is a writeable property.
// The internal, non-writeable property jdk.boot.class.path.append
@@ -325,6 +329,21 @@
arg_in_range = 0
};
+ enum PropertyAppendable {
+ AppendProperty,
+ AddProperty
+ };
+
+ enum PropertyWriteable {
+ WriteableProperty,
+ UnwriteableProperty
+ };
+
+ enum PropertyInternal {
+ InternalProperty,
+ ExternalProperty
+ };
+
private:
// a pointer to the flags file name if it is specified
@@ -348,18 +367,18 @@
static SystemProperty *_java_class_path;
static SystemProperty *_jdk_boot_class_path_append;
- // -Xpatch:module=<file>(<pathsep><file>)*
+ // --patch-module=module=<file>(<pathsep><file>)*
// Each element contains the associated module name, path
- // string pair as specified to -Xpatch.
- static GrowableArray<ModuleXPatchPath*>* _xpatchprefix;
+ // string pair as specified to --patch-module.
+ static GrowableArray<ModulePatchPath*>* _patch_mod_prefix;
// The constructed value of the system class path after
// argument processing and JVMTI OnLoad additions via
// calls to AddToBootstrapClassLoaderSearch. This is the
// final form before ClassLoader::setup_bootstrap_search().
- // Note: since -Xpatch is a module name/path pair, the system
- // boot class path string no longer contains the "prefix" to
- // the boot class path base piece as it did when
+ // Note: since --patch-module is a module name/path pair, the
+ // system boot class path string no longer contains the "prefix"
+ // to the boot class path base piece as it did when
// -Xbootclasspath/p was supported.
static PathString *_system_boot_class_path;
@@ -462,7 +481,13 @@
static vfprintf_hook_t _vfprintf_hook;
// System properties
- static bool add_property(const char* prop);
+ static bool add_property(const char* prop, PropertyWriteable writeable=WriteableProperty,
+ PropertyInternal internal=ExternalProperty);
+
+ static bool create_property(const char* prop_name, const char* prop_value, PropertyInternal internal);
+ static bool create_numbered_property(const char* prop_base_name, const char* prop_value, unsigned int count);
+
+ static int process_patch_mod_option(const char* patch_mod_tail, bool* patch_mod_javabase);
// Miscellaneous system property setter
static bool append_to_addmods_property(const char* module_name);
@@ -500,7 +525,7 @@
static jint parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
const JavaVMInitArgs *java_options_args,
const JavaVMInitArgs *cmd_line_args);
- static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* xpatch_javabase, Flag::Flags origin);
+ static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_mod_javabase, Flag::Flags origin);
static jint finalize_vm_init_args();
static bool is_bad_option(const JavaVMOption* option, jboolean ignore, const char* option_type);
@@ -708,16 +733,20 @@
// Property List manipulation
static void PropertyList_add(SystemProperty *element);
static void PropertyList_add(SystemProperty** plist, SystemProperty *element);
- static void PropertyList_add(SystemProperty** plist, const char* k, const char* v);
- static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v) {
- PropertyList_unique_add(plist, k, v, false);
- }
- static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v, jboolean append);
+ static void PropertyList_add(SystemProperty** plist, const char* k, const char* v, bool writeable, bool internal);
+
+ static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v,
+ PropertyAppendable append, PropertyWriteable writeable,
+ PropertyInternal internal);
static const char* PropertyList_get_value(SystemProperty* plist, const char* key);
+ static const char* PropertyList_get_readable_value(SystemProperty* plist, const char* key);
static int PropertyList_count(SystemProperty* pl);
+ static int PropertyList_readable_count(SystemProperty* pl);
static const char* PropertyList_get_key_at(SystemProperty* pl,int index);
static char* PropertyList_get_value_at(SystemProperty* pl,int index);
+ static bool is_internal_module_property(const char* option);
+
// Miscellaneous System property value getter and setters.
static void set_dll_dir(const char *value) { _sun_boot_library_path->set_value(value); }
static void set_java_home(const char *value) { _java_home->set_value(value); }
@@ -725,7 +754,7 @@
static void set_ext_dirs(char *value) { _ext_dirs = os::strdup_check_oom(value); }
// Set up the underlying pieces of the system boot class path
- static void add_xpatchprefix(const char *module_name, const char *path, bool* xpatch_javabase);
+ static void add_patch_mod_prefix(const char *module_name, const char *path, bool* patch_mod_javabase);
static void set_sysclasspath(const char *value, bool has_jimage) {
// During start up, set by os::set_boot_path()
assert(get_sysclasspath() == NULL, "System boot class path previously set");
@@ -737,7 +766,7 @@
_jdk_boot_class_path_append->append_value(value);
}
- static GrowableArray<ModuleXPatchPath*>* get_xpatchprefix() { return _xpatchprefix; }
+ static GrowableArray<ModulePatchPath*>* get_patch_mod_prefix() { return _patch_mod_prefix; }
static char* get_sysclasspath() { return _system_boot_class_path->value(); }
static char* get_jdk_boot_class_path_append() { return _jdk_boot_class_path_append->value(); }
static bool has_jimage() { return _has_jimage; }
--- a/hotspot/src/share/vm/utilities/ostream.cpp Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/src/share/vm/utilities/ostream.cpp Thu Aug 11 17:02:27 2016 +0000
@@ -703,13 +703,15 @@
// System properties don't generally contain newlines, so don't bother with unparsing.
outputStream *text = xs->text();
for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
- // Print in two stages to avoid problems with long
- // keys/values.
assert(p->key() != NULL, "p->key() is NULL");
- text->print_raw(p->key());
- text->put('=');
- assert(p->value() != NULL, "p->value() is NULL");
- text->print_raw_cr(p->value());
+ if (p->is_readable()) {
+ // Print in two stages to avoid problems with long
+ // keys/values.
+ text->print_raw(p->key());
+ text->put('=');
+ assert(p->value() != NULL, "p->value() is NULL");
+ text->print_raw_cr(p->value());
+ }
}
xs->tail("properties");
}
--- a/hotspot/test/TEST.ROOT Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/TEST.ROOT Thu Aug 11 17:02:27 2016 +0000
@@ -46,12 +46,12 @@
vm.gc.Parallel \
vm.gc.ConcMarkSweep
-# Tests using jtreg 4.2 b02 features
-requiredVersion=4.2 b02
+# Tests using jtreg 4.2 b03 features
+requiredVersion=4.2 b03
# Path to libraries in the topmost test directory. This is needed so @library
# does not need ../../ notation to reach them
external.lib.roots = ../../
-# Use new form of -Xpatch
-useNewXpatch=true
+# Use new module options
+useNewOptions=true
--- a/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/compiler/unsafe/UnsafeGetConstantField.java Thu Aug 11 17:02:27 2016 +0000
@@ -40,7 +40,7 @@
* -XX:CompileCommand=dontinline,compiler.unsafe.UnsafeGetConstantField::checkGetAddress
* -XX:CompileCommand=dontinline,*::test*
* -XX:+UseUnalignedAccesses
- * -XaddReads:java.base=ALL-UNNAMED
+ * --add-reads=java.base=ALL-UNNAMED
* compiler.unsafe.UnsafeGetConstantField
*
* @run main/bootclasspath/othervm -XX:+UnlockDiagnosticVMOptions
@@ -50,7 +50,7 @@
* -XX:CompileCommand=dontinline,*::test*
* -XX:CompileCommand=inline,*Unsafe::get*
* -XX:-UseUnalignedAccesses
- * -XaddReads:java.base=ALL-UNNAMED
+ * --add-reads=java.base=ALL-UNNAMED
* compiler.unsafe.UnsafeGetConstantField
*/
--- a/hotspot/test/gc/arguments/TestMaxMinHeapFreeRatioFlags.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/gc/arguments/TestMaxMinHeapFreeRatioFlags.java Thu Aug 11 17:02:27 2016 +0000
@@ -88,7 +88,7 @@
(useXmaxf ? "-Xmaxf" + maxRatio / 100.0 : "-XX:MaxHeapFreeRatio=" + maxRatio),
"-Xmx" + MAX_HEAP_SIZE,
"-Xms" + HEAP_SIZE,
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:NewSize=" + NEW_SIZE,
"-XX:MaxNewSize=" + MAX_NEW_SIZE,
"-XX:" + (shrinkHeapInSteps ? '+' : '-') + "ShrinkHeapInSteps",
@@ -120,7 +120,7 @@
Collections.addAll(vmOptions,
(useXminf ? "-Xminf" + minRatio / 100.0 : "-XX:MinHeapFreeRatio=" + minRatio),
(useXmaxf ? "-Xmaxf" + maxRatio / 100.0 : "-XX:MaxHeapFreeRatio=" + maxRatio),
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-version"
);
ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(vmOptions.toArray(new String[vmOptions.size()]));
--- a/hotspot/test/gc/arguments/TestSurvivorRatioFlag.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/gc/arguments/TestSurvivorRatioFlag.java Thu Aug 11 17:02:27 2016 +0000
@@ -74,7 +74,7 @@
Collections.addAll(vmOptions,
"-Xbootclasspath/a:.",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:GCLockerEdenExpansionPercent=0",
--- a/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/gc/arguments/TestTargetSurvivorRatioFlag.java Thu Aug 11 17:02:27 2016 +0000
@@ -132,7 +132,7 @@
LinkedList<String> vmOptions = new LinkedList<>(options);
Collections.addAll(vmOptions,
"-Xbootclasspath/a:.",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
"-XX:+UseAdaptiveSizePolicy",
--- a/hotspot/test/gc/g1/TestShrinkAuxiliaryData.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/gc/g1/TestShrinkAuxiliaryData.java Thu Aug 11 17:02:27 2016 +0000
@@ -53,7 +53,7 @@
"-Xlog:gc=debug",
"-XX:+UnlockDiagnosticVMOptions",
"-XX:+WhiteBoxAPI",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-Xbootclasspath/a:.",
};
--- a/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/BadObjectClass/BootstrapRedefine.java Thu Aug 11 17:02:27 2016 +0000
@@ -48,7 +48,7 @@
"-Xmodule:java.base"),
"mods/java.base");
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base", "-version");
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.base=mods/java.base", "-version");
new OutputAnalyzer(pb.start())
.shouldContain("Incompatible definition of java.lang.Object")
.shouldHaveExitValue(1);
--- a/hotspot/test/runtime/BootClassAppendProp/BootClassPathAppendProp.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/BootClassAppendProp/BootClassPathAppendProp.java Thu Aug 11 17:02:27 2016 +0000
@@ -27,7 +27,7 @@
* @test
* @build BootClassPathAppendProp
* @run main/othervm -Xbootclasspath/a:/usr/lib -showversion -Xbootclasspath/a:/i/dont/exist BootClassPathAppendProp
- * @run main/othervm -Xpatch:/not/here -Xbootclasspath/a:/i/may/exist BootClassPathAppendProp
+ * @run main/othervm --patch-module=no_module=/not/here -Xbootclasspath/a:/i/may/exist BootClassPathAppendProp
* @run main/othervm -Djdk.boot.class.path.append=newdir BootClassPathAppendProp
* @run main/othervm BootClassPathAppendProp
*/
--- a/hotspot/test/runtime/ErrorHandling/CreateCoredumpOnCrash.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/ErrorHandling/CreateCoredumpOnCrash.java Thu Aug 11 17:02:27 2016 +0000
@@ -56,7 +56,7 @@
public static OutputAnalyzer runTest(String option) throws Exception {
return new OutputAnalyzer(
ProcessTools.createJavaProcessBuilder(
- "-Xmx64m", "-XX:-TransmitErrorReport", "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", option, Crasher.class.getName())
+ "-Xmx64m", "-XX:-TransmitErrorReport", "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", option, Crasher.class.getName())
.start());
}
}
--- a/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -48,7 +48,7 @@
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-Xmx64m", "-XX:-TransmitErrorReport", "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", "-XX:-CreateCoredumpOnCrash", Crasher.class.getName());
+ "-Xmx64m", "-XX:-TransmitErrorReport", "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", "-XX:-CreateCoredumpOnCrash", Crasher.class.getName());
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldNotContain("Exception in thread");
output.shouldNotMatch("error occurred during error reporting \\(printing problematic frame\\)");
--- a/hotspot/test/runtime/SharedArchiveFile/BootAppendTests.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/BootAppendTests.java Thu Aug 11 17:02:27 2016 +0000
@@ -160,10 +160,10 @@
// Test #3: If a class on -Xbootclasspath/a is from a package defined in boot modules,
// the class can be loaded from -Xbootclasspath/a when the module is excluded
- // using -limitmods. Verify the behavior is the same at runtime when CDS is
- // enabled.
+ // using --limit-modules. Verify the behavior is the same at runtime when CDS
+ // is enabled.
//
- // The java.desktop module is excluded using -limitmods at runtime,
+ // The java.desktop module is excluded using --limit-modules at runtime,
// javax.sound.sampled.MyClass is archived from -Xbootclasspath/a. It can be
// loaded from the archive at runtime.
public static void testBootAppendExcludedModuleClass() throws Exception {
@@ -174,7 +174,7 @@
"-XX:+TraceClassLoading",
"-cp", appJar,
"-Xbootclasspath/a:" + bootAppendJar,
- "-limitmods", "java.base",
+ "--limit-modules=java.base",
"-Xshare:" + mode,
APP_CLASS,
BOOT_APPEND_MODULE_CLASS_NAME);
@@ -191,8 +191,8 @@
// Test #4: If a class on -Xbootclasspath/a has the same fully qualified
// name as a class defined in boot modules, the class is loaded
// from -Xbootclasspath/a when the boot module is excluded using
- // -limitmods. Verify the behavior is the same at runtime when CDS is
- // enabled.
+ // --limit-modules. Verify the behavior is the same at runtime
+ // when CDS is enabled.
//
// The org.omg.CORBA.Context is a boot module class. The class
// on -Xbootclasspath/a that has the same fully-qualified name
@@ -206,7 +206,7 @@
"-XX:+TraceClassLoading",
"-cp", appJar,
"-Xbootclasspath/a:" + bootAppendJar,
- "-limitmods", "java.base",
+ "--limit-modules=java.base",
"-Xshare:" + mode,
APP_CLASS,
BOOT_APPEND_DUPLICATE_MODULE_CLASS_NAME);
--- a/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTest.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/SASymbolTableTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -89,10 +89,11 @@
long pid = p.getPid();
System.out.println("Attaching agent " + pid);
ProcessBuilder tool = ProcessTools.createJavaProcessBuilder(
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED",
+ "--add-modules=jdk.hotspot.agent",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.memory=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.runtime=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.tools=ALL-UNNAMED",
"SASymbolTableTestAgent",
Long.toString(pid));
OutputAnalyzer output = ProcessTools.executeProcess(tool);
--- a/hotspot/test/runtime/Unsafe/RangeCheck.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/Unsafe/RangeCheck.java Thu Aug 11 17:02:27 2016 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -44,7 +44,7 @@
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
true,
"-Xmx32m",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED",
+ "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
"-XX:-TransmitErrorReport",
"-XX:-CreateCoredumpOnCrash",
"-XX:-InlineUnsafeOps", // The compiler intrinsics doesn't have the assert
--- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -98,7 +98,7 @@
ClassFileInstaller.writeClassToDisk("GetSysPkg_package/GetSysClass", klassbuf);
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:bl_dir",
- "-XaddExports:java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator +
+ "--add-exports=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);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,75 @@
+/*
+ * 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
+ * @bug 8136930
+ * @summary Test that the VM ignores explicitly specified module internal properties.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+// Test that the VM ignores module related properties such as "jdk.module.addmods"
+// and jdk.module.addreads.0" that can only be set using module options.
+public class IgnoreModulePropertiesTest {
+
+ // Test that the specified property and its value are ignored. If the VM accepted
+ // the property and value then an exception would be thrown because the value is
+ // bogus for that property. But, since the property is ignored no exception is
+ // thrown.
+ public static void testProperty(String prop, String value) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-D" + prop + "=" + value, "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("java version ");
+ output.shouldHaveExitValue(0);
+
+ // Ensure that the property and its value aren't available.
+ if (System.getProperty(prop) != null) {
+ throw new RuntimeException(
+ "Unexpected non-null value for property " + prop);
+ }
+ }
+
+ // For options of the form "option=value", check that an exception gets thrown for
+ // the illegal value and then check that its corresponding property is handled
+ // correctly.
+ public static void testOption(String option, String value,
+ String prop, String result) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ option + "=" + value, "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain(result);
+ testProperty(prop, value);
+ }
+
+ public static void main(String[] args) throws Exception {
+ testOption("--add-modules", "java.sqlx", "jdk.module.addmods", "java.lang.module.ResolutionException");
+ testOption("--limit-modules", "java.sqlx", "jdk.module.limitmods", "java.lang.module.ResolutionException");
+ testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "java.lang.RuntimeException");
+ testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0", "java.lang.RuntimeException");
+ testOption("--patch-module", "=d", "jdk.module.patch.0", "IllegalArgumentException");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/ModuleOptionsTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,54 @@
+/*
+ * 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
+ * @bug 8136930
+ * @summary Test that the VM only recognizes the last specified --add-modules
+ * and --list-modules options
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+// Test that the VM behaves correctly when processing module related options.
+public class ModuleOptionsTest {
+
+ public static void main(String[] args) throws Exception {
+
+ // Test that last --add-modules is the only one recognized. No exception
+ // should be thrown.
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "--add-modules=i_dont_exist", "--add-modules=java.base", "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(0);
+
+ // Test that last --limit-modules is the only one recognized. No exception
+ // should be thrown.
+ pb = ProcessTools.createJavaProcessBuilder(
+ "--limit-modules=i_dont_exist", "--limit-modules=java.base", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/ModuleOptionsWarn.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,60 @@
+/*
+ * 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
+ * @bug 8162415
+ * @summary Test warnings for ignored properties.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+// Test that the VM behaves correctly when processing command line module system properties.
+public class ModuleOptionsWarn {
+
+ public static void main(String[] args) throws Exception {
+
+ // Test that a warning is issued for module related properties that get ignored.
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+PrintWarnings", "-Djdk.module.ignored", "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Ignoring system property option");
+ output.shouldHaveExitValue(0);
+
+ // Test that a warning can be suppressed for module related properties that get ignored.
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-Djdk.module.ignored", "-XX:-PrintWarnings", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Ignoring system property option");
+ output.shouldHaveExitValue(0);
+
+ // Test that a warning is not issued for properties of the form "jdk.module.main"
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+PrintWarnings", "-Djdk.module.main.ignored", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldNotContain("Ignoring system property option");
+ output.shouldHaveExitValue(0);
+ }
+}
--- a/hotspot/test/runtime/modules/ModuleStress/ExportModuleStressTest.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleStress/ExportModuleStressTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -62,8 +62,8 @@
compiled = CompilerUtils.compile(
SRC_DIR.resolve("jdk.translet"),
MODS_DIR.resolve("jdk.translet"),
- "-XaddExports:jdk.test/test=jdk.translet",
- "-mp", MODS_DIR.toString());
+ "--add-exports=jdk.test/test=jdk.translet",
+ "-p", MODS_DIR.toString());
if (!compiled) {
throw new RuntimeException("Test failed to compile module jdk.translet");
}
@@ -71,7 +71,7 @@
// Sanity check that the test, jdk.test/test/Main.java
// runs without error.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-mp", MODS_DIR.toString(),
+ "-p", MODS_DIR.toString(),
"-m", "jdk.test/test.Main");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("failed: 0")
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleStressGC.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/modules/ModuleStress/ModuleStressGC.java Thu Aug 11 17:02:27 2016 +0000
@@ -62,8 +62,8 @@
compiled = CompilerUtils.compile(
SRC_DIR.resolve("jdk.translet"),
MODS_DIR.resolve("jdk.translet"),
- "-XaddExports:jdk.test/test=jdk.translet",
- "-mp", MODS_DIR.toString());
+ "--add-exports=jdk.test/test=jdk.translet",
+ "-p", MODS_DIR.toString());
if (!compiled) {
throw new RuntimeException("Test failed to compile module jdk.translet");
}
@@ -74,7 +74,7 @@
// GC safepoints.
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-Xlog:modules=trace",
- "-mp", MODS_DIR.toString(),
+ "-p", MODS_DIR.toString(),
"-m", "jdk.test/test.MainGC");
OutputAnalyzer oa = new OutputAnalyzer(pb.start());
oa.shouldContain("package test defined in module jdk.test, exports list being walked")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/BasicJarBuilder.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+/*
+ * @summary Simple jar builder
+ * Input: jarName className1 className2 ...
+ * do not specify extensions, just the names
+ * E.g. prot_domain ProtDomainA ProtDomainB
+ * Output: A jar containing compiled classes, placed in a test classes folder
+ */
+
+import jdk.test.lib.*;
+
+import java.io.File;
+import java.util.ArrayList;
+import sun.tools.jar.Main;
+
+// Using JarBuilder requires that all to-be-jarred classes should be placed
+// in the current working directory, aka "."
+public class BasicJarBuilder {
+ private static final String classDir = System.getProperty("test.classes");
+
+ public static void build(boolean classesInWorkDir, String jarName,
+ String ...classNames) throws Exception {
+
+ if (classesInWorkDir) {
+ createSimpleJar(".", classDir + File.separator + jarName + ".jar", classNames);
+ } else {
+ build(jarName, classNames);
+ }
+ }
+
+ public static void build(String jarName, String ...classNames) throws Exception {
+ createSimpleJar(classDir, classDir + File.separator + jarName + ".jar",
+ classNames);
+ }
+
+ private static void createSimpleJar(String jarclassDir, String jarName,
+ String[] classNames) throws Exception {
+ ArrayList<String> args = new ArrayList<String>();
+ args.add("cf");
+ args.add(jarName);
+ addClassArgs(args, jarclassDir, classNames);
+ createJar(args);
+ }
+
+ private static void addClassArgs(ArrayList<String> args, String jarclassDir,
+ String[] classNames) {
+
+ for (String name : classNames) {
+ args.add("-C");
+ args.add(jarclassDir);
+ args.add(name + ".class");
+ }
+ }
+
+ private static void createJar(ArrayList<String> args) {
+ Main jarTool = new Main(System.out, System.err, "jar");
+ if (!jarTool.run(args.toArray(new String[1]))) {
+ throw new RuntimeException("jar operation failed");
+ }
+ }
+
+ // Get full path to the test jar
+ public static String getTestJar(String jar) {
+ File dir = new File(System.getProperty("test.classes", "."));
+ File jarFile = new File(dir, jar);
+ if (!jarFile.exists()) {
+ throw new RuntimeException("Cannot find " + jarFile.getPath());
+ }
+ if (!jarFile.isFile()) {
+ throw new RuntimeException("Not a regular file: " + jarFile.getPath());
+ }
+ return jarFile.getPath();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModule2Dirs.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015, 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
+ * @summary Make sure --patch-module works with multiple directories.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ * @compile PatchModule2DirsMain.java
+ * @run main PatchModule2Dirs
+ */
+
+import jdk.test.lib.*;
+import java.io.File;
+
+public class PatchModule2Dirs {
+
+ public static void main(String[] args) throws Exception {
+ String source1 = "package javax.naming.spi; " +
+ "public class NamingManager { " +
+ " static { " +
+ " System.out.println(\"I pass one!\"); " +
+ " } " +
+ "}";
+ String source2 = "package java.beans; " +
+ "public class Encoder { " +
+ " static { " +
+ " System.out.println(\"I pass two!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source1, "-Xmodule:java.naming"),
+ "mods/java.naming");
+
+ ClassFileInstaller.writeClassToDisk("java/beans/Encoder",
+ InMemoryJavaCompiler.compile("java.beans.Encoder", source2, "-Xmodule:java.desktop"),
+ "mods2/java.desktop");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "--patch-module=java.naming=mods/java.naming",
+ "--patch-module=java.desktop=mods2/java.desktop",
+ "PatchModule2DirsMain", "javax.naming.spi.NamingManager", "java.beans.Encoder");
+
+ OutputAnalyzer oa = new OutputAnalyzer(pb.start());
+ oa.shouldContain("I pass one!");
+ oa.shouldContain("I pass two!");
+ oa.shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModule2DirsMain.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// This loads the class affected by the --patch-module option. For the test to pass
+// it must load both classes from the --patch-module directory, not the jimage file.
+public class PatchModule2DirsMain {
+ public static void main(String[] args) throws Exception {
+ Class.forName(args[0]);
+ Class.forName(args[1]);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2015, 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
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * @run main PatchModuleCDS
+ */
+
+import java.io.File;
+import jdk.test.lib.*;
+
+public class PatchModuleCDS {
+
+ public static void main(String args[]) throws Throwable {
+ System.out.println("Test that --patch-module and -Xshare:dump are incompatibable");
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming", "-Xshare:dump");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Cannot use the following option when dumping the shared archive: --patch-module");
+
+ System.out.println("Test that --patch-module and -Xshare:on are incompatibable");
+ String filename = "patch_module.jsa";
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=" + filename,
+ "-Xshare:dump");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("ro space:"); // Make sure archive got created.
+
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=" + filename,
+ "-Xshare:on",
+ "--patch-module=java.naming=mods/java.naming",
+ "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("The shared archive file cannot be used with --patch-module");
+
+ output.shouldHaveExitValue(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleDupJavaBase.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,46 @@
+/*
+ * 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
+ * @summary VM exit initialization results if java.base is specificed more than once to --patch-module.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+public class PatchModuleDupJavaBase {
+ // The VM should exit initialization if java.base is specified
+ // more than once to --patch-module.
+ public static void main(String args[]) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "--patch-module=java.base=javabase_dir",
+ "--patch-module=java.base=javabase_dir",
+ "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Cannot specify java.base more than once to --patch-module");
+ output.shouldHaveExitValue(1);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleDupModule.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,47 @@
+/*
+ * 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
+ * @summary Module system initialization exception results if a module is specificed twice to --patch-module.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ */
+
+import jdk.test.lib.*;
+
+public class PatchModuleDupModule {
+
+ // The module system initialization should generate an ExceptionInInitializerError
+ // if --patch-module is specified with the same module more than once.
+
+ public static void main(String args[]) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "--patch-module=module1=module1_dir",
+ "--patch-module=module1=module1_dir",
+ "-version");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("java.lang.ExceptionInInitializerError");
+ output.shouldHaveExitValue(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleJavaBase.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,57 @@
+/*
+ * 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
+ * @bug 8130399
+ * @summary Make sure --patch-module works for java.base.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ * @compile PatchModuleMain.java
+ * @run main PatchModuleJavaBase
+ */
+
+import jdk.test.lib.*;
+
+public class PatchModuleJavaBase {
+
+ public static void main(String[] args) throws Exception {
+ String source = "package java.lang; " +
+ "public class NewClass { " +
+ " static { " +
+ " System.out.println(\"I pass!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("java/lang/NewClass",
+ InMemoryJavaCompiler.compile("java.lang.NewClass", source, "-Xmodule:java.base"),
+ "mods/java.base");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.base=mods/java.base",
+ "PatchModuleMain", "java.lang.NewClass");
+
+ new OutputAnalyzer(pb.start())
+ .shouldContain("I pass!")
+ .shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleMain.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+// This loads the class affected by the --patch-module option. For the test to pass
+// it must load the class from the --patch-module directory, not the jimage file.
+public class PatchModuleMain {
+ public static void main(String[] args) throws Exception {
+ Class.forName(args[0]);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2015, 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
+ * @bug 8130399
+ * @summary Make sure --patch-module works for modules besides java.base.
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ * @compile PatchModuleMain.java
+ * @run main PatchModuleTest
+ */
+
+import jdk.test.lib.*;
+
+public class PatchModuleTest {
+
+ public static void main(String[] args) throws Exception {
+ String source = "package javax.naming.spi; " +
+ "public class NamingManager { " +
+ " static { " +
+ " System.out.println(\"I pass!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+ "mods/java.naming");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming",
+ "PatchModuleMain", "javax.naming.spi.NamingManager");
+
+ new OutputAnalyzer(pb.start())
+ .shouldContain("I pass!")
+ .shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJar.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,83 @@
+/*
+ * 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
+ * @summary Make sure --patch-module works when a jar file is specified for a module
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * jdk.jartool/sun.tools.jar
+ * @build BasicJarBuilder
+ * @compile PatchModuleMain.java
+ * @run main PatchModuleTestJar
+ */
+
+import jdk.test.lib.*;
+
+public class PatchModuleTestJar {
+ private static String moduleJar;
+
+ public static void main(String[] args) throws Exception {
+
+ // Create a class file in the module java.naming. This class file
+ // will be put in the javanaming.jar file.
+ String source = "package javax.naming.spi; " +
+ "public class NamingManager { " +
+ " static { " +
+ " System.out.println(\"I pass!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+ System.getProperty("test.classes"));
+
+ // Build the jar file that will be used for the module "java.naming".
+ BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager");
+ moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
+
+ // Just to make sure we are not fooled by the class file being on the
+ // class path where all the test classes are stored, write the NamingManager.class
+ // file out again with output that does not contain what OutputAnalyzer
+ // expects. This will provide confidence that the contents of the class
+ // is truly coming from the jar file and not the class file.
+ source = "package javax.naming.spi; " +
+ "public class NamingManager { " +
+ " static { " +
+ " System.out.println(\"Fail!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+ System.getProperty("test.classes"));
+
+ // Supply --patch-module with the name of the jar file for the module java.naming.
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=" + moduleJar,
+ "PatchModuleMain", "javax.naming.spi.NamingManager");
+
+ new OutputAnalyzer(pb.start())
+ .shouldContain("I pass!")
+ .shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTestJarDir.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,105 @@
+/*
+ * 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
+ * @summary Make sure --patch-module works when a jar file and a directory is specified for a module
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * jdk.jartool/sun.tools.jar
+ * @build BasicJarBuilder
+ * @compile PatchModule2DirsMain.java
+ * @run main PatchModuleTestJarDir
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import jdk.test.lib.*;
+
+public class PatchModuleTestJarDir {
+ private static String moduleJar;
+
+ public static void main(String[] args) throws Exception {
+
+ // Create a class file in the module java.naming. This class file
+ // will be put in the javanaming.jar file.
+ String source = "package javax.naming.spi; " +
+ "public class NamingManager1 { " +
+ " static { " +
+ " System.out.println(\"I pass one!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
+ System.getProperty("test.classes"));
+
+ // Build the jar file that will be used for the module "java.naming".
+ BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager1");
+ moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
+
+ // Just to make sure we are not fooled by the class file being on the
+ // class path where all the test classes are stored, write the NamingManager.class
+ // file out again with output that does not contain what OutputAnalyzer
+ // expects. This will provide confidence that the contents of the class
+ // is truly coming from the jar file and not the class file.
+ source = "package javax.naming.spi; " +
+ "public class NamingManager1 { " +
+ " static { " +
+ " System.out.println(\"Fail!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
+ System.getProperty("test.classes"));
+
+ // Create a second class file in the module java.naming. This class file
+ // will be put in the mods/java.naming directory.
+ source = "package javax.naming.spi; " +
+ "public class NamingManager2 { " +
+ " static { " +
+ " System.out.println(\"I pass two!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager2",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager2", source, "-Xmodule:java.naming"),
+ (System.getProperty("test.classes") + "/mods/java.naming"));
+
+
+ // Supply --patch-module with the name of the jar file for the module java.naming.
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=" +
+ moduleJar +
+ File.pathSeparator +
+ System.getProperty("test.classes") + "/mods/java.naming",
+ "PatchModule2DirsMain",
+ "javax.naming.spi.NamingManager1",
+ "javax.naming.spi.NamingManager2");
+
+ new OutputAnalyzer(pb.start())
+ .shouldContain("I pass one!")
+ .shouldContain("I pass two!")
+ .shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleTraceCL.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,83 @@
+/*
+ * 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
+ * @bug 8069469
+ * @summary Make sure -Xlog:classload=info works properly with "modules" jimage,
+ --patch-module, and with -Xbootclasspath/a
+ * @modules java.base/jdk.internal.misc
+ * @library /testlibrary
+ * @compile PatchModuleMain.java
+ * @run main PatchModuleTraceCL
+ */
+
+import java.io.File;
+import jdk.test.lib.*;
+
+public class PatchModuleTraceCL {
+
+ public static void main(String[] args) throws Exception {
+ String source = "package javax.naming.spi; " +
+ "public class NamingManager { " +
+ " static { " +
+ " System.out.println(\"I pass!\"); " +
+ " } " +
+ "}";
+
+ // Test -Xlog:classload=info output for --patch-module
+ ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
+ InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
+ "mods/java.naming");
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("--patch-module=java.naming=mods/java.naming",
+ "-Xlog:class+load=info", "PatchModuleMain", "javax.naming.spi.NamingManager");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ // "modules" jimage case.
+ output.shouldContain("[class,load] java.lang.Thread source: jrt:/java.base");
+ // --patch-module case.
+ output.shouldContain("[class,load] javax.naming.spi.NamingManager source: mods/java.naming");
+ // -cp case.
+ output.shouldContain("[class,load] PatchModuleMain source: file");
+
+ // Test -Xlog:classload=info output for -Xbootclasspath/a
+ source = "package PatchModuleTraceCL_pkg; " +
+ "public class ItIsI { " +
+ " static { " +
+ " System.out.println(\"I also pass!\"); " +
+ " } " +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("PatchModuleTraceCL_pkg/ItIsI",
+ InMemoryJavaCompiler.compile("PatchModuleTraceCL_pkg.ItIsI", source),
+ "xbcp");
+
+ pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:xbcp",
+ "-Xlog:class+load=info", "PatchModuleMain", "PatchModuleTraceCL_pkg.ItIsI");
+ output = new OutputAnalyzer(pb.start());
+ // -Xbootclasspath/a case.
+ output.shouldContain("[class,load] PatchModuleTraceCL_pkg.ItIsI source: xbcp");
+ output.shouldHaveExitValue(0);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/modules/Visibility/PatchModuleVisibility.java Thu Aug 11 17:02:27 2016 +0000
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2015, 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
+ * @summary Ensure that a newly introduced java.base package placed within the --patch-module
+ * directory is considered part of the boot loader's visibility boundary
+ * @requires !(os.family == "windows")
+ * @library /testlibrary
+ * @modules java.base/jdk.internal.misc
+ * java.management
+ * @run main/othervm PatchModuleVisibility
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import jdk.test.lib.*;
+
+public class PatchModuleVisibility {
+
+ public static void main(String[] args) throws Throwable {
+
+ String Vis2_B_src =
+ "package p2;" +
+ "public class Vis2_B {" +
+ " public void m() {" +
+ " System.out.println(\"In B's m()\");" +
+ " }" +
+ "}";
+
+ String Vis2_A_src =
+ "import p2.*;" +
+ "public class Vis2_A {" +
+ " public static void main(String args[]) throws Exception {" +
+ // Try loading a class within a newly introduced java.base
+ // package. Make sure the class can be found via --patch-module.
+ " try {" +
+ " p2.Vis2_B b = new p2.Vis2_B();" +
+ " if (b.getClass().getClassLoader() != null) {" +
+ " throw new RuntimeException(\"PatchModuleVisibility FAILED - class B " +
+ "should be loaded by boot class loader\\n\");" +
+ " }" +
+ " b.m();" +
+ " } catch (Throwable e) {" +
+ " throw new RuntimeException(\"PatchModuleVisibility FAILED - test " +
+ "should not throw an error or exception\\n\");" +
+ " }" +
+ " System.out.println(\"PatchModuleVisibility PASSED\\n\");" +
+ " }" +
+ "}";
+
+ ClassFileInstaller.writeClassToDisk("p2/Vis2_B",
+ InMemoryJavaCompiler.compile("p2.Vis2_B", Vis2_B_src), System.getProperty("test.classes"));
+ ClassFileInstaller.writeClassToDisk("p2/Vis2_B", "mods2/java.base");
+
+ ClassFileInstaller.writeClassToDisk("Vis2_A",
+ InMemoryJavaCompiler.compile("Vis2_A", Vis2_A_src), System.getProperty("test.classes"));
+
+ // Make sure the classes are actually being loaded from mods2
+ Files.delete(Paths.get(System.getProperty("test.classes") + File.separator +
+ "p2" + File.separator + "Vis2_B.class"));
+
+ new OutputAnalyzer(ProcessTools.createJavaProcessBuilder(
+ "--patch-module=java.base=mods2/java.base",
+ "--add-exports=java.base/p2=ALL-UNNAMED",
+ "Vis2_A")
+ .start()).shouldHaveExitValue(0);
+ }
+}
--- a/hotspot/test/runtime/modules/Visibility/XbootcpNoVisibility.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/modules/Visibility/XbootcpNoVisibility.java Thu Aug 11 17:02:27 2016 +0000
@@ -50,7 +50,7 @@
// Try loading a class within a named package in a module which has been defined
// to the boot loader. In this situation, the class should only be attempted
// to be loaded from the boot loader's module path which consists of:
- // [-Xpatch]; exploded build | "modules" jimage
+ // [--patch-module]; exploded build | "modules" jimage
//
// Since the class is located on the boot loader's append path via
// -Xbootclasspath/a specification, it should not be found.
--- a/hotspot/test/runtime/modules/Visibility/XpatchVisibility.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2015, 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
- * @summary Ensure that a newly introduced java.base package placed within the -Xpatch directory
- * is considered part of the boot loader's visibility boundary
- * @requires !(os.family == "windows")
- * @library /testlibrary
- * @modules java.base/jdk.internal.misc
- * java.management
- * @run main/othervm XpatchVisibility
- */
-
-import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import jdk.test.lib.*;
-
-public class XpatchVisibility {
-
- public static void main(String[] args) throws Throwable {
-
- String Vis2_B_src =
- "package p2;" +
- "public class Vis2_B {" +
- " public void m() {" +
- " System.out.println(\"In B's m()\");" +
- " }" +
- "}";
-
- String Vis2_A_src =
- "import p2.*;" +
- "public class Vis2_A {" +
- " public static void main(String args[]) throws Exception {" +
- // Try loading a class within a newly introduced java.base
- // package. Make sure the class can be found via -Xpatch.
- " try {" +
- " p2.Vis2_B b = new p2.Vis2_B();" +
- " if (b.getClass().getClassLoader() != null) {" +
- " throw new RuntimeException(\"XpatchVisibility FAILED - class B " +
- "should be loaded by boot class loader\\n\");" +
- " }" +
- " b.m();" +
- " } catch (Throwable e) {" +
- " throw new RuntimeException(\"XpatchVisibility FAILED - test " +
- "should not throw an error or exception\\n\");" +
- " }" +
- " System.out.println(\"XpatchVisibility PASSED\\n\");" +
- " }" +
- "}";
-
- ClassFileInstaller.writeClassToDisk("p2/Vis2_B",
- InMemoryJavaCompiler.compile("p2.Vis2_B", Vis2_B_src), System.getProperty("test.classes"));
- ClassFileInstaller.writeClassToDisk("p2/Vis2_B", "mods2/java.base");
-
- ClassFileInstaller.writeClassToDisk("Vis2_A",
- InMemoryJavaCompiler.compile("Vis2_A", Vis2_A_src), System.getProperty("test.classes"));
-
- // Make sure the classes are actually being loaded from mods2
- Files.delete(Paths.get(System.getProperty("test.classes") + File.separator +
- "p2" + File.separator + "Vis2_B.class"));
-
- new OutputAnalyzer(ProcessTools.createJavaProcessBuilder(
- "-Xpatch:java.base=mods2/java.base",
- "-XaddExports:java.base/p2=ALL-UNNAMED",
- "Vis2_A")
- .start()).shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/BasicJarBuilder.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2015, 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.
- */
-
-/*
- * @summary Simple jar builder
- * Input: jarName className1 className2 ...
- * do not specify extensions, just the names
- * E.g. prot_domain ProtDomainA ProtDomainB
- * Output: A jar containing compiled classes, placed in a test classes folder
- */
-
-import jdk.test.lib.*;
-
-import java.io.File;
-import java.util.ArrayList;
-import sun.tools.jar.Main;
-
-// Using JarBuilder requires that all to-be-jarred classes should be placed
-// in the current working directory, aka "."
-public class BasicJarBuilder {
- private static final String classDir = System.getProperty("test.classes");
-
- public static void build(boolean classesInWorkDir, String jarName,
- String ...classNames) throws Exception {
-
- if (classesInWorkDir) {
- createSimpleJar(".", classDir + File.separator + jarName + ".jar", classNames);
- } else {
- build(jarName, classNames);
- }
- }
-
- public static void build(String jarName, String ...classNames) throws Exception {
- createSimpleJar(classDir, classDir + File.separator + jarName + ".jar",
- classNames);
- }
-
- private static void createSimpleJar(String jarclassDir, String jarName,
- String[] classNames) throws Exception {
- ArrayList<String> args = new ArrayList<String>();
- args.add("cf");
- args.add(jarName);
- addClassArgs(args, jarclassDir, classNames);
- createJar(args);
- }
-
- private static void addClassArgs(ArrayList<String> args, String jarclassDir,
- String[] classNames) {
-
- for (String name : classNames) {
- args.add("-C");
- args.add(jarclassDir);
- args.add(name + ".class");
- }
- }
-
- private static void createJar(ArrayList<String> args) {
- Main jarTool = new Main(System.out, System.err, "jar");
- if (!jarTool.run(args.toArray(new String[1]))) {
- throw new RuntimeException("jar operation failed");
- }
- }
-
- // Get full path to the test jar
- public static String getTestJar(String jar) {
- File dir = new File(System.getProperty("test.classes", "."));
- File jarFile = new File(dir, jar);
- if (!jarFile.exists()) {
- throw new RuntimeException("Cannot find " + jarFile.getPath());
- }
- if (!jarFile.isFile()) {
- throw new RuntimeException("Not a regular file: " + jarFile.getPath());
- }
- return jarFile.getPath();
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/Xpatch2Dirs.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2015, 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
- * @summary Make sure -Xpatch works with multiple directories.
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- * @compile Xpatch2DirsMain.java
- * @run main Xpatch2Dirs
- */
-
-import jdk.test.lib.*;
-import java.io.File;
-
-public class Xpatch2Dirs {
-
- public static void main(String[] args) throws Exception {
- String source1 = "package javax.naming.spi; " +
- "public class NamingManager { " +
- " static { " +
- " System.out.println(\"I pass one!\"); " +
- " } " +
- "}";
- String source2 = "package java.beans; " +
- "public class Encoder { " +
- " static { " +
- " System.out.println(\"I pass two!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source1, "-Xmodule:java.naming"),
- "mods/java.naming");
-
- ClassFileInstaller.writeClassToDisk("java/beans/Encoder",
- InMemoryJavaCompiler.compile("java.beans.Encoder", source2, "-Xmodule:java.desktop"),
- "mods2/java.desktop");
-
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-Xpatch:java.naming=mods/java.naming",
- "-Xpatch:java.desktop=mods2/java.desktop",
- "Xpatch2DirsMain", "javax.naming.spi.NamingManager", "java.beans.Encoder");
-
- OutputAnalyzer oa = new OutputAnalyzer(pb.start());
- oa.shouldContain("I pass one!");
- oa.shouldContain("I pass two!");
- oa.shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/Xpatch2DirsMain.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2015, 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.
- */
-
-// This loads the class affected by the -Xpatch option. For the test to pass
-// it must load both classes from the -Xpatch directory, not the jimage file.
-public class Xpatch2DirsMain {
- public static void main(String[] args) throws Exception {
- Class.forName(args[0]);
- Class.forName(args[1]);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchDupJavaBase.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +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
- * @summary VM exit initialization results if java.base is specificed more than once to Xpatch.
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- */
-
-import jdk.test.lib.*;
-
-public class XpatchDupJavaBase {
- // The VM should exit initialization if java.base is specified
- // more than once to -Xpatch.
- public static void main(String args[]) throws Exception {
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-Xpatch:java.base=javabase_dir",
- "-Xpatch:java.base=javabase_dir",
- "-version");
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
- output.shouldContain("Cannot specify java.base more than once to -Xpatch");
- output.shouldHaveExitValue(1);
- }
-}
-
--- a/hotspot/test/runtime/modules/Xpatch/XpatchDupModule.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +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
- * @summary Module system initialization exception results if a module is specificed twice to Xpatch.
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- */
-
-import jdk.test.lib.*;
-
-public class XpatchDupModule {
-
- // The module system initialization should generate an ExceptionInInitializerError
- // if -Xpatch is specified with the same module more than once.
-
- public static void main(String args[]) throws Exception {
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-Xpatch:module1=module1_dir",
- "-Xpatch:module1=module1_dir",
- "-version");
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
- output.shouldContain("java.lang.ExceptionInInitializerError");
- output.shouldHaveExitValue(1);
- }
-}
-
--- a/hotspot/test/runtime/modules/Xpatch/XpatchJavaBase.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +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
- * @bug 8130399
- * @summary Make sure -Xpatch works for java.base.
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- * @compile XpatchMain.java
- * @run main XpatchJavaBase
- */
-
-import jdk.test.lib.*;
-
-public class XpatchJavaBase {
-
- public static void main(String[] args) throws Exception {
- String source = "package java.lang; " +
- "public class NewClass { " +
- " static { " +
- " System.out.println(\"I pass!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("java/lang/NewClass",
- InMemoryJavaCompiler.compile("java.lang.NewClass", source, "-Xmodule:java.base"),
- "mods/java.base");
-
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.base=mods/java.base",
- "XpatchMain", "java.lang.NewClass");
-
- new OutputAnalyzer(pb.start())
- .shouldContain("I pass!")
- .shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchMain.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2015, 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.
- */
-
-// This loads the class affected by the -Xpatch option. For the test to pass
-// it must load the class from the -Xpatch directory, not the jimage file.
-public class XpatchMain {
- public static void main(String[] args) throws Exception {
- Class.forName(args[0]);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTest.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2015, 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
- * @bug 8130399
- * @summary Make sure -Xpatch works for modules besides java.base.
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- * @compile XpatchMain.java
- * @run main XpatchTest
- */
-
-import jdk.test.lib.*;
-
-public class XpatchTest {
-
- public static void main(String[] args) throws Exception {
- String source = "package javax.naming.spi; " +
- "public class NamingManager { " +
- " static { " +
- " System.out.println(\"I pass!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
- "mods/java.naming");
-
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
- "XpatchMain", "javax.naming.spi.NamingManager");
-
- new OutputAnalyzer(pb.start())
- .shouldContain("I pass!")
- .shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTestJar.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +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
- * @summary Make sure -Xpatch works when a jar file is specified for a module
- * @library /testlibrary
- * @modules java.base/jdk.internal.misc
- * jdk.jartool/sun.tools.jar
- * @build BasicJarBuilder
- * @compile XpatchMain.java
- * @run main XpatchTestJar
- */
-
-import jdk.test.lib.*;
-
-public class XpatchTestJar {
- private static String moduleJar;
-
- public static void main(String[] args) throws Exception {
-
- // Create a class file in the module java.naming. This class file
- // will be put in the javanaming.jar file.
- String source = "package javax.naming.spi; " +
- "public class NamingManager { " +
- " static { " +
- " System.out.println(\"I pass!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
- System.getProperty("test.classes"));
-
- // Build the jar file that will be used for the module "java.naming".
- BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager");
- moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
-
- // Just to make sure we are not fooled by the class file being on the
- // class path where all the test classes are stored, write the NamingManager.class
- // file out again with output that does not contain what OutputAnalyzer
- // expects. This will provide confidence that the contents of the class
- // is truly coming from the jar file and not the class file.
- source = "package javax.naming.spi; " +
- "public class NamingManager { " +
- " static { " +
- " System.out.println(\"Fail!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
- System.getProperty("test.classes"));
-
- // Supply -Xpatch with the name of the jar file for the module java.naming.
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" + moduleJar,
- "XpatchMain", "javax.naming.spi.NamingManager");
-
- new OutputAnalyzer(pb.start())
- .shouldContain("I pass!")
- .shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTestJarDir.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +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
- * @summary Make sure -Xpatch works when a jar file and a directory is specified for a module
- * @library /testlibrary
- * @modules java.base/jdk.internal.misc
- * jdk.jartool/sun.tools.jar
- * @build BasicJarBuilder
- * @compile Xpatch2DirsMain.java
- * @run main XpatchTestJarDir
- */
-
-import java.io.File;
-import java.nio.file.Files;
-import jdk.test.lib.*;
-
-public class XpatchTestJarDir {
- private static String moduleJar;
-
- public static void main(String[] args) throws Exception {
-
- // Create a class file in the module java.naming. This class file
- // will be put in the javanaming.jar file.
- String source = "package javax.naming.spi; " +
- "public class NamingManager1 { " +
- " static { " +
- " System.out.println(\"I pass one!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
- System.getProperty("test.classes"));
-
- // Build the jar file that will be used for the module "java.naming".
- BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager1");
- moduleJar = BasicJarBuilder.getTestJar("javanaming.jar");
-
- // Just to make sure we are not fooled by the class file being on the
- // class path where all the test classes are stored, write the NamingManager.class
- // file out again with output that does not contain what OutputAnalyzer
- // expects. This will provide confidence that the contents of the class
- // is truly coming from the jar file and not the class file.
- source = "package javax.naming.spi; " +
- "public class NamingManager1 { " +
- " static { " +
- " System.out.println(\"Fail!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager1",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager1", source, "-Xmodule:java.naming"),
- System.getProperty("test.classes"));
-
- // Create a second class file in the module java.naming. This class file
- // will be put in the mods/java.naming directory.
- source = "package javax.naming.spi; " +
- "public class NamingManager2 { " +
- " static { " +
- " System.out.println(\"I pass two!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager2",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager2", source, "-Xmodule:java.naming"),
- (System.getProperty("test.classes") + "/mods/java.naming"));
-
-
- // Supply -Xpatch with the name of the jar file for the module java.naming.
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=" +
- moduleJar +
- File.pathSeparator +
- System.getProperty("test.classes") + "/mods/java.naming",
- "Xpatch2DirsMain",
- "javax.naming.spi.NamingManager1",
- "javax.naming.spi.NamingManager2");
-
- new OutputAnalyzer(pb.start())
- .shouldContain("I pass one!")
- .shouldContain("I pass two!")
- .shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/Xpatch/XpatchTraceCL.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +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
- * @bug 8069469
- * @summary Make sure -Xlog:classload=info works properly with "modules" jimage,
- -Xpatch, and with -Xbootclasspath/a
- * @modules java.base/jdk.internal.misc
- * @library /testlibrary
- * @compile XpatchMain.java
- * @run main XpatchTraceCL
- */
-
-import java.io.File;
-import jdk.test.lib.*;
-
-public class XpatchTraceCL {
-
- public static void main(String[] args) throws Exception {
- String source = "package javax.naming.spi; " +
- "public class NamingManager { " +
- " static { " +
- " System.out.println(\"I pass!\"); " +
- " } " +
- "}";
-
- // Test -Xlog:classload=info output for -Xpatch
- ClassFileInstaller.writeClassToDisk("javax/naming/spi/NamingManager",
- InMemoryJavaCompiler.compile("javax.naming.spi.NamingManager", source, "-Xmodule:java.naming"),
- "mods/java.naming");
-
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming",
- "-Xlog:class+load=info", "XpatchMain", "javax.naming.spi.NamingManager");
-
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
- // "modules" jimage case.
- output.shouldContain("[class,load] java.lang.Thread source: jrt:/java.base");
- // -Xpatch case.
- output.shouldContain("[class,load] javax.naming.spi.NamingManager source: mods/java.naming");
- // -cp case.
- output.shouldContain("[class,load] XpatchMain source: file");
-
- // Test -Xlog:classload=info output for -Xbootclasspath/a
- source = "package XpatchTraceCL_pkg; " +
- "public class ItIsI { " +
- " static { " +
- " System.out.println(\"I also pass!\"); " +
- " } " +
- "}";
-
- ClassFileInstaller.writeClassToDisk("XpatchTraceCL_pkg/ItIsI",
- InMemoryJavaCompiler.compile("XpatchTraceCL_pkg.ItIsI", source),
- "xbcp");
-
- pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:xbcp",
- "-Xlog:class+load=info", "XpatchMain", "XpatchTraceCL_pkg.ItIsI");
- output = new OutputAnalyzer(pb.start());
- // -Xbootclasspath/a case.
- output.shouldContain("[class,load] XpatchTraceCL_pkg.ItIsI source: xbcp");
- output.shouldHaveExitValue(0);
- }
-}
--- a/hotspot/test/runtime/modules/XpatchCDS.java Thu Aug 11 15:47:07 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2015, 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
- * @library /testlibrary
- * @modules java.base/jdk.internal.misc
- * @run main XpatchCDS
- */
-
-import java.io.File;
-import jdk.test.lib.*;
-
-public class XpatchCDS {
-
- public static void main(String args[]) throws Throwable {
- System.out.println("Test that -Xpatch and -Xshare:dump are incompatibable");
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xpatch:java.naming=mods/java.naming", "-Xshare:dump");
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
- output.shouldContain("Cannot use the following option when dumping the shared archive: -Xpatch");
-
- System.out.println("Test that -Xpatch and -Xshare:on are incompatibable");
- String filename = "Xpatch.jsa";
- pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UnlockDiagnosticVMOptions",
- "-XX:SharedArchiveFile=" + filename,
- "-Xshare:dump");
- output = new OutputAnalyzer(pb.start());
- output.shouldContain("ro space:"); // Make sure archive got created.
-
- pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UnlockDiagnosticVMOptions",
- "-XX:SharedArchiveFile=" + filename,
- "-Xshare:on",
- "-Xpatch:java.naming=mods/java.naming",
- "-version");
- output = new OutputAnalyzer(pb.start());
- output.shouldContain("The shared archive file cannot be used with -Xpatch");
-
- output.shouldHaveExitValue(1);
- }
-}
--- a/hotspot/test/runtime/modules/java.base/java/lang/reflect/ModuleHelper.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/runtime/modules/java.base/java/lang/reflect/ModuleHelper.java Thu Aug 11 17:02:27 2016 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -27,7 +27,7 @@
/**
* A helper class intended to be injected into java.lang.reflect using the
- * java -Xpatch option. The helper class provides access to package private
+ * java --patch-module option. The helper class provides access to package private
* methods in java.lang.reflect.Module.
*/
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Thu Aug 11 17:02:27 2016 +0000
@@ -113,9 +113,10 @@
};
String[] toolArgs = {
"-XX:+UnlockDiagnosticVMOptions",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
+ "--add-modules=jdk.hotspot.agent",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"TestInstanceKlassSize",
Long.toString(app.getPid())
};
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Thu Aug 11 17:02:27 2016 +0000
@@ -107,9 +107,10 @@
// Grab the pid from the current java process and pass it
String[] toolArgs = {
"-XX:+UnlockDiagnosticVMOptions",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
- "-XaddExports:jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
+ "--add-modules=jdk.hotspot.agent",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED",
+ "--add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED",
"TestInstanceKlassSizeForInterface",
Long.toString(ProcessTools.getProcessId())
};
--- a/hotspot/test/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java Thu Aug 11 17:02:27 2016 +0000
@@ -87,7 +87,7 @@
String expectedFormat) throws Exception, IOException,
InterruptedException, FileNotFoundException {
ProcessBuilder procBuilder = ProcessTools.createJavaProcessBuilder(
- "-XaddExports:java.management/sun.management=ALL-UNNAMED", vmArgs, "JMapHProfLargeHeapProc", String.valueOf(heapSize));
+ "--add-exports=java.management/sun.management=ALL-UNNAMED", vmArgs, "JMapHProfLargeHeapProc", String.valueOf(heapSize));
procBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
Process largeHeapProc = procBuilder.start();
--- a/hotspot/test/testlibrary/ctw/Makefile Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/testlibrary/ctw/Makefile Thu Aug 11 17:02:27 2016 +0000
@@ -58,10 +58,10 @@
ctw.jar: filelist wb.jar
@mkdir -p $(OUTPUT_DIR)
- $(JAVAC) -XaddExports:java.base/jdk.internal.jimage=ALL-UNNAMED \
- -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED \
- -XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED \
- -sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp wb.jar @filelist
+ $(JAVAC) --add-exports java.base/jdk.internal.jimage=ALL-UNNAMED \
+ --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
+ --add-exports java.base/jdk.internal.reflect=ALL-UNNAMED \
+ -sourcepath $(SRC_DIR) -d $(OUTPUT_DIR) -cp wb.jar @filelist
$(JAR) --create --file=$@ --main-class $(MAIN_CLASS) -C $(OUTPUT_DIR) .
wb.jar: wb_filelist
--- a/hotspot/test/testlibrary/jittester/Makefile Thu Aug 11 15:47:07 2016 +0000
+++ b/hotspot/test/testlibrary/jittester/Makefile Thu Aug 11 17:02:27 2016 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2015, 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
@@ -95,10 +95,10 @@
@echo 'Main-Class: jdk.test.lib.jittester.Automatic' >> $(MANIFEST)
compile_testlib: INIT
- $(JAVAC) -XDignore.symbol.file -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint $(TESTLIBRARY_SRC_FILES) -d $(CLASSES_DIR)
+ $(JAVAC) -XDignore.symbol.file --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint $(TESTLIBRARY_SRC_FILES) -d $(CLASSES_DIR)
COMPILE: INIT filelist compile_testlib
- $(JAVAC) -cp $(CLASSES_DIR) -XDignore.symbol.file -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint -sourcepath $(SRC_DIR) -d $(CLASSES_DIR) @filelist
+ $(JAVAC) -cp $(CLASSES_DIR) -XDignore.symbol.file --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -Xlint -sourcepath $(SRC_DIR) -d $(CLASSES_DIR) @filelist
filelist: $(SRC_FILES)
@rm -f $@
@@ -109,7 +109,7 @@
$(shell if [ ! -d $(CLASSES_DIR) ]; then mkdir -p $(CLASSES_DIR); fi)
install: clean_testbase testgroup testroot copytestlibrary JAR cleantmp
- $(JAVA) -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -ea -jar $(DIST_JAR) $(APPLICATION_ARGS)
+ $(JAVA) --add-exports=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED -ea -jar $(DIST_JAR) $(APPLICATION_ARGS)
clean_testbase:
@rm -rf $(TESTBASE_DIR)