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