This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

patch to avoid jc1 crash when reading .class files


This patches fixes a problem Hans Boehm reported when compiling
multiple .class files at once.  I've checked it into both the
branch and the trunk.

2001-05-21  Per Bothner  <per@bothner.com>

	* jcf-parse.c (read_class):  If class is from .class or .zip file
	and it's already been read, don't push/pop parser context.

Index: jcf-parse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-parse.c,v
retrieving revision 1.84
diff -u -p -r1.84 jcf-parse.c
--- jcf-parse.c	2001/04/21 00:01:11	1.84
+++ jcf-parse.c	2001/05/21 20:18:59
@@ -558,7 +558,6 @@ 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,14 +578,15 @@ read_class (name)
 
   current_jcf = jcf;
 
-  java_parser_context_save_global ();
-  java_push_parser_context ();
   if (current_jcf->java_source)
     {
       const char *filename = current_jcf->filename;
       tree 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);
       if (wfl_operator == NULL_TREE)
@@ -605,24 +605,28 @@ read_class (name)
 	    fatal_io_error ("can't close %s", input_filename);
 	}
       JCF_FINISH (current_jcf);
+      java_pop_parser_context (generate);
+      java_parser_context_restore_global ();
     }
   else
     {
-      input_filename = current_jcf->filename;
-      current_class = class;
       if (class == NULL_TREE || ! CLASS_PARSED_P (class))
 	{
+	  java_parser_context_save_global ();
+	  java_push_parser_context ();
+	  current_class = class;
+	  input_filename = current_jcf->filename;
 	  if (JCF_SEEN_IN_ZIP (current_jcf))
 	    read_zip_member(current_jcf,
 			    current_jcf->zipd, current_jcf->zipd->zipf);
 	  jcf_parse (current_jcf);
+	  class = current_class;
+	  java_pop_parser_context (0);
+	  java_parser_context_restore_global ();
 	}
-      layout_class (current_class);
-      load_inner_classes (current_class);
-      generate = 0;
+      layout_class (class);
+      load_inner_classes (class);
     }
-  java_pop_parser_context (generate);
-  java_parser_context_restore_global ();
 
   current_class = save_current_class;
   input_filename = save_input_filename;

-- 
	--Per Bothner
per@bothner.com   http://www.bothner.com/per/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]