--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Wed Nov 23 16:16:34 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Thu Dec 01 08:56:41 2016 +0000
@@ -434,6 +434,165 @@
}
}
+jvmtiError
+JvmtiExport::add_module_reads(Handle module, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+
+ // Invoke the addReads method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addReads_name(),
+ vmSymbols::addReads_signature(),
+ module,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+ assert(!pkg_name.is_null(), "pkg_name should always be set");
+
+ // Invoke the addExports method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addExports_name(),
+ vmSymbols::addExports_signature(),
+ module,
+ pkg_name,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
+ return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ }
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!to_module.is_null(), "to_module should always be set");
+ assert(!pkg_name.is_null(), "pkg_name should always be set");
+
+ // Invoke the addOpens method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addOpens_name(),
+ vmSymbols::addExports_signature(),
+ module,
+ pkg_name,
+ to_module,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) {
+ return JVMTI_ERROR_ILLEGAL_ARGUMENT;
+ }
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_uses(Handle module, Handle service, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!service.is_null(), "service should always be set");
+
+ // Invoke the addUses method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addUses_name(),
+ vmSymbols::addUses_signature(),
+ module,
+ service,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
+jvmtiError
+JvmtiExport::add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS) {
+ if (!Universe::is_module_initialized()) {
+ return JVMTI_ERROR_NONE; // extra safety
+ }
+ assert(!module.is_null(), "module should always be set");
+ assert(!service.is_null(), "service should always be set");
+ assert(!impl_class.is_null(), "impl_class should always be set");
+
+ // Invoke the addProvides method
+ JavaValue result(T_VOID);
+ JavaCalls::call_static(&result,
+ SystemDictionary::module_Modules_klass(),
+ vmSymbols::addProvides_name(),
+ vmSymbols::addProvides_signature(),
+ module,
+ service,
+ impl_class,
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ LogTarget(Trace, jvmti) log;
+ LogStreamCHeap log_stream(log);
+ java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream);
+ log_stream.cr();
+ CLEAR_PENDING_EXCEPTION;
+ return JVMTI_ERROR_INTERNAL;
+ }
+ return JVMTI_ERROR_NONE;
+}
+
void
JvmtiExport::decode_version_values(jint version, int * major, int * minor,
int * micro) {