X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=mg.c;h=b032bf3f9557af2fff3055a3947a4a1a50c75968;hb=39e571d41067215a80f26089b260f1418caeb36b;hp=bcb9e838fab03b46d56ab55894bad3fbb0372abe;hpb=e5687acb0c7cb7e00d80dde70d5d9163677bffea;p=p5sagit%2Fp5-mst-13.2.git diff --git a/mg.c b/mg.c index bcb9e83..b032bf3 100644 --- a/mg.c +++ b/mg.c @@ -418,7 +418,7 @@ magic_get(SV *sv, MAGIC *mg) } sv_setpvn(sv,s,i); if (tainting) - tainted = was_tainted || rx->exec_tainted; + tainted = was_tainted || RX_MATCH_TAINTED(rx); break; } } @@ -600,7 +600,7 @@ magic_setenv(SV *sv, MAGIC *mg) } #endif -#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) +#if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS) /* And you'll never guess what the dog had */ /* in its mouth... */ if (tainting) { @@ -649,7 +649,7 @@ magic_setenv(SV *sv, MAGIC *mg) } } } -#endif /* neither OS2 nor AMIGAOS nor WIN32 */ +#endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */ return 0; } @@ -838,7 +838,54 @@ magic_setsig(SV *sv, MAGIC *mg) int magic_setisa(SV *sv, MAGIC *mg) { + HV *stash; + SV **svp; + I32 fill; + HV *basefields = Nullhv; + GV **gvp; + GV *gv; + HE *he; + static char *FIELDS = "FIELDS"; + sub_generation++; + + if (mg->mg_type == 'i') + return 0; /* Ignore lower-case version of the magic */ + + stash = GvSTASH(mg->mg_obj); + svp = AvARRAY((AV*)sv); + + for (fill = AvFILL((AV*)sv); fill >= 0; fill--, svp++) { + HV *basestash = gv_stashsv(*svp, FALSE); + + if (!basestash) { + if (dowarn) + warn("No such package \"%_\" in @ISA assignment", *svp); + continue; + } + gvp = (GV**)hv_fetch(basestash, FIELDS, 6, FALSE); + if (gvp && *gvp && GvHV(*gvp)) { + if (basefields) + croak("Can't multiply inherit %%FIELDS"); + basefields = GvHV(*gvp); + } + } + + if (!basefields) + return 0; + + gv = (GV*)*hv_fetch(stash, FIELDS, 6, TRUE); + if (!isGV(gv)) + gv_init(gv, stash, FIELDS, 6, TRUE); + if (!GvHV(gv)) + GvHV(gv) = newHV(); + if (HvKEYS(GvHV(gv))) + croak("Inherited %%FIELDS can't override existing %%FIELDS"); + + hv_iterinit(GvHV(gv)); + while ((he = hv_iternext(basefields))) + hv_store(GvHV(gv), HeKEY(he), HeKLEN(he), HeVAL(he), HeHASH(he)); + return 0; } @@ -1258,6 +1305,14 @@ magic_setuvar(SV *sv, MAGIC *mg) return 0; } +int +magic_freeregexp(SV *sv, MAGIC *mg) +{ + regexp *re = (regexp *)mg->mg_obj; + ReREFCNT_dec(re); + return 0; +} + #ifdef USE_LOCALE_COLLATE int magic_setcollxfrm(SV *sv, MAGIC *mg) @@ -1678,15 +1733,15 @@ Signal_t sighandler(int sig) { dSP; - GV *gv; + GV *gv = Nullgv; HV *st; SV *sv, *tSv = Sv; - CV *cv; + CV *cv = Nullcv; AV *oldstack; OP *myop = op; U32 flags = 0; I32 o_save_i = savestack_ix, type; - CONTEXT *cx; + PERL_CONTEXT *cx; XPV *tXpv = Xpv; if (savestack_ix + 15 <= savestack_max) @@ -1733,8 +1788,11 @@ sighandler(int sig) if (!cv || !CvROOT(cv)) { if (dowarn) warn("SIG%s handler \"%s\" not defined.\n", - sig_name[sig], GvENAME(gv) ); - return; + sig_name[sig], (gv ? GvENAME(gv) + : ((cv && CvGV(cv)) + ? GvENAME(CvGV(cv)) + : "__ANON__"))); + goto cleanup; } oldstack = curstack; @@ -1757,6 +1815,7 @@ sighandler(int sig) perl_call_sv((SV*)cv, G_DISCARD); SWITCHSTACK(signalstack, oldstack); +cleanup: if (flags & 1) savestack_ix -= 8; /* Unprotect save in progress. */ if (flags & 2) {