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;