gcc 3.2 has a bug that makes SArray's shift_* not work when compiled with optimization. This works around it (and is arguably better style anyway). gcc will receive a bug report if I can manage to reduce the problem.
Index: classes/sarray.pmc =================================================================== RCS file: /cvs/public/parrot/classes/sarray.pmc,v retrieving revision 1.7 diff -u -r1.7 sarray.pmc --- classes/sarray.pmc 14 Jul 2003 09:54:48 -0000 1.7 +++ classes/sarray.pmc 20 Jul 2003 02:06:16 -0000 @@ -145,13 +145,14 @@ INTVAL shift_integer() { HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF); + HASH_ENTRY *ret; if (e[0].val.int_val >= e[1].val.int_val) internal_exception(OUT_OF_BOUNDS, "SArray index out of bounds!\n"); - e = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); - if (e->type != enum_hash_int) + ret = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); + if (ret->type != enum_hash_int) internal_exception(OUT_OF_BOUNDS, "SArray: Not an integer!\n"); - return e->val.int_val; + return ret->val.int_val; } FLOATVAL get_number_keyed_int (INTVAL key) { @@ -175,13 +176,14 @@ FLOATVAL shift_float() { HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF); + HASH_ENTRY *ret; if (e[0].val.int_val >= e[1].val.int_val) internal_exception(OUT_OF_BOUNDS, "SArray index out of bounds!\n"); - e = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); - if (e->type != enum_hash_num) + ret = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); + if (ret->type != enum_hash_num) internal_exception(OUT_OF_BOUNDS, "SArray: Not a num!\n"); - return e->val.num_val; + return ret->val.num_val; } STRING* get_string_keyed_int (INTVAL key) { @@ -205,13 +207,14 @@ STRING* shift_string() { HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF); + HASH_ENTRY *ret; if (e[0].val.int_val >= e[1].val.int_val) internal_exception(OUT_OF_BOUNDS, "SArray index out of bounds!\n"); - e = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); - if (e->type != enum_hash_string) + ret = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); + if (ret->type != enum_hash_string) internal_exception(OUT_OF_BOUNDS, "SArray: Not a string!\n"); - return e->val.string_val; + return ret->val.string_val; } PMC* get_pmc_keyed_int (INTVAL key) { @@ -252,13 +255,14 @@ PMC* shift_pmc() { HASH_ENTRY *e = (HASH_ENTRY *) PMC_data(SELF); + HASH_ENTRY *ret; if (e[0].val.int_val >= e[1].val.int_val) internal_exception(OUT_OF_BOUNDS, "SArray index out of bounds!\n"); - e = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); - if (e->type != enum_hash_pmc) + ret = (HASH_ENTRY *) PMC_data(SELF) + (2 + e[0].val.int_val++); + if (ret->type != enum_hash_pmc) internal_exception(OUT_OF_BOUNDS, "SArray: Not a pmc!\n"); - return e->val.pmc_val; + return ret->val.pmc_val; } void set_integer (PMC* value) { Index: t/pmc/sarray.t =================================================================== RCS file: /cvs/public/parrot/t/pmc/sarray.t,v retrieving revision 1.2 diff -u -r1.2 sarray.t --- t/pmc/sarray.t 4 Jul 2003 18:20:30 -0000 1.2 +++ t/pmc/sarray.t 20 Jul 2003 02:06:17 -0000 @@ -273,6 +273,7 @@ ok1: print "ok 1\n" set I0, P0 eq I0, 2, ok2 + print "not " ok2: print "ok 2\n" shift I0, P0 @@ -281,6 +282,7 @@ ok3: print "ok 3\n" set I0, P0 eq I0, 1, ok4 + print "not " ok4: print "ok 4\n" shift I0, P0 @@ -289,6 +291,7 @@ ok5: print "ok 5\n" set I0, P0 eq I0, 0, ok6 + print "not " ok6: print "ok 6\n" end CODE