< prev index next >

hotspot/src/share/vm/prims/jvm.cpp

Print this page

        

*** 531,621 **** // java.lang.StackWalker ////////////////////////////////////////////////////// JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jint skip_frames, jint frame_count, jint start_index, - jobjectArray classes, jobjectArray frames)) JVMWrapper("JVM_CallStackWalk"); JavaThread* jt = (JavaThread*) THREAD; if (!jt->is_Java_thread() || !jt->has_last_Java_frame()) { THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", NULL); } Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream)); - objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(classes)); - objArrayHandle classes_array_h(THREAD, ca); ! // frames array is null when only getting caller reference ! objArrayOop fa = objArrayOop(JNIHandles::resolve(frames)); objArrayHandle frames_array_h(THREAD, fa); int limit = start_index + frame_count; ! if (classes_array_h->length() < limit) { THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", NULL); } Handle result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count, ! start_index, classes_array_h, ! frames_array_h, CHECK_NULL); return JNIHandles::make_local(env, result()); JVM_END JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jlong anchor, jint frame_count, jint start_index, - jobjectArray classes, jobjectArray frames)) JVMWrapper("JVM_MoreStackWalk"); JavaThread* jt = (JavaThread*) THREAD; - objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(classes)); - objArrayHandle classes_array_h(THREAD, ca); ! // frames array is null when only getting caller reference ! objArrayOop fa = objArrayOop(JNIHandles::resolve(frames)); objArrayHandle frames_array_h(THREAD, fa); int limit = start_index+frame_count; ! if (classes_array_h->length() < limit) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers"); } Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream)); return StackWalk::moreFrames(stackStream_h, mode, anchor, frame_count, ! start_index, classes_array_h, ! frames_array_h, THREAD); ! JVM_END ! ! JVM_ENTRY(void, JVM_FillStackFrames(JNIEnv *env, jclass stackStream, ! jint start_index, ! jobjectArray frames, ! jint from_index, jint to_index)) ! JVMWrapper("JVM_FillStackFrames"); ! if (TraceStackWalk) { ! tty->print("JVM_FillStackFrames() start_index=%d from_index=%d to_index=%d\n", ! start_index, from_index, to_index); ! } ! ! JavaThread* jt = (JavaThread*) THREAD; ! ! objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames)); ! objArrayHandle frames_array_h(THREAD, fa); ! ! if (frames_array_h->length() < to_index) { ! THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "array length not matched"); ! } ! ! for (int i = from_index; i < to_index; i++) { ! Handle stackFrame(THREAD, frames_array_h->obj_at(i)); ! java_lang_StackFrameInfo::fill_methodInfo(stackFrame, CHECK); ! } JVM_END ! JVM_ENTRY(void, JVM_SetMethodInfo(JNIEnv *env, jobject frame)) JVMWrapper("JVM_SetMethodInfo"); ! Handle stackFrame(THREAD, JNIHandles::resolve(frame)); ! java_lang_StackFrameInfo::fill_methodInfo(stackFrame, THREAD); JVM_END // java.lang.Object /////////////////////////////////////////////// --- 531,596 ---- // java.lang.StackWalker ////////////////////////////////////////////////////// JVM_ENTRY(jobject, JVM_CallStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jint skip_frames, jint frame_count, jint start_index, jobjectArray frames)) JVMWrapper("JVM_CallStackWalk"); JavaThread* jt = (JavaThread*) THREAD; if (!jt->is_Java_thread() || !jt->has_last_Java_frame()) { THROW_MSG_(vmSymbols::java_lang_InternalError(), "doStackWalk: no stack trace", NULL); } Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream)); ! // frames array is a Class<?>[] array when only getting caller reference, ! // and a StackFrameInfo[] array (or derivative) otherwise. It should never ! // be null. ! objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames)); objArrayHandle frames_array_h(THREAD, fa); int limit = start_index + frame_count; ! if (frames_array_h.is_null()) { ! THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "parameters and mode mismatch", NULL); ! } ! if (frames_array_h->length() < limit) { THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers", NULL); } Handle result = StackWalk::walk(stackStream_h, mode, skip_frames, frame_count, ! start_index, frames_array_h, CHECK_NULL); return JNIHandles::make_local(env, result()); JVM_END JVM_ENTRY(jint, JVM_MoreStackWalk(JNIEnv *env, jobject stackStream, jlong mode, jlong anchor, jint frame_count, jint start_index, jobjectArray frames)) JVMWrapper("JVM_MoreStackWalk"); JavaThread* jt = (JavaThread*) THREAD; ! // frames array is a Class<?>[] array when only getting caller reference, ! // and a StackFrameInfo[] array (or derivative) otherwise. It should never ! // be null. ! objArrayOop fa = objArrayOop(JNIHandles::resolve_non_null(frames)); objArrayHandle frames_array_h(THREAD, fa); int limit = start_index+frame_count; ! if (frames_array_h->length() < limit) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "not enough space in buffers"); } Handle stackStream_h(THREAD, JNIHandles::resolve_non_null(stackStream)); return StackWalk::moreFrames(stackStream_h, mode, anchor, frame_count, ! start_index, frames_array_h, THREAD); JVM_END ! JVM_ENTRY(void, JVM_FillInStackTraceElement(JNIEnv *env, jobject frame, jobject stack)) JVMWrapper("JVM_SetMethodInfo"); ! Handle stack_frame_info(THREAD, JNIHandles::resolve(frame)); ! Handle stack_trace_element(THREAD, JNIHandles::resolve(stack)); ! java_lang_StackFrameInfo::fill_methodInfo(stack_frame_info, stack_trace_element, THREAD); JVM_END // java.lang.Object ///////////////////////////////////////////////
< prev index next >