[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