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