fix scoping of named parameters
[p5sagit/Function-Parameters.git] / Parameters.xs
index 5d97321..784d96b 100644 (file)
@@ -1283,7 +1283,37 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
                        OP *nameblock;
                        PADOFFSET vb, vc, vi, vk;
                        int vb_is_str, vc_is_str;
-                       const size_t pos = count_positional_params(param_spec);
+
+                       {
+                               OP *lhs;
+                               size_t i, lim;
+
+                               lhs = NULL;
+
+                               for (i = 0, lim = param_spec->named_required.used; i < lim; i++) {
+                                       OP *const var = my_var(
+                                               aTHX_
+                                               OPf_MOD | OPf_WANT_LIST | (OPpLVAL_INTRO << 8),
+                                               param_spec->named_required.data[i].padoff
+                                       );
+                                       lhs = op_append_elem(OP_LIST, lhs, var);
+                               }
+
+                               for (i = 0, lim = param_spec->named_optional.used; i < lim; i++) {
+                                       OP *const var = my_var(
+                                               aTHX_
+                                               OPf_MOD | OPf_WANT_LIST | (OPpLVAL_INTRO << 8),
+                                               param_spec->named_optional.data[i].param.padoff
+                                       );
+                                       lhs = op_append_elem(OP_LIST, lhs, var);
+                               }
+
+                               lhs->op_flags |= OPf_PARENS;
+                               *prelude_sentinel = op_append_list(
+                                       OP_LINESEQ, *prelude_sentinel,
+                                       lhs
+                               );
+                       }
 
                        nameblock = NULL;
                        nameblock_ix = S_block_start(aTHX_ TRUE);
@@ -1319,7 +1349,7 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
 
                                var = newOP(OP_PADSV, OPf_MOD | (OPpLVAL_INTRO << 8));
                                var->op_targ = vi = pad_add_name_pvs("$__I", 0, NULL, NULL);
-                               var = newASSIGNOP(OPf_STACKED, var, 0, newSVOP(OP_CONST, 0, newSViv(pos)));
+                               var = newASSIGNOP(OPf_STACKED, var, 0, newSVOP(OP_CONST, 0, newSViv(count_positional_params(param_spec))));
                                decl = op_append_list(OP_LINESEQ, decl, newSTATEOP(0, NULL, var));
 
                                //S_intro_my(aTHX);
@@ -1431,7 +1461,7 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
                                                } else {
                                                        vec = newASSIGNOP(
                                                                OPf_STACKED,
-                                                               my_var(0, vc),
+                                                               my_var(aTHX_ 0, vc),
                                                                OP_BIT_OR,
                                                                newSVOP(OP_CONST, 0, newSVuv((UV)1 << i))
                                                        );
@@ -1483,7 +1513,7 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
                                                } else {
                                                        vec = newASSIGNOP(
                                                                OPf_STACKED,
-                                                               my_var(0, vb),
+                                                               my_var(aTHX_ 0, vb),
                                                                OP_BIT_OR,
                                                                newSVOP(OP_CONST, 0, newSVuv((UV)1 << i))
                                                        );
@@ -1560,7 +1590,7 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
                                                        0,
                                                        vb_is_str
                                                                ? mkvecbits(aTHX_ vb, i)
-                                                               : newBINOP(OP_BIT_AND, 0, my_var(0, vb), newSVOP(OP_CONST, 0, newSVuv((UV)1 << i)))
+                                                               : newBINOP(OP_BIT_AND, 0, my_var(aTHX_ 0, vb), newSVOP(OP_CONST, 0, newSVuv((UV)1 << i)))
                                                        ,
                                                        newNULLLIST(),
                                                        newSVOP(OP_CONST, 0, newSVpvn_utf8(p + 1, n - 1, SvUTF8(sv)))
@@ -1643,7 +1673,7 @@ static int parse_fun(pTHX_ OP **pop, const char *keyword_ptr, STRLEN keyword_len
                                                OP_NOT, OPf_SPECIAL,
                                                vc_is_str
                                                ? mkvecbits(aTHX_ vc, i)
-                                               : newBINOP(OP_BIT_AND, 0, my_var(0, vc), newSVOP(OP_CONST, 0, newSVuv((UV)1 << i)))
+                                               : newBINOP(OP_BIT_AND, 0, my_var(aTHX_ 0, vc), newSVOP(OP_CONST, 0, newSVuv((UV)1 << i)))
                                        );
 
                                        init = newCONDOP(0, cond, init, NULL);