diff options
author | Andrew Haley <aph@redhat.com> | 2007-02-10 14:22:54 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2007-02-10 14:22:54 +0000 |
commit | ba9652fcb40c232e43a5d2e96843847932e3784b (patch) | |
tree | b46076778a1fa06db86e1bab8e622bbd3cf616d2 | |
parent | bf654c9418d8246110f1703c920f4e57eec4a075 (diff) | |
download | gcc-ba9652fcb40c232e43a5d2e96843847932e3784b.zip gcc-ba9652fcb40c232e43a5d2e96843847932e3784b.tar.gz gcc-ba9652fcb40c232e43a5d2e96843847932e3784b.tar.bz2 |
re PR libgcj/30742 (ResourceBundle regression)
2007-02-10 Andrew Haley <aph@redhat.com>
PR java/30742
* gnu/classpath/natVMStackWalker.cc (GET_CALLING_CLASS): New.
(getCallingClass): Call GET_CALLING_CLASS.
(getCallingClassLoader): Likewise.
From-SVN: r121798
-rw-r--r-- | libjava/ChangeLog | 7 | ||||
-rw-r--r-- | libjava/gnu/classpath/natVMStackWalker.cc | 50 |
2 files changed, 36 insertions, 21 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 5441374..1c39b14 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,10 @@ +2007-02-10 Andrew Haley <aph@redhat.com> + + PR java/30742 + * gnu/classpath/natVMStackWalker.cc (GET_CALLING_CLASS): New. + (getCallingClass): Call GET_CALLING_CLASS. + (getCallingClassLoader): Likewise. + 2007-02-10 Mohan Embar <gnustuff@thisiscool.com> * configure: Rebuilt. diff --git a/libjava/gnu/classpath/natVMStackWalker.cc b/libjava/gnu/classpath/natVMStackWalker.cc index 621a95b..f7eb883 100644 --- a/libjava/gnu/classpath/natVMStackWalker.cc +++ b/libjava/gnu/classpath/natVMStackWalker.cc @@ -1,6 +1,6 @@ // natVMStackWalker.cc -/* Copyright (C) 2006 Free Software Foundation +/* Copyright (C) 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -19,6 +19,32 @@ details. */ #include <java/lang/ClassLoader.h> #include <java/lang/Class.h> +// Return the class of the method that contains PC. +// This is a macro not a function, since defining it as one would +// introduce an extra frame on the stack. */ +#define GET_CALLING_CLASS(PC) \ +({ \ + void *f = _Unwind_FindEnclosingFunction (PC); \ + \ + /* FIXME: it might well be a good idea to cache pc values here in \ + order to avoid repeated invocations of \ + _Unwind_FindEnclosingFunction, which is quite expensive. On the \ + other hand, which not simply write a caching version of \ + _Unwind_FindEnclosingFunction itself? That would probably be \ + worthwhile. */ \ + \ + _Jv_StackTrace::UpdateNCodeMap (); \ + jclass klass = (jclass) _Jv_StackTrace::ncodeMap->get ((jobject) f); \ + \ + /* If the caller is a compiled frame and the caller of the caller is \ + an interpreted frame then klass will be null and we need to \ + unwind the stack. */ \ + if (!klass) \ + klass = _Jv_StackTrace::GetStackWalkerCallingClass (); \ + \ + klass; \ + }) + JArray<jclass> * gnu::classpath::VMStackWalker::getClassContext(void) { @@ -40,25 +66,7 @@ jclass gnu::classpath::VMStackWalker::getCallingClass(::gnu::gcj::RawData *pc) { _Jv_InitClass (&::gnu::classpath::VMStackWalker::class$); - void *f = _Unwind_FindEnclosingFunction (pc); - - // FIXME: it might well be a good idea to cache pc values here in - // order to avoid repeated invocations of - // _Unwind_FindEnclosingFunction, which is quite expensive. On the - // other hand, which not simply write a caching version of - // _Unwind_FindEnclosingFunction itself? That would probably be - // worthwhile. - - _Jv_StackTrace::UpdateNCodeMap (); - jclass klass = (jclass) _Jv_StackTrace::ncodeMap->get ((jobject) f); - - // If the caller is a compiled frame and the caller of the caller - // is an interpreted frame then klass will be null and we need to - // unwind the stack. - if (klass == NULL) - klass = _Jv_StackTrace::GetStackWalkerCallingClass (); - - return klass; + return GET_CALLING_CLASS(pc); } ::java::lang::ClassLoader * @@ -80,7 +88,7 @@ gnu::classpath::VMStackWalker::getCallingClassLoader(void) gnu::classpath::VMStackWalker::getCallingClassLoader(::gnu::gcj::RawData *pc) { _Jv_InitClass (&::gnu::classpath::VMStackWalker::class$); - return getCallingClass (pc)->getClassLoaderInternal (); + return GET_CALLING_CLASS(pc)->getClassLoaderInternal (); } ::java::lang::ClassLoader * |