class.c (set_super_info): Call `set_class_decl_access_flags.'
authorAlexandre Petit-Bianco <apbianco@redhat.com>
Wed, 27 Jun 2001 20:38:20 +0000 (13:38 -0700)
committerAlexandre Petit-Bianco <apbianco@gcc.gnu.org>
Wed, 27 Jun 2001 20:38:20 +0000 (13:38 -0700)
2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>

* class.c (set_super_info): Call `set_class_decl_access_flags.'
(set_class_decl_access_flags): New function.
* java-tree.h (set_class_decl_access_flags): New prototype.
* jcf-parse.c (handle_innerclass_attribute): Read and set access flags.
(parse_class_file): New local `decl_max_locals.' Take wide types
into account to compute DECL_MAX_LOCALS.
* parse.y (type_import_on_demand_declaration:): Ignore duplicate
imports on demand.

(http://gcc.gnu.org/ml/gcc-patches/2001-06/msg01718.html )

From-SVN: r43618

gcc/java/ChangeLog
gcc/java/class.c
gcc/java/java-tree.h
gcc/java/jcf-parse.c
gcc/java/parse.y

index c0b881cd1dc2935badf566adbc82a05563c49004..676f7be1d7b4dfb74077fdee4c307670ce00e007 100644 (file)
@@ -1,3 +1,14 @@
+2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+       * class.c (set_super_info): Call `set_class_decl_access_flags.'
+       (set_class_decl_access_flags): New function.
+       * java-tree.h (set_class_decl_access_flags): New prototype.
+       * jcf-parse.c (handle_innerclass_attribute): Read and set access flags.
+       (parse_class_file): New local `decl_max_locals.' Take wide types
+       into account to compute DECL_MAX_LOCALS.
+       * parse.y (type_import_on_demand_declaration:): Ignore duplicate
+       imports on demand.
+
 2001-06-22  Jan van Male  <jan.vanmale@fenk.wau.nl>
 
        * zipfile.h: Use GCC_JCF_H instead of JCF_H.
index 894671c24222ed47d336331e845603c2b44c1b64..45bb6df2cf753217281116a17dbca4de922ddaaa 100644 (file)
@@ -394,6 +394,14 @@ set_super_info (access_flags, this_class, super_class, interfaces_count)
       CLASS_HAS_SUPER (this_class) = 1;
     }
 
+  set_class_decl_access_flags (access_flags, class_decl);
+}
+
+void
+set_class_decl_access_flags (access_flags, class_decl)
+     int access_flags;
+     tree class_decl;
+{
   if (access_flags & ACC_PUBLIC)    CLASS_PUBLIC (class_decl) = 1;
   if (access_flags & ACC_FINAL)     CLASS_FINAL (class_decl) = 1;
   if (access_flags & ACC_SUPER)     CLASS_SUPER (class_decl) = 1;
index 914ba817967b4dc6bebc609dd8c0389178a0aa07..d0c2d34b29086c1548b2f57493a5388487fadfec 100644 (file)
@@ -1040,6 +1040,7 @@ extern void pop_labeled_block PARAMS ((void));
 extern const char *lang_printable_name PARAMS ((tree, int));
 extern tree maybe_add_interface PARAMS ((tree, tree));
 extern void set_super_info PARAMS ((int, tree, tree, int));
+extern void set_class_decl_access_flags PARAMS ((int, tree));
 extern int get_access_flags_from_decl PARAMS ((tree));
 extern int interface_of_p PARAMS ((tree, tree));
 extern int inherits_from_p PARAMS ((tree, tree));
index 6127d9d64aca8d46a29ff0a4cf934361b242c89d..82583e0360aa3601ec49a811924c5b7ef22f81ea 100644 (file)
@@ -465,6 +465,8 @@ handle_innerclass_attribute (count, jcf)
       /* Read inner_name_index. If the class we're dealing with is
         an annonymous class, it must be 0. */
       int ini = JCF_readu2 (jcf);
+      /* Read the access flag. */
+      int acc = JCF_readu2 (jcf);
       /* If icii is 0, don't try to read the class. */
       if (icii >= 0)
        {
@@ -475,13 +477,13 @@ handle_innerclass_attribute (count, jcf)
            {
              tree outer = TYPE_NAME (get_class_constant (jcf, ocii));
              tree alias = (ini ? get_name_constant (jcf, ini) : NULL_TREE);
+             set_class_decl_access_flags (acc, decl);
              DECL_CONTEXT (decl) = outer;
              DECL_INNER_CLASS_LIST (outer) =
                tree_cons (decl, alias, DECL_INNER_CLASS_LIST (outer));
              CLASS_COMPLETE_P (decl) = 1;
             }
        }
-      JCF_SKIP (jcf, 2);
     }
 }
 
@@ -788,10 +790,21 @@ parse_class_file ()
 
       if (METHOD_NATIVE (method))
        {
+         tree arg;
+         int  decl_max_locals;
+
          if (! flag_jni)
            continue;
-         DECL_MAX_LOCALS (method)
-           = list_length (TYPE_ARG_TYPES (TREE_TYPE (method)));
+         /* We need to compute the DECL_MAX_LOCALS. We need to take
+             the wide types into account too. */
+         for (arg = TYPE_ARG_TYPES (TREE_TYPE (method)), decl_max_locals = 0; 
+              arg != end_params_node;
+              arg = TREE_CHAIN (arg), decl_max_locals += 1)
+           {
+             if (TREE_VALUE (arg) && TYPE_IS_WIDE (TREE_VALUE (arg)))
+               decl_max_locals += 1;
+           }
+         DECL_MAX_LOCALS (method) = decl_max_locals;
          start_java_method (method);
          give_name_to_locals (jcf);
          expand_expr_stmt (build_jni_stub (method));
index 37b5f1d58b30722b04784b23a34afe2dfd6cc4ab..a56c8fc8b8b15c9d80bfea60b699566577196b93 100644 (file)
@@ -781,8 +781,14 @@ type_import_on_demand_declaration:
        IMPORT_TK name DOT_TK MULT_TK SC_TK
                {
                  tree name = EXPR_WFL_NODE ($2);
-                 /* Don't import java.lang.* twice. */
-                 if (name != java_lang_id)
+                 tree it;
+                 /* Search for duplicates. */
+                 for (it = ctxp->import_demand_list; it; it = TREE_CHAIN (it))
+                   if (EXPR_WFL_NODE (TREE_PURPOSE (it)) == name)
+                     break;
+                 /* Don't import the same thing more than once, just ignore
+                    duplicates (7.5.2) */
+                 if (! it)
                    {
                      read_import_dir ($2);
                      ctxp->import_demand_list =