aboutsummaryrefslogtreecommitdiff
path: root/libjava/stacktrace.cc
diff options
context:
space:
mode:
authorGary Benson <gbenson@redhat.com>2006-08-10 09:56:03 +0000
committerGary Benson <gary@gcc.gnu.org>2006-08-10 09:56:03 +0000
commit3c95dcfdc2d82abb353997589f7c9c85e462657f (patch)
treeea99d08538a2e3928204d850e7a3c5dc199cd010 /libjava/stacktrace.cc
parent9f6b5d5953c984aecff1756a72d222f028fe6429 (diff)
downloadgcc-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.cc60
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;
}