Patch: PR java/8955

Tom Tromey tromey@redhat.com
Wed Dec 18 19:40:00 GMT 2002


This patch fixes PR java/8955.

In this PR the lowest value in a switch statement was
Integer.MIN_VALUE.  This caused overflow in the comparison to see
whether we should generate a tableswitch.

The fix is to use an unsigned result.  Then overflow is interpreted as
a "no".

Ok to commit?

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>

	* jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case
	where minimum case value is Integer.MIN_VALUE.
	Fixes PR java/8955.

Index: jcf-write.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jcf-write.c,v
retrieving revision 1.111
diff -u -r1.111 jcf-write.c
--- jcf-write.c 16 Dec 2002 18:22:35 -0000 1.111
+++ jcf-write.c 19 Dec 2002 03:27:30 -0000
@@ -1746,6 +1746,7 @@
 	else
 	  {
 	    HOST_WIDE_INT i;
+	    unsigned HOST_WIDE_INT delta;
 	    /* Copy the chain of relocs into a sorted array. */
 	    struct jcf_relocation **relocs = (struct jcf_relocation **)
 	      xmalloc (sw_state.num_cases * sizeof (struct jcf_relocation *));
@@ -1778,8 +1779,11 @@
 		   handled by the parser.  */
 	      }
 
-	    if (2 * sw_state.num_cases
-		>= sw_state.max_case - sw_state.min_case)
+	    /* We could have DELTA < 0 if sw_state.min_case is
+	       something like Integer.MIN_VALUE.  That is why delta is
+	       unsigned.  */
+	    delta = sw_state.max_case - sw_state.min_case;
+	    if (2 * sw_state.num_cases >= delta)
 	      { /* Use tableswitch. */
 		int index = 0;
 		RESERVE (13 + 4 * (sw_state.max_case - sw_state.min_case + 1));



More information about the Java-patches mailing list