Author: leo
Date: Tue Oct 11 04:25:41 2005
New Revision: 9445

Modified:
   trunk/classes/parrotobject.pmc
   trunk/t/pmc/object-meths.t
Log:
handle *_keyed_int overrides for custom classes; test

Modified: trunk/classes/parrotobject.pmc
==============================================================================
--- trunk/classes/parrotobject.pmc      (original)
+++ trunk/classes/parrotobject.pmc      Tue Oct 11 04:25:41 2005
@@ -45,6 +45,22 @@ F<src/objects.c>, at least for right now
 
 #include "parrot/parrot.h"
 
+/* XXX duplicated from delegate.pmc */
+static PMC *
+find_meth(Interp* interpreter, PMC *pmc, STRING *meth) {
+    PMC *class = pmc;
+
+    if (Interp_trace_TEST(interpreter, PARROT_TRACE_SUB_CALL_FLAG)) {
+        char *name = string_to_cstring(interpreter, meth);
+        PIO_eprintf(interpreter, "# Calling meth '%s'\n#", name);
+        string_cstring_free(name);
+        print_pbc_location(interpreter);
+    }
+    if (PObj_is_object_TEST(pmc)) {
+        class = GET_CLASS((Buffer *)PMC_data(pmc), pmc);
+    }
+    return Parrot_find_method_with_cache(interpreter, class, meth);
+}
 pmclass ParrotObject extends ParrotClass need_ext {
 
 /*
@@ -156,6 +172,120 @@ Return the class of this object.
     }
 
 /*
+
+=item C<INTVAL get_integer_keyed_int(INTVAL key)>
+
+=item C<FLOATVAL get_number_keyed_int(INTVAL key)>
+
+=item C<STRING *get_string_keyed_int(INTVAL key)>
+
+=item C<PMC *get_pmc_keyed_int(INTVAL key)>
+
+=item C<void set_integer_keyed_int (INTVAL key, INTVAL value)>
+
+=item C<void set_number_keyed_int (INTVAL key, FLOATVAL value)>
+
+=item C<void set_string_keyed_int (INTVAL key, STRING* value)>
+
+=item C<void set_pmc_keyed_int (INTVAL key, PMC* value)>
+
+These methods have default implmentations in F<classes/default.pmc>
+which redirct to PMC keys. Test if a specialized method exists, else
+use fallback.
+
+=cut
+
+*/
+
+    INTVAL get_integer_keyed_int (INTVAL key) {
+        STRING *meth = CONST_STRING(interpreter, "__get_integer_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            return Parrot_run_meth_fromc_args_reti(interpreter, sub,
+                                              pmc, meth, "II", key);
+        }
+        else
+            return SUPER(key);
+    }
+
+    FLOATVAL get_number_keyed_int (INTVAL key) {
+        STRING *meth = CONST_STRING(interpreter, "__get_number_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            return Parrot_run_meth_fromc_args_retf(interpreter, sub,
+                                              pmc, meth, "NI", key);
+        }
+        else
+            return SUPER(key);
+    }
+
+    STRING* get_string_keyed_int (INTVAL key) {
+        STRING *meth = CONST_STRING(interpreter, "__get_string_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            return Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "SI", key);
+        }
+        else
+            return SUPER(key);
+    }
+
+    PMC* get_pmc_keyed_int (INTVAL key) {
+        STRING *meth = CONST_STRING(interpreter, "__get_pmc_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            return Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "PI", key);
+        }
+        else
+            return SUPER(key);
+    }
+
+    void set_integer_keyed_int (INTVAL key, INTVAL value) {
+        STRING *meth = CONST_STRING(interpreter, "__set_integer_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            (void) Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "vII", key, value);
+        }
+        else
+            SUPER(key, value);
+    }
+
+    void set_number_keyed_int (INTVAL key, FLOATVAL value) {
+        STRING *meth = CONST_STRING(interpreter, "__set_number_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            (void) Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "vIN", key, value);
+        }
+        else
+            SUPER(key, value);
+    }
+
+    void set_string_keyed_int (INTVAL key, STRING* value) {
+        STRING *meth = CONST_STRING(interpreter, "__set_string_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            (void) Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "vIS", key, value);
+        }
+        else
+            SUPER(key, value);
+    }
+
+    void set_pmc_keyed_int (INTVAL key, PMC* value) {
+        STRING *meth = CONST_STRING(interpreter, "__set_pmc_keyed_int");
+        PMC *sub = find_meth(interpreter, pmc, meth);
+        if (sub) {
+            (void) Parrot_run_meth_fromc_args(interpreter, sub,
+                                              pmc, meth, "vIP", key, value);
+        }
+        else
+            SUPER(key, value);
+    }
+
+/*
 
 =item C<void visit(visit_info *info)>
 

Modified: trunk/t/pmc/object-meths.t
==============================================================================
--- trunk/t/pmc/object-meths.t  (original)
+++ trunk/t/pmc/object-meths.t  Tue Oct 11 04:25:41 2005
@@ -16,7 +16,7 @@ Tests PMC object methods.
 
 =cut
 
-use Parrot::Test tests => 31;
+use Parrot::Test tests => 32;
 use Test::More;
 
 output_like(<<'CODE', <<'OUTPUT', "callmethod - unknown method");
@@ -1010,3 +1010,32 @@ Parent foo
 Parent bar
 OUTPUT
 
+pir_output_is(<<'CODE', <<'OUTPUT', "delegate keyed_int");
+.sub main :main
+    .local pmc cl, o
+    cl = newclass "MyClass"
+    o = new "MyClass"
+    $I0 = 5
+    $S0 = "foo"
+    o[$I0] = 42
+    o[$S0] = 42
+.end
+
+.namespace ["MyClass"]
+
+.sub __set_integer_keyed_int :method
+    .param int key
+    .param int val
+    print "ikey\n"
+.end
+
+.sub __set_integer_keyed :method
+    .param string key
+    .param int val
+    print "skey\n"
+.end
+
+CODE
+ikey
+skey
+OUTPUT

Reply via email to