X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/eb578fdb5569b91c28466a4d1939e381ff6ceaf4..7013f40cab0d92f7348323178ca7c11948f06d9f:/pp_sys.c diff --git a/pp_sys.c b/pp_sys.c index b233942..938aafe 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -387,7 +387,7 @@ PP(pp_glob) ENTER_with_name("glob"); #ifndef VMS - if (PL_tainting) { + if (TAINTING_get) { /* * The external globbing program may use things we can't control, * so for security reasons we must assume the worst. @@ -861,9 +861,16 @@ PP(pp_tie) switch(SvTYPE(varsv)) { case SVt_PVHV: + { + HE *entry; methname = "TIEHASH"; + if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) { + HvLAZYDEL_off(varsv); + hv_free_ent((HV *)varsv, entry); + } HvEITER_set(MUTABLE_HV(varsv), 0); break; + } case SVt_PVAV: methname = "TIEARRAY"; if (!AvREAL(varsv)) { @@ -1093,7 +1100,7 @@ PP(pp_sselect) if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0); if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0)) - Perl_croak_no_modify(aTHX); + Perl_croak_no_modify(); } if (!SvPOK(sv)) { if (!SvPOKp(sv)) @@ -1453,7 +1460,7 @@ PP(pp_leavewrite) } } if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0) - do_print(PL_formfeed, ofp); + do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp); IoLINES_LEFT(io) = IoPAGE_LEN(io); IoPAGE(io)++; PL_formtarget = PL_toptarget; @@ -1508,12 +1515,14 @@ PP(pp_prtf) { dVAR; dSP; dMARK; dORIGMARK; PerlIO *fp; - SV *sv; GV * const gv = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv; IO *const io = GvIO(gv); + /* Treat empty list as "" */ + if (MARK == SP) XPUSHs(&PL_sv_no); + if (io) { const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar); if (mg) { @@ -1530,7 +1539,6 @@ PP(pp_prtf) } } - sv = newSV(0); if (!io) { report_evil_fh(gv); SETERRNO(EBADF,RMS_IFI); @@ -1545,6 +1553,7 @@ PP(pp_prtf) goto just_say_no; } else { + SV *sv = sv_newmortal(); do_sprintf(sv, SP - MARK, MARK + 1); if (!do_print(sv, fp)) goto just_say_no; @@ -1553,13 +1562,11 @@ PP(pp_prtf) if (PerlIO_flush(fp) == EOF) goto just_say_no; } - SvREFCNT_dec(sv); SP = ORIGMARK; PUSHs(&PL_sv_yes); RETURN; just_say_no: - SvREFCNT_dec(sv); SP = ORIGMARK; PUSHs(&PL_sv_undef); RETURN; @@ -1650,12 +1657,7 @@ PP(pp_sysread) buffer_utf8 = !IN_BYTES && SvUTF8(bufsv); } if (DO_UTF8(bufsv)) { - /* offset adjust in characters not bytes */ - /* SV's length cache is only safe for non-magical values */ - if (SvGMAGICAL(bufsv)) - blen = utf8_length((const U8 *)buffer, (const U8 *)buffer + blen); - else - blen = sv_len_utf8(bufsv); + blen = sv_len_utf8_nomg(bufsv); } charstart = TRUE; @@ -1667,7 +1669,7 @@ PP(pp_sysread) if (PL_op->op_type == OP_RECV) { Sock_size_t bufsize; char namebuf[MAXPATHLEN]; -#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__) +#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__) bufsize = sizeof (struct sockaddr_in); #else bufsize = sizeof namebuf; @@ -1936,15 +1938,9 @@ PP(pp_syswrite) blen_chars = orig_blen_bytes; } else { /* The SV really is UTF-8. */ - if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) { - /* Don't call sv_len_utf8 again because it will call magic - or overloading a second time, and we might get back a - different result. */ - blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen); - } else { - /* It's safe, and it may well be cached. */ - blen_chars = sv_len_utf8(bufsv); - } + /* Don't call sv_len_utf8 on a magical or overloaded + scalar, as we might get back a different result. */ + blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen); } } else { blen_chars = blen; @@ -2533,7 +2529,7 @@ PP(pp_accept) IO *nstio; IO *gstio; char namebuf[MAXPATHLEN]; -#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__) +#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__) Sock_size_t len = sizeof (struct sockaddr_in); #else Sock_size_t len = sizeof namebuf; @@ -4047,7 +4043,7 @@ PP(pp_fork) } #endif if (childpid < 0) - RETSETUNDEF; + RETPUSHUNDEF; if (!childpid) { #ifdef PERL_USES_PL_PIDSTATUS hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */ @@ -4064,7 +4060,7 @@ PP(pp_fork) PERL_FLUSHALL_FOR_CHILD; childpid = PerlProc_fork(); if (childpid == -1) - RETSETUNDEF; + RETPUSHUNDEF; PUSHi(childpid); RETURN; # else @@ -4142,11 +4138,11 @@ PP(pp_system) I32 value; int result; - if (PL_tainting) { + if (TAINTING_get) { TAINT_ENV(); while (++MARK <= SP) { (void)SvPV_nolen_const(*MARK); /* stringify for taint check */ - if (PL_tainted) + if (TAINT_get) break; } MARK = ORIGMARK; @@ -4289,11 +4285,11 @@ PP(pp_exec) dVAR; dSP; dMARK; dORIGMARK; dTARGET; I32 value; - if (PL_tainting) { + if (TAINTING_get) { TAINT_ENV(); while (++MARK <= SP) { (void)SvPV_nolen_const(*MARK); /* stringify for taint check */ - if (PL_tainted) + if (TAINT_get) break; } MARK = ORIGMARK; @@ -4308,25 +4304,13 @@ PP(pp_exec) #ifdef VMS value = (I32)vms_do_aexec(NULL, MARK, SP); #else -# ifdef __OPEN_VM - { - (void ) do_aspawn(NULL, MARK, SP); - value = 0; - } -# else value = (I32)do_aexec(NULL, MARK, SP); -# endif #endif else { #ifdef VMS value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP))); #else -# ifdef __OPEN_VM - (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP))); - value = 0; -# else value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP))); -# endif #endif } @@ -5451,7 +5435,7 @@ PP(pp_syscall) I32 i = 0; IV retval = -1; - if (PL_tainting) { + if (TAINTING_get) { while (++MARK <= SP) { if (SvTAINTED(*MARK)) { TAINT;