perl.cvs.parrot
[Top] [All Lists]

[svn:parrot] r33369 - in branches/call_conv_redux: include/parrot src

Subject: [svn:parrot] r33369 - in branches/call_conv_redux: include/parrot src
From:
Date: Sun, 30 Nov 2008 07:47:19 -0800 PST
Newsgroups: perl.cvs.parrot

Author: Whiteknight
Date: Sun Nov 30 07:47:19 2008
New Revision: 33369

Modified:
   branches/call_conv_redux/include/parrot/enums.h
   branches/call_conv_redux/src/inter_call.c

Log:
[call_conv_redux] update commit_last_arg_sig_object and introduce the 
PARROT_ARG_INVOCANT flag

Modified: branches/call_conv_redux/include/parrot/enums.h
==============================================================================
--- branches/call_conv_redux/include/parrot/enums.h     (original)
+++ branches/call_conv_redux/include/parrot/enums.h     Sun Nov 30 07:47:19 2008
@@ -58,7 +58,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_INVOCANT         = 0x400  /* 1024 this PMC is an invocant */
     /* more to come soon */
 
 } Call_bits_enum_t;
@@ -77,6 +78,7 @@
 #define PARROT_ARG_OPTIONAL_ISSET(o)      ((o) & PARROT_ARG_OPTIONAL)
 #define PARROT_ARG_OPT_FLAG_ISSET(o)      ((o) & PARROT_ARG_OPT_FLAG)
 #define PARROT_ARG_NAME_ISSET(o)          ((o) & PARROT_ARG_NAME)
+#define PARROT_ARG_INVOCANT_ISSET(o)      ((o) & PARROT_ARG_INVOCANT)
 
 
 #endif /* PARROT_ENUMS_H_GUARD */

Modified: branches/call_conv_redux/src/inter_call.c
==============================================================================
--- branches/call_conv_redux/src/inter_call.c   (original)
+++ branches/call_conv_redux/src/inter_call.c   Sun Nov 30 07:47:19 2008
@@ -2057,10 +2057,26 @@
         case PARROT_ARG_STRING:
             reg_offset = n_regs_used[seen_arrow * 4 + REGNO_STR]++; break;
         case PARROT_ARG_PMC :
-            reg_offset = n_regs_used[seen_arrow * 4 + REGNO_PMC]++; break;
+            {
+                if (cur & PARROT_ARG_INVOCANT) {
+                    if (seen_arrow == 0 && index == 0) {
+                        n_regs_used[REGNO_PMC]++;
+                        reg_offset = 0;
+                    }
+                    else {
+                        Parrot_ex_throw_from_c_args(interp, NULL,
+                                EXCEPTION_INVALID_OPERATION,
+                                "Parrot_pcc_invoke: Only the first parameter 
can be an invocant %d, %d", seen_arrow, index);
+                    }
+                }
+                else {
+                    reg_offset = n_regs_used[seen_arrow * 4 + REGNO_PMC]++;
+                }
+            }
+            break;
         default:
             Parrot_ex_throw_from_c_args(interp, NULL, 
EXCEPTION_INVALID_OPERATION,
-                "Parrot_PCCINVOKE: invalid reg type");
+                "Parrot_pcc_invoke_method_from_c_args: invalid reg type");
     }
 
     /* set the register offset into the index int[] */
@@ -2084,6 +2100,9 @@
                 break;
             case PARROT_ARG_PMC:
                 CTX_REG_PMC(ctx, reg_offset) = 
VTABLE_get_pmc_keyed_int(interp, sig_obj, index);
+                if (cur & PARROT_ARG_INVOCANT) {
+                    interp->current_object = CTX_REG_PMC(ctx, reg_offset);
+                }
                 break;
             default:
                 Parrot_ex_throw_from_c_args(interp, NULL,

<Prev in Thread] Current Thread [Next in Thread>
  • [svn:parrot] r33369 - in branches/call_conv_redux: include/parrot src, Whiteknight <=