aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/natResourceBundle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/natResourceBundle.cc')
-rw-r--r--libjava/java/util/natResourceBundle.cc20
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;
}