diff options
author | Gary Benson <gbenson@redhat.com> | 2006-08-10 09:56:03 +0000 |
---|---|---|
committer | Gary Benson <gary@gcc.gnu.org> | 2006-08-10 09:56:03 +0000 |
commit | 3c95dcfdc2d82abb353997589f7c9c85e462657f (patch) | |
tree | ea99d08538a2e3928204d850e7a3c5dc199cd010 /libjava/stacktrace.cc | |
parent | 9f6b5d5953c984aecff1756a72d222f028fe6429 (diff) | |
download | gcc-3c95dcfdc2d82abb353997589f7c9c85e462657f.zip gcc-3c95dcfdc2d82abb353997589f7c9c85e462657f.tar.gz gcc-3c95dcfdc2d82abb353997589f7c9c85e462657f.tar.bz2 |
java-stack.h (GetAccessControlStack): Change return type.
2006-08-10 Gary Benson <gbenson@redhat.com>
* include/java-stack.h (GetAccessControlStack): Change return
type.
* stacktrace.cc (accesscontrol_trace_fn): Record the number of
Java frames encountered.
(GetAccessControlStack): Return a flag indicating whether a call to
doPrivileged was encountered rather than an array of method names.
* java/security/natVMAccessController.cc (getStack): Change return
type.
* java/security/VMAccessController.java (getStack): Likewise.
(getContext): Change to reflect the above.
From-SVN: r116058
Diffstat (limited to 'libjava/stacktrace.cc')
-rw-r--r-- | libjava/stacktrace.cc | 60 |
1 files changed, 31 insertions, 29 deletions
diff --git a/libjava/stacktrace.cc b/libjava/stacktrace.cc index bd011d0..fe2c2e0 100644 --- a/libjava/stacktrace.cc +++ b/libjava/stacktrace.cc @@ -18,6 +18,7 @@ details. */ #include <stdio.h> +#include <java/lang/Boolean.h> #include <java/lang/Class.h> #include <java/lang/Long.h> #include <java/security/AccessController.h> @@ -536,59 +537,58 @@ _Jv_StackTrace::GetFirstNonSystemClassLoader () return NULL; } +struct AccessControlTraceData +{ + jint length; + jboolean privileged; +}; + _Unwind_Reason_Code _Jv_StackTrace::accesscontrol_trace_fn (_Jv_UnwindState *state) { + AccessControlTraceData *trace_data = (AccessControlTraceData *) + state->trace_data; _Jv_StackFrame *frame = &state->frames[state->pos]; FillInFrameInfo (frame); if (!(frame->klass && frame->meth)) return _URC_NO_REASON; - bool *stopping = (bool *) state->trace_data; - if (*stopping) + trace_data->length++; + + // If the previous frame was a call to doPrivileged, then this is + // the last frame we look at. + if (trace_data->privileged) return _URC_NORMAL_STOP; if (frame->klass == &::java::security::AccessController::class$ && strcmp (frame->meth->name->chars(), "doPrivileged") == 0) - *stopping = true; + trace_data->privileged = true; return _URC_NO_REASON; } -JArray<jobjectArray> * +jobjectArray _Jv_StackTrace::GetAccessControlStack (void) { int trace_size = 100; _Jv_StackFrame frames[trace_size]; _Jv_UnwindState state (trace_size); state.frames = (_Jv_StackFrame *) &frames; + + AccessControlTraceData trace_data; + trace_data.length = 0; + trace_data.privileged = false; + state.trace_function = accesscontrol_trace_fn; - bool stopping = false; - state.trace_data = (void *) &stopping; + state.trace_data = (void *) &trace_data; UpdateNCodeMap(); _Unwind_Backtrace (UnwindTraceFn, &state); - - jint length = 0; - for (int i = 0; i < state.pos; i++) - { - _Jv_StackFrame *frame = &state.frames[i]; - - if (frame->klass && frame->meth) - length++; - } - - jclass array_class = _Jv_GetArrayClass (&::java::lang::Object::class$, NULL); - JArray<jobjectArray> *result = - (JArray<jobjectArray> *) _Jv_NewObjectArray (2, array_class, NULL); JArray<jclass> *classes = (JArray<jclass> *) - _Jv_NewObjectArray (length, &::java::lang::Class::class$, NULL); - JArray<jstring> *methods = (JArray<jstring> *) - _Jv_NewObjectArray (length, &::java::lang::String::class$, NULL); - jclass *c = elements (classes); - jstring *m = elements (methods); + _Jv_NewObjectArray (trace_data.length, &::java::lang::Class::class$, NULL); + jclass *c = elements (classes); for (int i = 0, j = 0; i < state.pos; i++) { @@ -596,13 +596,15 @@ _Jv_StackTrace::GetAccessControlStack (void) if (!frame->klass || !frame->meth) continue; c[j] = frame->klass; - m[j] = JvNewStringUTF (frame->meth->name->chars()); j++; } - jobjectArray *elems = elements (result); - elems[0] = (jobjectArray) classes; - elems[1] = (jobjectArray) methods; - + jobjectArray result = + (jobjectArray) _Jv_NewObjectArray (2, &::java::lang::Object::class$, + NULL); + jobject *r = elements (result); + r[0] = (jobject) classes; + r[1] = (jobject) new Boolean (trace_data.privileged); + return result; } |