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;
 

Reply via email to