[svn:parrot] r48357 - trunk/src/call
NotFound at svn.parrot.org
NotFound at svn.parrot.org
Mon Aug 9 12:32:59 UTC 2010
Author: NotFound
Date: Mon Aug 9 12:32:58 2010
New Revision: 48357
URL: https://trac.parrot.org/parrot/changeset/48357
Log:
fix pcc handling of slurpy after optional, TT #1733
Modified:
trunk/src/call/args.c
Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c Mon Aug 9 05:50:26 2010 (r48356)
+++ trunk/src/call/args.c Mon Aug 9 12:32:58 2010 (r48357)
@@ -816,29 +816,29 @@
/* If the parameter is slurpy, collect all remaining positional
* arguments into an array.*/
if (param_flags & PARROT_ARG_SLURPY_ARRAY) {
- PMC *collect_positional;
- int j;
-
/* Can't handle named slurpy here, go to named argument handling */
- if (param_flags & PARROT_ARG_NAME)
- break;
+ if (!(param_flags & PARROT_ARG_NAME)) {
+ PMC *collect_positional;
+ int j;
+ INTVAL num_positionals = positional_args - arg_index;
+ if (num_positionals < 0)
+ num_positionals = 0;
+ if (named_count > 0)
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "named parameters must follow all positional parameters");
- if (named_count > 0)
- Parrot_ex_throw_from_c_args(interp, NULL,
- EXCEPTION_INVALID_OPERATION,
- "named parameters must follow all positional parameters");
+ collect_positional = Parrot_pmc_new_init_int(interp,
+ Parrot_get_ctx_HLL_type(interp, enum_class_ResizablePMCArray),
+ num_positionals);
- collect_positional = Parrot_pmc_new_init_int(interp,
- Parrot_get_ctx_HLL_type(interp, enum_class_ResizablePMCArray),
- positional_args - arg_index);
+ for (j = 0; arg_index < positional_args; ++arg_index)
+ VTABLE_set_pmc_keyed_int(interp, collect_positional, j++,
+ VTABLE_get_pmc_keyed_int(interp, call_object, arg_index));
- for (j = 0; arg_index < positional_args; ++arg_index) {
- VTABLE_set_pmc_keyed_int(interp, collect_positional, j++,
- VTABLE_get_pmc_keyed_int(interp, call_object, arg_index));
+ *accessor->pmc(interp, arg_info, param_index) = collect_positional;
+ ++param_index;
}
-
- *accessor->pmc(interp, arg_info, param_index) = collect_positional;
- ++param_index;
break; /* Terminate the positional arg loop. */
}
More information about the parrot-commits
mailing list