diff --git a/src/pmc/luaany.pmc b/src/pmc/luaany.pmc
index e5f4e3f..c020f1a 100644
--- a/src/pmc/luaany.pmc
+++ b/src/pmc/luaany.pmc
@@ -147,8 +147,8 @@ Throws an exception.
                 "attempt to index a %Ss value", SELF.name());

         if (dynpmc_LuaFunction == PMC_type(meth)) {
-            PMC * const retval = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                          SELF, key);
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, key, &retval);
             if (PMC_IS_NULL(retval))
                 return pmc_new(INTERP, dynpmc_LuaNil);

@@ -175,8 +175,7 @@ Throws an exception.
                 "attempt to index a %Ss value", SELF.name());

         if (dynpmc_LuaFunction == PMC_type(meth)) {
-            Parrot_runops_fromc_args(INTERP, meth, "vPPP",
-                                     SELF, key, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PPP->", SELF, key, value);
         }
         else
             VTABLE_set_pmc_keyed(INTERP, meth, key, value);
@@ -200,7 +199,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PP", SELF);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->P", SELF, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -215,7 +214,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PP", SELF);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->P", SELF, &SELF);

         if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -269,7 +268,7 @@ Throws an exception.

             /* fix me */
 #if 1
-        retval = Parrot_runops_fromc_args(INTERP, meth, "PP", SELF);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->P", SELF, &retval);
         if (PMC_IS_NULL(retval))
             retval = pmc_new(INTERP, dynpmc_LuaNil);
 #else
@@ -325,7 +324,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -340,7 +339,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
     }
@@ -351,7 +350,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -365,7 +364,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -378,7 +377,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -393,7 +392,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -406,7 +405,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -421,7 +420,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -434,7 +433,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -449,7 +448,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -462,7 +461,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -477,7 +476,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to perform arithmetic on a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -490,7 +489,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to concatenate a %Ss value", SELF.name());

-        dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

         if (PMC_IS_NULL(dest))
             return pmc_new(INTERP, dynpmc_LuaNil);
@@ -504,7 +503,7 @@ Throws an exception.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to concatenate a %Ss value", SELF.name());

-        SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

         if (PMC_IS_NULL(SELF))
             SELF = pmc_new(INTERP, dynpmc_LuaNil);
@@ -584,7 +583,7 @@ Without shortcut like in Default PMC.
             Parrot_ex_throw_from_c_args(INTERP, NULL, EXCEPTION_ILL_INHERIT,
                 "attempt to get length of a %Ss value", SELF.name());

-        retval = Parrot_runops_fromc_args(INTERP, meth, "PP", SELF);
+        Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->P", SELF, &retval);

         if (PMC_IS_NULL(retval))
             retval = pmc_new(INTERP, dynpmc_LuaNil);
@@ -622,7 +621,7 @@ Common implementation (use C<__tostring> or C<get_string>).
         PMC *retval;

         if (!PMC_IS_NULL(meth)) {
-            retval = Parrot_runops_fromc_args(INTERP, meth, "PP", SELF);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->P", SELF, &retval);

             if (PMC_IS_NULL(retval))
                 retval = pmc_new(INTERP, dynpmc_LuaNil);
diff --git a/src/pmc/luanumber.pmc b/src/pmc/luanumber.pmc
index 01b9bb6..5b04382 100644
--- a/src/pmc/luanumber.pmc
+++ b/src/pmc/luanumber.pmc
@@ -323,7 +323,7 @@ Used to unarchive the number.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__add");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -365,7 +365,7 @@ Used to unarchive the number.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__add");

         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -409,7 +409,7 @@ Used to unarchive the number.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__sub");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest)) {
                 dest = pmc_new(INTERP, dynpmc_LuaNil);
             }
