PR 1208

Tom Tromey tromey@redhat.com
Tue Mar 20 16:43:00 GMT 2001


Per> This patch seems to fix the problem.  Please try that instead.

Thanks, looks fine to me.

Per> I'm going to try to figure out why the unreachable bytecodes are
Per> being emitted next.

I already have a partial patch for this problem.  Alex is working on
finishing it.  I believe this is the same problem as PR 2216.

I've appended the incomplete patch.  This patch gets pretty close, but
it causes some other failures.

Tom

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/ChangeLog,v
retrieving revision 1.647.2.10
diff -u -r1.647.2.10 ChangeLog
--- ChangeLog	2001/03/07 22:35:14	1.647.2.10
+++ ChangeLog	2001/03/14 16:56:55
@@ -1,3 +1,11 @@
+2001-03-13  Tom Tromey  <tromey@redhat.com>
+            Alexandre Petit-Bianco  <apbianco@redhat.com>
+
+	* parse.y (try_statement): Always create a TRY_BLOCK.
+	* jcf-write.c (generate_bytecode_insns): Correctly recognize empty
+	`finally' block.  Correctly generate `goto' when try block empty.
+	Don't generate `goto' when finally block empty.  Fixes PR java/2216.
+
 2001-03-07  Tom Tromey  <tromey@redhat.com>
 
 	* config-lang.in (lang_requires): Define.
Index: jcf-write.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-write.c,v
retrieving revision 1.72
diff -u -r1.72 jcf-write.c
--- jcf-write.c	2001/02/04 22:44:03	1.72
+++ jcf-write.c	2001/03/14 16:56:57
@@ -2342,7 +2342,9 @@
 
 	/* If the finally clause happens to be empty, set a flag so we
            remember to just skip it. */
-	if (BLOCK_EXPR_BODY (finally) == empty_stmt_node)
+	if ((TREE_CODE (finally) == BLOCK
+	     && BLOCK_EXPR_BODY (finally) == empty_stmt_node)
+	    || TREE_CODE (finally) == NOP_EXPR)
 	  worthwhile_finally = 0;
 
 	if (worthwhile_finally)
@@ -2363,23 +2365,29 @@
 
 	generate_bytecode_insns (try_block, target, state);
 
-	if (worthwhile_finally)
+	if (!worthwhile_finally)
+	  break;
+
+	if (state->labeled_blocks != finally_label)
+	  abort();
+	state->labeled_blocks = finally_label->next;
+
+	/* This point in the bytecode represents the collection point
+	   for the try clause and the various catch clauses -- each
+	   one which can complete normally will emit a `goto' to this
+	   point.  We want to generate a `jsr' to the `finally'
+	   clause, unless none of the preceding clauses can complete
+	   normally, since in that particular case the `jsr' would
+	   simply be dead code.  */
+	if (CAN_COMPLETE_NORMALLY (try_block))
 	  {
-	    if (state->labeled_blocks != finally_label)
-	      abort();
-	    state->labeled_blocks = finally_label->next;
 	    emit_jsr (finally_label, state);
+	    if (BLOCK_EXPR_BODY (TREE_OPERAND (try_block, 0))
+		!= empty_stmt_node)
+	      emit_goto (finished_label, state);
 	  }
 
-	if (CAN_COMPLETE_NORMALLY (try_block)
-	    && TREE_CODE (try_block) == BLOCK
-	    && BLOCK_EXPR_BODY (try_block) != empty_stmt_node)
-	  emit_goto (finished_label, state);
-
 	/* Handle exceptions. */
-
-	if (!worthwhile_finally)
-	  break;
 
 	localvar_alloc (return_link, state);
 	handler = alloc_handler (start_label, NULL_PTR, state);
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.251.2.6
diff -u -r1.251.2.6 parse.y
--- parse.y	2001/02/20 21:15:48	1.251.2.6
+++ parse.y	2001/03/14 16:57:09
@@ -1847,7 +1847,10 @@
 	TRY_TK block catches
 		{ $$ = build_try_statement ($1.location, $2, $3); }
 |	TRY_TK block finally
-		{ $$ = build_try_finally_statement ($1.location, $2, $3); }
+                { $$ = build_try_finally_statement 
+		    ($1.location, 
+		     build_try_statement ($1.location, $2, NULL_TREE), $3);
+		}
 |	TRY_TK block catches finally
 		{ $$ = build_try_finally_statement 
 		    ($1.location, build_try_statement ($1.location,



More information about the Java mailing list