From 98f705b937992d93e48c6085b45630d57122a99f Mon Sep 17 00:00:00 2001 From: Alexandre Petit-Bianco Date: Thu, 25 Oct 2001 14:37:44 -0700 Subject: mangle.c (static tree compression_table): Fixed leading comment. 2001-10-24 Alexandre Petit-Bianco * mangle.c (static tree compression_table): Fixed leading comment. * parse.h (struct parser_ctxt): Fixed field comment. * parse.y (check_pkg_class_access): New prototype, fixed leading comment, new parameter used to emit error only if passed as true. (parse_check_super): Pass extra argument to check_pkg_class_access. (do_resolve_class): Likewise. (process_imports): Likewise. (read_import_dir): Fixed indentation. (find_in_imports_on_demand): New local class_type_name. Local node_to_use deleted. while loop changed into for loop. Report multiple definition only for accessible classes. Improved error message. (start_complete_expand_method): Local `ptr' removed. DECL_ARGUMENTS assigned to parameter list, fixed indentation. while loop changed into for loop, restore TREE_CHAIN on local `tem' before the next iteration. ( http://gcc.gnu.org/ml/gcc-patches/2001-10/msg01323.html ) From-SVN: r46498 --- gcc/java/ChangeLog | 19 +++++++ gcc/java/mangle.c | 2 +- gcc/java/parse.h | 2 +- gcc/java/parse.y | 145 +++++++++++++++++++++++++++++++---------------------- 4 files changed, 107 insertions(+), 61 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 6ed6204..7e05cc2 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,22 @@ +2001-10-24 Alexandre Petit-Bianco + + * mangle.c (static tree compression_table): Fixed leading comment. + * parse.h (struct parser_ctxt): Fixed field comment. + * parse.y (check_pkg_class_access): New prototype, fixed leading + comment, new parameter used to emit error only if passed as true. + (parse_check_super): Pass extra argument to check_pkg_class_access. + (do_resolve_class): Likewise. + (process_imports): Likewise. + (read_import_dir): Fixed indentation. + (find_in_imports_on_demand): New local class_type_name. Local + node_to_use deleted. while loop changed into for loop. Report + multiple definition only for accessible classes. Improved error + message. + (start_complete_expand_method): Local `ptr' removed. DECL_ARGUMENTS + assigned to parameter list, fixed indentation. while loop changed + into for loop, restore TREE_CHAIN on local `tem' before the next + iteration. + Tue Oct 23 14:02:17 2001 Richard Kenner * lang.c (lang_get_alias_set): Deleted. diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c index 027eb5d..f0bda0e 100644 --- a/gcc/java/mangle.c +++ b/gcc/java/mangle.c @@ -255,7 +255,7 @@ mangle_type (type) /* The compression table is a vector that keeps track of things we've already seen, so they can be reused. For example, java.lang.Object - Would generate three entries: two package names and a type. If + would generate three entries: two package names and a type. If java.lang.String is presented next, the java.lang will be matched against the first two entries (and kept for compression as S_0), and type String would be added to the table. See mangle_record_type. diff --git a/gcc/java/parse.h b/gcc/java/parse.h index f425750..22056715 100644 --- a/gcc/java/parse.h +++ b/gcc/java/parse.h @@ -785,7 +785,7 @@ struct parser_ctxt { tree non_static_initialized; /* List of non static initialized fields */ tree static_initialized; /* List of static non final initialized */ - tree instance_initializers; /* List of instancei initializers stmts */ + tree instance_initializers; /* List of instance initializers stmts */ tree import_list; /* List of import */ tree import_demand_list; /* List of import on demand */ diff --git a/gcc/java/parse.y b/gcc/java/parse.y index f699c5d..0fed076 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -108,7 +108,7 @@ static void reset_final_variable_local_assignment_flag PARAMS ((tree)); static int check_final_variable_indirect_assignment PARAMS ((tree)); static void check_final_variable_global_assignment_flag PARAMS ((tree)); static void check_inner_class_access PARAMS ((tree, tree, tree)); -static int check_pkg_class_access PARAMS ((tree, tree)); +static int check_pkg_class_access PARAMS ((tree, tree, bool)); static void register_package PARAMS ((tree)); static tree resolve_package PARAMS ((tree, tree *)); static tree lookup_package_type PARAMS ((const char *, int)); @@ -5079,7 +5079,8 @@ parser_check_super_interface (super_decl, this_decl, this_wfl) /* Check top-level interface access. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) - && check_pkg_class_access (DECL_NAME (super_decl), lookup_cl (this_decl))) + && check_pkg_class_access (DECL_NAME (super_decl), + lookup_cl (this_decl), true)) return 1; SOURCE_FRONTEND_DEBUG (("Completing interface %s with %s", @@ -5118,7 +5119,7 @@ parser_check_super (super_decl, this_decl, wfl) /* Check top-level class scope. Inner classes are subject to member access rules (6.6.1). */ if (! INNER_CLASS_P (super_type) - && (check_pkg_class_access (DECL_NAME (super_decl), wfl))) + && (check_pkg_class_access (DECL_NAME (super_decl), wfl, true))) return 1; SOURCE_FRONTEND_DEBUG (("Completing class %s with %s", @@ -5834,7 +5835,7 @@ do_resolve_class (enclosing, class_type, decl, cl) by the caller. */ if (cl) { - if (check_pkg_class_access (TYPE_NAME (class_type), cl)) + if (check_pkg_class_access (TYPE_NAME (class_type), cl, true)) return NULL_TREE; } @@ -6676,7 +6677,7 @@ process_imports () QUALIFIED_P (to_be_found) = 1; load_class (to_be_found, 0); error_found = - check_pkg_class_access (to_be_found, TREE_PURPOSE (import)); + check_pkg_class_access (to_be_found, TREE_PURPOSE (import), true); /* We found it, we can bail out */ if (IDENTIFIER_CLASS_VALUE (to_be_found)) @@ -6765,7 +6766,6 @@ read_import_dir (wfl) void *entry; struct buffer filename[1]; - if (IS_AN_IMPORT_ON_DEMAND_P (package_id)) return; IS_AN_IMPORT_ON_DEMAND_P (package_id) = 1; @@ -6878,71 +6878,95 @@ find_in_imports_on_demand (enclosing_type, class_type) tree enclosing_type; tree class_type; { + tree class_type_name = TYPE_NAME (class_type); tree import = (enclosing_type ? TYPE_IMPORT_DEMAND_LIST (enclosing_type) : ctxp->import_demand_list); - tree node_to_use = NULL_TREE, cl = NULL_TREE; + tree cl = NULL_TREE; + int seen_once = -1; /* -1 when not set, 1 if seen once, >1 otherwise. */ + int to_return = -1; /* -1 when not set, 0 or 1 otherwise */ tree node; - int seen_once = -1; - while (import) + for (; import; import = TREE_CHAIN (import)) { + int saved_lineno = lineno; + int access_check; const char *id_name; + tree decl, type_name_copy; + obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import))), IDENTIFIER_LENGTH (EXPR_WFL_NODE (TREE_PURPOSE (import)))); obstack_1grow (&temporary_obstack, '.'); obstack_grow0 (&temporary_obstack, - IDENTIFIER_POINTER (TYPE_NAME (class_type)), - IDENTIFIER_LENGTH (TYPE_NAME (class_type))); + IDENTIFIER_POINTER (class_type_name), + IDENTIFIER_LENGTH (class_type_name)); id_name = obstack_finish (&temporary_obstack); - node = maybe_get_identifier (id_name); - if (node && IS_A_CLASSFILE_NAME (node)) + if (! (node = maybe_get_identifier (id_name))) + continue; + + /* Setup lineno so that it refers to the line of the import (in + case we parse a class file and encounter errors */ + lineno = EXPR_WFL_LINENO (TREE_PURPOSE (import)); + + type_name_copy = TYPE_NAME (class_type); + TYPE_NAME (class_type) = node; + QUALIFIED_P (node) = 1; + decl = IDENTIFIER_CLASS_VALUE (node); + access_check = -1; + /* If there is no DECL set for the class or if the class isn't + loaded and not seen in source yet, then load */ + if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) + && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) + { + load_class (node, 0); + decl = IDENTIFIER_CLASS_VALUE (node); + } + if (decl && ! INNER_CLASS_P (TREE_TYPE (decl))) + access_check = check_pkg_class_access (node, TREE_PURPOSE (import), + false); + else + /* 6.6.1: Inner classes are subject to member access rules. */ + access_check = 0; + + lineno = saved_lineno; + + /* If the loaded class is not accessible or couldn't be loaded, + we restore the original TYPE_NAME and process the next + import. */ + if (access_check || !decl) + { + TYPE_NAME (class_type) = type_name_copy; + continue; + } + + /* If the loaded class is accessible, we keep a tab on it to + detect and report multiple inclusions. */ + if (IS_A_CLASSFILE_NAME (node)) { if (seen_once < 0) { cl = TREE_PURPOSE (import); seen_once = 1; - node_to_use = node; } - else + else if (seen_once >= 0) { + tree location = (cl ? cl : TREE_PURPOSE (import)); + tree package = (cl ? EXPR_WFL_NODE (cl) : + EXPR_WFL_NODE (TREE_PURPOSE (import))); seen_once++; parse_error_context - (TREE_PURPOSE (import), + (location, "Type `%s' also potentially defined in package `%s'", - IDENTIFIER_POINTER (TYPE_NAME (class_type)), - IDENTIFIER_POINTER (EXPR_WFL_NODE (TREE_PURPOSE (import)))); + IDENTIFIER_POINTER (TYPE_NAME (class_type)), + IDENTIFIER_POINTER (package)); } } - import = TREE_CHAIN (import); + to_return = access_check; } if (seen_once == 1) - { - /* Setup lineno so that it refers to the line of the import (in - case we parse a class file and encounter errors */ - tree decl; - int saved_lineno = lineno; - lineno = EXPR_WFL_LINENO (cl); - TYPE_NAME (class_type) = node_to_use; - QUALIFIED_P (TYPE_NAME (class_type)) = 1; - decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - /* If there is no DECL set for the class or if the class isn't - loaded and not seen in source yet, the load */ - if (!decl || (!CLASS_LOADED_P (TREE_TYPE (decl)) - && !CLASS_FROM_SOURCE_P (TREE_TYPE (decl)))) - { - load_class (node_to_use, 0); - decl = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type)); - } - lineno = saved_lineno; - if (! INNER_CLASS_P (TREE_TYPE (decl))) - return check_pkg_class_access (TYPE_NAME (class_type), cl); - else - /* 6.6.1: Inner classes are subject to member access rules. */ - return 0; - } + return to_return; else return (seen_once < 0 ? 0 : seen_once); /* It's ok not to have found */ } @@ -7118,14 +7142,16 @@ check_inner_class_access (decl, enclosing_decl, cl) lang_printable_name (decl, 0), access); } -/* Accessibility check for top-level classes. If CLASS_NAME is in a foreign - package, it must be PUBLIC. Return 0 if no access violations were found, - 1 otherwise. */ +/* Accessibility check for top-level classes. If CLASS_NAME is in a + foreign package, it must be PUBLIC. Return 0 if no access + violations were found, 1 otherwise. If VERBOSE is true and an error + was found, it is reported and accounted for. */ static int -check_pkg_class_access (class_name, cl) +check_pkg_class_access (class_name, cl, verbose) tree class_name; tree cl; + bool verbose; { tree type; @@ -7148,10 +7174,11 @@ check_pkg_class_access (class_name, cl) /* Both in the same package. */ return 0; - parse_error_context - (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", - (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), - IDENTIFIER_POINTER (class_name)); + if (verbose) + parse_error_context + (cl, "Can't access %s `%s'. Only public classes and interfaces in other packages can be accessed", + (CLASS_INTERFACE (TYPE_NAME (type)) ? "interface" : "class"), + IDENTIFIER_POINTER (class_name)); return 1; } return 0; @@ -7926,14 +7953,15 @@ static void start_complete_expand_method (mdecl) tree mdecl; { - tree tem, *ptr; + tree tem; pushlevel (1); /* Prepare for a parameter push */ - ptr = &DECL_ARGUMENTS (mdecl); - tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); + tem = BLOCK_EXPR_DECLS (DECL_FUNCTION_BODY (current_function_decl)); + DECL_ARGUMENTS (mdecl) = tem; - while (tem) + for (; tem; tem = TREE_CHAIN (tem)) { + /* TREE_CHAIN (tem) will change after pushdecl. */ tree next = TREE_CHAIN (tem); tree type = TREE_TYPE (tem); if (PROMOTE_PROTOTYPES @@ -7943,11 +7971,10 @@ start_complete_expand_method (mdecl) DECL_ARG_TYPE (tem) = type; layout_decl (tem, 0); pushdecl (tem); - *ptr = tem; - ptr = &TREE_CHAIN (tem); - tem = next; + /* Re-install the next so that the list is kept and the loop + advances. */ + TREE_CHAIN (tem) = next; } - *ptr = NULL_TREE; pushdecl_force_head (DECL_ARGUMENTS (mdecl)); lineno = DECL_SOURCE_LINE_FIRST (mdecl); build_result_decl (mdecl); -- cgit v1.1