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

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Oct 5 01:13:16 UTC 2009


Author: bacek
Date: Mon Oct  5 01:13:15 2009
New Revision: 41725
URL: https://trac.parrot.org/parrot/changeset/41725

Log:
Revert "[pcc] The start of the fill_results refactor.  Doesn't work well yet."

It doesn't work...

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

Modified: branches/pcc_reapply/src/call/args.c
==============================================================================
--- branches/pcc_reapply/src/call/args.c	Mon Oct  5 00:56:21 2009	(r41724)
+++ branches/pcc_reapply/src/call/args.c	Mon Oct  5 01:13:15 2009	(r41725)
@@ -62,11 +62,6 @@
         __attribute__nonnull__(4)
         __attribute__nonnull__(5);
 
-static void assign_default_result_value(PARROT_INTERP,
-    PMC *result,
-    INTVAL result_flags)
-        __attribute__nonnull__(1);
-
 PARROT_CAN_RETURN_NULL
 static PMC* clone_key_arg(PARROT_INTERP, ARGIN(PMC *key))
         __attribute__nonnull__(1)
@@ -105,17 +100,6 @@
         __attribute__nonnull__(5)
         FUNC_MODIFIES(*call_object);
 
-static void fill_results(PARROT_INTERP,
-    ARGMOD_NULLOK(PMC *call_object),
-    ARGIN(PMC *raw_sig),
-    ARGIN(void *return_info),
-    ARGIN(struct pcc_set_funcs *accessor))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(3)
-        __attribute__nonnull__(4)
-        __attribute__nonnull__(5)
-        FUNC_MODIFIES(*call_object);
-
 static INTVAL intval_constant_from_op(PARROT_INTERP,
     ARGIN(opcode_t *raw_params),
     INTVAL param_index)
@@ -240,8 +224,6 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(arg_info) \
     , PARROT_ASSERT_ARG(accessor))
-#define ASSERT_ARGS_assign_default_result_value __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_clone_key_arg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(key))
@@ -260,11 +242,6 @@
     , PARROT_ASSERT_ARG(raw_sig) \
     , PARROT_ASSERT_ARG(arg_info) \
     , PARROT_ASSERT_ARG(accessor))
-#define ASSERT_ARGS_fill_results __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(raw_sig) \
-    , PARROT_ASSERT_ARG(return_info) \
-    , PARROT_ASSERT_ARG(accessor))
 #define ASSERT_ARGS_intval_constant_from_op __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(raw_params))
