[ecj] Improved VMStackWalker.getCallingClassLoader()

Gary Benson gbenson@redhat.com
Wed Dec 13 14:16:00 GMT 2006


Hi all,

This commit makes VMStackWalker.getCallingClassLoader() unwind only
as much of the stack as necessary when called by interpreted code. 

Cheers,
Gary
-------------- next part --------------
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 119820)
+++ ChangeLog	(working copy)
@@ -1,3 +1,12 @@
+2006-12-13  Gary Benson  <gbenson@redhat.com>
+
+	* stacktrace.cc (stackwalker_trace_fn,
+	GetStackWalkerCallingClass): Be less strict about caller.
+	* gnu/classpath/natVMStackWalker.cc
+	(getCallingClassLoader): New method.
+	* gnu/classpath/VMStackWalker.java
+	(getCallingClassLoader): Replace with native method.
+
 2006-12-12  Tom Tromey  <tromey@redhat.com>
 
 	* sources.am, Makefile.in: Rebuilt.
Index: stacktrace.cc
===================================================================
--- stacktrace.cc	(revision 119820)
+++ stacktrace.cc	(working copy)
@@ -681,7 +681,7 @@
 
 typedef enum
   {
-    VMSW_GETCLASSCONTEXT,
+    VMSW_GET_CALLING_ITEM,
     JLRM_INVOKE_OR_CALLER,
     CALLER,
     CALLER_OF_CALLER
@@ -706,10 +706,8 @@
 
   switch (trace_data->expect)
     {
-    case VMSW_GETCLASSCONTEXT:
-      JvAssert (
-	frame->klass == &::gnu::classpath::VMStackWalker::class$
-	&& strcmp (frame->meth->name->chars(), "getClassContext") == 0);
+    case VMSW_GET_CALLING_ITEM:
+      JvAssert (frame->klass == &::gnu::classpath::VMStackWalker::class$);
       trace_data->expect = JLRM_INVOKE_OR_CALLER;
       break;
 
@@ -742,7 +740,7 @@
   state.frames = (_Jv_StackFrame *) &frames;
 
   StackWalkerTraceData trace_data;
-  trace_data.expect = VMSW_GETCLASSCONTEXT;
+  trace_data.expect = VMSW_GET_CALLING_ITEM;
   trace_data.result = NULL;
   
   state.trace_function = stackwalker_trace_fn;
Index: gnu/classpath/natVMStackWalker.cc
===================================================================
--- gnu/classpath/natVMStackWalker.cc	(revision 119820)
+++ gnu/classpath/natVMStackWalker.cc	(working copy)
@@ -61,6 +61,13 @@
 }
 
 ::java::lang::ClassLoader *
+gnu::classpath::VMStackWalker::getCallingClassLoader(void)
+{
+  return
+    _Jv_StackTrace::GetStackWalkerCallingClass ()->getClassLoaderInternal ();
+}
+
+::java::lang::ClassLoader *
 gnu::classpath::VMStackWalker::getCallingClassLoader(::gnu::gcj::RawData *pc)
 {
   return getCallingClass (pc)->getClassLoaderInternal ();
Index: gnu/classpath/VMStackWalker.java
===================================================================
--- gnu/classpath/VMStackWalker.java	(revision 119820)
+++ gnu/classpath/VMStackWalker.java	(working copy)
@@ -110,13 +110,7 @@
    * this method. <code>getCallingClassLoader(addr)</code> does not
    * unwind the stack, so is therefore more efficient.
    */
-  public static ClassLoader getCallingClassLoader()
-  {
-    Class[] ctx = getClassContext();
-    if (ctx.length < 3)
-      return null;
-    return getClassLoader(ctx[2]);
-  }
+  public static native ClassLoader getCallingClassLoader();
 
   /**
    * Get the class loader associated with the Class returned by


More information about the Java-patches mailing list