From 4a70e37e7541cfcdfa7b96df83ed1ef54787133b Mon Sep 17 00:00:00 2001 From: Alexandre Petit-Bianco Date: Wed, 27 Jun 2001 13:38:20 -0700 Subject: [PATCH] class.c (set_super_info): Call `set_class_decl_access_flags.' 2001-06-27 Alexandre Petit-Bianco * 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 | 11 +++++++++++ gcc/java/class.c | 8 ++++++++ gcc/java/java-tree.h | 1 + gcc/java/jcf-parse.c | 19 ++++++++++++++++--- gcc/java/parse.y | 10 ++++++++-- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index c0b881cd1dc..676f7be1d7b 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,14 @@ +2001-06-27 Alexandre Petit-Bianco + + * 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 * zipfile.h: Use GCC_JCF_H instead of JCF_H. diff --git a/gcc/java/class.c b/gcc/java/class.c index 894671c2422..45bb6df2cf7 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -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; diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h index 914ba817967..d0c2d34b290 100644 --- a/gcc/java/java-tree.h +++ b/gcc/java/java-tree.h @@ -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)); diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 6127d9d64ac..82583e0360a 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -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)); diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 37b5f1d58b3..a56c8fc8b8b 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -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 = -- 2.30.2