[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