Introduce the macros newSVpvs(str) and sv_catpvs(sv, str).
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 5c1ebd2..6ff9acd 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -330,10 +330,7 @@ PP(pp_backtick)
        mode = "rt";
     fp = PerlProc_popen(tmps, mode);
     if (fp) {
-        const char *type = NULL;
-       if (PL_curcop->cop_io) {
-           type = SvPV_nolen_const(PL_curcop->cop_io);
-       }
+        const char * const type = PL_curcop->cop_io ? SvPV_nolen_const(PL_curcop->cop_io) : NULL;
        if (type && *type)
            PerlIO_apply_layers(aTHX_ fp,mode,type);
 
@@ -406,7 +403,7 @@ PP(pp_glob)
     PL_last_in_gv = (GV*)*PL_stack_sp--;
 
     SAVESPTR(PL_rs);           /* This is not permanent, either. */
-    PL_rs = sv_2mortal(newSVpvn("\000", 1));
+    PL_rs = sv_2mortal(newSVpvs("\000"));
 #ifndef DOSISH
 #ifndef CSH
     *SvPVX(PL_rs) = '\n';
@@ -448,12 +445,12 @@ PP(pp_warn)
        SV * const error = ERRSV;
        SvUPGRADE(error, SVt_PV);
        if (SvPOK(error) && SvCUR(error))
-           sv_catpv(error, "\t...caught");
+           sv_catpvs(error, "\t...caught");
        tmpsv = error;
        tmps = SvPV_const(tmpsv, len);
     }
     if (!tmps || !len)
-       tmpsv = sv_2mortal(newSVpvn("Warning: something's wrong", 26));
+       tmpsv = sv_2mortal(newSVpvs("Warning: something's wrong"));
 
     Perl_warn(aTHX_ "%"SVf, tmpsv);
     RETSETYES;
@@ -482,17 +479,17 @@ PP(pp_die)
         tmps = SvROK(tmpsv) ? Nullch : SvPV_const(tmpsv, len);
     }
     if (!tmps || !len) {
-       SV *error = ERRSV;
+       SV * const error = ERRSV;
        SvUPGRADE(error, SVt_PV);
        if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
            if (!multiarg)
                SvSetSV(error,tmpsv);
            else if (sv_isobject(error)) {
-               HV *stash = SvSTASH(SvRV(error));
-               GV *gv = gv_fetchmethod(stash, "PROPAGATE");
+               HV * const stash = SvSTASH(SvRV(error));
+               GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
                if (gv) {
-                   SV *file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
-                   SV *line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
+                   SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
+                   SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
                    EXTEND(SP, 3);
                    PUSHMARK(SP);
                    PUSHs(error);
@@ -508,7 +505,7 @@ PP(pp_die)
        }
        else {
            if (SvPOK(error) && SvCUR(error))
-               sv_catpv(error, "\t...propagated");
+               sv_catpvs(error, "\t...propagated");
            tmpsv = error;
            if (SvOK(tmpsv))
                tmps = SvPV_const(tmpsv, len);
@@ -517,7 +514,7 @@ PP(pp_die)
        }
     }
     if (!tmps || !len)
-       tmpsv = sv_2mortal(newSVpvn("Died", 4));
+       tmpsv = sv_2mortal(newSVpvs("Died"));
 
     DIE(aTHX_ "%"SVf, tmpsv);
 }
