[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