diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-22 15:38:49 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 2000-03-22 15:38:49 +0000 |
commit | 3a1f2dc96a3b866c46ab6f878057fc73d4b009d4 (patch) | |
tree | 67ea7ec3c00b20e8eab0bc95b6f0d6643787d409 /util.c | |
parent | 4bca7e4f54e1629a267f78a6411de31fe29da1d8 (diff) | |
download | perl-3a1f2dc96a3b866c46ab6f878057fc73d4b009d4.tar.gz |
save RE context when calling __WARN__ and __DIE__ hooks;
add missing stack-of-stacks logic for new code that came
in with lexical warnings (this fixes coredumps from
-Mdiagnostics when the warnings happens to come from within
the RE engine)
p4raw-id: //depot/perl@5877
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -1515,6 +1515,7 @@ Perl_vdie(pTHX_ const char* pat, va_list *args) SV *msg; ENTER; + save_re_context(); if (message) { msg = newSVpvn(message, msglen); SvREADONLY_on(msg); @@ -1604,6 +1605,7 @@ Perl_vcroak(pTHX_ const char* pat, va_list *args) SV *msg; ENTER; + save_re_context(); msg = newSVpvn(message, msglen); SvREADONLY_on(msg); SAVEFREESV(msg); @@ -1697,6 +1699,7 @@ Perl_vwarn(pTHX_ const char* pat, va_list *args) SV *msg; ENTER; + save_re_context(); msg = newSVpvn(message, msglen); SvREADONLY_on(msg); SAVEFREESV(msg); @@ -1810,15 +1813,17 @@ Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) SV *msg; ENTER; + save_re_context(); msg = newSVpvn(message, msglen); SvREADONLY_on(msg); SAVEFREESV(msg); + PUSHSTACKi(PERLSI_DIEHOOK); PUSHMARK(sp); XPUSHs(msg); PUTBACK; call_sv((SV*)cv, G_DISCARD); - + POPSTACK; LEAVE; } } @@ -1843,21 +1848,23 @@ Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) SAVESPTR(PL_warnhook); PL_warnhook = Nullsv; cv = sv_2cv(oldwarnhook, &stash, &gv, 0); - LEAVE; + LEAVE; if (cv && !CvDEPTH(cv) && (CvROOT(cv) || CvXSUB(cv))) { dSP; SV *msg; ENTER; + save_re_context(); msg = newSVpvn(message, msglen); SvREADONLY_on(msg); SAVEFREESV(msg); + PUSHSTACKi(PERLSI_WARNHOOK); PUSHMARK(sp); XPUSHs(msg); PUTBACK; call_sv((SV*)cv, G_DISCARD); - + POPSTACK; LEAVE; return; } |