From 913746e3284267294197f2b41df8d5f67f9398a6 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 20 Dec 2002 19:25:46 +0000 Subject: [PATCH] re PR java/8955 (switch case statement causes gcj to throw segmentation fault) * jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case where minimum case value is Integer.MIN_VALUE. Fixes PR java/8955. From-SVN: r60372 --- gcc/java/ChangeLog | 6 ++++++ gcc/java/jcf-write.c | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 3b6cf6c8c3c..7567830e88d 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,9 @@ +2002-12-20 Tom Tromey + + * jcf-write.c (generate_bytecode_insns) [SWITCH_EXPR]: Handle case + where minimum case value is Integer.MIN_VALUE. + Fixes PR java/8955. + 2002-12-18 Andrew Haley * parse.y (patch_invoke): Force evaluation order when `check' is diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c index bfb1bd2724b..866ba7d7fa0 100644 --- a/gcc/java/jcf-write.c +++ b/gcc/java/jcf-write.c @@ -1746,6 +1746,7 @@ generate_bytecode_insns (exp, target, state) 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 @@ generate_bytecode_insns (exp, target, state) 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)); -- 2.30.2