X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_ctl.c;h=46636f787f850734827fbf6da88d7b9d137aade0;hb=015eb7b967ac690ef0b530c0aa564f080ff0fa4b;hp=6a5ea652b4358da09a408202a1bc51d22079e731;hpb=d0b243e39ca09d7da156b4027255b58fa0a84810;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_ctl.c b/pp_ctl.c index 6a5ea65..46636f7 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -4303,28 +4303,19 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) destroy_matcher(matcher); RETPUSHNO; } - else if (SvNIOK(d)) { + else if (!SvOK(d)) { + /* undef ~~ array */ + const I32 this_len = av_len(MUTABLE_AV(SvRV(e))); I32 i; - for(i = 0; i <= AvFILL(MUTABLE_AV(SvRV(e))); ++i) { + for (i = 0; i <= this_len; ++i) { SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE); - if (!svp) - continue; - - PUSHs(d); - PUSHs(*svp); - PUTBACK; - if (CopHINTS_get(PL_curcop) & HINT_INTEGER) - (void) pp_i_eq(); - else - (void) pp_eq(); - SPAGAIN; - if (SvTRUEx(POPs)) + if (!svp || !SvOK(*svp)) RETPUSHYES; } RETPUSHNO; } - else if (SvPOK(d)) { + else { const I32 this_len = av_len(MUTABLE_AV(SvRV(e))); I32 i; @@ -4332,11 +4323,12 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) SV * const * const svp = av_fetch(MUTABLE_AV(SvRV(e)), i, FALSE); if (!svp) continue; - + PUSHs(d); PUSHs(*svp); PUTBACK; - (void) pp_seq(); + /* infinite recursion isn't supposed to happen here */ + (void) do_smartmatch(NULL, NULL); SPAGAIN; if (SvTRUEx(POPs)) RETPUSHYES;