You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by gs...@apache.org on 2007/04/10 20:03:30 UTC

svn commit: r527227 - in /harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti: jvmti_pop_frame.cpp jvmti_stack.cpp

Author: gshimansky
Date: Tue Apr 10 11:03:29 2007
New Revision: 527227

URL: http://svn.apache.org/viewvc?view=rev&rev=527227
Log:
Applied HARMONY-2749 [drlvm][jvmti] PopFrame does not contain check of JVMTI_ERROR_NO_MORE_FRAMES (31)


Modified:
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp?view=diff&rev=527227&r1=527226&r2=527227
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_pop_frame.cpp Tue Apr 10 11:03:29 2007
@@ -255,11 +255,7 @@
     // create stack iterator from native
     StackIterator* si = si_create_from_native();
     si_transfer_all_preserved_registers(si);
-    TRACE(("PopFrame prepare for method %s.%s%s, IP: %p",
-        class_get_name(method_get_class(si_get_code_chunk_info(si)->get_method())),
-        method_get_name(si_get_code_chunk_info(si)->get_method()),
-        method_get_descriptor(si_get_code_chunk_info(si)->get_method()),
-        si_get_ip(si) ));
+    TRACE(("PopFrame prepare for method IP: %p", si_get_ip(si) ));
 
     // prepare pop frame - find regs values
     uint32 buf = 0;

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp?view=diff&rev=527227&r1=527226&r2=527227
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jvmti/jvmti_stack.cpp Tue Apr 10 11:03:29 2007
@@ -72,10 +72,12 @@
             Class *clss = method_get_class(method);
             assert(clss);
 
-            if (strcmp(method_get_name(method), "runImpl") == 0 &&
-                strcmp(class_get_name(clss), "java/lang/VMStart$MainThread") == 0)
-            {
-                skip = 3;
+            if (!strcmp(method_get_name(method), "runImpl")) {
+                if(!strcmp(class_get_name(clss), "java/lang/VMStart$MainThread")) {
+                    skip = 3;
+                } else if(!strcmp(class_get_name(clss), "java/lang/Thread")) {
+                    skip = 1;
+                }
             }
         }
 
@@ -583,36 +585,54 @@
     CHECK_EVERYTHING();
     CHECK_CAPABILITY(can_pop_frame);
 
-    if (thread == 0) {
-        return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
+    if (NULL == thread) {
+        return JVMTI_ERROR_INVALID_THREAD;
     }
 
-    if (NULL == thread)
-        return JVMTI_ERROR_INVALID_THREAD;
+    JNIEnv *jni_env = p_TLS_vmthread->jni_env;
 
-    // check error condition: JVMTI_ERROR_INVALID_THREAD
-    err = env->GetThreadState(thread, &state);
+    jthread curr_thread = getCurrentThread();
+    if (jni_env->IsSameObject(thread,curr_thread) ) {
+        // cannot pop frame yourself
+        return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
+    }
 
+    // get thread state
+    err = env->GetThreadState(thread, &state);
     if (err != JVMTI_ERROR_NONE) {
         return err;
     }
 
-    // check error condition: JVMTI_ERROR_THREAD_NOT_ALIVE
+    // check thread state
     if ((state & JVMTI_THREAD_STATE_ALIVE) == 0) {
         return JVMTI_ERROR_THREAD_NOT_ALIVE;
     }
-
-    // check error condition: JVMTI_ERROR_THREAD_NOT_SUSPENDED
-    JNIEnv *jni_env = p_TLS_vmthread->jni_env;
-    jthread curr_thread = getCurrentThread();
-    if (jni_env->IsSameObject(thread,curr_thread)
-            || ((state & JVMTI_THREAD_STATE_SUSPENDED) == 0)) {
+    if( (state & JVMTI_THREAD_STATE_SUSPENDED) == 0) {
         return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
     }
 
+    // check stack depth
+    hythread_t hy_thread = jthread_get_native_thread(thread);
+    VM_thread* vm_thread = get_vm_thread(hy_thread);
+
+    jint depth;
+    if (interpreter_enabled()) {
+        err = interpreter.interpreter_ti_get_frame_count(env,
+            vm_thread, &depth);
+    } else {
+        depth = get_thread_stack_depth(vm_thread);
+        err = JVMTI_ERROR_NONE;
+    }
+    if (err != JVMTI_ERROR_NONE) {
+        return err;
+    }
+
+    if(depth <= 1) {
+        return JVMTI_ERROR_NO_MORE_FRAMES;
+    }
+
     if (interpreter_enabled()) {
-        return interpreter.interpreter_ti_pop_frame(env,
-            get_vm_thread_ptr_safe(jvmti_test_jenv, thread));
+        return interpreter.interpreter_ti_pop_frame(env, vm_thread);
     } else {
         return jvmti_jit_pop_frame(thread);
     }