OSDN Git Service

* defineclass.cc (handleField): Throw exception if field name is
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Jul 2003 17:12:54 +0000 (17:12 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Jul 2003 17:12:54 +0000 (17:12 +0000)
duplicated.
(handleMethod): Throw exception for duplicate method.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@69928 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/defineclass.cc

index 4af6516..ea7d7c7 100644 (file)
@@ -1,5 +1,11 @@
 2003-07-29  Tom Tromey  <tromey@redhat.com>
 
+       * defineclass.cc (handleField): Throw exception if field name is
+       duplicated.
+       (handleMethod): Throw exception for duplicate method.
+
+2003-07-29  Tom Tromey  <tromey@redhat.com>
+
        * gnu/gcj/convert/natIconv.cc (write): Handle case where
        output buffer is too small.
 
index 001fa01..4cd4f4f 100644 (file)
@@ -75,7 +75,7 @@ struct _Jv_ClassReader {
   // allways on.  You always want this as far as I can see, but it also
   // controls weither identifiers and type descriptors/signatures are
   // verified as legal.  This could be somewhat more expensive since it
-  // will call Characher.isJavaIdentifier{Start,Part} for each character
+  // will call Character.isJavaIdentifier{Start,Part} for each character
   // in any identifier (field name or method name) it comes by.  Thus,
   // it might be useful to turn off this verification for classes that
   // come from a trusted source.  However, for GCJ, trusted classes are
@@ -403,15 +403,15 @@ void _Jv_ClassReader::read_fields ()
       int name_index       = read2u ();
       int descriptor_index = read2u ();
       int attributes_count = read2u ();
-      
+
       check_tag (name_index, JV_CONSTANT_Utf8);
       prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
 
       check_tag (descriptor_index, JV_CONSTANT_Utf8);
       prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
-      
+
       handleField (i, access_flags, name_index, descriptor_index);
-      
+
       for (int j = 0; j < attributes_count; j++)
        {
          read_one_field_attribute (i);
@@ -1071,14 +1071,25 @@ void _Jv_ClassReader::handleField (int field_no,
   field->nameIndex = name;
 #endif
 
-  if (verify)
-    verify_identifier (field_name);
-
-  // ignore flags we don't know about.  
+  // Ignore flags we don't know about.  
   field->flags = flags & Modifier::ALL_FLAGS;
 
+  _Jv_Utf8Const* sig = pool_data[desc].utf8;
+
   if (verify)
     {
+      verify_identifier (field_name);
+
+      for (int i = 0; i < field_no; ++i)
+       {
+         if (_Jv_equalUtf8Consts (field_name, def->fields[i].name)
+             && _Jv_equalUtf8Consts (sig,
+                                     // We know the other fields are
+                                     // unresolved.
+                                     (_Jv_Utf8Const *) def->fields[i].type))
+           throw_class_format_error ("duplicate field name");
+       }
+
       if (field->flags & (Modifier::SYNCHRONIZED
                          | Modifier::NATIVE
                          | Modifier::INTERFACE
@@ -1091,8 +1102,6 @@ void _Jv_ClassReader::handleField (int field_no,
        throw_class_format_error ("erroneous field access flags");
     }
 
-  _Jv_Utf8Const* sig = pool_data[desc].utf8;
-
   if (verify)
     _Jv_VerifyFieldSignature (sig);
 
@@ -1233,6 +1242,14 @@ void _Jv_ClassReader::handleMethod
 
       _Jv_VerifyMethodSignature (method->signature);
 
+      for (int i = 0; i < mth_index; ++i)
+       {
+         if (_Jv_equalUtf8Consts (method->name, def->methods[i].name)
+             && _Jv_equalUtf8Consts (method->signature,
+                                     def->methods[i].signature))
+           throw_class_format_error ("duplicate method");
+       }
+
       if (method->accflags & (Modifier::VOLATILE
                              | Modifier::TRANSIENT
                              | Modifier::INTERFACE))