X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=931b1a1525174dd499072690cdddb7e7695a4c13;hb=e42c74e1bbeb8832945ac76bd2905217353ae440;hp=4f183b02c58561fe6ac5aafe62644b7e6da8d9e5;hpb=9aa983d27b0af31badfcbbb76567f6e557076b41;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index 4f183b0..931b1a1 100644 --- a/mg.c +++ b/mg.c @@ -412,7 +412,9 @@ Perl_magic_len(pTHX_ SV *sv, MAGIC *mg) char *s = rx->subbeg + s1; char *send = rx->subbeg + t1; - i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send); + i = t1 - s1; + if (is_utf8_string((U8*)s, i)) + i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send); } if (i < 0) Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i); @@ -479,9 +481,9 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) break; case '\004': /* ^D */ - sv_setiv(sv, (IV)(PL_debug & 32767)); + sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK)); #if defined(YYDEBUG) && defined(DEBUGGING) - PL_yydebug = (PL_debug & 1); + PL_yydebug = DEBUG_p_TEST; #endif break; case '\005': /* ^E */ @@ -630,7 +632,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg) PL_tainted = FALSE; } sv_setpvn(sv, s, i); - if (DO_UTF8(PL_reg_sv)) + if (DO_UTF8(PL_reg_sv) && is_utf8_string((U8*)s, i)) SvUTF8_on(sv); else SvUTF8_off(sv); @@ -796,7 +798,7 @@ Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg) struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr; if (uf && uf->uf_val) - (*uf->uf_val)(uf->uf_index, sv); + (*uf->uf_val)(aTHX_ uf->uf_index, sv); return 0; } @@ -996,6 +998,40 @@ Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg) return 0; } +void +Perl_raise_signal(pTHX_ int sig) +{ + /* Set a flag to say this signal is pending */ + PL_psig_pend[sig]++; + /* And one to say _a_ signal is pending */ + PL_sig_pending = 1; +} + +Signal_t +Perl_csighandler(int sig) +{ +#ifdef PERL_OLD_SIGNALS + /* Call the perl level handler now with risk we may be in malloc() etc. */ + (*PL_sighandlerp)(sig); +#else + dTHX; + Perl_raise_signal(aTHX_ sig); +#endif +} + +void +Perl_despatch_signals(pTHX) +{ + int sig; + PL_sig_pending = 0; + for (sig = 1; sig < SIG_SIZE; sig++) { + if (PL_psig_pend[sig]) { + PL_psig_pend[sig] = 0; + (*PL_sighandlerp)(sig); + } + } +} + int Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) { @@ -1034,7 +1070,7 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) } if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) { if (i) - (void)rsignal(i, PL_sighandlerp); + (void)rsignal(i, &Perl_csighandler); else *svp = SvREFCNT_inc(sv); return 0; @@ -1061,7 +1097,7 @@ Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg) if (!strchr(s,':') && !strchr(s,'\'')) sv_insert(sv, 0, 0, "main::", 6); if (i) - (void)rsignal(i, PL_sighandlerp); + (void)rsignal(i, &Perl_csighandler); else *svp = SvREFCNT_inc(sv); } @@ -1433,7 +1469,7 @@ Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg) } else if (SvUTF8(lsv)) { sv_pos_u2b(lsv, &lvoff, &lvlen); - tmps = bytes_to_utf8(tmps, &len); + tmps = (char*)bytes_to_utf8((U8*)tmps, &len); sv_insert(lsv, lvoff, lvlen, tmps, len); Safefree(tmps); } @@ -1633,7 +1669,7 @@ Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg) struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr; if (uf && uf->uf_set) - (*uf->uf_set)(uf->uf_index, sv); + (*uf->uf_set)(aTHX_ uf->uf_index, sv); return 0; } @@ -1677,7 +1713,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg) break; case '\004': /* ^D */ - PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000; + PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG; DEBUG_x(dump_all()); break; case '\005': /* ^E */ @@ -2230,6 +2266,7 @@ Perl_sighandler(int sig) POPSTACK; if (SvTRUE(ERRSV)) { +#ifndef PERL_MICRO #ifdef HAS_SIGPROCMASK /* Handler "died", for example to get out of a restart-able read(). * Before we re-do that on its behalf re-enable the signal which was @@ -2242,8 +2279,9 @@ Perl_sighandler(int sig) #else /* Not clear if this will work */ (void)rsignal(sig, SIG_IGN); - (void)rsignal(sig, PL_sighandlerp); + (void)rsignal(sig, &Perl_csighandler); #endif +#endif /* !PERL_MICRO */ Perl_die(aTHX_ Nullch); } cleanup: