re PR libgcj/17020 (gij should ignore all reserved method flags)
authorBryce McKinlay <mckinlay@redhat.com>
Fri, 13 Aug 2004 18:26:00 +0000 (18:26 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Fri, 13 Aug 2004 18:26:00 +0000 (19:26 +0100)
PR libgcj/17020
Reported by Robin Green.
* defineclass.cc (handleField): Don't throw exception on
unrecognised modifier. Add FIXME comments for spec compliance.
(handleMethod): Likewise.

From-SVN: r85952

libjava/ChangeLog
libjava/defineclass.cc

index 053ffef084a9863ca954f0ea44bf983a990f1906..8a86bc9000d2c3a21699b82d83f086c8abf2e224 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-13  Bryce McKinlay  <mckinlay@redhat.com>
+
+       PR libgcj/17020
+       Reported by Robin Green.
+       * defineclass.cc (handleField): Don't throw exception on unrecognised
+       modifier. Add FIXME comments for spec compliance.
+       (handleMethod): Likewise.
+
 2004-08-10  Hans Boehm <Hans.Boehm@hp.com>
 
        PR libgcj/16662
index ad40fc8f7fce6a054383c702beab10b1ca5b8208..5cd6b009be554cac53d57f0db340f8abe05a73a5 100644 (file)
@@ -1096,16 +1096,15 @@ void _Jv_ClassReader::handleField (int field_no,
            throw_class_format_error ("duplicate field name");
        }
 
-      if (field->flags & (Modifier::SYNCHRONIZED
-                         | Modifier::NATIVE
-                         | Modifier::INTERFACE
-                         | Modifier::ABSTRACT))
-       throw_class_format_error ("erroneous field access flags");
-      
+      // At most one of PUBLIC, PRIVATE, or PROTECTED is allowed.
       if (1 < ( ((field->flags & Modifier::PUBLIC) ? 1 : 0)
                +((field->flags & Modifier::PRIVATE) ? 1 : 0)
                +((field->flags & Modifier::PROTECTED) ? 1 : 0)))
        throw_class_format_error ("erroneous field access flags");
+
+      // FIXME: JVM spec S4.5: Verify ACC_FINAL and ACC_VOLATILE are not 
+      // both set. Verify modifiers for interface fields.
+      
     }
 
   if (verify)
@@ -1256,15 +1255,15 @@ void _Jv_ClassReader::handleMethod
            throw_class_format_error ("duplicate method");
        }
 
-      if (method->accflags & (Modifier::VOLATILE
-                             | Modifier::TRANSIENT
-                             | Modifier::INTERFACE))
-       throw_class_format_error ("erroneous method access flags");
-      
+      // At most one of PUBLIC, PRIVATE, or PROTECTED is allowed.
       if (1 < ( ((method->accflags & Modifier::PUBLIC) ? 1 : 0)
                +((method->accflags & Modifier::PRIVATE) ? 1 : 0)
                +((method->accflags & Modifier::PROTECTED) ? 1 : 0)))
        throw_class_format_error ("erroneous method access flags");
+
+      // FIXME: JVM spec S4.6: if ABSTRACT modifier is set, verify other 
+      // flags are not set. Verify flags for interface methods. Verifiy
+      // modifiers for initializers. 
     }
 }