@@ -1213,41 +1190,6 @@
 
 /*
 
-=item C<static void assign_default_result_value(PARROT_INTERP, PMC *result,
-INTVAL result_flags)>
-
-Assign an appropriate default value to the result depending on its type
-
-=cut
-
-*/
-
-static void
-assign_default_result_value(PARROT_INTERP, PMC *result, INTVAL result_flags)
-{
-    ASSERT_ARGS(assign_default_result_value)
-    switch (PARROT_ARG_TYPE_MASK_MASK(result_flags)) {
-        case PARROT_ARG_INTVAL:
-            VTABLE_set_integer_native(interp, result, 0);
-            break;
-        case PARROT_ARG_FLOATVAL:
-            VTABLE_set_number_native(interp, result, 0.0);
-            break;
-        case PARROT_ARG_STRING:
-            VTABLE_set_string_native(interp, result, NULL);
-            break;
-        case PARROT_ARG_PMC:
-            VTABLE_set_pmc(interp, result, PMCNULL);
-            break;
-        default:
-            Parrot_ex_throw_from_c_args(interp, NULL,
-                    EXCEPTION_INVALID_OPERATION, "invalid parameter type");
-            break;
-    }
-}
-
-/*
-
 =item C<void Parrot_pcc_fill_params_from_op(PARROT_INTERP, PMC *call_object, PMC
 *raw_sig, opcode_t *raw_params)>
 
@@ -1334,475 +1276,6 @@
 
 /*
 
-=item C<static void fill_results(PARROT_INTERP, PMC *call_object, PMC *raw_sig,
-void *return_info, struct pcc_set_funcs *accessor)>
-
-Gets returns for the current return and puts them into position.
-First it gets the positional non-slurpy returns, then the positional
-slurpy returns, then the named returns, and finally the named
-slurpy returns.
-
-=cut
-
-*/
-
-static void
-fill_results(PARROT_INTERP, ARGMOD_NULLOK(PMC *call_object),
-        ARGIN(PMC *raw_sig), ARGIN(void *return_info), ARGIN(struct pcc_set_funcs *accessor))
-{
-    ASSERT_ARGS(fill_results)
-    PMC    *ctx = CURRENT_CONTEXT(interp);
-    PMC    *named_used_list = PMCNULL;
-    INTVAL  return_count    = VTABLE_elements(interp, raw_sig);
-    INTVAL  result_count;
-    INTVAL  positional_returns = 0; /* initialized by a loop later */
-    INTVAL  i = 0;                  /* used by the initialization loop */
-    STRING *result_name     = NULL;
-    INTVAL  return_index    = 0;
-    INTVAL  result_index    = 0;
-    INTVAL  positional_index = 0;
-    INTVAL  named_count    = 0;
-    INTVAL  err_check      = 0;
-    PMC    *result_list;
-    PMC    *result_sig;
-
-    /* Check if we should be throwing errors. This is configured separately
-     * for parameters and return values. */
-    if (PARROT_ERRORS_test(interp, PARROT_ERRORS_PARAM_COUNT_FLAG))
-            err_check = 1;
-
-    /* A null call object is fine if there are no returns and no results. */
-    if (PMC_IS_NULL(call_object)) {
-        if (result_count > 0) {
-            if (err_check)
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "too few returns: 0 passed, %d expected",
-                        result_count);
-        }
-        return;
-    }
-
-    result_list    = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
-    if (PMC_IS_NULL(result_list)) {
-        if (result_count > 0) {
-            if (err_check)
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "too few returns: 0 passed, %d expected",
-                        result_count);
-        }
-        return;
-    }
-
-    result_sig   = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "return_flags"));
-    result_count = VTABLE_elements(interp, result_sig);
-
-    /* the call obj doesn't have the returns as positionals, so instead we loop
-     * over raw_sig and count the number of non-named
-     *
-     * XXX Do we need to check for :flat?
-     */
-    for(i = 0; i < return_count; i++) {
-        INTVAL flags = VTABLE_get_integer_keyed_int(interp, raw_sig, i);
-        if (!(flags & PARROT_ARG_NAME))
-            positional_returns++;
-    }
-
-    /* Parrot_io_eprintf(interp, "return_count: %d\nresult_count: %d\npositional_returns: %d\nreturn_sig: %S\nresult_sig: %S\n", return_count, result_count, positional_returns, VTABLE_get_repr(interp, raw_sig), VTABLE_get_repr(interp, result_sig)); */
-
-    while (1) {
-        INTVAL result_flags;
-        INTVAL return_flags;
-        PMC *result_item;
-        INTVAL constant;
-
-        /* Check if we've used up all the results. */
-        if (result_index >= result_count) {
-            if (return_index >= positional_returns) {
-                /* We've used up all the returns and results, we're done. */
-                break;
-            }
-            else if (err_check) {
-                /* We've used up all the results, but have extra positional
-                 * returns left over. */
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "too many positional returns: %d passed, %d expected",
-                        positional_returns, result_index);
-            }
-            return;
-        }
-
-        result_flags = VTABLE_get_integer_keyed_int(interp, result_sig, result_index);
-        return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
-        result_item = VTABLE_get_pmc_keyed_int(interp, result_list, result_index);
-        constant = PARROT_ARG_CONSTANT_ISSET(return_flags);
-
-        /* If the result is slurpy, collect all remaining positional
-         * returns into an array.*/
-        if (result_flags & PARROT_ARG_SLURPY_ARRAY) {
-            PMC *collect_positional;
-
-            /* Can't handle named slurpy here, go on to named return handling. */
-            if (result_flags & PARROT_ARG_NAME)
-                break;
-
-            if (named_count > 0)
-                Parrot_ex_throw_from_c_args(interp, NULL,
-                        EXCEPTION_INVALID_OPERATION,
-                        "named results must follow all positional results");
-
-            collect_positional = pmc_new(interp,
-                    Parrot_get_ctx_HLL_type(interp, enum_class_ResizablePMCArray));
-            for (; return_index < positional_returns; return_index++) {
-                return_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, return_index);
-                constant = PARROT_ARG_CONSTANT_ISSET(return_flags);
-                switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
-                    case PARROT_ARG_INTVAL:
-                        VTABLE_push_integer(interp, collect_positional, constant?
-                                accessor->intval_constant(interp, return_info, return_index)
-                                :*accessor->intval(interp, return_info, return_index));
-                        break;
-                    case PARROT_ARG_FLOATVAL:
-                        VTABLE_push_float(interp, collect_positional, constant?
-                                accessor->numval_constant(interp, return_info, return_index)
-                                :*accessor->numval(interp, return_info, return_index));
-                        break;
-                    case PARROT_ARG_STRING:
-                        VTABLE_push_string(interp, collect_positional, constant?
-                                accessor->string_constant(interp, return_info, return_index)
-                                :*accessor->string(interp, return_info, return_index));
-                        break;
-                    case PARROT_ARG_PMC:
-                        VTABLE_push_pmc(interp, collect_positional, constant?
-                                accessor->pmc_constant(interp, return_info, return_index)
-                                :*accessor->pmc(interp, return_info, return_index));
-                        break;
-                    default:
-                        Parrot_ex_throw_from_c_args(interp, NULL,
-                                EXCEPTION_INVALID_OPERATION, "invalid return type");
-                        break;
-                }
-            }
-            VTABLE_set_pmc(interp, result_item, collect_positional);
-            result_index++;
-            break; /* Terminate the positional return loop. */
-        }
-
-        /* We have a positional return, fill the result with it. */
-        if (return_index < positional_returns) {
-
-            /* Fill a named result with a positional return. */
-            if (result_flags & PARROT_ARG_NAME) {
-                STRING *result_name;
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "named returns NYI");
-                if (!(result_flags & PARROT_ARG_STRING))
-                    Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                            "named results must have a name specified");
-                result_name = PARROT_ARG_CONSTANT_ISSET(result_flags)
-                                   ? accessor->string_constant(interp, return_info, result_index)
-                                   : *accessor->string(interp, return_info, result_index);
-                named_count++;
-                result_index++;
-                if (result_index >= result_count)
-                    continue;
-                result_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, result_index);
-
-                /* Mark the name as used, cannot be filled again. */
-                if (PMC_IS_NULL(named_used_list)) /* Only created if needed. */
-                    named_used_list = pmc_new(interp, enum_class_Hash);
-                VTABLE_set_integer_keyed_str(interp, named_used_list, result_name, 1);
-            }
-            else if (named_count > 0) {
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "named results must follow all positional results");
-            }
-
-            /* Check for :lookahead result goes here. */
-
-            /* Go ahead and fill the result with a positional return. */
-            switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
-                case PARROT_ARG_INTVAL:
-                    if (constant)
-                        VTABLE_set_integer_native(interp, result_item,
-                            accessor->intval_constant(interp, return_info, return_index));
-                    else
-                        VTABLE_set_integer_native(interp, result_item,
-                            *accessor->intval(interp, return_info, return_index));
-                    break;
-                case PARROT_ARG_FLOATVAL:
-                    if (constant)
-                        VTABLE_set_number_native(interp, result_item,
-                            accessor->numval_constant(interp, return_info, return_index));
-                    else
-                        VTABLE_set_number_native(interp, result_item,
-                            *accessor->numval(interp, return_info, return_index));
-                    break;
-                case PARROT_ARG_STRING:
-                    if (constant)
-                        VTABLE_set_string_native(interp, result_item,
-                            accessor->string_constant(interp, return_info, return_index));
-                    else
-                        VTABLE_set_string_native(interp, result_item,
-                            *accessor->string(interp, return_info, return_index));
-                    break;
-                case PARROT_ARG_PMC:
-                    if (constant)
-                        VTABLE_set_pmc(interp, result_item,
-                            accessor->pmc_constant(interp, return_info, return_index));
-                    else
-                        VTABLE_set_pmc(interp, result_item,
-                            *accessor->pmc(interp, return_info, return_index));
-                    break;
-                default:
-                    Parrot_ex_throw_from_c_args(interp, NULL,
-                            EXCEPTION_INVALID_OPERATION, "invalid return type");
-                    break;
-            }
-
-            /* Mark the option flag for the filled result. */
-            if (result_flags & PARROT_ARG_OPTIONAL) {
-                INTVAL next_result_flags;
-
-                if (result_index + 1 < result_count) {
-                    next_result_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, result_index + 1);
-                    if (next_result_flags & PARROT_ARG_OPT_FLAG) {
-                        result_index++;
-                        VTABLE_set_integer_native(interp, result_item, 1);
-                    }
-                }
-            }
-        }
-        /* We have no more positional returns, fill the optional result
-         * with a default value. */
-        else if (result_flags & PARROT_ARG_OPTIONAL) {
-            INTVAL next_result_flags;
-
-            /* We don't handle optional named results here, handle them in the
-             * next loop. */
-            if (result_flags & PARROT_ARG_NAME)
-                break;
-
-            assign_default_result_value(interp, result_item, result_flags);
-
-            /* Mark the option flag for the result to FALSE, it was filled
-             * with a default value. */
-            if (result_index + 1 < result_count) {
-                next_result_flags = VTABLE_get_integer_keyed_int(interp,
-                        raw_sig, result_index + 1);
-                if (next_result_flags & PARROT_ARG_OPT_FLAG) {
-                    result_index++;
-                    VTABLE_set_integer_native(interp, result_item, 0);
-                }
-            }
-        }
-        /* We don't have an return for the result, and it's not optional,
-         * so it's an error. */
-        else {
-            /* We don't handle named results here, go to the next loop. */
-            if (result_flags & PARROT_ARG_NAME)
-                break;
-
-            if (err_check)
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                        "too few positional returns: %d passed, %d (or more) expected",
-                        positional_returns, result_index + 1);
-        }
-
-        /* Go on to next return and result. */
-        return_index++;
-        result_index++;
-    }
-
-    /* Now iterate over the named returns and results. */
-    while (1) {
-        STRING *result_name    = NULL;
-        PMC *result_item;
-        INTVAL result_flags;
-
-        /* Check if we've used up all the results. We'll check for leftover
-         * named returns after the loop. */
-        if (result_index >= result_count)
-            break;
-
-        result_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, result_index);
-        result_item = VTABLE_get_pmc_keyed_int(interp, result_list, result_index);
-
-        /* All remaining results must be named. */
-        if (!(result_flags & PARROT_ARG_NAME)) {
-            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                    "named results must follow all positional results");
-        }
-
-        /* Collected ("slurpy") named result */
-        if (result_flags & PARROT_ARG_SLURPY_ARRAY) {
-            PMC * const collect_named = pmc_new(interp,
-                    Parrot_get_ctx_HLL_type(interp, enum_class_Hash));
-            PMC *named_return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "named"));
-            if (!PMC_IS_NULL(named_return_list)) {
-                INTVAL named_return_count = VTABLE_elements(interp, named_return_list);
-                INTVAL named_return_index;
-                PMC *named_key = pmc_new(interp, enum_class_Key);
-                VTABLE_set_integer_native(interp, named_key, 0);
-                SETATTR_Key_next_key(interp, named_key, (PMC *)INITBucketIndex);
-
-                /* Low-level hash iteration. */
-                for (named_return_index = 0; named_return_index < named_return_count; named_return_index++) {
-                    if (!PMC_IS_NULL(named_key)) {
-                        STRING *name = (STRING *)parrot_hash_get_idx(interp,
-                                    (Hash *)VTABLE_get_pointer(interp, named_return_list), named_key);
-                        PARROT_ASSERT(name);
-                        if ((PMC_IS_NULL(named_used_list)) ||
-                                !VTABLE_exists_keyed_str(interp, named_used_list, name)) {
-                            VTABLE_set_pmc_keyed_str(interp, collect_named, name,
-                                    VTABLE_get_pmc_keyed_str(interp, call_object, name));
-                            /* Mark the name as used, cannot be filled again. */
-                            if (PMC_IS_NULL(named_used_list)) /* Only created if needed. */
-                                named_used_list = pmc_new(interp, enum_class_Hash);
-                            VTABLE_set_integer_keyed_str(interp, named_used_list, name, 1);
-                            named_count++;
-                        }
-                    }
-                }
-            }
-
-            VTABLE_set_pmc(interp, result_item, collect_named);
-            break; /* End of named results. */
-        }
-
-        /* Store the name. */
-       if (!(result_flags & PARROT_ARG_STRING))
-            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                    "named results must have a name specified");
-        result_name = PARROT_ARG_CONSTANT_ISSET(result_flags)
-                               ? accessor->string_constant(interp, return_info, result_index)
-                               : *accessor->string(interp, return_info, result_index);
-
-        if (!STRING_IS_NULL(result_name)) {
-            /* The next result is the actual value. */
-            result_index++;
-            if (result_index >= result_count)
-                continue;
-            result_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, result_index);
-
-            if (VTABLE_exists_keyed_str(interp, call_object, result_name)) {
-
-                /* Mark the name as used, cannot be filled again. */
-                if (PMC_IS_NULL(named_used_list)) /* Only created if needed. */
-                    named_used_list = pmc_new(interp, enum_class_Hash);
-                VTABLE_set_integer_keyed_str(interp, named_used_list, result_name, 1);
-                named_count++;
-
-                /* Fill the named result. */
-                switch (PARROT_ARG_TYPE_MASK_MASK(result_flags)) {
-                    case PARROT_ARG_INTVAL:
-                        VTABLE_set_integer_native(interp, result_item, 
-                            *accessor->intval(interp, return_info, result_index));
-                        break;
-                    case PARROT_ARG_FLOATVAL:
-                        VTABLE_set_number_native(interp, result_item, 
-                            *accessor->numval(interp, return_info, result_index));
-                        break;
-                    case PARROT_ARG_STRING:
-                        VTABLE_set_string_native(interp, result_item, 
-                            *accessor->string(interp, return_info, result_index));
-                        break;
-                    case PARROT_ARG_PMC:
-                        VTABLE_set_pmc(interp, result_item, 
-                            *accessor->pmc(interp, return_info, result_index));
-                        break;
-                    default:
-                        Parrot_ex_throw_from_c_args(interp, NULL,
-                                EXCEPTION_INVALID_OPERATION, "invalid result type");
-                        break;
-                }
-
-                /* Mark the option flag for the filled result. */
-                if (result_flags & PARROT_ARG_OPTIONAL) {
-                    INTVAL next_result_flags;
-
-                    if (result_index + 1 < result_count) {
-                        next_result_flags = VTABLE_get_integer_keyed_int(interp,
-                                raw_sig, result_index + 1);
-                        if (next_result_flags & PARROT_ARG_OPT_FLAG) {
-                            result_index++;
-                            VTABLE_set_integer_native(interp, result_item, 1);
-                        }
-                    }
-                }
-            }
-            else if (result_flags & PARROT_ARG_OPTIONAL) {
-                INTVAL next_result_flags;
-
-                assign_default_result_value(interp, result_item, result_flags);
-
-                /* Mark the option flag for the result to FALSE, it was filled
-                 * with a default value. */
-                if (result_index + 1 < result_count) {
-                    next_result_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, result_index + 1);
-                    if (next_result_flags & PARROT_ARG_OPT_FLAG) {
-                        result_index++;
-                        result_item = VTABLE_get_pmc_keyed_int(interp, result_list, result_index);
-                        VTABLE_set_integer_native(interp, result_item, 1);
-                    }
-                }
-            }
-            /* We don't have an return for the result, and it's not optional,
-             * so it's an error. */
-            else {
-                if (err_check)
-                    Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                            "too few named returns: no return for required result '%S'",
-                            result_name);
-            }
-        }
-
-        result_index++;
-    }
-
-    /* Double check that all named returns were assigned to results. */
-    if (err_check) {
-        PMC *named_return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "named"));
-        if (!PMC_IS_NULL(named_return_list)) {
-            INTVAL named_return_count = VTABLE_elements(interp, named_return_list);
-            if (PMC_IS_NULL(named_used_list))
-                    Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                            "too many named returns: %d passed, 0 used",
-                            named_return_count);
-            if (named_return_count > named_count) {
-                /* At this point we know we have named returns that weren't
-                 * assigned to results. We're going to throw an exception
-                 * anyway, so spend a little extra effort to tell the user *which*
-                 * named return is extra. */
-                INTVAL named_return_index;
-                PMC *named_key = pmc_new(interp, enum_class_Key);
-                VTABLE_set_integer_native(interp, named_key, 0);
-                SETATTR_Key_next_key(interp, named_key, (PMC *)INITBucketIndex);
-
-                /* Low-level hash iteration. */
-                for (named_return_index = 0; named_return_index < named_return_count; named_return_index++) {
-                    if (!PMC_IS_NULL(named_key)) {
-                        STRING *name = (STRING *)parrot_hash_get_idx(interp,
-                                    (Hash *)VTABLE_get_pointer(interp, named_return_list), named_key);
-                        PARROT_ASSERT(name);
-                        if (!VTABLE_exists_keyed_str(interp, named_used_list, name)) {
-                            Parrot_ex_throw_from_c_args(interp, NULL,
-                                    EXCEPTION_INVALID_OPERATION,
-                                    "too many named returns: '%S' not used",
-                                    name);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-}
-
-/*
-
 =item C<void Parrot_pcc_fill_returns_from_op(PARROT_INTERP, PMC *call_object,
 PMC *raw_sig, opcode_t *raw_returns)>
 
@@ -1827,18 +1300,6 @@
     INTVAL return_index = 0;
     INTVAL return_list_index = 0;
     INTVAL err_check      = 0;
-    static pcc_set_funcs function_pointers = {
-        (intval_func_t)intval_from_op,
-        (numval_func_t)numval_from_op,
-        (string_func_t)string_from_op,
-        (pmc_func_t)pmc_from_op,
-
-        (intval_constant_func_t)intval_constant_from_op,
-        (numval_constant_func_t)numval_constant_from_op,
-        (string_constant_func_t)string_constant_from_op,
-        (pmc_constant_func_t)pmc_constant_from_op,
-    };
-
 
     /* Check if we should be throwing errors. This is configured separately
      * for parameters and return values. */
@@ -1856,9 +1317,84 @@
         return;
     }
 
-    fill_results(interp, call_object, raw_sig, raw_returns, &function_pointers);
+    return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
+    if (PMC_IS_NULL(return_list)) {
+        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;
+    }
+    else
+        return_list_elements = VTABLE_elements(interp, return_list);
+
+    caller_return_flags = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "return_flags"));
+
+
+    if (raw_return_count > return_list_elements) {
+        if (err_check)
+            Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
+                    "too many return values: %d passed, %d expected",
+                    raw_return_count, return_list_elements);
+    }
+
+    for (return_index = 0; return_index < raw_return_count; return_index++) {
+        INTVAL return_flags = VTABLE_get_integer_keyed_int(interp,
+                    raw_sig, return_index);
+        INTVAL result_flags;
 
-    return;
+        const INTVAL constant  = PARROT_ARG_CONSTANT_ISSET(return_flags);
+        const INTVAL raw_index = raw_returns[return_index + 2];
+        PMC *result_item = VTABLE_get_pmc_keyed_int(interp, return_list, return_list_index);
+        STRING *item_sig;
+
+        /* Gracefully ignore extra returns when error checking is off. */
+        if (PMC_IS_NULL(result_item))
+            continue; /* Go on to next return arg. */
+
+        result_flags = VTABLE_get_integer_keyed_int(interp, caller_return_flags, return_list_index);
+        item_sig = VTABLE_get_string_keyed_str(interp, result_item, CONST_STRING(interp, ''));
+
+        switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
+            case PARROT_ARG_INTVAL:
+                if (constant)
+                    VTABLE_set_integer_native(interp, result_item, raw_index);
+                else
+                    VTABLE_set_integer_native(interp, result_item, CTX_REG_INT(ctx, raw_index));
+                return_list_index++;
+                break;
+            case PARROT_ARG_FLOATVAL:
+                if (constant)
+                    VTABLE_set_number_native(interp, result_item,
+                            Parrot_pcc_get_num_constant(interp, ctx, raw_index));
+                else
+                    VTABLE_set_number_native(interp, result_item, CTX_REG_NUM(ctx, raw_index));
+                return_list_index++;
+                break;
+            case PARROT_ARG_STRING:
+                if (constant)
+                    VTABLE_set_string_native(interp, result_item, Parrot_str_new_COW(interp,
+                            Parrot_pcc_get_string_constant(interp, ctx, raw_index)));
+                else
+                    VTABLE_set_string_native(interp, result_item, CTX_REG_STR(ctx, raw_index));
+                return_list_index++;
+                break;
+            case PARROT_ARG_PMC:
+                if (constant)
+                    VTABLE_set_pmc(interp, result_item,
+                            Parrot_pcc_get_pmc_constant(interp, ctx, raw_index));
+                else
+                    VTABLE_set_pmc(interp, result_item, CTX_REG_PMC(ctx, raw_index));
+                return_list_index++;
+                break;
+            default:
+                Parrot_ex_throw_from_c_args(interp, NULL,
+                        EXCEPTION_INVALID_OPERATION, "invalid parameter type");
+                break;
+        }
+    }
 }
 
 /*


More information about the parrot-commits mailing list