X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Parameters.xs;h=784d96b3ebc5bee1e560a34ad7f4727c34451c64;hb=c56c77b63484ad166c526cbf4d65f6a54d394b24;hp=5d97321a6de26dd6eef2a35199ebed2c85ffd5bb;hpb=0f875412cdfbc1f0602b973fcd93d34189e8a43f;p=p5sagit%2FFunction-Parameters.git diff --git a/Parameters.xs b/Parameters.xs index 5d97321..784d96b 100644 --- a/Parameters.xs +++ b/Parameters.xs @@ -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);