diff options
author | Ranjit Mathew <rmathew@hotmail.com> | 2004-06-17 13:45:23 +0000 |
---|---|---|
committer | Ranjit Mathew <rmathew@gcc.gnu.org> | 2004-06-17 13:45:23 +0000 |
commit | cfb6b4b8c3c01be5a1d43695c9d2988838f2254a (patch) | |
tree | e9e1192174fd464acc4c3c8b496859d2d296a690 /gcc/java/jcf-parse.c | |
parent | 794c3bee303760a10e5442d23cda23b6c71ed5ea (diff) | |
download | gcc-cfb6b4b8c3c01be5a1d43695c9d2988838f2254a.zip gcc-cfb6b4b8c3c01be5a1d43695c9d2988838f2254a.tar.gz gcc-cfb6b4b8c3c01be5a1d43695c9d2988838f2254a.tar.bz2 |
re PR java/13948 (GCJ segmentation fault while compiling GL4Java .class files)
Fixes PR java/13948
* parse.y (java_layout_seen_class_methods): Ensure class is loaded
before trying to lay out its methods.
* jcf-parse.c (read_class): Track parsed files using canonical paths
obtained via lrealpath from libiberty.
(java_parse_file): Likewise.
(parse_source_file_1): Rename formal parameter to reflect its
modified purpose. Minor formatting fix.
From-SVN: r83292
Diffstat (limited to 'gcc/java/jcf-parse.c')
-rw-r--r-- | gcc/java/jcf-parse.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index a44e860..c948a1a 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -494,27 +494,33 @@ read_class (tree name) if (current_jcf->java_source) { const char *filename = current_jcf->filename; - tree file; + tree given_file, real_file; FILE *finput; int generate; java_parser_context_save_global (); java_push_parser_context (); - BUILD_FILENAME_IDENTIFIER_NODE (file, filename); - generate = IS_A_COMMAND_LINE_FILENAME_P (file); + + BUILD_FILENAME_IDENTIFIER_NODE (given_file, filename); + real_file = get_identifier (lrealpath (filename)); + + generate = IS_A_COMMAND_LINE_FILENAME_P (given_file); if (wfl_operator == NULL_TREE) wfl_operator = build_expr_wfl (NULL_TREE, NULL, 0, 0); - EXPR_WFL_FILENAME_NODE (wfl_operator) = file; + EXPR_WFL_FILENAME_NODE (wfl_operator) = given_file; input_filename = ggc_strdup (filename); output_class = current_class = NULL_TREE; current_function_decl = NULL_TREE; - if (!HAS_BEEN_ALREADY_PARSED_P (file)) + + if (! HAS_BEEN_ALREADY_PARSED_P (real_file)) { - if (!(finput = fopen (input_filename, "r"))) + if (! (finput = fopen (input_filename, "r"))) fatal_error ("can't reopen %s: %m", input_filename); - parse_source_file_1 (file, finput); + + parse_source_file_1 (real_file, finput); parse_source_file_2 (); parse_source_file_3 (); + if (fclose (finput)) fatal_error ("can't close %s: %m", input_filename); } @@ -798,11 +804,12 @@ parse_class_file (void) /* Parse a source file, as pointed by the current value of INPUT_FILENAME. */ static void -parse_source_file_1 (tree file, FILE *finput) +parse_source_file_1 (tree real_file, FILE *finput) { int save_error_count = java_error_count; - /* Mark the file as parsed */ - HAS_BEEN_ALREADY_PARSED_P (file) = 1; + + /* Mark the file as parsed. */ + HAS_BEEN_ALREADY_PARSED_P (real_file) = 1; jcf_dependency_add_file (input_filename, 0); @@ -1015,9 +1022,11 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) unsigned char magic_string[4]; uint32 magic = 0; tree name = TREE_VALUE (node); + tree real_file; /* Skip already parsed files */ - if (HAS_BEEN_ALREADY_PARSED_P (name)) + real_file = get_identifier (lrealpath (IDENTIFIER_POINTER (name))); + if (HAS_BEEN_ALREADY_PARSED_P (real_file)) continue; /* Close previous descriptor, if any */ @@ -1075,7 +1084,8 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED) JAVA_FILE_P (node) = 1; java_push_parser_context (); java_parser_context_save_global (); - parse_source_file_1 (name, finput); + + parse_source_file_1 (real_file, finput); java_parser_context_restore_global (); java_pop_parser_context (1); } |