@@ -451,7 +451,7 @@ Used to unarchive the number.
     MULTI void i_subtract(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__sub");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -494,7 +494,7 @@ Used to unarchive the number.
     MULTI PMC *multiply(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mul");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -534,7 +534,7 @@ Used to unarchive the number.
     MULTI void i_multiply(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mul");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -577,7 +577,7 @@ Used to unarchive the number.
     MULTI PMC *divide(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__div");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -618,7 +618,7 @@ Used to unarchive the number.
     MULTI void i_divide(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__div");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -662,7 +662,7 @@ Used to unarchive the number.
     MULTI PMC *modulus(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mod");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -704,7 +704,7 @@ Used to unarchive the number.
     MULTI void i_modulus(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mod");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -747,7 +747,7 @@ Used to unarchive the number.
     MULTI PMC *pow(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__pow");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -788,7 +788,7 @@ Used to unarchive the number.
     MULTI void i_pow(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__pow");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -860,7 +860,7 @@ Used to unarchive the number.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__concat");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);

             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);
@@ -895,7 +895,7 @@ Used to unarchive the number.
     MULTI void i_concatenate(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__concat");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);

             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);
diff --git a/src/pmc/luastring.pmc b/src/pmc/luastring.pmc
index a7419f1..988fa92 100644
--- a/src/pmc/luastring.pmc
+++ b/src/pmc/luastring.pmc
@@ -328,7 +328,7 @@ Used to unarchive the string.
     MULTI PMC* add(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__add");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -378,7 +378,7 @@ Used to unarchive the string.
     MULTI void i_add(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__add");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -432,7 +432,7 @@ Used to unarchive the string.
     MULTI PMC* subtract(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__sub");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -483,7 +483,7 @@ Used to unarchive the string.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__sub");

         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -537,7 +537,7 @@ Used to unarchive the string.
     MULTI PMC* multiply(DEFAULT value, PMC *dest) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mul");
         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -587,7 +587,7 @@ Used to unarchive the string.
     MULTI void i_multiply(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mul");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -642,7 +642,7 @@ Used to unarchive the string.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__div");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -692,7 +692,7 @@ Used to unarchive the string.
     MULTI void i_divide(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__div");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -747,7 +747,7 @@ Used to unarchive the string.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mod");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -797,7 +797,7 @@ Used to unarchive the string.
     MULTI void i_modulus(DEFAULT value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__mod");
         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -852,7 +852,7 @@ Used to unarchive the string.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__pow");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -903,7 +903,7 @@ Used to unarchive the string.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__pow");

         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

@@ -989,7 +989,7 @@ Throws an exception unless C<value> is a LuaString.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__concat");

         if (!PMC_IS_NULL(meth)) {
-            dest = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &dest);
             if (PMC_IS_NULL(dest))
                 dest = pmc_new(INTERP, dynpmc_LuaNil);

@@ -1024,7 +1024,7 @@ Throws an exception unless C<value> is a LuaString.
         PMC * const meth = _LuaAny_find_meth(INTERP, value, "__concat");

         if (!PMC_IS_NULL(meth)) {
-            SELF = Parrot_runops_fromc_args(INTERP, meth, "PPP", SELF, value);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P", SELF, value, &SELF);
             if (PMC_IS_NULL(SELF))
                 SELF = pmc_new(INTERP, dynpmc_LuaNil);

diff --git a/src/pmc/luatable.pmc b/src/pmc/luatable.pmc
index 6f26453..aac3925 100644
--- a/src/pmc/luatable.pmc
+++ b/src/pmc/luatable.pmc
@@ -500,8 +500,8 @@ C<table> accessor.
             PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__index");
             if (!PMC_IS_NULL(meth)) {
                 if (dynpmc_LuaFunction == PMC_type(meth)) {
-                    value = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                 SELF, key);
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P",
+                                                      SELF, key, &value);
                 }
                 else
                     return VTABLE_get_pmc_keyed(INTERP, meth, key);
@@ -528,8 +528,8 @@ C<table> mutator.
             PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__newindex");
             if (!PMC_IS_NULL(meth)) {
                 if (dynpmc_LuaFunction == PMC_type(meth)) {
-                    Parrot_runops_fromc_args(INTERP, meth, "vPPP", SELF,
-                            key, value);
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PPP->",
+                                                      SELF, key, value);
                 }
                 else
                     VTABLE_set_pmc_keyed(INTERP, meth, key, value);
@@ -596,8 +596,9 @@ The C<==> operation. Compares reference (not in depth).
     MULTI INTVAL is_equal(LuaTable value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__eq");
         if (!PMC_IS_NULL(meth)) {
-            PMC * const retval = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                          SELF, value);
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P",
+                                              SELF, value, &retval);

             if (PMC_IS_NULL(retval))
                 return (INTVAL)0;
@@ -623,8 +624,9 @@ The C<==> operation. Compares reference (not in depth).
 #if 0
         PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__cmp");
         if (!PMC_IS_NULL(meth)) {
-            PMC * const retval = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                          SELF, value);
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P",
+                                              SELF, value, &retval);

             if (!PMC_IS_NULL(retval))
                 return (INTVAL)VTABLE_get_number(INTERP, retval);
@@ -633,19 +635,21 @@ The C<==> operation. Compares reference (not in depth).
         PMC * const _lt = _LuaAny_find_meth(INTERP, SELF, "__lt");

         if (!PMC_IS_NULL(_lt)) {
-            PMC *retval = Parrot_runops_fromc_args(INTERP, _lt, "PPP",
-                                                   SELF, value);
-            INTVAL r = PMC_IS_NULL(retval)
-                     ? (INTVAL)0
-                     : VTABLE_get_bool(INTERP, retval);
+            INTVAL r;
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, _lt, "PP->P",
+                                              SELF, value, &retval);
+            r = PMC_IS_NULL(retval)
+              ? (INTVAL)0
+              : VTABLE_get_bool(INTERP, retval);

             if (r)
                 return (INTVAL)-1;
             else {
                 PMC * const _le = _LuaAny_find_meth(INTERP, SELF, "__le");
                 if (!PMC_IS_NULL(_le)) {
-                    retval = Parrot_runops_fromc_args(INTERP, _le, "PPP",
-                                                      SELF, value);
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, _le, "PP->P",
+                                                      SELF, value, &retval);
                     r = PMC_IS_NULL(retval)
                       ? (INTVAL)0
                       : VTABLE_get_bool(INTERP, retval);
@@ -653,9 +657,9 @@ The C<==> operation. Compares reference (not in depth).
                     return (r) ? (INTVAL)0 : (INTVAL)1;
                 }
                 else {
-                    retval = Parrot_runops_fromc_args(INTERP, _lt, "PPP",
-                                                      value, SELF);
-                    r = PMC_IS_NULL(retval)
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, _lt, "PP->P",
+                                                      value, SELF, &retval);
+                    r = PMC_IS_NULL(retval)
                       ? (INTVAL)0
                       : VTABLE_get_bool(INTERP, retval);

diff --git a/src/pmc/luauserdata.pmc b/src/pmc/luauserdata.pmc
index ed139c0..a8389e7 100644
--- a/src/pmc/luauserdata.pmc
+++ b/src/pmc/luauserdata.pmc
@@ -110,7 +110,7 @@ Call finalizer and free the userdata.
         PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__gc");

         if (!PMC_IS_NULL(meth))
-            (void)Parrot_runops_fromc_args(INTERP, meth, "vP", SELF);
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "P->", SELF);
 #endif
     }

@@ -206,8 +206,9 @@ The C<==> operation. Compares reference (not in depth).
     MULTI INTVAL is_equal(LuaUserdata value) {
         PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__eq");
         if (!PMC_IS_NULL(meth)) {
-            PMC * const retval = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                          SELF, value);
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P",
+                                              SELF, value, &retval);
             if (PMC_IS_NULL(retval))
                 return (INTVAL)0;

@@ -232,8 +233,9 @@ The C<==> operation. Compares reference (not in depth).
 #if 0
         PMC * const meth = _LuaAny_find_meth(INTERP, SELF, "__cmp");
         if (!PMC_IS_NULL(meth)) {
-            PMC *retval = Parrot_runops_fromc_args(INTERP, meth, "PPP",
-                                                   SELF, value);
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, meth, "PP->P",
+                                              SELF, value, &retval);

             if (!PMC_IS_NULL(retval))
                 return (INTVAL)VTABLE_get_number(INTERP, retval);
@@ -242,19 +244,21 @@ The C<==> operation. Compares reference (not in depth).
         PMC * const _lt = _LuaAny_find_meth(INTERP, SELF, "__lt");

         if (!PMC_IS_NULL(_lt)) {
-            PMC *retval = Parrot_runops_fromc_args(INTERP, _lt, "PPP",
-                                                   SELF, value);
-            INTVAL r = PMC_IS_NULL(retval)
-                     ? (INTVAL)0
-                     : VTABLE_get_bool(INTERP, retval);
+            INTVAL r;
+            PMC * retval;
+            Parrot_pcc_invoke_sub_from_c_args(INTERP, _lt, "PP->P",
+                                              SELF, value, &retval);
+            r = PMC_IS_NULL(retval)
+              ? (INTVAL)0
+              : VTABLE_get_bool(INTERP, retval);

             if (r)
                 return (INTVAL)-1;
             else {
                 PMC * const _le = _LuaAny_find_meth(INTERP, SELF, "__le");
                 if (!PMC_IS_NULL(_le)) {
-                    retval = Parrot_runops_fromc_args(INTERP, _le, "PPP",
-                                                      SELF, value);
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, _le, "PP->P",
+                                                      SELF, value, &retval);
                     r = PMC_IS_NULL(retval)
                       ? (INTVAL)0
                       : VTABLE_get_bool(INTERP, retval);
@@ -265,8 +269,8 @@ The C<==> operation. Compares reference (not in depth).
                         return (INTVAL)1;
                 }
                 else {
-                    retval = Parrot_runops_fromc_args(INTERP, _lt, "PPP",
-                                                      value, SELF);
+                    Parrot_pcc_invoke_sub_from_c_args(INTERP, _lt, "PP->P",
+                                                      value, SELF, &retval);
                     r = PMC_IS_NULL(retval)
                       ? (INTVAL)0
                       : VTABLE_get_bool(INTERP, retval);
