X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_ctl.c;h=832f189c1165a17dd2636586c975ee53c09d28ed;hb=6ae7e45950bbea01cc8774a8c6c78ed87228651c;hp=9633ba3a247e094ce2a47d448a433bfcc44877f3;hpb=ff806af2ea404e8d06ddc51fb69c5913462e33d3;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_ctl.c b/pp_ctl.c index 9633ba3..832f189 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -796,17 +796,23 @@ PP(pp_formline) case FF_0DECIMAL: arg = *fpc++; #if defined(USE_LONG_DOUBLE) - fmt = (arg & 256) ? "%#0*.*" PERL_PRIfldbl : "%0*.*" PERL_PRIfldbl; + fmt = (const char *) + ((arg & 256) ? + "%#0*.*" PERL_PRIfldbl : "%0*.*" PERL_PRIfldbl); #else - fmt = (arg & 256) ? "%#0*.*f" : "%0*.*f"; + fmt = (const char *) + ((arg & 256) ? + "%#0*.*f" : "%0*.*f"); #endif goto ff_dec; case FF_DECIMAL: arg = *fpc++; #if defined(USE_LONG_DOUBLE) - fmt = (arg & 256) ? "%#*.*" PERL_PRIfldbl : "%*.*" PERL_PRIfldbl; + fmt = (const char *) + ((arg & 256) ? "%#*.*" PERL_PRIfldbl : "%*.*" PERL_PRIfldbl); #else - fmt = (arg & 256) ? "%#*.*f" : "%*.*f"; + fmt = (const char *) + ((arg & 256) ? "%#*.*f" : "%*.*f"); #endif ff_dec: /* If the field is marked with ^ and the value is undefined, @@ -1283,8 +1289,8 @@ Perl_is_lvalue_sub(pTHX) const I32 cxix = dopoptosub(cxstack_ix); assert(cxix >= 0); /* We should only be called from inside subs */ - if (cxstack[cxix].blk_sub.lval && CvLVALUE(cxstack[cxix].blk_sub.cv)) - return cxstack[cxix].blk_sub.lval; + if (CX_SUB_LVAL(cxstack + cxix) && CvLVALUE(cxstack[cxix].blk_sub.cv)) + return CX_SUB_LVAL(cxstack + cxix); else return 0; } @@ -1509,7 +1515,7 @@ Perl_die_where(pTHX_ const char *message, STRLEN msglen) if (CxTYPE(cx) != CXt_EVAL) { if (!message) message = SvPVx_const(ERRSV, msglen); - PerlIO_write(Perl_error_log, "panic: die ", 11); + PerlIO_write(Perl_error_log, (const char *)"panic: die ", 11); PerlIO_write(Perl_error_log, message, msglen); my_exit(1); } @@ -1635,11 +1641,11 @@ PP(pp_caller) SV * const sv = newSV(0); gv_efullname3(sv, cvgv, NULL); PUSHs(sv_2mortal(sv)); - PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs))); + PUSHs(sv_2mortal(newSViv((I32)CX_SUB_HASARGS_GET(cx)))); } else { PUSHs(sv_2mortal(newSVpvs("(unknown)"))); - PUSHs(sv_2mortal(newSViv((I32)cx->blk_sub.hasargs))); + PUSHs(sv_2mortal(newSViv((I32)CX_SUB_HASARGS_GET(cx)))); } } else { @@ -1672,7 +1678,7 @@ PP(pp_caller) PUSHs(&PL_sv_undef); PUSHs(&PL_sv_undef); } - if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs + if (CxTYPE(cx) == CXt_SUB && CX_SUB_HASARGS_GET(cx) && CopSTASH_eq(PL_curcop, PL_debstash)) { AV * const ary = cx->blk_sub.argarray; @@ -1731,7 +1737,7 @@ PP(pp_reset) { dVAR; dSP; - const char * const tmps = (MAXARG < 1) ? "" : POPpconstx; + const char * const tmps = (MAXARG < 1) ? (const char *)"" : POPpconstx; sv_reset(tmps, CopSTASH(PL_curcop)); PUSHs(&PL_sv_yes); RETURN; @@ -1802,7 +1808,7 @@ PP(pp_enteriter) register PERL_CONTEXT *cx; const I32 gimme = GIMME_V; SV **svp; - U32 cxtype = CXt_LOOP | CXp_FOREACH; + U16 cxtype = CXt_LOOP | CXp_FOREACH; #ifdef USE_ITHREADS void *iterdata; #endif @@ -2342,7 +2348,7 @@ PP(pp_goto) } else if (CxMULTICALL(cx)) DIE(aTHX_ "Can't goto subroutine from a sort sub (or similar callback)"); - if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.hasargs) { + if (CxTYPE(cx) == CXt_SUB && CX_SUB_HASARGS_GET(cx)) { /* put @_ back onto stack */ AV* av = cx->blk_sub.argarray; @@ -2404,7 +2410,7 @@ PP(pp_goto) PL_in_eval = cx->blk_eval.old_in_eval; PL_eval_root = cx->blk_eval.old_eval_root; cx->cx_type = CXt_SUB; - cx->blk_sub.hasargs = 0; + CX_SUB_HASARGS_SET(cx, 0); } cx->blk_sub.cv = cv; cx->blk_sub.olddepth = CvDEPTH(cv); @@ -2419,7 +2425,7 @@ PP(pp_goto) } SAVECOMPPAD(); PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); - if (cx->blk_sub.hasargs) + if (CX_SUB_HASARGS_GET(cx)) { AV* const av = (AV*)PAD_SVl(0); @@ -3423,9 +3429,7 @@ PP(pp_entereval) U32 seq; HV *saved_hh = NULL; const char * const fakestr = "_<(eval )"; -#ifdef HAS_STRLCPY const int fakelen = 9 + 1; -#endif if (PL_op->op_private & OPpEVAL_HAS_HH) { saved_hh = (HV*) SvREFCNT_inc(POPs); @@ -3498,11 +3502,7 @@ PP(pp_entereval) if (PERLDB_INTER && was != (I32)PL_sub_generation /* Some subs defined here. */ && ret != PL_op->op_next) { /* Successive compilation. */ /* Copy in anything fake and short. */ -#ifdef HAS_STRLCPY - strlcpy(safestr, fakestr, fakelen); -#else - strcpy(safestr, fakestr); -#endif /* #ifdef HAS_STRLCPY */ + my_strlcpy(safestr, fakestr, fakelen); } return DOCATCH(ret); } @@ -3768,42 +3768,8 @@ PP(pp_smartmatch) return do_smartmatch(NULL, NULL); } -/* This version of do_smartmatch() implements the following - table of smart matches: - - $a $b Type of Match Implied Matching Code - ====== ===== ===================== ============= - (overloading trumps everything) - - Code[+] Code[+] referential equality match if refaddr($a) == refaddr($b) - Any Code[+] scalar sub truth match if $b->($a) - - Hash Hash hash keys identical match if sort(keys(%$a)) ÈeqÇ sort(keys(%$b)) - Hash Array hash value slice truth match if $a->{any(@$b)} - Hash Regex hash key grep match if any(keys(%$a)) =~ /$b/ - Hash Any hash entry existence match if exists $a->{$b} - - Array Array arrays are identical[*] match if $a È~~Ç $b - Array Regex array grep match if any(@$a) =~ /$b/ - Array Num array contains number match if any($a) == $b - Array Any array contains string match if any($a) eq $b - - Any undef undefined match if !defined $a - Any Regex pattern match match if $a =~ /$b/ - Code() Code() results are equal match if $a->() eq $b->() - Any Code() simple closure truth match if $b->() (ignoring $a) - Num numish[!] numeric equality match if $a == $b - Any Str string equality match if $a eq $b - Any Num numeric equality match if $a == $b - - Any Any string equality match if $a eq $b - - - + - this must be a code reference whose prototype (if present) is not "" - (subs with a "" prototype are dealt with by the 'Code()' entry lower down) - * - if a circular reference is found, we fall back to referential equality - ! - either a real number, or a string that looks_like_number() - +/* This version of do_smartmatch() implements the + * table of smart matches that is found in perlsyn. */ STATIC OP * @@ -3814,39 +3780,39 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) SV *e = TOPs; /* e is for 'expression' */ SV *d = TOPm1s; /* d is for 'default', as in PL_defgv */ - SV *this, *other; + SV *This, *Other; /* 'This' (and Other to match) to play with C++ */ MAGIC *mg; regexp *this_regex, *other_regex; # define NOT_EMPTY_PROTO(cv) (!SvPOK(cv) || SvCUR(cv) == 0) # define SM_REF(type) ( \ - (SvROK(d) && (SvTYPE(this = SvRV(d)) == SVt_##type) && (other = e)) \ - || (SvROK(e) && (SvTYPE(this = SvRV(e)) == SVt_##type) && (other = d))) + (SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_##type) && (Other = e)) \ + || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_##type) && (Other = d))) # define SM_CV_NEP /* Find a code ref without an empty prototype */ \ - ((SvROK(d) && (SvTYPE(this = SvRV(d)) == SVt_PVCV) \ - && NOT_EMPTY_PROTO(this) && (other = e)) \ - || (SvROK(e) && (SvTYPE(this = SvRV(e)) == SVt_PVCV) \ - && NOT_EMPTY_PROTO(this) && (other = d))) + ((SvROK(d) && (SvTYPE(This = SvRV(d)) == SVt_PVCV) \ + && NOT_EMPTY_PROTO(This) && (Other = e)) \ + || (SvROK(e) && (SvTYPE(This = SvRV(e)) == SVt_PVCV) \ + && NOT_EMPTY_PROTO(This) && (Other = d))) # define SM_REGEX ( \ - (SvROK(d) && SvMAGICAL(this = SvRV(d)) \ - && (mg = mg_find(this, PERL_MAGIC_qr)) \ + (SvROK(d) && SvMAGICAL(This = SvRV(d)) \ + && (mg = mg_find(This, PERL_MAGIC_qr)) \ && (this_regex = (regexp *)mg->mg_obj) \ - && (other = e)) \ + && (Other = e)) \ || \ - (SvROK(e) && SvMAGICAL(this = SvRV(e)) \ - && (mg = mg_find(this, PERL_MAGIC_qr)) \ + (SvROK(e) && SvMAGICAL(This = SvRV(e)) \ + && (mg = mg_find(This, PERL_MAGIC_qr)) \ && (this_regex = (regexp *)mg->mg_obj) \ - && (other = d)) ) + && (Other = d)) ) # define SM_OTHER_REF(type) \ - (SvROK(other) && SvTYPE(SvRV(other)) == SVt_##type) + (SvROK(Other) && SvTYPE(SvRV(Other)) == SVt_##type) -# define SM_OTHER_REGEX (SvROK(other) && SvMAGICAL(SvRV(other)) \ - && (mg = mg_find(SvRV(other), PERL_MAGIC_qr)) \ +# define SM_OTHER_REGEX (SvROK(Other) && SvMAGICAL(SvRV(Other)) \ + && (mg = mg_find(SvRV(Other), PERL_MAGIC_qr)) \ && (other_regex = (regexp *)mg->mg_obj)) @@ -3876,9 +3842,9 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) if (SM_CV_NEP) { I32 c; - if ( SM_OTHER_REF(PVCV) && NOT_EMPTY_PROTO(SvRV(other)) ) + if ( SM_OTHER_REF(PVCV) && NOT_EMPTY_PROTO(SvRV(Other)) ) { - if (this == SvRV(other)) + if (This == SvRV(Other)) RETPUSHYES; else RETPUSHNO; @@ -3887,9 +3853,9 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) ENTER; SAVETMPS; PUSHMARK(SP); - PUSHs(other); + PUSHs(Other); PUTBACK; - c = call_sv(this, G_SCALAR); + c = call_sv(This, G_SCALAR); SPAGAIN; if (c == 0) PUSHs(&PL_sv_no); @@ -3903,39 +3869,39 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) if (SM_OTHER_REF(PVHV)) { /* Check that the key-sets are identical */ HE *he; - HV *other_hv = (HV *) SvRV(other); + HV *other_hv = (HV *) SvRV(Other); bool tied = FALSE; bool other_tied = FALSE; U32 this_key_count = 0, other_key_count = 0; /* Tied hashes don't know how many keys they have. */ - if (SvTIED_mg(this, PERL_MAGIC_tied)) { + if (SvTIED_mg(This, PERL_MAGIC_tied)) { tied = TRUE; } else if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) { HV * const temp = other_hv; - other_hv = (HV *) this; - this = (SV *) temp; + other_hv = (HV *) This; + This = (SV *) temp; tied = TRUE; } if (SvTIED_mg((SV *) other_hv, PERL_MAGIC_tied)) other_tied = TRUE; - if (!tied && HvUSEDKEYS((HV *) this) != HvUSEDKEYS(other_hv)) + if (!tied && HvUSEDKEYS((HV *) This) != HvUSEDKEYS(other_hv)) RETPUSHNO; /* The hashes have the same number of keys, so it suffices to check that one is a subset of the other. */ - (void) hv_iterinit((HV *) this); - while ( (he = hv_iternext((HV *) this)) ) { + (void) hv_iterinit((HV *) This); + while ( (he = hv_iternext((HV *) This)) ) { I32 key_len; char * const key = hv_iterkey(he, &key_len); ++ this_key_count; if(!hv_exists(other_hv, key, key_len)) { - (void) hv_iterinit((HV *) this); /* reset iterator */ + (void) hv_iterinit((HV *) This); /* reset iterator */ RETPUSHNO; } } @@ -3954,11 +3920,11 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) RETPUSHYES; } else if (SM_OTHER_REF(PVAV)) { - AV * const other_av = (AV *) SvRV(other); + AV * const other_av = (AV *) SvRV(Other); const I32 other_len = av_len(other_av) + 1; I32 i; - if (HvUSEDKEYS((HV *) this) != other_len) + if (HvUSEDKEYS((HV *) This) != other_len) RETPUSHNO; for(i = 0; i < other_len; ++i) { @@ -3970,7 +3936,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) RETPUSHNO; key = SvPV(*svp, key_len); - if(!hv_exists((HV *) this, key, key_len)) + if(!hv_exists((HV *) This, key, key_len)) RETPUSHNO; } RETPUSHYES; @@ -3979,10 +3945,10 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) PMOP * const matcher = make_matcher(other_regex); HE *he; - (void) hv_iterinit((HV *) this); - while ( (he = hv_iternext((HV *) this)) ) { + (void) hv_iterinit((HV *) This); + while ( (he = hv_iternext((HV *) This)) ) { if (matcher_matches_sv(matcher, hv_iterkeysv(he))) { - (void) hv_iterinit((HV *) this); + (void) hv_iterinit((HV *) This); destroy_matcher(matcher); RETPUSHYES; } @@ -3991,7 +3957,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) RETPUSHNO; } else { - if (hv_exists_ent((HV *) this, other, 0)) + if (hv_exists_ent((HV *) This, Other, 0)) RETPUSHYES; else RETPUSHNO; @@ -3999,8 +3965,8 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) } else if (SM_REF(PVAV)) { if (SM_OTHER_REF(PVAV)) { - AV *other_av = (AV *) SvRV(other); - if (av_len((AV *) this) != av_len(other_av)) + AV *other_av = (AV *) SvRV(Other); + if (av_len((AV *) This) != av_len(other_av)) RETPUSHNO; else { I32 i; @@ -4015,7 +3981,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) (void) sv_2mortal((SV *) seen_other); } for(i = 0; i <= other_len; ++i) { - SV * const * const this_elem = av_fetch((AV *)this, i, FALSE); + SV * const * const this_elem = av_fetch((AV *)This, i, FALSE); SV * const * const other_elem = av_fetch(other_av, i, FALSE); if (!this_elem || !other_elem) { @@ -4051,11 +4017,11 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) } else if (SM_OTHER_REGEX) { PMOP * const matcher = make_matcher(other_regex); - const I32 this_len = av_len((AV *) this); + const I32 this_len = av_len((AV *) This); I32 i; for(i = 0; i <= this_len; ++i) { - SV * const * const svp = av_fetch((AV *)this, i, FALSE); + SV * const * const svp = av_fetch((AV *)This, i, FALSE); if (svp && matcher_matches_sv(matcher, *svp)) { destroy_matcher(matcher); RETPUSHYES; @@ -4064,15 +4030,15 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) destroy_matcher(matcher); RETPUSHNO; } - else if (SvIOK(other) || SvNOK(other)) { + else if (SvIOK(Other) || SvNOK(Other)) { I32 i; - for(i = 0; i <= AvFILL((AV *) this); ++i) { - SV * const * const svp = av_fetch((AV *)this, i, FALSE); + for(i = 0; i <= AvFILL((AV *) This); ++i) { + SV * const * const svp = av_fetch((AV *)This, i, FALSE); if (!svp) continue; - PUSHs(other); + PUSHs(Other); PUSHs(*svp); PUTBACK; if (CopHINTS_get(PL_curcop) & HINT_INTEGER) @@ -4085,16 +4051,16 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) } RETPUSHNO; } - else if (SvPOK(other)) { - const I32 this_len = av_len((AV *) this); + else if (SvPOK(Other)) { + const I32 this_len = av_len((AV *) This); I32 i; for(i = 0; i <= this_len; ++i) { - SV * const * const svp = av_fetch((AV *)this, i, FALSE); + SV * const * const svp = av_fetch((AV *)This, i, FALSE); if (!svp) continue; - PUSHs(other); + PUSHs(Other); PUSHs(*svp); PUTBACK; (void) pp_seq(); @@ -4115,7 +4081,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) PMOP * const matcher = make_matcher(this_regex); PUTBACK; - PUSHs(matcher_matches_sv(matcher, other) + PUSHs(matcher_matches_sv(matcher, Other) ? &PL_sv_yes : &PL_sv_no); destroy_matcher(matcher); @@ -4130,7 +4096,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) SAVETMPS; PUSHMARK(SP); PUTBACK; - c = call_sv(this, G_SCALAR); + c = call_sv(This, G_SCALAR); SPAGAIN; if (c == 0) PUSHs(&PL_sv_undef); @@ -4141,7 +4107,7 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) /* This one has to be null-proto'd too. Call both of 'em, and compare the results */ PUSHMARK(SP); - c = call_sv(SvRV(other), G_SCALAR); + c = call_sv(SvRV(Other), G_SCALAR); SPAGAIN; if (c == 0) PUSHs(&PL_sv_undef); @@ -4157,10 +4123,10 @@ S_do_smartmatch(pTHX_ HV *seen_this, HV *seen_other) LEAVE; RETURN; } - else if ( ((SvIOK(d) || SvNOK(d)) && (this = d) && (other = e)) - || ((SvIOK(e) || SvNOK(e)) && (this = e) && (other = d)) ) + else if ( ((SvIOK(d) || SvNOK(d)) && (This = d) && (Other = e)) + || ((SvIOK(e) || SvNOK(e)) && (This = e) && (Other = d)) ) { - if (SvPOK(other) && !looks_like_number(other)) { + if (SvPOK(Other) && !looks_like_number(Other)) { /* String comparison */ PUSHs(d); PUSHs(e); PUTBACK; @@ -4569,7 +4535,8 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) take = umaxlen; } } else { - const char *const first_nl = memchr(cache_p, '\n', cache_len); + const char *const first_nl = + (const char *)memchr(cache_p, '\n', cache_len); if (first_nl) { take = first_nl + 1 - cache_p; } @@ -4641,7 +4608,8 @@ S_run_user_filter(pTHX_ int idx, SV *buf_sv, int maxlen) prune_from = got_p + umaxlen; } } else { - const char *const first_nl = memchr(got_p, '\n', got_len); + const char *const first_nl = + (const char *)memchr(got_p, '\n', got_len); if (first_nl && first_nl + 1 < got_p + got_len) { /* There's a second line here... */ prune_from = first_nl + 1;