X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=2e528ba53854aa1310b74edd39cb32c5728c4861;hb=e9c1fd70a0c901791f5a7169cb6bf808e7e42d7a;hp=7230b0151dfb0e85f7558d3b733b9ff55483e4cd;hpb=a4268c0aeed5c62288abc420420bbe3d0436a5b6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index 7230b01..2e528ba 100644 --- a/mg.c +++ b/mg.c @@ -40,12 +40,12 @@ struct magic_state { /* MGS is typedef'ed to struct magic_state in perl.h */ STATIC void -S_save_magic(pTHX_ IV mgs_ix, SV *sv) +S_save_magic(pTHX_ I32 mgs_ix, SV *sv) { MGS* mgs; assert(SvMAGICAL(sv)); - SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*,mgs_ix)); + SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix)); mgs = SSPTR(mgs_ix, MGS*); mgs->mgs_sv = sv; @@ -93,7 +93,7 @@ Do magic after a value is retrieved from the SV. See C. int Perl_mg_get(pTHX_ SV *sv) { - IV mgs_ix; + I32 mgs_ix; MAGIC* mg; MAGIC** mgp; int mgp_valid = 0; @@ -120,7 +120,7 @@ Perl_mg_get(pTHX_ SV *sv) mgp = &SvMAGIC(sv); /* Re-establish pointer after sv_upgrade */ } - restore_magic(aTHXo_ INT2PTR(void*,mgs_ix)); + restore_magic(aTHXo_ INT2PTR(void*, (IV)mgs_ix)); return 0; } @@ -135,7 +135,7 @@ Do magic after a value is assigned to the SV. See C. int Perl_mg_set(pTHX_ SV *sv) { - IV mgs_ix; + I32 mgs_ix; MAGIC* mg; MAGIC* nextmg; @@ -153,7 +153,7 @@ Perl_mg_set(pTHX_ SV *sv) CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg); } - restore_magic(aTHXo_ INT2PTR(void*,mgs_ix)); + restore_magic(aTHXo_ INT2PTR(void*, (IV)mgs_ix)); return 0; } @@ -169,28 +169,33 @@ U32 Perl_mg_length(pTHX_ SV *sv) { MAGIC* mg; - char *junk; STRLEN len; for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { MGVTBL* vtbl = mg->mg_virtual; if (vtbl && vtbl->svt_len) { - IV mgs_ix; + I32 mgs_ix; mgs_ix = SSNEW(sizeof(MGS)); save_magic(mgs_ix, sv); /* omit MGf_GSKIP -- not changed here */ len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg); - restore_magic(aTHXo_ INT2PTR(void*,mgs_ix)); + restore_magic(aTHXo_ INT2PTR(void*, (IV)mgs_ix)); return len; } } - junk = SvPV(sv, len); + if (DO_UTF8(sv)) + { + U8 *s = (U8*)SvPV(sv, len); + len = Perl_utf8_length(aTHX_ s, s + len); + } + else + (void)SvPV(sv, len); return len; } -IV +I32 Perl_mg_size(pTHX_ SV *sv) { MAGIC* mg; @@ -199,13 +204,13 @@ Perl_mg_size(pTHX_ SV *sv) for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) { MGVTBL* vtbl = mg->mg_virtual; if (vtbl && vtbl->svt_len) { - IV mgs_ix; + I32 mgs_ix; mgs_ix = SSNEW(sizeof(MGS)); save_magic(mgs_ix, sv); /* omit MGf_GSKIP -- not changed here */ len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg); - restore_magic(aTHXo_ INT2PTR(void*,mgs_ix)); + restore_magic(aTHXo_ INT2PTR(void*, (IV)mgs_ix)); return len; } } @@ -234,7 +239,7 @@ Clear something magical that the SV represents. See C. int Perl_mg_clear(pTHX_ SV *sv) { - IV mgs_ix; + I32 mgs_ix; MAGIC* mg; mgs_ix = SSNEW(sizeof(MGS)); @@ -248,7 +253,7 @@ Perl_mg_clear(pTHX_ SV *sv) CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg); } - restore_magic(aTHXo_ INT2PTR(void*,mgs_ix)); + restore_magic(aTHXo_ INT2PTR(void*, (IV)mgs_ix)); return 0; } @@ -341,7 +346,7 @@ Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg) { register REGEXP *rx; - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { if (mg->mg_obj) /* @+ */ return rx->nparens; else /* @- */ @@ -360,7 +365,7 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg) register REGEXP *rx; I32 t; - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = mg->mg_len; if (paren < 0) return 0; @@ -404,7 +409,7 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) switch (*mg->mg_ptr) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '&': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = atoi(mg->mg_ptr); /* $& is in [0] */ getparen: @@ -429,14 +434,21 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) } return 0; case '+': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = rx->lastparen; if (paren) goto getparen; } return 0; + case '\016': /* ^N */ + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { + paren = rx->lastcloseparen; + if (paren) + goto getparen; + } + return 0; case '`': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { if (rx->startp[0] != -1) { i = rx->startp[0]; if (i > 0) { @@ -448,7 +460,7 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) } return 0; case '\'': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { if (rx->endp[0] != -1) { i = rx->sublen - rx->endp[0]; if (i > 0) { @@ -614,7 +626,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '&': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { I32 s1, t1; /* @@ -653,15 +665,23 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) sv_setsv(sv,&PL_sv_undef); break; case '+': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { paren = rx->lastparen; if (paren) goto getparen; } sv_setsv(sv,&PL_sv_undef); break; + case '\016': /* ^N */ + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { + paren = rx->lastcloseparen; + if (paren) + goto getparen; + } + sv_setsv(sv,&PL_sv_undef); + break; case '`': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { if ((s = rx->subbeg) && rx->startp[0] != -1) { i = rx->startp[0]; goto getrx; @@ -670,7 +690,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) sv_setsv(sv,&PL_sv_undef); break; case '\'': - if (PL_curpm && (rx = PL_curpm->op_pmregexp)) { + if (PL_curpm && (rx = PM_GETRE(PL_curpm))) { if (rx->subbeg && rx->endp[0] != -1) { s = rx->subbeg + rx->endp[0]; i = rx->sublen - rx->endp[0]; @@ -1133,19 +1153,16 @@ int Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg) { HV *hv = (HV*)LvTARG(sv); - HE *entry; I32 i = 0; - + if (hv) { - (void) hv_iterinit(hv); - if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) - i = HvKEYS(hv); - else { - /*SUPPRESS 560*/ - while ((entry = hv_iternext(hv))) { - i++; - } - } + (void) hv_iterinit(hv); + if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) + i = HvKEYS(hv); + else { + while (hv_iternext(hv)) + i++; + } } sv_setiv(sv, (IV)i); @@ -1734,7 +1751,9 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) # ifdef WIN32 SetLastError( SvIV(sv) ); # else -# ifndef OS2 +# ifdef OS2 + os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)); +# else /* will anyone ever use this? */ SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4); # endif @@ -2071,12 +2090,12 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) * the setproctitle() routine to manipulate that. */ { s = SvPV(sv, len); -# if __FreeBSD_version >= 410001 +# if __FreeBSD_version > 410001 /* The leading "-" removes the "perl: " prefix, * but not the "(perl) suffix from the ps(1) * output, because that's what ps(1) shows if the * argv[] is modified. */ - setproctitle("-%s", s, len + 1); + setproctitle("-%s", s); # else /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */ /* This doesn't really work if you assume that * $0 = 'foobar'; will wipe out 'perl' from the $0 @@ -2107,11 +2126,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) break; } /* can grab env area too? */ - if (PL_origenviron && (PL_origenviron[0] == s + 1 -#ifdef OS2 - || (PL_origenviron[0] == s + 9 && (s += 8)) -#endif - )) { + if (PL_origenviron && (PL_origenviron[0] == s + 1)) { my_setenv("NoNe SuCh", Nullch); /* force copy of environment */ for (i = 0; PL_origenviron[i]; i++) @@ -2161,7 +2176,7 @@ Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg) { DEBUG_S(PerlIO_printf(Perl_debug_log, "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n", - PTR2UV(thr), PTR2UV(sv));) + PTR2UV(thr), PTR2UV(sv))); if (MgOWNER(mg)) Perl_croak(aTHX_ "panic: magic_mutexfree"); MUTEX_DESTROY(MgMUTEXP(mg)); @@ -2206,7 +2221,6 @@ Perl_sighandler(int sig) CV *cv = Nullcv; OP *myop = PL_op; U32 flags = 0; - I32 o_save_i = PL_savestack_ix; XPV *tXpv = PL_Xpv; #if defined(WIN32) && defined(PERL_IMPLICIT_CONTEXT) @@ -2230,7 +2244,6 @@ Perl_sighandler(int sig) infinity, so we fix 4 (in fact 5): */ if (flags & 1) { PL_savestack_ix += 5; /* Protect save in progress. */ - o_save_i = PL_savestack_ix; SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags); } if (flags & 4)