OSDN Git Service

2008-01-04 Andrew Haley <aph@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / java / jcf-parse.c
index a544163..c3fe524 100644 (file)
@@ -1596,6 +1596,8 @@ parse_class_file (void)
   file_start_location = input_location;
   (*debug_hooks->start_source_file) (input_line, input_filename);
 
+  java_mark_class_local (current_class);
+
   gen_indirect_dispatch_tables (current_class);
 
   for (method = TYPE_METHODS (current_class);
@@ -1946,6 +1948,10 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
 #endif
          parse_zip_file_entries ();
        }
+      else if (magic == (JCF_u4) ZIPEMPTYMAGIC)
+       {
+         /* Ignore an empty input jar.  */
+       }
       else
        {
          gcc_unreachable ();
@@ -1963,13 +1969,6 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
        }
     }
 
-  /* Do this before lowering any code.  */
-  for (node = current_file_list; node; node = TREE_CHAIN (node))
-    {
-      if (CLASS_FILE_P (node))
-       java_mark_class_local (TREE_TYPE (node));
-    }
-
   for (node = current_file_list; node; node = TREE_CHAIN (node))
     {
       input_location = DECL_SOURCE_LOCATION (node);
@@ -2076,6 +2075,7 @@ parse_zip_file_entries (void)
        case 1:
          {
            char *class_name = compute_class_name (zdir);
+           int previous_alias_set = -1;
            class = lookup_class (get_identifier (class_name));
            FREE (class_name);
            current_jcf = TYPE_JCF (class);
@@ -2086,17 +2086,25 @@ parse_zip_file_entries (void)
            gcc_assert (! TYPE_DUMMY (class));
 
            /* This is for a corner case where we have a superclass
-              but no superclass fields.  
+              but no superclass fields.
 
               This can happen if we earlier failed to lay out this
               class because its superclass was still in the process
               of being laid out; this occurs when we have recursive
-              class dependencies via inner classes.  Setting
-              TYPE_SIZE to null here causes CLASS_LOADED_P to return
-              false, so layout_class() will be called again.  */
+              class dependencies via inner classes.  We must record
+              the previous alias set and restore it after laying out
+              the class.
+
+              FIXME: this really is a kludge.  We should figure out a
+              way to lay out the class properly before this
+              happens.  */
            if (TYPE_SIZE (class) && CLASSTYPE_SUPER (class)
                && integer_zerop (TYPE_SIZE (class)))
-             TYPE_SIZE (class) = NULL_TREE;
+             {
+               TYPE_SIZE (class) = NULL_TREE;
+               previous_alias_set = TYPE_ALIAS_SET (class);
+               TYPE_ALIAS_SET (class) = -1;
+             }
 
            if (! CLASS_LOADED_P (class))
              {
@@ -2109,6 +2117,9 @@ parse_zip_file_entries (void)
                load_inner_classes (current_class);
              }
 
+           if (previous_alias_set != -1)
+             TYPE_ALIAS_SET (class) = previous_alias_set;
+
            if (TYPE_SIZE (current_class) != error_mark_node)
              {
                parse_class_file ();