[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