java-stack.h (accesscontrol_trace_fn): Declare.

2006-08-09  Gary Benson  <gbenson@redhat.com>

	* include/java-stack.h (accesscontrol_trace_fn): Declare.
	(GetAccessControlStack): Likewise.
	(GetClassMethodStack): Remove.
	* stacktrace.cc (accesscontrol_trace_fn): New method.
	(GetAccessControlStack): Likewise.
	(GetClassMethodStack): Remove.
	* java/security/natVMAccessController.cc (getStack): Use
	GetAccessControlStack.

From-SVN: r116032
This commit is contained in:
Gary Benson 2006-08-09 08:38:28 +00:00 committed by Gary Benson
parent ca78720074
commit c7dc750aef
4 changed files with 50 additions and 11 deletions

View File

@ -1,3 +1,14 @@
2006-08-09 Gary Benson <gbenson@redhat.com>
* include/java-stack.h (accesscontrol_trace_fn): Declare.
(GetAccessControlStack): Likewise.
(GetClassMethodStack): Remove.
* stacktrace.cc (accesscontrol_trace_fn): New method.
(GetAccessControlStack): Likewise.
(GetClassMethodStack): Remove.
* java/security/natVMAccessController.cc (getStack): Use
GetAccessControlStack.
2006-08-07 Gary Benson <gbenson@redhat.com>
PR libgcj/28340:

View File

@ -114,6 +114,7 @@ private:
static _Unwind_Reason_Code calling_class_trace_fn (_Jv_UnwindState *state);
static _Unwind_Reason_Code non_system_trace_fn (_Jv_UnwindState *state);
static _Unwind_Reason_Code accesscontrol_trace_fn (_Jv_UnwindState *state);
public:
static _Jv_StackTrace *GetStackTrace (void);
@ -124,7 +125,7 @@ public:
static void GetCallerInfo (jclass checkClass, jclass *, _Jv_Method **);
static JArray<jclass> *GetClassContext (jclass checkClass);
static ClassLoader *GetFirstNonSystemClassLoader (void);
static JArray<jobjectArray> *GetClassMethodStack (_Jv_StackTrace *trace);
static JArray<jobjectArray> *GetAccessControlStack ();
};

View File

@ -19,6 +19,5 @@ details. */
JArray<jobjectArray> *
java::security::VMAccessController::getStack ()
{
_Jv_StackTrace *trace = _Jv_StackTrace::GetStackTrace ();
return _Jv_StackTrace::GetClassMethodStack (trace);
return _Jv_StackTrace::GetAccessControlStack ();
}

View File

@ -20,6 +20,7 @@ details. */
#include <java/lang/Class.h>
#include <java/lang/Long.h>
#include <java/security/AccessController.h>
#include <java/util/ArrayList.h>
#include <java/util/IdentityHashMap.h>
#include <gnu/java/lang/MainThread.h>
@ -535,16 +536,43 @@ _Jv_StackTrace::GetFirstNonSystemClassLoader ()
return NULL;
}
JArray<jobjectArray> *
_Jv_StackTrace::GetClassMethodStack (_Jv_StackTrace *trace)
_Unwind_Reason_Code
_Jv_StackTrace::accesscontrol_trace_fn (_Jv_UnwindState *state)
{
jint length = 0;
_Jv_StackFrame *frame = &state->frames[state->pos];
FillInFrameInfo (frame);
bool *stopping = (bool *) state->trace_data;
if (*stopping)
return _URC_NORMAL_STOP;
if (frame->klass == &::java::security::AccessController::class$
&& frame->meth
&& strcmp (frame->meth->name->chars(), "doPrivileged") == 0)
*stopping = true;
return _URC_NO_REASON;
}
JArray<jobjectArray> *
_Jv_StackTrace::GetAccessControlStack (void)
{
int trace_size = 100;
_Jv_StackFrame frames[trace_size];
_Jv_UnwindState state (trace_size);
state.frames = (_Jv_StackFrame *) &frames;
state.trace_function = accesscontrol_trace_fn;
bool stopping = false;
state.trace_data = (void *) &stopping;
UpdateNCodeMap();
for (int i = 0; i < trace->length; i++)
_Unwind_Backtrace (UnwindTraceFn, &state);
jint length = 0;
for (int i = 0; i < state.pos; i++)
{
_Jv_StackFrame *frame = &trace->frames[i];
FillInFrameInfo (frame);
_Jv_StackFrame *frame = &state.frames[i];
if (frame->klass && frame->meth)
length++;
@ -560,9 +588,9 @@ _Jv_StackTrace::GetClassMethodStack (_Jv_StackTrace *trace)
jclass *c = elements (classes);
jstring *m = elements (methods);
for (int i = 0, j = 0; i < trace->length; i++)
for (int i = 0, j = 0; i < state.pos; i++)
{
_Jv_StackFrame *frame = &trace->frames[i];
_Jv_StackFrame *frame = &state.frames[i];
if (!frame->klass || !frame->meth)
continue;
c[j] = frame->klass;