X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=libjava%2Fgnu%2Fclasspath%2FnatVMStackWalker.cc;h=f7eb8832f4c28194a5e17ee826c77ef6afe22bab;hp=621a95b4cc5e680da12328ce478384b6d0c8c817;hb=d4f1e64e02b4ff8b7374e379003f4ed33e4f3f47;hpb=3ccf108d8b40a62d19b1c9e4bfa860f49888951e diff --git a/libjava/gnu/classpath/natVMStackWalker.cc b/libjava/gnu/classpath/natVMStackWalker.cc index 621a95b4cc5..f7eb8832f4c 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 #include +// 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 * 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 *