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


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

[PATCH] Java: fixes to java/1958, java/2633 and java/1314.



This fixes the following PRs:

  http://gcc.gnu.org/ml/java-prs/2001-q1/msg00036.html
  http://gcc.gnu.org/ml/java-prs/2001-q2/msg00015.html
  http://gcc.gnu.org/ml/java-prs/2000-q3/msg00091.html

I'm checking this in.

./A

2001-07-03  Alexandre Petit-Bianco  <apbianco@redhat.com>

	* parse.y (resolve_expression_name): Improved error message for
	inner class cases.
	Fixes PR java/1958

2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>

	* jcf-parse.c (gcc_mark_jcf): Test for a finished JCF.
	* jcf.h (typedef struct JCF): New bitfield `finished.'
	(JCF_FINISH): Set `finished.'
	(JCF_ZERO): Reset `finished.'
	Fixes PR java/2633

2001-06-27  Alexandre Petit-Bianco  <apbianco@redhat.com>

	* parse.y (class_body_declaration:): Don't install empty instance
	initializers.
	Fixes PR java/1314

Index: jcf-parse.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-parse.c,v
retrieving revision 1.87
diff -u -p -r1.87 jcf-parse.c
--- jcf-parse.c	2001/07/04 17:55:20	1.87
+++ jcf-parse.c	2001/07/05 22:26:57
@@ -101,14 +101,15 @@ static void jcf_parse PARAMS ((struct JC
 static void load_inner_classes PARAMS ((tree));
 
 /* Mark (for garbage collection) all the tree nodes that are
-   referenced from JCF's constant pool table. */
+   referenced from JCF's constant pool table. Do that only if the JCF
+   hasn't been marked finished.  */
 
 static void
 ggc_mark_jcf (elt)
      void **elt;
 {
   JCF *jcf = *(JCF**) elt;
-  if (jcf != NULL)
+  if (jcf != NULL && !jcf->finished)
     {
       CPool *cpool = &jcf->cpool;
       int size = CPOOL_COUNT(cpool);
Index: jcf.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf.h,v
retrieving revision 1.23
diff -u -p -r1.23 jcf.h
--- jcf.h	2001/05/26 01:31:47	1.23
+++ jcf.h	2001/07/05 22:26:58
@@ -90,6 +90,7 @@ typedef struct JCF {
   unsigned char *read_end;
   int java_source : 1;
   int right_zip : 1;
+  int finished : 1;
   jcf_filbuf_t filbuf;
   void *read_state;
   const char *filename;
@@ -144,7 +145,8 @@ typedef struct JCF {
   CPOOL_FINISH(&(JCF)->cpool); \
   if ((JCF)->buffer) FREE ((JCF)->buffer); \
   if ((JCF)->filename) FREE ((char *) (JCF)->filename); \
-  if ((JCF)->classname) FREE ((char *) (JCF)->classname); }
+  if ((JCF)->classname) FREE ((char *) (JCF)->classname); \
+  (JCF)->finished = 1; }
   
 #define CPOOL_INIT(CPOOL) \
   ((CPOOL)->capacity = 0, (CPOOL)->count = 0, (CPOOL)->tags = 0, (CPOOL)->data = 0)
@@ -154,7 +156,8 @@ typedef struct JCF {
 #define JCF_ZERO(JCF)  \
   ((JCF)->buffer = (JCF)->buffer_end = (JCF)->read_ptr = (JCF)->read_end = 0,\
    (JCF)->read_state = 0, (JCF)->filename = (JCF)->classname = 0, \
-   CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0)
+   CPOOL_INIT(&(JCF)->cpool), (JCF)->java_source = 0, (JCF)->zipd = 0, \
+   (JCF)->finished = 0)
 
 /* Given that PTR points to a 2-byte unsigned integer in network
    (big-endian) byte-order, return that integer. */
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.292
diff -u -p -r1.292 parse.y
--- parse.y	2001/07/03 23:44:07	1.292
+++ parse.y	2001/07/05 22:27:37
@@ -924,8 +924,11 @@ class_body_declaration:
 |	constructor_declaration
 |	block			/* Added, JDK1.1, instance initializer */
 		{
-		  TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
-		  SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
+		  if ($1 != empty_stmt_node)
+		    {
+		      TREE_CHAIN ($1) = CPC_INSTANCE_INITIALIZER_STMT (ctxp);
+		      SET_CPC_INSTANCE_INITIALIZER_STMT (ctxp, $1);
+		    }
 		}
 ;
 
@@ -8952,8 +8955,15 @@ resolve_expression_name (id, orig)
     }
 
   /* We've got an error here */
-  parse_error_context (id, "Undefined variable `%s'", 
-		       IDENTIFIER_POINTER (name));
+  if (INNER_CLASS_TYPE_P (current_class))
+    parse_error_context (id, 
+			 "Local variable `%s' can't be accessed from within the inner class `%s' unless it is declared final",
+			 IDENTIFIER_POINTER (name),
+			 IDENTIFIER_POINTER (DECL_NAME
+					     (TYPE_NAME (current_class))));
+  else
+    parse_error_context (id, "Undefined variable `%s'", 
+			 IDENTIFIER_POINTER (name));
 
   return error_mark_node;
 }


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