]> gcc.gnu.org Git - gcc.git/commitdiff
java-stack.h (accesscontrol_trace_fn): Declare.
authorGary Benson <gbenson@redhat.com>
Wed, 9 Aug 2006 08:38:28 +0000 (08:38 +0000)
committerGary Benson <gary@gcc.gnu.org>
Wed, 9 Aug 2006 08:38:28 +0000 (08:38 +0000)
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

libjava/ChangeLog
libjava/include/java-stack.h
libjava/java/security/natVMAccessController.cc
libjava/stacktrace.cc

index 7176d1b2102db56e0a9c21b6d8325c5ce8dac1ad..27061ae8b6d4db3d43797f0a18bcd63c20d429c6 100644 (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:
index a1b0db670ea157436b624dfdd1441ce7d3d5e918..29e4285fa02e7cdd0a14e807741a513734c58f25 100644 (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 ();
   
 };
 
index e56ccbd9135ecb2f70f665be16258fcdb61504c7..42cfc9cfe68730fd8813000e8274383018e1c6bb 100644 (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 ();
 }
index 843c5124e7e2ee949a75aa4f78b4a259aed89a28..e81294ddf690587a26641fe932dba29d7f88e826 100644 (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;
 }
 
+_Unwind_Reason_Code
+_Jv_StackTrace::accesscontrol_trace_fn (_Jv_UnwindState *state)
+{
+  _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::GetClassMethodStack (_Jv_StackTrace *trace)
+_Jv_StackTrace::GetAccessControlStack (void)
 {
-  jint length = 0;
+  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;
This page took 0.080522 seconds and 5 git commands to generate.