aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/jcf-parse.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>2001-04-20 17:01:12 -0700
committerPer Bothner <bothner@gcc.gnu.org>2001-04-20 17:01:12 -0700
commit3c0ce750cb50921dee27d1399bd14a10145f7538 (patch)
tree3e403b7d575e2f47a8246846495c78ecb309ed18 /gcc/java/jcf-parse.c
parentc1800ec88e53d47792c9b01672d4feabba209a3c (diff)
downloadgcc-3c0ce750cb50921dee27d1399bd14a10145f7538.zip
gcc-3c0ce750cb50921dee27d1399bd14a10145f7538.tar.gz
gcc-3c0ce750cb50921dee27d1399bd14a10145f7538.tar.bz2
Fixes to compile multiple .class files at once.
From-SVN: r41472
Diffstat (limited to 'gcc/java/jcf-parse.c')
-rw-r--r--gcc/java/jcf-parse.c113
1 files changed, 60 insertions, 53 deletions
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index f235f6d..4be3453 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -93,7 +93,6 @@ static void parse_zip_file_entries PARAMS ((void));
static void process_zip_dir PARAMS ((FILE *));
static void parse_source_file_1 PARAMS ((tree, FILE *));
static void parse_source_file_2 PARAMS ((void));
-static void jcf_parse_source PARAMS ((void));
static void parse_class_file PARAMS ((void));
static void set_source_filename PARAMS ((JCF *, int));
static int predefined_filename_p PARAMS ((tree));
@@ -559,6 +558,7 @@ read_class (name)
tree save_current_class = current_class;
const char *save_input_filename = input_filename;
JCF *save_current_jcf = current_jcf;
+ int generate;
if ((icv = IDENTIFIER_CLASS_VALUE (name)) != NULL_TREE)
{
@@ -579,23 +579,50 @@ read_class (name)
current_jcf = jcf;
+ java_parser_context_save_global ();
+ java_push_parser_context ();
if (current_jcf->java_source)
- jcf_parse_source ();
- else {
- java_parser_context_save_global ();
- java_push_parser_context ();
- input_filename = current_jcf->filename;
- current_class = class;
- if (JCF_SEEN_IN_ZIP (current_jcf))
- read_zip_member(current_jcf, current_jcf->zipd, current_jcf->zipd->zipf);
- jcf_parse (current_jcf);
- load_inner_classes (current_class);
- java_pop_parser_context (0);
- java_parser_context_restore_global ();
- }
-
- if (! JCF_SEEN_IN_ZIP (current_jcf))
- JCF_FINISH (current_jcf);
+ {
+ const char *filename = current_jcf->filename;
+ tree file;
+ FILE *finput;
+
+ BUILD_FILENAME_IDENTIFIER_NODE (file, filename);
+ generate = IS_A_COMMAND_LINE_FILENAME_P (file);
+ if (wfl_operator == NULL_TREE)
+ wfl_operator = build_expr_wfl (NULL_TREE, NULL, 0, 0);
+ EXPR_WFL_FILENAME_NODE (wfl_operator) = file;
+ input_filename = ggc_strdup (filename);
+ current_class = NULL_TREE;
+ current_function_decl = NULL_TREE;
+ if (!HAS_BEEN_ALREADY_PARSED_P (file))
+ {
+ if (!(finput = fopen (input_filename, "r")))
+ fatal_io_error ("can't reopen %s", input_filename);
+ parse_source_file_1 (file, finput);
+ parse_source_file_2 ();
+ if (fclose (finput))
+ fatal_io_error ("can't close %s", input_filename);
+ }
+ JCF_FINISH (current_jcf);
+ }
+ else
+ {
+ input_filename = current_jcf->filename;
+ current_class = class;
+ if (class == NULL_TREE || ! CLASS_PARSED_P (class))
+ {
+ if (JCF_SEEN_IN_ZIP (current_jcf))
+ read_zip_member(current_jcf,
+ current_jcf->zipd, current_jcf->zipd->zipf);
+ jcf_parse (current_jcf);
+ }
+ layout_class (current_class);
+ load_inner_classes (current_class);
+ generate = 0;
+ }
+ java_pop_parser_context (generate);
+ java_parser_context_restore_global ();
current_class = save_current_class;
input_filename = save_input_filename;
@@ -632,36 +659,6 @@ load_class (class_or_name, verbose)
error ("Cannot find file for class %s.", IDENTIFIER_POINTER (name));
}
-/* Parse a source file when JCF refers to a source file. */
-
-static void
-jcf_parse_source ()
-{
- tree file;
- FILE *finput;
-
- java_parser_context_save_global ();
- java_push_parser_context ();
- BUILD_FILENAME_IDENTIFIER_NODE (file, current_jcf->filename);
- if (wfl_operator == NULL_TREE)
- wfl_operator = build_expr_wfl (NULL_TREE, NULL, 0, 0);
- EXPR_WFL_FILENAME_NODE (wfl_operator) = file;
- input_filename = ggc_strdup (current_jcf->filename);
- current_class = NULL_TREE;
- current_function_decl = NULL_TREE;
- if (!HAS_BEEN_ALREADY_PARSED_P (file))
- {
- if (!(finput = fopen (input_filename, "r")))
- fatal_io_error ("can't reopen %s", input_filename);
- parse_source_file_1 (file, finput);
- parse_source_file_2 ();
- if (fclose (finput))
- fatal_io_error ("can't close %s", input_filename);
- }
- java_pop_parser_context (IS_A_COMMAND_LINE_FILENAME_P (file));
- java_parser_context_restore_global ();
-}
-
/* Parse the .class file JCF. */
void
@@ -686,9 +683,14 @@ jcf_parse (jcf)
fprintf (stderr, " %s %s",
(jcf->access_flags & ACC_INTERFACE) ? "interface" : "class",
IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))));
- if (CLASS_LOADED_P (current_class))
- return;
- CLASS_LOADED_P (current_class) = 1;
+ if (CLASS_PARSED_P (current_class))
+ {
+ /* FIXME - where was first time */
+ fatal_error ("reading class %s for the second time from %s",
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (current_class))),
+ jcf->filename);
+ }
+ CLASS_PARSED_P (current_class) = 1;
for (i = 1; i < JPOOL_SIZE(jcf); i++)
{
@@ -714,7 +716,6 @@ jcf_parse (jcf)
if (current_class != class_type_node && current_class != object_type_node)
TYPE_FIELDS (current_class) = nreverse (TYPE_FIELDS (current_class));
- layout_class (current_class);
if (current_class == object_type_node)
{
layout_class_methods (object_type_node);
@@ -1123,8 +1124,10 @@ yyparse ()
{
current_class = TREE_PURPOSE (node);
current_jcf = TYPE_JCF (current_class);
+ layout_class (current_class);
load_inner_classes (current_class);
parse_class_file ();
+ JCF_FINISH (current_jcf);
}
}
input_filename = main_input_filename;
@@ -1157,8 +1160,12 @@ parse_zip_file_entries (void)
if ( !CLASS_LOADED_P (class))
{
- read_zip_member(current_jcf, zdir, localToFile);
- jcf_parse (current_jcf);
+ if (! CLASS_PARSED_P (class))
+ {
+ read_zip_member(current_jcf, zdir, localToFile);
+ jcf_parse (current_jcf);
+ }
+ layout_class (current_class);
load_inner_classes (current_class);
}