Author: leo
Date: Thu Feb  9 05:38:56 2006
New Revision: 11482

Modified:
   trunk/src/ops/core.ops
   trunk/src/ops/pic.ops
Log:
Argument passing cleanup 2

* use SIG_* macros in *.ops
* make results_info more robust WRT missing get_results opcode


Modified: trunk/src/ops/core.ops
==============================================================================
--- trunk/src/ops/core.ops      (original)
+++ trunk/src/ops/core.ops      Thu Feb  9 05:38:56 2006
@@ -497,7 +497,7 @@ op set_args(inconst PMC) {
 
     /* for now just point to the opcode */
     interpreter->current_args = this;
-    argc = VTABLE_elements(interpreter, signature);
+    argc = SIG_ELEMS(signature);
     goto OFFSET(argc + 2);
 }
 
@@ -507,7 +507,7 @@ op get_results(inconst PMC) {
     INTVAL argc;
 
     CONTEXT(interpreter->ctx)->current_results = this;
-    argc = VTABLE_elements(interpreter, signature);
+    argc = SIG_ELEMS(signature);
     goto OFFSET(argc + 2);
 }
 
@@ -551,7 +551,7 @@ op set_returns(inconst PMC) {
        parrot_pass_args(interpreter, ctx, caller_ctx,
                PARROT_OP_get_results_pc);
     }
-    argc = VTABLE_elements(interpreter, signature);
+    argc = SIG_ELEMS(signature);
     goto OFFSET(argc + 2);
 }
 
@@ -567,19 +567,21 @@ specified in F<docs/pdds/pdd03_calling_c
 inline op result_info(out PMC) {
     /* Get context of callee from return continuation. */
     PMC *cc = CONTEXT(interpreter->ctx)->current_cont;
-    PMC *i = NULL;
-    if (cc && PMC_cont(cc)->to_ctx)
-    {
-        /* Find results PMC index and get PMC. */
-        opcode_t results_pmc = PMC_cont(cc)->to_ctx->current_results[1];
-        i = PF_CONST(PMC_cont(cc)->seg, results_pmc)->u.key;
+    PMC *sig = NULL;
+    if (cc && PMC_cont(cc)->to_ctx) {
+       /* caller context has results */
+        opcode_t *results = PMC_cont(cc)->to_ctx->current_results;
+        if (results) {
+           /* get results PMC index and get PMC. */
+           sig = PF_CONST(PMC_cont(cc)->seg, results[1])->u.key;
+       }
     }
 
     /* If no elements, hand back empty array; otherwise PMC. */
-    if (PMC_IS_NULL(i))
+    if (!sig)
         $1 = pmc_new(interpreter, enum_class_FixedIntegerArray);
     else
-        $1 = i;
+        $1 = sig;
     goto NEXT();
 }
 

Modified: trunk/src/ops/pic.ops
==============================================================================
--- trunk/src/ops/pic.ops       (original)
+++ trunk/src/ops/pic.ops       Thu Feb  9 05:38:56 2006
@@ -257,21 +257,20 @@ inline op pic_callr__(inconst PMC) :pic 
     pc = ctx->current_results;
     if (pc) {
         pred_pc = (void**) pc - ctx->pred_offset;
-        args[0] = (_reg_base + ((opcode_t*)pred_pc)[2]);
-        assert((sig = (PMC*)(pred_pc[1])) &&
-                PObj_is_PMC_TEST(sig) &&
-                sig->vtable->base_type == enum_class_FixedIntegerArray &&
-                VTABLE_elements(interpreter, sig) == 1);
+        sig = (PMC*)(pred_pc[1]);
+        ASSERT_SIG_PMC(sig);
+        assert(SIG_ELEMS(sig) <= 1);
+        args[0] = SIG_ELEMS(sig) ? 
+            (_reg_base + ((opcode_t*)pred_pc)[2]) : NULL;
     }
     else
         args[0] = NULL;
     /* set_args */
     n_args = 0;
     sig = mic->m.sig;
-    assert(PObj_is_PMC_TEST(sig) &&
-            sig->vtable->base_type == enum_class_FixedIntegerArray);
-    n_args = VTABLE_elements(interpreter, sig);
-    sig_bits = PMC_data(sig);
+    ASSERT_SIG_PMC(sig);
+    n_args = SIG_ELEMS(sig);
+    sig_bits = SIG_ARRAY(sig);
     for (i = 0; i < n_args; ++i) {
         switch (sig_bits[i]) {
             case PARROT_ARG_INTVAL:

Reply via email to