# New Ticket Created by  Simon Glover 
# Please include the string:  [netlabs #788]
# in the subject line of all future correspondence about this issue. 
# <URL: http://bugs6.perl.org/rt2/Ticket/Display.html?id=788 >



 This patch fixes a number of off-by-one errors in array.pmc, and adds a
 few more tests.

 Simon

--- classes/array.pmc.old       Wed Jul 10 15:33:45 2002
+++ classes/array.pmc   Wed Jul 10 15:50:03 2002
@@ -71,7 +71,7 @@ pmclass Array {
     }

     INTVAL type () {
-        return 0;
+        return enum_class_Array;
     }

     INTVAL type_keyed (KEY* key) {
@@ -132,7 +132,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -156,7 +156,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -181,7 +181,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -205,7 +205,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -229,7 +229,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -254,7 +254,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -274,7 +274,7 @@ pmclass Array {
         kp = &key->atom;
         ix = atom2int(INTERP, kp);

-        if (ix > SELF->cache.int_val || ix < 0) {
+        if (ix >= SELF->cache.int_val || ix < 0) {
             internal_exception(OUT_OF_BOUNDS, "Array element out of bounds!\n");
         }

@@ -336,11 +336,11 @@ pmclass Array {

     void set_number (PMC * value) {
         INTVAL idx = (INTVAL)value->cache.num_val;
-        resize_array(interpreter, SELF, idx+1);
+        resize_array(interpreter, SELF, idx);
     }

     void set_number_native (FLOATVAL idx) {
-        resize_array(interpreter, SELF, (INTVAL)idx + 1);
+        resize_array(interpreter, SELF, (INTVAL)idx);
     }

     void set_number_bignum (BIGNUM* value) {


--- t/pmc/array.t.old   Wed Jul 10 15:24:00 2002
+++ t/pmc/array.t       Wed Jul 10 16:01:47 2002
@@ -1,9 +1,9 @@
 #! perl -w

-use Parrot::Test tests => 1;
+use Parrot::Test tests => 5;
 use Test::More;

-output_is(<<'CODE', <<'OUTPUT', "Basic array tests");
+output_is(<<'CODE', <<'OUTPUT', "Setting array size");
        new P0,.Array

        set I0,P0
@@ -17,31 +17,108 @@ OK_1:      print "ok 1\n"
        print "not "
 OK_2:  print "ok 2\n"

+       set P0,2.0
+       set I0,P0
+       eq I0,2,OK_3
+       print "not "
+OK_3:  print "ok 3\n"
+
+        new P1, .PerlInt
+        set P1, 3
+       set P0,P1
+       set I0,P0
+       eq I0,3,OK_4
+       print "not "
+OK_4:  print "ok 4\n"
+
+
+        end
+CODE
+ok 1
+ok 2
+ok 3
+ok 4
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "Setting first element");
+        new P0, .Array
+        set P0, 1
+
        set P0,0,-7 # set P0[0], -7
        set I0,P0,0 # set I0, P0[0]
-       eq I0,-7,OK_3
+       eq I0,-7,OK_1
        print "not "
-OK_3:  print "ok 3\n"
+OK_1:  print "ok 1\n"

        set P0,0,3.7 # set P0[0], 3.7
        set N0,P0,0 # set N0, P0[0]
-       eq N0,3.7,OK_4
+       eq N0,3.7,OK_2
        print "not "
-OK_4:  print "ok 4\n"
+OK_2:  print "ok 2\n"

        set P0,0,"Buckaroo" # set P0[0], "Buckaroo"
        set S0,P0,0 # set S0, P0[0]
-       eq S0,"Buckaroo",OK_5
+       eq S0,"Buckaroo",OK_3
        print "not "
-OK_5:  print "ok 5\n"
+OK_3:  print "ok 3\n"

        end
 CODE
 ok 1
 ok 2
 ok 3
-ok 4
-ok 5
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "Setting second element");
+        new P0, .Array
+        set P0, 2
+
+       set P0[1], -7
+       set I0, P0[1]
+       eq I0,-7,OK_1
+       print "not "
+OK_1:  print "ok 1\n"
+
+       set P0[1], 3.7
+       set N0, P0[1]
+       eq N0,3.7,OK_2
+       print "not "
+OK_2:  print "ok 2\n"
+
+       set P0[1],"Buckaroo"
+       set S0, P0[1]
+       eq S0,"Buckaroo",OK_3
+       print "not "
+OK_3:  print "ok 3\n"
+
+       end
+CODE
+ok 1
+ok 2
+ok 3
+OUTPUT
+
+# TODO: Rewrite these properly when we have exceptions
+
+output_is(<<'CODE', <<'OUTPUT', "Setting out-of-bounds elements");
+        new P0, .Array
+        set P0, 1
+
+       set P0[1], -7
+
+       end
+CODE
+Array element out of bounds!
+OUTPUT
+
+output_is(<<'CODE', <<'OUTPUT', "Getting out-of-bounds elements");
+        new P0, .Array
+        set P0, 1
+
+       set I0, P0[1]
+       end
+CODE
+Array element out of bounds!
 OUTPUT

 1;



Reply via email to