diff options
Diffstat (limited to 'libjava/java/util/natResourceBundle.cc')
-rw-r--r-- | libjava/java/util/natResourceBundle.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/libjava/java/util/natResourceBundle.cc b/libjava/java/util/natResourceBundle.cc index 21a9565c996..35e90ee23d3 100644 --- a/libjava/java/util/natResourceBundle.cc +++ b/libjava/java/util/natResourceBundle.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation +/* Copyright (C) 2002, 2003 Free Software Foundation This file is part of libgcj. @@ -16,17 +16,27 @@ details. */ #include <java/lang/SecurityManager.h> #include <java/lang/ClassLoader.h> #include <java/lang/Class.h> +#include <java/lang/ArrayIndexOutOfBoundsException.h> #include <gnu/gcj/runtime/StackTrace.h> java::lang::ClassLoader * java::util::ResourceBundle::getCallingClassLoader () { gnu::gcj::runtime::StackTrace *t = new gnu::gcj::runtime::StackTrace(6); - for (int i = 3; i < 6; ++i) + try + { + /* Frame 0 is this method, frame 1 is getBundle, so starting at + frame 2 we might see the user's class. FIXME: should account + for reflection, JNI, etc, here. */ + for (int i = 2; ; ++i) + { + jclass klass = t->classAt(i); + if (klass != NULL) + return klass->getClassLoaderInternal(); + } + } + catch (::java::lang::ArrayIndexOutOfBoundsException *e) { - jclass klass = t->classAt(i); - if (klass != NULL) - return klass->getClassLoaderInternal(); } return NULL; } |