Index: src/inter_call.c
===================================================================
--- src/inter_call.c	(revision 18494)
+++ src/inter_call.c	(working copy)
@@ -312,7 +312,10 @@
                                       : CTX_REG_NUM(st->src.ctx, idx);
             break;
         case PARROT_ARG_PMC:
-            UVal_pmc(st->val) = constant ? st->src.ctx->constants[idx]->u.key
+            if (st->src.sig & PARROT_ARG_OBJECT)
+                UVal_pmc(st->val) = CONTEXT(interp->ctx)->current_object;
+            else
+                UVal_pmc(st->val) = constant ? st->src.ctx->constants[idx]->u.key
                                       : CTX_REG_PMC(st->src.ctx, idx);
 
             if (st->src.sig & PARROT_ARG_FLATTEN) {
Index: src/pmc/delegate.pmc
===================================================================
--- src/pmc/delegate.pmc	(revision 18494)
+++ src/pmc/delegate.pmc	(working copy)
@@ -135,6 +135,25 @@
         PMC *sub = Parrot_find_vtable_meth(INTERP, SELF, meth);
         if (PMC_IS_NULL(sub))
             vtable_meth_not_found(INTERP, SELF, "invoke");
+
+        /* 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);
     }
Index: include/parrot/enums.h
===================================================================
--- include/parrot/enums.h	(revision 18494)
+++ include/parrot/enums.h	(working copy)
@@ -61,7 +61,8 @@
     /* unused - 0x040 */
     PARROT_ARG_OPTIONAL         = 0x080, /* 128 */
     PARROT_ARG_OPT_FLAG         = 0x100, /* 256 prev optional was set */
-    PARROT_ARG_NAME             = 0x200  /* 512 this String is an arg name */
+    PARROT_ARG_NAME             = 0x200, /* 512 this String is an arg name */
+    PARROT_ARG_OBJECT           = 0x400  /* 1024 */
     /* more to come soon */
 
 } Call_bits_enum_t;
