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

Reply via email to