hotspot/src/share/vm/prims/jvm.cpp
changeset 34280 72bfaaffee36
parent 34273 8598d07915d9
child 34286 ae53ecf4124a
equal deleted inserted replaced
34277:d457b9400c99 34280:72bfaaffee36
    44 #include "prims/jvm_misc.hpp"
    44 #include "prims/jvm_misc.hpp"
    45 #include "prims/jvmtiExport.hpp"
    45 #include "prims/jvmtiExport.hpp"
    46 #include "prims/jvmtiThreadState.hpp"
    46 #include "prims/jvmtiThreadState.hpp"
    47 #include "prims/nativeLookup.hpp"
    47 #include "prims/nativeLookup.hpp"
    48 #include "prims/privilegedStack.hpp"
    48 #include "prims/privilegedStack.hpp"
       
    49 #include "prims/stackwalk.hpp"
    49 #include "runtime/arguments.hpp"
    50 #include "runtime/arguments.hpp"
    50 #include "runtime/atomic.inline.hpp"
    51 #include "runtime/atomic.inline.hpp"
    51 #include "runtime/handles.inline.hpp"
    52 #include "runtime/handles.inline.hpp"
    52 #include "runtime/init.hpp"
    53 #include "runtime/init.hpp"
    53 #include "runtime/interfaceSupport.hpp"
    54 #include "runtime/interfaceSupport.hpp"
   545   oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
   546   oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
   546   return JNIHandles::make_local(env, element);
   547   return JNIHandles::make_local(env, element);
   547 JVM_END
   548 JVM_END
   548 
   549 
   549 
   550 
       
   551 // java.lang.StackWalker //////////////////////////////////////////////////////
       
   552 
       
   553 
       
   554 JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jlong mode,
       
   555                                      jint skip_frames, jint frame_count, jint start_index,
       
   556                                      jobjectArray classes,
       
   557                                      jobjectArray frames))
       
   558   JVMWrapper("JVM_CallStackWalk");
       
   559   JavaThread* jt = (JavaThread*) THREAD;
       
   560   if (!jt->is_Java_thread() || !jt->has_last_Java_frame()) {
       
   561     THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", NULL);
       
   562   }
       
   563 
       
   564   Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
       
   565   objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(classes));
       
   566   objArrayHandle classes_array_h(THREAD, ca);
       
   567 
       
   568   // frames array is null when only getting caller reference
       
   569   objArrayOop fa = objArrayOop(JNIHandles::resolve(frames));
       
   570   objArrayHandle frames_array_h(THREAD, fa);
       
   571 
       
   572   int limit = start_index + frame_count;
       
   573   if (classes_array_h->length() < limit) {
       
   574     THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", NULL);
       
   575   }
       
   576 
       
   577   Handle result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count,
       
   578                                   start_index, classes_array_h,
       
   579                                   frames_array_h, CHECK_NULL);
       
   580   return JNIHandles::make_local(env, result());
       
   581 JVM_END
       
   582 
       
   583 
       
   584 JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jlong anchor,
       
   585                                   jint frame_count, jint start_index,
       
   586                                   jobjectArray classes,
       
   587                                   jobjectArray frames))
       
   588   JVMWrapper("JVM_MoreStackWalk");
       
   589   JavaThread* jt = (JavaThread*) THREAD;
       
   590   objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(classes));
       
   591   objArrayHandle classes_array_h(THREAD, ca);
       
   592 
       
   593   // frames array is null when only getting caller reference
       
   594   objArrayOop fa = objArrayOop(JNIHandles::resolve(frames));
       
   595   objArrayHandle frames_array_h(THREAD, fa);
       
   596 
       
   597   int limit = start_index+frame_count;
       
   598   if (classes_array_h->length() < limit) {
       
   599     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers");
       
   600   }
       
   601 
       
   602   Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream));
       
   603   return StackWalk::moreFrames(stackStream_h, mode, anchor, frame_count,
       
   604                                start_index, classes_array_h,
       
   605                                frames_array_h, THREAD);
       
   606 JVM_END
       
   607 
       
   608 JVM_ENTRY(void, JVM_FillStackFrames(JNIEnv *env, jclass stackStream,
       
   609                                     jint start_index,
       
   610                                     jobjectArray frames,
       
   611                                     jint from_index, jint to_index))
       
   612   JVMWrapper("JVM_FillStackFrames");
       
   613   if (TraceStackWalk) {
       
   614     tty->print("JVM_FillStackFrames() start_index=%d from_index=%d to_index=%d\n",
       
   615                start_index, from_index, to_index);
       
   616   }
       
   617 
       
   618   JavaThread* jt = (JavaThread*) THREAD;
       
   619 
       
   620   objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames));
       
   621   objArrayHandle frames_array_h(THREAD, fa);
       
   622 
       
   623   if (frames_array_h->length() < to_index) {
       
   624     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "array length not matched");
       
   625   }
       
   626 
       
   627   for (int i = from_index; i < to_index; i++) {
       
   628     Handle stackFrame(THREAD, frames_array_h->obj_at(i));
       
   629     java_lang_StackFrameInfo::fill_methodInfo(stackFrame, CHECK);
       
   630   }
       
   631 JVM_END
       
   632 
       
   633 JVM_ENTRY(void, JVM_SetMethodInfo(JNIEnv *env, jobject frame))
       
   634   JVMWrapper("JVM_SetMethodInfo");
       
   635   Handle stackFrame(THREAD, JNIHandles::resolve(frame));
       
   636   java_lang_StackFrameInfo::fill_methodInfo(stackFrame, THREAD);
       
   637 JVM_END
       
   638 
   550 // java.lang.Object ///////////////////////////////////////////////
   639 // java.lang.Object ///////////////////////////////////////////////
   551 
   640 
   552 
   641 
   553 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
   642 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
   554   JVMWrapper("JVM_IHashCode");
   643   JVMWrapper("JVM_IHashCode");