[svn:parrot] r42039 - trunk/src/call

bacek at svn.parrot.org bacek at svn.parrot.org
Fri Oct 23 15:56:30 UTC 2009


Author: bacek
Date: Fri Oct 23 15:56:28 2009
New Revision: 42039
URL: https://trac.parrot.org/parrot/changeset/42039

Log:
[core][pcc] FLAT returns into SLURPY results.

Modified:
   trunk/src/call/args.c

Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c	Fri Oct 23 15:09:02 2009	(r42038)
+++ trunk/src/call/args.c	Fri Oct 23 15:56:28 2009	(r42039)
@@ -1660,15 +1660,29 @@
                                 :accessor->string(interp, return_info, return_index));
                         break;
                     case PARROT_ARG_PMC:
+                    {
+                        PMC *return_item = (constant)
+                                         ? accessor->pmc_constant(interp, return_info, return_index)
+                                         : accessor->pmc(interp, return_info, return_index);
                         if (return_flags & PARROT_ARG_FLATTEN) {
-                            Parrot_ex_throw_from_c_args(interp, NULL,
-                                    EXCEPTION_INVALID_OPERATION,
-                                    "We don't handle :flat returns into a :slurpy result yet\n");
+                            INTVAL flat_pos;
+                            INTVAL flat_elems;
+                            if (!VTABLE_does(interp, return_item, CONST_STRING(interp, "array"))) {
+                                Parrot_ex_throw_from_c_args(interp, NULL,
+                                                            EXCEPTION_INVALID_OPERATION,
+                                                            "flattened return on a non-array");
+                            }
+                            flat_elems = VTABLE_elements(interp, return_item);
+                            for(flat_pos = 0; flat_pos < flat_elems; flat_pos++) {
+                                /* fetch an item out of the aggregate */
+                                VTABLE_push_pmc(interp, collect_positional,
+                                        VTABLE_get_pmc_keyed_int(interp, return_item, flat_pos));
+                            }
                         }
-                        VTABLE_push_pmc(interp, collect_positional, constant?
-                                accessor->pmc_constant(interp, return_info, return_index)
-                                :accessor->pmc(interp, return_info, return_index));
+                        else
+                            VTABLE_push_pmc(interp, collect_positional, return_item);
                         break;
+                    }
                     default:
                         Parrot_ex_throw_from_c_args(interp, NULL,
                                 EXCEPTION_INVALID_OPERATION, "invalid return type");


More information about the parrot-commits mailing list