# New Ticket Created by  Bram Geron 
# Please include the string:  [perl #46593]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=46593 >


I think attached patch clarifies parameter passing a little.

Non-comment changes:
* enum call_state_mode becomes typedef'd call_state_mode
* call_state_item.mode becomes type call_state_mode instead of int
* call_state_item.sig  becomes type Call_bits_enum_t instead of INTVAL

 include/parrot/inter_call.h |   68
+++++++++++++++++++++++++++-----------------
 src/inter_call.c            |   13 ++++++--
 2 files changed, 52 insertions(+), 29 deletions(-)


Cheers,
-- 
Bram Geron | GPG 0xE7B9E65E
diff --git a/include/parrot/inter_call.h b/include/parrot/inter_call.h
index f08e225..a16ea02 100644
--- a/include/parrot/inter_call.h
+++ b/include/parrot/inter_call.h
@@ -16,38 +16,54 @@
 #ifndef PARROT_INTER_CALL_H_GUARD
 #define PARROT_INTER_CALL_H_GUARD
 
-enum call_state_mode {
-    /* arg processing states
-     *       <src>_<dest>           sd  nibbles    */
-
-    CALL_STATE_SIG        =  0x100,     /* runops, nci */
-    CALL_STATE_OP         =  0x200,     /* get_, set_ ops */
-    CALL_S_D_MASK         =  0x300,     /* src/dest mask */
-
-    CALL_STATE_FLATTEN    =  0x400      /* flatten src */
-
-};
+typedef enum call_state_mode {
+    /* argument fetching/putting modes */
+    CALL_STATE_SIG     = 0x100, /* runops, nci. In case we're interfacing with
+                                   C and va_lists. */
+    CALL_STATE_OP      = 0x200, /* get_, set_ ops. In case we're interfacing
+                                   with Parrot code and get the signature from
+                                   call_state_item.u.op. */
+    CALL_S_D_MASK      = 0x300, /* src/dest mask */
+
+    /* whether we are busy in a :flat argument */
+    CALL_STATE_FLATTEN = 0x400
+} call_state_mode;
 
 typedef struct call_state_item {
-    int mode;       /* from_sig, from_set_ops, flatten ...*/
+    /* We have one call_state_item for both the caller (source,
+       arguments/returns) and the callee (destination, parameters/results). */
+    call_state_mode mode; /* this specifies
+                             - where we get our arguments from / where we put
+                               our parameters (from C code or from set_*,get_*)
+                             - if we're in the middle of a :flat */
+
     union {
-        struct {
-            void *ap;   /* a ptr to va_list */
-            const char *sig;
+        struct {             /* In case the caller (or callee? FIXME)
+                                is C code: */
+            void *ap;        /* a ptr to va_list */
+            const char *sig; /* a C string describing the type of each 
argument */
         } sig;
-        struct {
-            opcode_t *pc;
-            PMC *signature;
+
+        struct {         /* In case the caller/callee was Parrot code: */
+            opcode_t *pc;   /* array of 'indexes' for each argument:
+                               - in case it's about a constant, the constant 
number
+                               - in case it's about a register, the register 
number */
+            PMC *signature; /* a PMC array holding a Call_bits_enum_t
+                                signature for each argument */
         } op;
     } u;
-    parrot_context_t *ctx;
-    INTVAL used;
-    INTVAL i;
-    INTVAL n;
-    INTVAL sig;
-    PMC *slurp;
-    INTVAL slurp_i;
-    INTVAL slurp_n;
+
+    parrot_context_t *ctx; /* the context where we get the args from / put the 
params in */
+    INTVAL used;    /* src: whether this argument has been consumed already 
(or: whether the previous arg has already been consumed?) */
+    INTVAL i;       /* number of args/params already consumed / filled in */
+    INTVAL n;       /* number of args/params we are supposed to match. may 
include :slurpys and :flats */
+    Call_bits_enum_t sig;  /* type of current arg/param (counting from 1, the 
i'th) */
+
+    /* We might encounter a :flat. */
+    /* FIXME bgeron: is this used for :slurpys? I can't find a reference in 
slurpy-filling code. */
+    PMC *slurp;     /* PMC in which to put the args we slurp up / from where 
to flatten */
+    INTVAL slurp_i; /* index of :flat/:slurpy arg/param we are trying to match 
*/
+    INTVAL slurp_n; /* number of :flat/:slurpy args/params we are supposed to 
match */
 } call_state_item;
 
 typedef struct call_state {
diff --git a/src/inter_call.c b/src/inter_call.c
index 9c522d8..0e9920e 100644
--- a/src/inter_call.c
+++ b/src/inter_call.c
@@ -329,7 +329,9 @@ start_flatten(PARROT_INTERP, NOTNULL(call_state *st), 
NOTNULL(PMC *p_arg))
     st->n_actual_args += st->src.slurp_n - 1;
 }
 
-
+/* Calculate what type of argument/parameter we get next
+ * (the index has already been increased by now)
+ */
 static void
 next_arg_sig(NOTNULL(call_state_item *sti))
 {
@@ -357,6 +359,8 @@ next_arg_sig(NOTNULL(call_state_item *sti))
     }
 }
 
+/* Fetch an argument from C code
+ */
 static int
 fetch_arg_sig(PARROT_INTERP, NOTNULL(call_state *st))
 {
@@ -401,7 +405,8 @@ fetch_arg_sig(PARROT_INTERP, NOTNULL(call_state *st))
     return 1;
 }
 
-
+/* Fetch an argument from a Parrot_Context
+ */
 static int
 fetch_arg_op(PARROT_INTERP, NOTNULL(call_state *st))
 {
@@ -448,6 +453,8 @@ fetch_arg_op(PARROT_INTERP, NOTNULL(call_state *st))
     return 1;
 }
 
+/* Fetch a new argument.
+ */
 PARROT_API
 int
 Parrot_fetch_arg(PARROT_INTERP, NOTNULL(call_state *st))
@@ -460,7 +467,7 @@ Parrot_fetch_arg(PARROT_INTERP, NOTNULL(call_state *st))
 
     next_arg_sig(&st->src);
 
-    /* check if we're at a :flat argument */
+    /* check if we're supposed to continue a :flat argument */
     if (st->src.mode & CALL_STATE_FLATTEN) {
         PMC *elem;
         PARROT_ASSERT(st->src.slurp_i < st->src.slurp_n);

Reply via email to