< prev index next >

src/jdk.hotspot.agent/macosx/native/libsaproc/MacosxDebuggerLocal.m

Print this page
rev 54099 : 8257988: Remove JNF dependency from libsaproc/MacosxDebuggerLocal.m
Reviewed-by: yan

*** 22,33 **** * */ #include <objc/objc-runtime.h> #import <Foundation/Foundation.h> - #import <JavaNativeFoundation/JavaNativeFoundation.h> - #import <JavaRuntimeSupport/JavaRuntimeSupport.h> #include <jni.h> #import <mach/mach.h> #import <mach/mach_types.h> --- 22,31 ----
*** 258,267 **** --- 256,298 ---- } (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr); return addr; } + /* Create a pool and initiate a try block to catch any exception */ + #define JNI_COCOA_ENTER(env) \ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; \ + @try { + + /* Don't allow NSExceptions to escape to Java. + * If there is a Java exception that has been thrown that should escape. + * And ensure we drain the auto-release pool. + */ + #define JNI_COCOA_EXIT(env) \ + } \ + @catch (NSException *e) { \ + NSLog(@"%@", [e callStackSymbols]); \ + } \ + @finally { \ + [pool drain]; \ + }; + + static NSString* JavaStringToNSString(JNIEnv *env, jstring jstr) { + + if (jstr == NULL) { + return NULL; + } + jsize len = (*env)->GetStringLength(env, jstr); + const jchar *chars = (*env)->GetStringChars(env, jstr, NULL); + if (chars == NULL) { + return NULL; + } + NSString *result = [NSString stringWithCharacters:(UniChar *)chars length:len]; + (*env)->ReleaseStringChars(env, jstr, chars); + return result; + } + /* * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal * Method: lookupByName0 * Signature: (Ljava/lang/String;Ljava/lang/String;)J */
*** 275,297 **** return lookupByNameIncore(env, ph, this_obj, objectName, symbolName); } jlong address = 0; ! JNF_COCOA_ENTER(env); ! NSString *symbolNameString = JNFJavaToNSString(env, symbolName); print_debug("lookupInProcess called for %s\n", [symbolNameString UTF8String]); id symbolicator = getSymbolicator(env, this_obj); if (symbolicator != nil) { uint64_t (*dynamicCall)(id, SEL, NSString *) = (uint64_t (*)(id, SEL, NSString *))&objc_msgSend; address = (jlong) dynamicCall(symbolicator, @selector(addressForSymbol:), symbolNameString); } print_debug("address of symbol %s = %llx\n", [symbolNameString UTF8String], address); ! JNF_COCOA_EXIT(env); return address; } /* --- 306,329 ---- return lookupByNameIncore(env, ph, this_obj, objectName, symbolName); } jlong address = 0; ! JNI_COCOA_ENTER(env); ! ! NSString *symbolNameString = JavaStringToNSString(env, symbolName); print_debug("lookupInProcess called for %s\n", [symbolNameString UTF8String]); id symbolicator = getSymbolicator(env, this_obj); if (symbolicator != nil) { uint64_t (*dynamicCall)(id, SEL, NSString *) = (uint64_t (*)(id, SEL, NSString *))&objc_msgSend; address = (jlong) dynamicCall(symbolicator, @selector(addressForSymbol:), symbolNameString); } print_debug("address of symbol %s = %llx\n", [symbolNameString UTF8String], address); ! JNI_COCOA_EXIT(env); return address; } /*
*** 803,813 **** Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I( JNIEnv *env, jobject this_obj, jint jpid) { print_debug("attach0 called for jpid=%d\n", (int)jpid); ! JNF_COCOA_ENTER(env); kern_return_t result; task_t gTask = 0; result = task_for_pid(mach_task_self(), jpid, &gTask); --- 835,845 ---- Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I( JNIEnv *env, jobject this_obj, jint jpid) { print_debug("attach0 called for jpid=%d\n", (int)jpid); ! JNI_COCOA_ENTER(env); kern_return_t result; task_t gTask = 0; result = task_for_pid(mach_task_self(), jpid, &gTask);
*** 917,927 **** mach_port_deallocate(mach_task_self(), gTask); mach_port_deallocate(mach_task_self(), tgt_exception_port); THROW_NEW_DEBUGGER_EXCEPTION("Can't attach symbolicator to the process"); } ! JNF_COCOA_EXIT(env); } /** For core file, called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 */ static void fillLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) { --- 949,959 ---- mach_port_deallocate(mach_task_self(), gTask); mach_port_deallocate(mach_task_self(), tgt_exception_port); THROW_NEW_DEBUGGER_EXCEPTION("Can't attach symbolicator to the process"); } ! JNI_COCOA_EXIT(env); } /** For core file, called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 */ static void fillLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
*** 1011,1021 **** struct ps_prochandle* ph = get_proc_handle(env, this_obj); if (ph != NULL && ph->core != NULL) { Prelease(ph); return; } ! JNF_COCOA_ENTER(env); task_t gTask = getTask(env, this_obj); kern_return_t k_res = 0; // Restore the pre-saved original exception ports registered with the target process --- 1043,1054 ---- struct ps_prochandle* ph = get_proc_handle(env, this_obj); if (ph != NULL && ph->core != NULL) { Prelease(ph); return; } ! ! JNI_COCOA_ENTER(env); task_t gTask = getTask(env, this_obj); kern_return_t k_res = 0; // Restore the pre-saved original exception ports registered with the target process
*** 1062,1068 **** detach_cleanup(gTask, env, this_obj, true); } detach_cleanup(gTask, env, this_obj, false); ! JNF_COCOA_EXIT(env); } --- 1095,1101 ---- detach_cleanup(gTask, env, this_obj, true); } detach_cleanup(gTask, env, this_obj, false); ! JNI_COCOA_EXIT(env); }
< prev index next >