8034034: [parfait] JNI exc. pending in hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m

Thu, 20 Mar 2014 14:25:22 -0700

author
ccheung
date
Thu, 20 Mar 2014 14:25:22 -0700
changeset 6437
f2294a37e723
parent 6436
8c6165f9ea8e
child 6438
6b207d038106

8034034: [parfait] JNI exc. pending in hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m
Summary: added JNI exception check in the appropriate places
Reviewed-by: sla, zgu

agent/src/os/bsd/MacosxDebuggerLocal.m file | annotate | diff | comparison | revisions
     1.1 --- a/agent/src/os/bsd/MacosxDebuggerLocal.m	Tue Mar 25 19:48:50 2014 -0700
     1.2 +++ b/agent/src/os/bsd/MacosxDebuggerLocal.m	Thu Mar 20 14:25:22 2014 -0700
     1.3 @@ -95,7 +95,9 @@
     1.4  #define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; } 
     1.5  
     1.6  static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
     1.7 -  (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
     1.8 +  jclass exceptionClass = (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException");
     1.9 +  CHECK_EXCEPTION;
    1.10 +  (*env)->ThrowNew(env, exceptionClass, errMsg);
    1.11  }
    1.12  
    1.13  static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
    1.14 @@ -129,6 +131,7 @@
    1.15  JNIEXPORT void JNICALL 
    1.16  Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) {
    1.17    symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J");
    1.18 +  CHECK_EXCEPTION;
    1.19    taskID = (*env)->GetFieldID(env, cls, "task", "J");
    1.20    CHECK_EXCEPTION;
    1.21  
    1.22 @@ -236,13 +239,16 @@
    1.23    (JNIEnv *env, jobject this_obj, jlong addr) {
    1.24    uintptr_t offset;
    1.25    const char* sym = NULL;
    1.26 +  jstring sym_string;
    1.27  
    1.28    struct ps_prochandle* ph = get_proc_handle(env, this_obj);
    1.29    if (ph != NULL && ph->core != NULL) {
    1.30      sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
    1.31      if (sym == NULL) return 0;
    1.32 +    sym_string = (*env)->NewStringUTF(env, sym);
    1.33 +    CHECK_EXCEPTION_(0);
    1.34      return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
    1.35 -                          (*env)->NewStringUTF(env, sym), (jlong)offset);
    1.36 +                                                sym_string, (jlong)offset);
    1.37    }
    1.38    return 0;
    1.39  }
    1.40 @@ -749,11 +755,14 @@
    1.41       const char* name;
    1.42       jobject loadObject;
    1.43       jobject loadObjectList;
    1.44 +     jstring nameString;
    1.45  
    1.46       base = get_lib_base(ph, i);
    1.47       name = get_lib_name(ph, i);
    1.48 +     nameString = (*env)->NewStringUTF(env, name);
    1.49 +     CHECK_EXCEPTION;
    1.50       loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
    1.51 -                                   (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
    1.52 +                                            nameString, (jlong)0, (jlong)base);
    1.53       CHECK_EXCEPTION;
    1.54       loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
    1.55       CHECK_EXCEPTION;

mercurial