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

bacek at svn.parrot.org bacek at svn.parrot.org
Sat Oct 3 23:55:22 UTC 2009


Author: bacek
Date: Sat Oct  3 23:55:21 2009
New Revision: 41658
URL: https://trac.parrot.org/parrot/changeset/41658

Log:
Fix handling null CallSignature in Parrot_pcc_fill_returns_* functions.

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

Modified: branches/pcc_reapply/src/call/args.c
==============================================================================
--- branches/pcc_reapply/src/call/args.c	Sat Oct  3 23:45:23 2009	(r41657)
+++ branches/pcc_reapply/src/call/args.c	Sat Oct  3 23:55:21 2009	(r41658)
@@ -1109,8 +1109,8 @@
                 Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                         "too many return values: %d passed, 0 expected",
                         raw_return_count);
-            return;
         }
+        return;
     }
 
     return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
@@ -1232,7 +1232,7 @@
     va_list args;
     INTVAL return_list_elements;
     PMC *ctx = CURRENT_CONTEXT(interp);
-    PMC * const return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
+    PMC * return_list;
     INTVAL raw_return_count = 0;
     INTVAL return_index = 0;
     INTVAL return_list_index = 0;
@@ -1252,6 +1252,18 @@
     if (PARROT_ERRORS_test(interp, PARROT_ERRORS_RESULT_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 (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",
+                        raw_return_count);
+        }
+        return;
+    }
+
+    return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
     if (PMC_IS_NULL(return_list)) {
         if (err_check)
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,


More information about the parrot-commits mailing list