--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Fri Jul 08 12:17:10 2016 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Sat Jul 09 19:20:38 2016 -0700
@@ -24,6 +24,7 @@
#include "precompiled.hpp"
#include "classfile/classLoaderExt.hpp"
+#include "classfile/modules.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
#include "interpreter/bytecodeStream.hpp"
@@ -201,6 +202,28 @@
} /* end GetAllModules */
+// class_loader - NULL is a valid value, must be pre-checked
+// package_name - pre-checked for NULL
+// module_ptr - pre-checked for NULL
+jvmtiError
+JvmtiEnv::GetNamedModule(jobject class_loader, const char* package_name, jobject* module_ptr) {
+ JavaThread* THREAD = JavaThread::current(); // pass to macros
+ ResourceMark rm(THREAD);
+
+ Handle h_loader (THREAD, JNIHandles::resolve(class_loader));
+ // Check that loader is a subclass of java.lang.ClassLoader.
+ if (h_loader.not_null() && !java_lang_ClassLoader::is_subclass(h_loader->klass())) {
+ return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ }
+ jobject module = Modules::get_named_module(h_loader, package_name, THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL; // unexpected exception
+ }
+ *module_ptr = module;
+ return JVMTI_ERROR_NONE;
+} /* end GetNamedModule */
+
//
// Class functions
//