re PR libgcj/11779 (Field reflection incorrectly throws IllegalAccessException)
authorTom Tromey <tromey@redhat.com>
Tue, 5 Aug 2003 20:06:57 +0000 (20:06 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Tue, 5 Aug 2003 20:06:57 +0000 (20:06 +0000)
Fix for PR libgcj/11779:
* java/lang/reflect/natField.cc (getAddr): Skip frames in Field
class.

From-SVN: r70185

libjava/ChangeLog
libjava/java/lang/reflect/natField.cc

index be7d6505378e4c5bd701acd31836ea55eae8eaea..2ab9b0df9485404415ec1462936badcfca90cd5f 100644 (file)
@@ -1,5 +1,9 @@
 2003-08-05  Tom Tromey  <tromey@redhat.com>
 
+       Fix for PR libgcj/11779:
+       * java/lang/reflect/natField.cc (getAddr): Skip frames in Field
+       class.
+
        * java/lang/reflect/Method.java: Updated status comment.
        Imported javadoc from Classpath and re-ordered methods.
        * java/lang/reflect/Constructor.java: Reindented.  Updated
index 5f104a9d99975e27aa21fdbc45b8f2115498a53d..b7f12f06e926b6b4617a0ebc917b713b6d086ac2 100644 (file)
@@ -59,13 +59,14 @@ getAddr (java::lang::reflect::Field* field, jclass caller, jobject obj)
   // calls.  However, we never implemented that, so we have to find
   // the caller by hand instead.
   gnu::gcj::runtime::StackTrace *t 
-    = new gnu::gcj::runtime::StackTrace(4);
+    = new gnu::gcj::runtime::StackTrace(7);
   try
     {
-      for (int i = 1; !caller; i++)
-       {
-         caller = t->classAt (i);
-       }
+      // We want to skip all the frames on the stack from this class.
+      for (int i = 1;
+          !caller || caller == &java::lang::reflect::Field::class$;
+          i++)
+       caller = t->classAt (i);
     }
   catch (::java::lang::ArrayIndexOutOfBoundsException *e)
     {