X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=doop.c;h=702aaf85e585728535c9518e2c662071e9190ca1;hb=2d259d9294e79c03b1a69d3eaac3d6e5647468d7;hp=11dc837b33dc7240d0a40719c6cca8879841d5e4;hpb=c4f23d77f4b3486a36335c4460cbfd4e81e37892;p=p5sagit%2Fp5-mst-13.2.git diff --git a/doop.c b/doop.c index 11dc837..702aaf8 100644 --- a/doop.c +++ b/doop.c @@ -106,7 +106,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp) sv_upgrade(sv, SVt_PV); if (SvLEN(sv) < len + items) { /* current length is way too short */ while (items-- > 0) { - if (*mark) { + if (*mark && !SvGMAGICAL(*mark) && SvOK(*mark)) { SvPV(*mark, tmplen); len += tmplen; } @@ -445,6 +445,7 @@ do_kv(ARGSproto) { djSP; HV *hv = (HV*)POPs; + HV *keys; register HE *entry; SV *tmpstr; I32 gimme = GIMME_V; @@ -465,10 +466,8 @@ do_kv(ARGSproto) RETURN; } - if (realhv) - (void)hv_iterinit(hv); /* always reset iterator regardless */ - else - (void)avhv_iterinit((AV*)hv); + keys = realhv ? hv : avhv_keys((AV*)hv); + (void)hv_iterinit(keys); /* always reset iterator regardless */ if (gimme == G_VOID) RETURN; @@ -483,29 +482,30 @@ do_kv(ARGSproto) sv_magic(TARG, Nullsv, 'k', Nullch, 0); } LvTYPE(TARG) = 'k'; - LvTARG(TARG) = (SV*)hv; + if (LvTARG(TARG) != (SV*)keys) { + if (LvTARG(TARG)) + SvREFCNT_dec(LvTARG(TARG)); + LvTARG(TARG) = SvREFCNT_inc(keys); + } PUSHs(TARG); RETURN; } - if (!SvRMAGICAL(hv) || !mg_find((SV*)hv,'P')) - i = HvKEYS(hv); + if (!SvRMAGICAL(keys) || !mg_find((SV*)keys,'P')) + i = HvKEYS(keys); else { i = 0; /*SUPPRESS 560*/ - while (entry = realhv ? hv_iternext(hv) : avhv_iternext((AV*)hv)) { - i++; - } + while (hv_iternext(keys)) i++; } PUSHi( i ); RETURN; } - /* Guess how much room we need. hv_max may be a few too many. Oh well. */ - EXTEND(SP, HvMAX(hv) * (dokeys + dovalues)); + EXTEND(SP, HvKEYS(keys) * (dokeys + dovalues)); PUTBACK; /* hv_iternext and hv_iterval might clobber stack_sp */ - while (entry = realhv ? hv_iternext(hv) : avhv_iternext((AV*)hv)) { + while (entry = hv_iternext(keys)) { SPAGAIN; if (dokeys) XPUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */ @@ -516,8 +516,8 @@ do_kv(ARGSproto) hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry)); DEBUG_H(sv_setpvf(tmpstr, "%lu%%%d=%lu", (unsigned long)HeHASH(entry), - HvMAX(hv)+1, - (unsigned long)(HeHASH(entry) & HvMAX(hv)))); + HvMAX(keys)+1, + (unsigned long)(HeHASH(entry) & HvMAX(keys)))); SPAGAIN; XPUSHs(tmpstr); }