[svn:parrot] r37976 - branches/pcc_rewiring/src/call

allison at svn.parrot.org allison at svn.parrot.org
Wed Apr 8 03:51:57 UTC 2009


Author: allison
Date: Wed Apr  8 03:51:56 2009
New Revision: 37976
URL: https://trac.parrot.org/parrot/changeset/37976

Log:
[pcc] Graceful handling for too many return arguments.

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

Modified: branches/pcc_rewiring/src/call/pcc.c
==============================================================================
--- branches/pcc_rewiring/src/call/pcc.c	Wed Apr  8 03:49:23 2009	(r37975)
+++ branches/pcc_rewiring/src/call/pcc.c	Wed Apr  8 03:51:56 2009	(r37976)
@@ -1021,9 +1021,9 @@
         ARGIN(PMC *raw_sig), ARGIN(opcode_t *raw_returns))
 {
     ASSERT_ARGS(Parrot_pcc_fill_returns_from_op)
+    INTVAL return_list_elements;
     Parrot_Context *ctx = CONTEXT(interp);
     PMC * const return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
-    INTVAL return_list_elements = VTABLE_elements(interp, return_list);
     INTVAL raw_return_count     = VTABLE_elements(interp, raw_sig);
     INTVAL return_index = 0;
     INTVAL return_list_index = 0;
@@ -1034,6 +1034,17 @@
     if (PARROT_ERRORS_test(interp, PARROT_ERRORS_RESULT_COUNT_FLAG))
             err_check = 1;
 
+    if (PMC_IS_NULL(return_list)) {
+        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_list_elements);
+        return;
+    }
+    else
+        return_list_elements = VTABLE_elements(interp, return_list);
+
+
     if (raw_return_count > return_list_elements) {
         if (err_check)
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
@@ -1049,6 +1060,10 @@
         const INTVAL raw_index = raw_returns[return_index + 2];
         PMC *result_item = VTABLE_get_pmc_keyed_int(interp, return_list, return_list_index);
 
+        /* Gracefully ignore extra returns when error checking is off. */
+        if (PMC_IS_NULL(result_item))
+            break; /* Go on to next return arg. */
+
         switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
             case PARROT_ARG_INTVAL:
                 if (constant)


More information about the parrot-commits mailing list