# 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;