diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1999-09-20 03:06:10 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1999-09-20 03:06:10 +0000 |
commit | 5a844595b9262407e093364ec4d29a22962723f0 (patch) | |
tree | 26cc1f15a25dbb3a9f2a698c89b85b9c7c37fd0e /util.c | |
parent | 371b7e1ad2e46c79c7794d9b0f41b49157e7653c (diff) | |
download | perl-5a844595b9262407e093364ec4d29a22962723f0.tar.gz |
queue errors due to strictures rather than printing them as
warnings; symbols that violate strictures do *not* end up in
the symbol table anyway, making multiple evals of the same piece
of code produce the same errors; errors indicate all locations
of a global symbol rather than just the first one; these
changes make compile-time failures within evals reliably
visible via the return value or contents of $@, and trappable
using __DIE__ hooks
p4raw-id: //depot/perl@4197
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 57 |
1 files changed, 49 insertions, 8 deletions
@@ -1379,8 +1379,33 @@ Perl_vform(pTHX_ const char *pat, va_list *args) return SvPVX(sv); } +#if defined(PERL_IMPLICIT_CONTEXT) +SV * +Perl_mess_nocontext(const char *pat, ...) +{ + dTHX; + SV *retval; + va_list args; + va_start(args, pat); + retval = vmess(pat, &args); + va_end(args); + return retval; +} +#endif /* PERL_IMPLICIT_CONTEXT */ + SV * -Perl_mess(pTHX_ const char *pat, va_list *args) +Perl_mess(pTHX_ const char *pat, ...) +{ + SV *retval; + va_list args; + va_start(args, pat); + retval = vmess(pat, &args); + va_end(args); + return retval; +} + +SV * +Perl_vmess(pTHX_ const char *pat, va_list *args) { SV *sv = mess_alloc(); static char dgd[] = " during global destruction.\n"; @@ -1438,8 +1463,14 @@ Perl_vdie(pTHX_ const char* pat, va_list *args) thr, PL_curstack, PL_mainstack)); if (pat) { - msv = mess(pat, args); - message = SvPV(msv,msglen); + msv = vmess(pat, args); + if (PL_errors && SvCUR(PL_errors)) { + sv_catsv(PL_errors, msv); + message = SvPV(PL_errors, msglen); + SvCUR_set(PL_errors, 0); + } + else + message = SvPV(msv,msglen); } else { message = Nullch; @@ -1529,9 +1560,18 @@ Perl_vcroak(pTHX_ const char* pat, va_list *args) SV *msv; STRLEN msglen; - msv = mess(pat, args); - message = SvPV(msv,msglen); - DEBUG_S(PerlIO_printf(PerlIO_stderr(), "croak: 0x%lx %s", (unsigned long) thr, message)); + msv = vmess(pat, args); + if (PL_errors && SvCUR(PL_errors)) { + sv_catsv(PL_errors, msv); + message = SvPV(PL_errors, msglen); + SvCUR_set(PL_errors, 0); + } + else + message = SvPV(msv,msglen); + + DEBUG_S(PerlIO_printf(PerlIO_stderr(), "croak: 0x%lx %s", + (unsigned long) thr, message)); + if (PL_diehook) { /* sv_2cv might call Perl_croak() */ SV *olddiehook = PL_diehook; @@ -1609,7 +1649,7 @@ Perl_vwarn(pTHX_ const char* pat, va_list *args) SV *msv; STRLEN msglen; - msv = mess(pat, args); + msv = vmess(pat, args); message = SvPV(msv, msglen); if (PL_warnhook) { @@ -1705,7 +1745,7 @@ Perl_vwarner(pTHX_ U32 err, const char* pat, va_list* args) SV *msv; STRLEN msglen; - msv = mess(pat, args); + msv = vmess(pat, args); message = SvPV(msv, msglen); if (ckDEAD(err)) { @@ -3370,6 +3410,7 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t) PL_restartop = 0; PL_statname = NEWSV(66,0); + PL_errors = newSVpvn("", 0); PL_maxscream = -1; PL_regcompp = MEMBER_TO_FPTR(Perl_pregcomp); PL_regexecp = MEMBER_TO_FPTR(Perl_regexec_flags); |