[svn:parrot] r41612 - branches/pcc_reapply/src/call

allison at svn.parrot.org allison at svn.parrot.org
Fri Oct 2 12:19:30 UTC 2009


Author: allison
Date: Fri Oct  2 12:19:29 2009
New Revision: 41612
URL: https://trac.parrot.org/parrot/changeset/41612

Log:
[pcc] Add null call signature checking to C parameter passing, use the right
value for the count of passed return values.

Modified:
   branches/pcc_reapply/src/call/pcc.c

Modified: branches/pcc_reapply/src/call/pcc.c
==============================================================================
--- branches/pcc_reapply/src/call/pcc.c	Fri Oct  2 12:14:40 2009	(r41611)
+++ branches/pcc_reapply/src/call/pcc.c	Fri Oct  2 12:19:29 2009	(r41612)
@@ -1098,7 +1098,7 @@
     ASSERT_ARGS(Parrot_pcc_fill_params_from_c_args)
     va_list args;
     PMC *ctx = CURRENT_CONTEXT(interp);
-    INTVAL  positional_elements = VTABLE_elements(interp, call_object);
+    INTVAL  positional_elements;
     INTVAL  param_count      = 0;
     STRING *param_name       = NULL;
     INTVAL  param_index      = 0;
@@ -1122,6 +1122,20 @@
     if (PARROT_ERRORS_test(interp, PARROT_ERRORS_PARAM_COUNT_FLAG))
             err_check = 1;
 
+    /* A null call object is fine if there are no arguments and no returns. */
+    if (PMC_IS_NULL(call_object)) {
+        if (param_count > 0) {
+            if (err_check)
+                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
+                        "too few arguments: 0 passed, %d expected",
+                        param_count);
+            else
+                return;
+        }
+    }
+
+    positional_elements = VTABLE_elements(interp, call_object);
+
     va_start(args, signature);
     for (param_index = 0; param_index < param_count; param_index++) {
         INTVAL param_flags = VTABLE_get_integer_keyed_int(interp,
@@ -1371,11 +1385,11 @@
 
     /* A null call object is fine if there are no arguments and no returns. */
     if (PMC_IS_NULL(call_object)) {
-        if (return_list_elements > 0) {
+        if (raw_return_count > 0) {
             if (err_check)
                 Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                         "too many return values: %d passed, 0 expected",
-                        return_list_elements);
+                        raw_return_count);
             return;
         }
     }


More information about the parrot-commits mailing list