--- /home/alek/parrot.pdd15/src/pmc/object.pmc	2007-05-11 17:01:56.000000000 +0000
+++ src/pmc/object.pmc	2007-05-11 17:24:48.000000000 +0000
@@ -230,10 +230,34 @@
 */
     opcode_t* invoke(void *next) {
         STRING *meth = CONST_STRING(interp, "invoke");
-        PMC *sub = Parrot_Class_find_vtable_method(interp, PARROT_OBJECT(SELF)->_class, meth);
-        if (PMC_IS_NULL(sub))
+        PMC *sub = Parrot_Class_find_vtable_method(interp, PARROT_OBJECT(pmc)->_class, meth);
+        if (PMC_IS_NULL(sub)) {
             vtable_meth_not_found(interp, pmc, "invoke");
-        return VTABLE_invoke(interp, sub, next);
+            return NULL;
+        }
+        else {
+            /* Since invoke() is a normal method, 'self' must be passed as the
+             * first argument, but because this looks like a non-method call in
+             * PIR, the args signature doesn't have it, so we have to get the
+             * args signature and unshift 'self' onto it. */
+
+            PMC *old_sig = CONTEXT(interp->ctx)->constants[*(interp->current_args+1)]->u.key;
+            INTVAL sig_len = VTABLE_elements(interp, old_sig) + 1;
+            int i;
+
+            PMC *meth_sig = pmc_new(interp, enum_class_FixedIntegerArray);
+            VTABLE_set_integer_native(interp, meth_sig, sig_len);
+
+            VTABLE_set_integer_keyed_int(interp, meth_sig, 0, PARROT_ARG_PMC | PARROT_ARG_OBJECT);
+            for ( i = 1; i < sig_len; i++ )
+                VTABLE_set_integer_keyed_int(interp, meth_sig, i, VTABLE_get_integer_keyed_int(interp, old_sig, i-1));
+
+            interp->args_signature = meth_sig;
+            interp->current_args++;
+
+            INTERP->current_object = SELF;
+            return VTABLE_invoke(interp, sub, next);
+        }
     }
 
 /*
