The get_*_keyed methods were missing from PerlArray. Inheriting from Array did not cut it when accessing elements beyond the array end.
The patch adds the missing methods. They really are a cut and paste from the Array methods. They access the corresponding get_*_keyed_int() methods, or the get_pmc_keyed() methods for the next part of a composite key. -- stef --- classes/perlarray.pmc.old 2004-02-09 13:57:19.000000000 +0100 +++ classes/perlarray.pmc 2004-02-09 18:16:14.000000000 +0100 @@ -110,6 +110,20 @@ return SUPER(key); } + INTVAL get_integer_keyed (PMC* key) { + INTVAL ix; + PMC* nextkey; + PMC* box; + + if (!key) return 0; + ix = key_integer(INTERP, key); + nextkey = key_next(INTERP, key); + if (nextkey == NULL) return SELF.get_integer_keyed_int(ix); + box = SELF.get_pmc_keyed_int(ix); + if (box == NULL) box = undef(INTERP); + return VTABLE_get_integer_keyed(INTERP, box, nextkey); + } + FLOATVAL get_number_keyed_int (INTVAL key) { if (key >= DYNSELF.elements() || key < -DYNSELF.elements()) { if (PARROT_WARNINGS_test(interpreter, @@ -123,6 +137,22 @@ return SUPER(key); } + FLOATVAL get_number_keyed (PMC* key) { + INTVAL ix; + PMC* nextkey; + PMC* box; + + if (!key) return 0; + ix = key_integer(INTERP, key); + nextkey = key_next(INTERP, key); + if (nextkey == NULL) return SELF.get_number_keyed_int(ix); + + box = SELF.get_pmc_keyed_int(ix); + if (box == NULL) box = undef(INTERP); + return VTABLE_get_number_keyed(INTERP, box, nextkey); + } + + STRING* get_string () { return string_from_int(INTERP, DYNSELF.elements()); } @@ -140,6 +170,22 @@ return SUPER(key); } + STRING* get_string_keyed (PMC* key) { + INTVAL ix; + PMC* nextkey; + PMC* box; + + if (!key) return 0; + ix = key_integer(INTERP, key); + nextkey = key_next(INTERP, key); + if (nextkey == NULL) return SELF.get_string_keyed_int(ix); + + box = SELF.get_pmc_keyed_int(ix); + if (box == NULL) box = undef(INTERP); + return VTABLE_get_string_keyed(INTERP, box, nextkey); + } + + PMC* get_pmc_keyed_int (INTVAL key) { if (key >= DYNSELF.elements() || key < -DYNSELF.elements()) { if (PARROT_WARNINGS_test(interpreter, @@ -153,4 +199,20 @@ return SUPER(key); } + PMC* get_pmc_keyed (PMC* key) { + INTVAL ix; + PMC* nextkey; + PMC* box; + + if (!key) return 0; + ix = key_integer(INTERP, key); + nextkey = key_next(INTERP, key); + if (nextkey == NULL) return SELF.get_pmc_keyed_int(ix); + + box = SELF.get_pmc_keyed_int(ix); + if (box == NULL) box = undef(INTERP); + return VTABLE_get_pmc_keyed(INTERP, box, nextkey); + } + + } diff -u t/pmc/perlarray.t.old t/pmc/perlarray.t --- t/pmc/perlarray.t.old 2004-02-09 20:59:15.000000000 +0100 +++ t/pmc/perlarray.t 2004-02-09 21:46:23.000000000 +0100 @@ -1,6 +1,6 @@ #! perl -w -use Parrot::Test tests => 26; +use Parrot::Test tests => 27; use Test::More; my $fp_equality_macro = <<'ENDOFMACRO'; @@ -1376,5 +1376,33 @@ / OUTPUT +my $qr = "0\n0.00*\n\n"; +$qr=qr|$qr|; + + +output_like(<<'CODE', $qr, "Fetching beyond the end of an array"); +# with pmcs, exercise the get_*_int() as well + new P0, .PerlArray + new P1, .Key + set P1, 0 + + set I1, P0[P1] + print I1 + print "\n" + + set N1, P0[P1] + print N1 + print "\n" + + set S1, P0[P1] + print S1 + print "\n" + + set P1, P0[P1] + print P1 + print "\n" + end +CODE + 1;