@@ -880,9 +877,9 @@ PP(pp_untie)
 
     if ((mg = SvTIED_mg(sv, how))) {
        SV * const obj = SvRV(SvTIED_obj(sv, mg));
-       CV *cv = NULL;
         if (obj) {
            GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
+           CV *cv;
            if (gv && isGV(gv) && (cv = GvCV(gv))) {
               PUSHMARK(SP);
               XPUSHs(SvTIED_obj((SV*)gv, mg));
@@ -1158,12 +1155,10 @@ Perl_setdefout(pTHX_ GV *gv)
 PP(pp_select)
 {
     dSP; dTARGET;
-    GV *egv;
     HV *hv;
-
     GV * const newdefout = (PL_op->op_private > 0) ? ((GV *) POPs) : (GV *) NULL;
+    GV * egv = GvEGV(PL_defoutgv);
 
-    egv = GvEGV(PL_defoutgv);
     if (!egv)
        egv = PL_defoutgv;
     hv = GvSTASH(egv);
@@ -1327,14 +1322,14 @@ PP(pp_leavewrite)
                if (!IoFMT_NAME(io))
                    IoFMT_NAME(io) = savepv(GvNAME(gv));
                topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
-               topgv = gv_fetchsv(topname, FALSE, SVt_PVFM);
+               topgv = gv_fetchsv(topname, 0, SVt_PVFM);
                if ((topgv && GvFORM(topgv)) ||
-                 !gv_fetchpv("top",FALSE,SVt_PVFM))
+                 !gv_fetchpv("top", 0, SVt_PVFM))
                    IoTOP_NAME(io) = savesvpv(topname);
                else
                    IoTOP_NAME(io) = savepvn("top", 3);
            }
-           topgv = gv_fetchpv(IoTOP_NAME(io),FALSE, SVt_PVFM);
+           topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
            if (!topgv || !GvFORM(topgv)) {
                IoLINES_LEFT(io) = IoPAGE_LEN(io);
                goto forget_top;
@@ -1775,7 +1770,6 @@ PP(pp_sysread)
 PP(pp_send)
 {
     dVAR; dSP; dMARK; dORIGMARK; dTARGET;
-    GV *gv;
     IO *io;
     SV *bufsv;
     const char *buffer;
@@ -1785,7 +1779,7 @@ PP(pp_send)
     MAGIC *mg;
     const int op_type = PL_op->op_type;
     
-    gv = (GV*)*++MARK;
+    GV *const gv = (GV*)*++MARK;
     if (PL_op->op_type == OP_SYSWRITE
        && gv && (io = GvIO(gv))
        && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
@@ -2009,17 +2003,16 @@ PP(pp_tell)
 PP(pp_sysseek)
 {
     dVAR; dSP;
-    GV *gv;
     IO *io;
     const int whence = POPi;
 #if LSEEKSIZE > IVSIZE
-    Off_t offset = (Off_t)SvNVx(POPs);
+    const Off_t offset = (Off_t)SvNVx(POPs);
 #else
-    Off_t offset = (Off_t)SvIVx(POPs);
+    const Off_t offset = (Off_t)SvIVx(POPs);
 #endif
     MAGIC *mg;
 
-    gv = PL_last_in_gv = (GV*)POPs;
+    GV * const gv = PL_last_in_gv = (GV*)POPs;
 
     if (gv && (io = GvIO(gv))
        && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
@@ -2043,11 +2036,11 @@ PP(pp_sysseek)
     if (PL_op->op_type == OP_SEEK)
        PUSHs(boolSV(do_seek(gv, offset, whence)));
     else {
-       Off_t sought = do_sysseek(gv, offset, whence);
+       const Off_t sought = do_sysseek(gv, offset, whence);
         if (sought < 0)
             PUSHs(&PL_sv_undef);
         else {
-            SV* sv = sought ?
+            SV* const sv = sought ?
 #if LSEEKSIZE > IVSIZE
                 newSVnv((NV)sought)
 #else
@@ -2085,7 +2078,7 @@ PP(pp_truncate)
        IO *io;
 
        if (PL_op->op_flags & OPf_SPECIAL) {
-           tmpgv = gv_fetchsv(POPs, FALSE, SVt_PVIO);
+           tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
 
        do_ftruncate_gv:
            if (!GvIO(tmpgv))
@@ -2110,7 +2103,7 @@ PP(pp_truncate)
            }
        }
        else {
-           SV *sv = POPs;
+           SV * const sv = POPs;
            const char *name;
 
            if (SvTYPE(sv) == SVt_PVGV) {
@@ -2133,9 +2126,9 @@ PP(pp_truncate)
                result = 0;
 #else
            {
-               int tmpfd;
+               const int tmpfd = PerlLIO_open(name, O_RDWR);
 
-               if ((tmpfd = PerlLIO_open(name, O_RDWR)) < 0)
+               if (tmpfd < 0)
                    result = 0;
                else {
                    if (my_chsize(tmpfd, len) < 0)
@@ -2157,13 +2150,13 @@ PP(pp_truncate)
 PP(pp_ioctl)
 {
     dSP; dTARGET;
-    SV *argsv = POPs;
+    SV * const argsv = POPs;
     const unsigned int func = POPu;
     const int optype = PL_op->op_type;
+    GV * const gv = (GV*)POPs;
+    IO * const io = gv ? GvIOn(gv) : Null(IO*);
     char *s;
     IV retval;
-    GV *gv = (GV*)POPs;
-    IO *io = gv ? GvIOn(gv) : 0;
 
     if (!io || !argsv || !IoIFP(io)) {
        if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
@@ -2189,7 +2182,7 @@ PP(pp_ioctl)
        s = INT2PTR(char*,retval);              /* ouch */
     }
 
-    TAINT_PROPER(optype == OP_IOCTL ? "ioctl" : "fcntl");
+    TAINT_PROPER(PL_op_desc[optype]);
 
     if (optype == OP_IOCTL)
 #ifdef HAS_IOCTL
@@ -2234,22 +2227,18 @@ PP(pp_flock)
 #ifdef FLOCK
     dSP; dTARGET;
     I32 value;
-    int argtype;
-    GV *gv;
     IO *io = NULL;
     PerlIO *fp;
+    const int argtype = POPi;
+    GV * const gv = (MAXARG == 0) ? PL_last_in_gv : (GV*)POPs;
 
-    argtype = POPi;
-    if (MAXARG == 0)
-       gv = PL_last_in_gv;
-    else
-       gv = (GV*)POPs;
     if (gv && (io = GvIO(gv)))
        fp = IoIFP(io);
     else {
        fp = Nullfp;
        io = NULL;
     }
+    /* XXX Looks to me like io is always NULL at this point */
     if (fp) {
        (void)PerlIO_flush(fp);
        value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
@@ -2273,16 +2262,13 @@ PP(pp_socket)
 {
 #ifdef HAS_SOCKET
     dSP;
-    GV *gv;
-    register IO *io;
-    int protocol = POPi;
-    int type = POPi;
-    int domain = POPi;
+    const int protocol = POPi;
+    const int type = POPi;
+    const int domain = POPi;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = gv ? GvIOn(gv) : NULL;
     int fd;
 
-    gv = (GV*)POPs;
-    io = gv ? GvIOn(gv) : NULL;
-
     if (!gv || !io) {
        if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
            report_evil_fh(gv, io, PL_op->op_type);
@@ -2326,19 +2312,15 @@ PP(pp_sockpair)
 {
 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
     dSP;
-    GV *gv1;
-    GV *gv2;
-    register IO *io1;
-    register IO *io2;
-    int protocol = POPi;
-    int type = POPi;
-    int domain = POPi;
+    const int protocol = POPi;
+    const int type = POPi;
+    const int domain = POPi;
+    GV * const gv2 = (GV*)POPs;
+    GV * const gv1 = (GV*)POPs;
+    register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
+    register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
     int fd[2];
 
-    gv2 = (GV*)POPs;
-    gv1 = (GV*)POPs;
-    io1 = gv1 ? GvIOn(gv1) : NULL;
-    io2 = gv2 ? GvIOn(gv2) : NULL;
     if (!gv1 || !gv2 || !io1 || !io2) {
        if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
            if (!gv1 || !io1)
@@ -2395,11 +2377,11 @@ PP(pp_bind)
     extern void GETPRIVMODE();
     extern void GETUSERMODE();
 #endif
-    SV *addrsv = POPs;
+    SV * const addrsv = POPs;
     /* OK, so on what platform does bind modify addr?  */
     const char *addr;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
     STRLEN len;
     int bind_ok = 0;
 #ifdef MPE
@@ -2451,10 +2433,10 @@ PP(pp_connect)
 {
 #ifdef HAS_SOCKET
     dSP;
-    SV *addrsv = POPs;
+    SV * const addrsv = POPs;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
     const char *addr;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
     STRLEN len;
 
     if (!io || !IoIFP(io))
@@ -2481,9 +2463,9 @@ PP(pp_listen)
 {
 #ifdef HAS_SOCKET
     dSP;
-    int backlog = POPi;
-    GV *gv = (GV*)POPs;
-    register IO *io = gv ? GvIOn(gv) : NULL;
+    const int backlog = POPi;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = gv ? GvIOn(gv) : NULL;
 
     if (!gv || !io || !IoIFP(io))
        goto nuts;
@@ -2507,8 +2489,6 @@ PP(pp_accept)
 {
 #ifdef HAS_SOCKET
     dSP; dTARGET;
-    GV *ngv;
-    GV *ggv;
     register IO *nstio;
     register IO *gstio;
     char namebuf[MAXPATHLEN];
@@ -2517,11 +2497,10 @@ PP(pp_accept)
 #else
     Sock_size_t len = sizeof namebuf;
 #endif
+    GV * const ggv = (GV*)POPs;
+    GV * const ngv = (GV*)POPs;
     int fd;
 
-    ggv = (GV*)POPs;
-    ngv = (GV*)POPs;
-
     if (!ngv)
        goto badexit;
     if (!ggv)
@@ -2578,9 +2557,9 @@ PP(pp_shutdown)
 {
 #ifdef HAS_SOCKET
     dSP; dTARGET;
-    int how = POPi;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    const int how = POPi;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
 
     if (!io || !IoIFP(io))
        goto nuts;
@@ -2602,24 +2581,15 @@ PP(pp_ssockopt)
 {
 #ifdef HAS_SOCKET
     dSP;
-    int optype = PL_op->op_type;
-    SV *sv;
+    const int optype = PL_op->op_type;
+    SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(NEWSV(22, 257)) : POPs;
+    const unsigned int optname = (unsigned int) POPi;
+    const unsigned int lvl = (unsigned int) POPi;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
     int fd;
-    unsigned int optname;
-    unsigned int lvl;
-    GV *gv;
-    register IO *io;
     Sock_size_t len;
 
-    if (optype == OP_GSOCKOPT)
-       sv = sv_2mortal(NEWSV(22, 257));
-    else
-       sv = POPs;
-    optname = (unsigned int) POPi;
-    lvl = (unsigned int) POPi;
-
-    gv = (GV*)POPs;
-    io = GvIOn(gv);
     if (!io || !IoIFP(io))
        goto nuts;
 
@@ -2688,12 +2658,12 @@ PP(pp_getpeername)
 {
 #ifdef HAS_SOCKET
     dSP;
-    int optype = PL_op->op_type;
+    const int optype = PL_op->op_type;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
+    Sock_size_t len;
     SV *sv;
     int fd;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
-    Sock_size_t len;
 
     if (!io || !IoIFP(io))
        goto nuts;
@@ -2784,7 +2754,7 @@ PP(pp_stat)
        }
     }
     else {
-       SV* sv = POPs;
+       SV* const sv = POPs;
        if (SvTYPE(sv) == SVt_PVGV) {
            gv = (GV*)sv;
            goto do_fstat;
@@ -2843,7 +2813,7 @@ PP(pp_stat)
 #ifdef USE_STAT_RDEV
        PUSHs(sv_2mortal(newSViv(PL_statcache.st_rdev)));
 #else
-       PUSHs(sv_2mortal(newSVpvn("", 0)));
+       PUSHs(sv_2mortal(newSVpvs("")));
 #endif
 #if Off_t_size > IVSIZE
        PUSHs(sv_2mortal(newSVnv((NV)PL_statcache.st_size)));
@@ -2863,8 +2833,8 @@ PP(pp_stat)
        PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blksize)));
        PUSHs(sv_2mortal(newSVuv(PL_statcache.st_blocks)));
 #else
-       PUSHs(sv_2mortal(newSVpvn("", 0)));
-       PUSHs(sv_2mortal(newSVpvn("", 0)));
+       PUSHs(sv_2mortal(newSVpvs("")));
+       PUSHs(sv_2mortal(newSVpvs("")));
 #endif
     }
     RETURN;
@@ -3139,7 +3109,7 @@ PP(pp_fttty)
     else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
        gv = (GV*)SvRV(POPs);
     else
-       gv = gv_fetchsv(tmpsv = POPs, FALSE, SVt_PVIO);
+       gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
 
     if (GvIO(gv) && IoIFP(GvIOp(gv)))
        fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
@@ -3326,7 +3296,7 @@ PP(pp_fttext)
 PP(pp_chdir)
 {
     dSP; dTARGET;
-    const char *tmps = 0;
+    const char *tmps = NULL;
     GV *gv = NULL;
 
     if( MAXARG == 1 ) {
@@ -3414,7 +3384,7 @@ PP(pp_chroot)
 {
 #ifdef HAS_CHROOT
     dSP; dTARGET;
-    char *tmps = POPpx;
+    char * const tmps = POPpx;
     TAINT_PROPER("chroot");
     PUSHi( chroot(tmps) >= 0 );
     RETURN;
@@ -3427,8 +3397,8 @@ PP(pp_rename)
 {
     dSP; dTARGET;
     int anum;
-    const char *tmps2 = POPpconstx;
-    const char *tmps = SvPV_nolen_const(TOPs);
+    const char * const tmps2 = POPpconstx;
+    const char * const tmps = SvPV_nolen_const(TOPs);
     TAINT_PROPER("rename");
 #ifdef HAS_RENAME
     anum = PerlLIO_rename(tmps, tmps2);
@@ -3465,8 +3435,8 @@ PP(pp_link)
 #  endif
 
     {
-       const char *tmps2 = POPpconstx;
-       const char *tmps = SvPV_nolen_const(TOPs);
+       const char * const tmps2 = POPpconstx;
+       const char * const tmps = SvPV_nolen_const(TOPs);
        TAINT_PROPER(PL_op_desc[op_type]);
        result =
 #  if defined(HAS_LINK)
@@ -3544,7 +3514,7 @@ S_dooneliner(pTHX_ const char *cmd, const char *filename)
     Safefree(cmdline);
 
     if (myfp) {
-       SV *tmpsv = sv_newmortal();
+       SV * const tmpsv = sv_newmortal();
        /* Need to save/restore 'PL_rs' ?? */
        s = sv_gets(tmpsv, myfp, 0);
        (void)PerlProc_pclose(myfp);
@@ -3632,18 +3602,10 @@ S_dooneliner(pTHX_ const char *cmd, const char *filename)
 PP(pp_mkdir)
 {
     dSP; dTARGET;
-    int mode;
-#ifndef HAS_MKDIR
-    int oldumask;
-#endif
     STRLEN len;
     const char *tmps;
     bool copy = FALSE;
-
-    if (MAXARG > 1)
-       mode = POPi;
-    else
-       mode = 0777;
+    const int mode = (MAXARG > 1) ? POPi : 0777;
 
     TRIMSLASHES(tmps,len,copy);
 
@@ -3651,10 +3613,13 @@ PP(pp_mkdir)
 #ifdef HAS_MKDIR
     SETi( PerlDir_mkdir(tmps, mode) >= 0 );
 #else
+    {
+    int oldumask;
     SETi( dooneliner("mkdir", tmps) );
     oldumask = PerlLIO_umask(0);
     PerlLIO_umask(oldumask);
     PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
+    }
 #endif
     if (copy)
        Safefree(tmps);
@@ -3686,9 +3651,9 @@ PP(pp_open_dir)
 {
 #if defined(Direntry_t) && defined(HAS_READDIR)
     dSP;
-    const char *dirname = POPpconstx;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    const char * const dirname = POPpconstx;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
 
     if (!io)
        goto nope;
@@ -3720,12 +3685,17 @@ PP(pp_readdir)
 
     SV *sv;
     const I32 gimme = GIMME;
-    GV *gv = (GV *)POPs;
-    register Direntry_t *dp;
-    register IO *io = GvIOn(gv);
+    GV * const gv = (GV *)POPs;
+    register const Direntry_t *dp;
+    register IO * const io = GvIOn(gv);
 
-    if (!io || !IoDIRP(io))
-       goto nope;
+    if (!io || !IoDIRP(io)) {
+        if(ckWARN(WARN_IO)) {
+            Perl_warner(aTHX_ packWARN(WARN_IO),
+                "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
+        }
+        goto nope;
+    }
 
     do {
         dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
@@ -3770,11 +3740,16 @@ PP(pp_telldir)
 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
     long telldir (DIR *);
 # endif
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
 
-    if (!io || !IoDIRP(io))
-       goto nope;
+    if (!io || !IoDIRP(io)) {
+        if(ckWARN(WARN_IO)) {
+            Perl_warner(aTHX_ packWARN(WARN_IO),
+               "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
+        }
+        goto nope;
+    }
 
     PUSHi( PerlDir_tell(IoDIRP(io)) );
     RETURN;
@@ -3791,13 +3766,17 @@ PP(pp_seekdir)
 {
 #if defined(HAS_SEEKDIR) || defined(seekdir)
     dSP;
-    long along = POPl;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
-
-    if (!io || !IoDIRP(io))
-       goto nope;
-
+    const long along = POPl;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
+
+    if (!io || !IoDIRP(io)) {
+       if(ckWARN(WARN_IO)) {
+           Perl_warner(aTHX_ packWARN(WARN_IO),
+                "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
+        }
+        goto nope;
+    }
     (void)PerlDir_seek(IoDIRP(io), along);
 
     RETPUSHYES;
@@ -3814,12 +3793,16 @@ PP(pp_rewinddir)
 {
 #if defined(HAS_REWINDDIR) || defined(rewinddir)
     dSP;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
 
-    if (!io || !IoDIRP(io))
+    if (!io || !IoDIRP(io)) {
+       if(ckWARN(WARN_IO)) {
+           Perl_warner(aTHX_ packWARN(WARN_IO),
+               "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
+       }
        goto nope;
-
+    }
     (void)PerlDir_rewind(IoDIRP(io));
     RETPUSHYES;
 nope:
@@ -3835,12 +3818,16 @@ PP(pp_closedir)
 {
 #if defined(Direntry_t) && defined(HAS_READDIR)
     dSP;
-    GV *gv = (GV*)POPs;
-    register IO *io = GvIOn(gv);
-
-    if (!io || !IoDIRP(io))
-       goto nope;
+    GV * const gv = (GV*)POPs;
+    register IO * const io = GvIOn(gv);
 
+    if (!io || !IoDIRP(io)) {
+       if(ckWARN(WARN_IO)) {
+           Perl_warner(aTHX_ packWARN(WARN_IO),
+                "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
+        }
+        goto nope;
+    }
 #ifdef VOID_CLOSEDIR
     PerlDir_close(IoDIRP(io));
 #else
@@ -3868,7 +3855,6 @@ PP(pp_fork)
 #ifdef HAS_FORK
     dSP; dTARGET;
     Pid_t childpid;
-    GV *tmpgv;
 
     EXTEND(SP, 1);
     PERL_FLUSHALL_FOR_CHILD;
@@ -3876,7 +3862,8 @@ PP(pp_fork)
     if (childpid < 0)
        RETSETUNDEF;
     if (!childpid) {
-       if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV))) {
+       GV * const tmpgv = gv_fetchpv("$", GV_ADD, SVt_PV);
+       if (tmpgv) {
             SvREADONLY_off(GvSV(tmpgv));
            sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
             SvREADONLY_on(GvSV(tmpgv));
@@ -3940,13 +3927,11 @@ PP(pp_waitpid)
 {
 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL)
     dSP; dTARGET;
-    Pid_t pid;
+    const int optype = POPi;
+    const Pid_t pid = TOPi;
     Pid_t result;
-    int optype;
     int argflags;
 
-    optype = POPi;
-    pid = TOPi;
     if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
         result = wait4pid(pid, &argflags, optype);
     else {
@@ -4056,7 +4041,7 @@ PP(pp_system)
 #endif
        }
        if (PL_op->op_flags & OPf_STACKED) {
-           SV *really = *++MARK;
+           SV * const really = *++MARK;
            value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
        }
        else if (SP - MARK != 1)
@@ -4070,7 +4055,7 @@ PP(pp_system)
     PL_statusvalue = 0;
     result = 0;
     if (PL_op->op_flags & OPf_STACKED) {
-       SV *really = *++MARK;
+       SV * const really = *++MARK;
 #  if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__)
        value = (I32)do_aspawn(really, MARK, SP);
 #  else
@@ -4114,7 +4099,7 @@ PP(pp_exec)
     }
     PERL_FLUSHALL_FOR_CHILD;
     if (PL_op->op_flags & OPf_STACKED) {
-       SV *really = *++MARK;
+       SV * const really = *++MARK;
        value = (I32)do_aexec(really, MARK, SP);
     }
     else if (SP - MARK != 1)
@@ -4170,13 +4155,9 @@ PP(pp_getpgrp)
 {
 #ifdef HAS_GETPGRP
     dSP; dTARGET;
-    Pid_t pid;
     Pid_t pgrp;
+    const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
 
-    if (MAXARG < 1)
-       pid = 0;
-    else
-       pid = SvIVx(POPs);
 #ifdef BSD_GETPGRP
     pgrp = (I32)BSD_GETPGRP(pid);
 #else
@@ -4227,8 +4208,8 @@ PP(pp_getpriority)
 {
 #ifdef HAS_GETPRIORITY
     dSP; dTARGET;
-    int who = POPi;
-    int which = TOPi;
+    const int who = POPi;
+    const int which = TOPi;
     SETi( getpriority(which, who) );
     RETURN;
 #else
@@ -4240,9 +4221,9 @@ PP(pp_setpriority)
 {
 #ifdef HAS_SETPRIORITY
     dSP; dTARGET;
-    int niceval = POPi;
-    int who = POPi;
-    int which = TOPi;
+    const int niceval = POPi;
+    const int who = POPi;
+    const int which = TOPi;
     TAINT_PROPER("setpriority");
     SETi( setpriority(which, who, niceval) >= 0 );
     RETURN;
@@ -4477,7 +4458,7 @@ PP(pp_semget)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
     dSP; dMARK; dTARGET;
-    int anum = do_ipcget(PL_op->op_type, MARK, SP);
+    const int anum = do_ipcget(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
        RETPUSHUNDEF;
@@ -4492,7 +4473,7 @@ PP(pp_semctl)
 {
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
     dSP; dMARK; dTARGET;
-    int anum = do_ipcctl(PL_op->op_type, MARK, SP);
+    const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
     SP = MARK;
     if (anum == -1)
        RETSETUNDEF;
@@ -4528,7 +4509,7 @@ PP(pp_ghostent)
     EXTEND(SP, 10);
     if (which == OP_GHBYNAME) {
 #ifdef HAS_GETHOSTBYNAME
-        char* name = POPpbytex;
+       const char* const name = POPpbytex;
        hent = PerlSock_gethostbyname(name);
 #else
        DIE(aTHX_ PL_no_sock_func, "gethostbyname");
@@ -4536,8 +4517,8 @@ PP(pp_ghostent)
     }
     else if (which == OP_GHBYADDR) {
 #ifdef HAS_GETHOSTBYADDR
-       int addrtype = POPi;
-       SV *addrsv = POPs;
+       const int addrtype = POPi;
+       SV * const addrsv = POPs;
        STRLEN addrlen;
        Netdb_host_t addr = (Netdb_host_t) SvPVbyte(addrsv, addrlen);
 
@@ -4584,7 +4565,7 @@ PP(pp_ghostent)
        for (elem = hent->h_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
-               sv_catpvn(sv, " ", 1);
+               sv_catpvs(sv, " ");
        }
        PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)hent->h_addrtype);
@@ -4624,7 +4605,7 @@ PP(pp_gnetent)
 
     if (which == OP_GNBYNAME){
 #ifdef HAS_GETNETBYNAME
-        char *name = POPpbytex;
+       const char * const name = POPpbytex;
        nent = PerlSock_getnetbyname(name);
 #else
         DIE(aTHX_ PL_no_sock_func, "getnetbyname");
@@ -4632,8 +4613,8 @@ PP(pp_gnetent)
     }
     else if (which == OP_GNBYADDR) {
 #ifdef HAS_GETNETBYADDR
-       int addrtype = POPi;
-       Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
+       const int addrtype = POPi;
+       const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
        nent = PerlSock_getnetbyaddr(addr, addrtype);
 #else
        DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
@@ -4676,7 +4657,7 @@ PP(pp_gnetent)
        for (elem = nent->n_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
-               sv_catpvn(sv, " ", 1);
+               sv_catpvs(sv, " ");
        }
        PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)nent->n_addrtype);
@@ -4706,7 +4687,7 @@ PP(pp_gprotoent)
 
     if (which == OP_GPBYNAME) {
 #ifdef HAS_GETPROTOBYNAME
-        char* name = POPpbytex;
+       const char* const name = POPpbytex;
        pent = PerlSock_getprotobyname(name);
 #else
        DIE(aTHX_ PL_no_sock_func, "getprotobyname");
@@ -4714,7 +4695,7 @@ PP(pp_gprotoent)
     }
     else if (which == OP_GPBYNUMBER) {
 #ifdef HAS_GETPROTOBYNUMBER
-        int number = POPi;
+       const int number = POPi;
        pent = PerlSock_getprotobynumber(number);
 #else
        DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
@@ -4746,7 +4727,7 @@ PP(pp_gprotoent)
        for (elem = pent->p_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
-               sv_catpvn(sv, " ", 1);
+               sv_catpvs(sv, " ");
        }
        PUSHs(sv = sv_mortalcopy(&PL_sv_no));
        sv_setiv(sv, (IV)pent->p_proto);
@@ -4774,29 +4755,21 @@ PP(pp_gservent)
 
     if (which == OP_GSBYNAME) {
 #ifdef HAS_GETSERVBYNAME
-       char *proto = POPpbytex;
-       char *name = POPpbytex;
-
-       if (proto && !*proto)
-           proto = Nullch;
-
-       sent = PerlSock_getservbyname(name, proto);
+       const char * const proto = POPpbytex;
+       const char * const name = POPpbytex;
+       sent = PerlSock_getservbyname(name, (proto && !*proto) ? Nullch : proto);
 #else
        DIE(aTHX_ PL_no_sock_func, "getservbyname");
 #endif
     }
     else if (which == OP_GSBYPORT) {
 #ifdef HAS_GETSERVBYPORT
-       char *proto = POPpbytex;
+       const char * const proto = POPpbytex;
        unsigned short port = (unsigned short)POPu;
-
-       if (proto && !*proto)
-           proto = Nullch;
-
 #ifdef HAS_HTONS
        port = PerlSock_htons(port);
 #endif
-       sent = PerlSock_getservbyport(port, proto);
+       sent = PerlSock_getservbyport(port, (proto && !*proto) ? Nullch : proto);
 #else
        DIE(aTHX_ PL_no_sock_func, "getservbyport");
 #endif
@@ -4832,7 +4805,7 @@ PP(pp_gservent)
        for (elem = sent->s_aliases; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
-               sv_catpvn(sv, " ", 1);
+               sv_catpvs(sv, " ");
        }
        PUSHs(sv = sv_mortalcopy(&PL_sv_no));
 #ifdef HAS_NTOHS
@@ -5018,7 +4991,7 @@ PP(pp_gpwent)
     switch (which) {
     case OP_GPWNAM:
       {
-       char* name = POPpbytex;
+       const char* const name = POPpbytex;
        pwent  = getpwnam(name);
       }
       break;
@@ -5082,14 +5055,12 @@ PP(pp_gpwent)
         * has a different API than the Solaris/IRIX one. */
 #   if defined(HAS_GETSPNAM) && !defined(_AIX)
        {
-           struct spwd *spwent;
-           int saverrno; /* Save and restore errno so that
+           const int saverrno = errno;
+           const struct spwd * const spwent = getspnam(pwent->pw_name);
+                         /* Save and restore errno so that
                           * underprivileged attempts seem
                           * to have never made the unsccessful
                           * attempt to retrieve the shadow password. */
-
-           saverrno = errno;
-           spwent = getspnam(pwent->pw_name);
            errno = saverrno;
            if (spwent && spwent->sp_pwdp)
                sv_setpv(sv, spwent->sp_pwdp);
@@ -5210,11 +5181,11 @@ PP(pp_ggrent)
     struct group *grent;
 
     if (which == OP_GGRNAM) {
-        char* name = POPpbytex;
+       const char* const name = POPpbytex;
        grent = (struct group *)getgrnam(name);
     }
     else if (which == OP_GGRGID) {
-        Gid_t gid = POPi;
+       const Gid_t gid = POPi;
        grent = (struct group *)getgrgid(gid);
     }
     else
@@ -5261,7 +5232,7 @@ PP(pp_ggrent)
        for (elem = grent->gr_mem; elem && *elem; elem++) {
            sv_catpv(sv, *elem);
            if (elem[1])
-               sv_catpvn(sv, " ", 1);
+               sv_catpvs(sv, " ");
        }
 #endif
     }
@@ -5474,11 +5445,10 @@ static int
 lockf_emulate_flock(int fd, int operation)
 {
     int i;
-    int save_errno;
+    const int save_errno = errno;
     Off_t pos;
 
     /* flock locks entire file so for lockf we need to do the same     */
-    save_errno = errno;
     pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR);    /* get pos to restore later */
     if (pos > 0)       /* is seekable and needs to be repositioned     */
        if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)