up patchlevel &c
[p5sagit/p5-mst-13.2.git] / pp.c
diff --git a/pp.c b/pp.c
index 5a15355..1b9ebdd 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -245,16 +245,19 @@ PP(pp_rv2gv)
                /* If this is a 'my' scalar and flag is set then vivify 
                 * NI-S 1999/05/07
                 */ 
-               if ( (PL_op->op_private & OPpDEREF) && 
-                     cUNOP->op_first->op_type == OP_PADSV ) {
-                   STRLEN len;
-                   SV *padname = *av_fetch(PL_comppad_name, cUNOP->op_first->op_targ, 4);
-                   char *name = SvPV(padname,len); 
+               if (PL_op->op_private & OPpDEREF) {
                    GV *gv = (GV *) newSV(0);
+                   STRLEN len = 0;
+                   char *name = "";
+                   if (cUNOP->op_first->op_type == OP_PADSV) {
+                       SV *padname = *av_fetch(PL_comppad_name, cUNOP->op_first->op_targ, 4);
+                       name = SvPV(padname,len);                                                    
+                   }
                    gv_init(gv, PL_curcop->cop_stash, name, len, 0);
                    sv_upgrade(sv, SVt_RV);
                    SvRV(sv) = (SV *) gv;
                    SvROK_on(sv);
+                   SvSETMAGIC(sv);
                    goto wasref;
                }  
                if (PL_op->op_flags & OPf_REF ||
@@ -469,7 +472,7 @@ PP(pp_prototype)
                goto set;
            else {                      /* None such */
              nonesuch:
-               croak("Cannot find an opnumber for \"%s\"", s+6);
+               croak("Can't find an opnumber for \"%s\"", s+6);
            }
        }
     }
@@ -528,7 +531,7 @@ refto(SV *sv)
        if (!(sv = LvTARG(sv)))
            sv = &PL_sv_undef;
        else
-           SvREFCNT_inc(sv);
+           (void)SvREFCNT_inc(sv);
     }
     else if (SvPADTMP(sv))
        sv = newSVsv(sv);
@@ -652,7 +655,6 @@ PP(pp_gelem)
 PP(pp_study)
 {
     djSP; dPOPss;
-    register UNOP *unop = cUNOP;
     register unsigned char *s;
     register I32 pos;
     register I32 ch;
@@ -867,7 +869,7 @@ PP(pp_predec)
     djSP;
     if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
        croak(PL_no_modify);
-    if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+    if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
        SvIVX(TOPs) != IV_MIN)
     {
        --SvIVX(TOPs);
@@ -885,7 +887,7 @@ PP(pp_postinc)
     if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
        croak(PL_no_modify);
     sv_setsv(TARG, TOPs);
-    if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+    if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
        SvIVX(TOPs) != IV_MAX)
     {
        ++SvIVX(TOPs);
@@ -906,7 +908,7 @@ PP(pp_postdec)
     if(SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
        croak(PL_no_modify);
     sv_setsv(TARG, TOPs);
-    if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
+    if (SvIOK_notUV(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
        SvIVX(TOPs) != IV_MIN)
     {
        --SvIVX(TOPs);
@@ -1001,8 +1003,8 @@ PP(pp_modulo)
        else {
            dleft = POPn;
            if (!use_double) {
-             use_double = 1;
-             dright = right;
+               use_double = 1;
+               dright = right;
            }
            left_neg = dleft < 0;
            if (left_neg)
@@ -1013,16 +1015,16 @@ PP(pp_modulo)
            double dans;
 
 #if 1
-           /* Tried: DOUBLESIZE <= UV_SIZE = Precision of UV more than of NV.
-            * But in fact this is an optimization - trunc may be slow */
-
 /* Somehow U_V is pessimized even if CASTFLAGS is 0 */
 #  if CASTFLAGS & 2
 #    define CAST_D2UV(d) U_V(d)
 #  else
 #    define CAST_D2UV(d) ((UV)(d))
 #  endif
-
+           /* Tried to do this only in the case DOUBLESIZE <= UV_SIZE,
+            * or, in other words, precision of UV more than of NV.
+            * But in fact the approach below turned out to be an
+            * optimization - floor() may be slow */
            if (dright <= UV_MAX && dleft <= UV_MAX) {
                right = CAST_D2UV(dright);
                left  = CAST_D2UV(dleft);
@@ -1031,13 +1033,8 @@ PP(pp_modulo)
 #endif
 
            /* Backward-compatibility clause: */
-#if 0
-           dright = trunc(dright + 0.5);
-           dleft  = trunc(dleft + 0.5);
-#else
            dright = floor(dright + 0.5);
            dleft  = floor(dleft + 0.5);
-#endif
 
            if (!dright)
                DIE("Illegal modulus zero");
@@ -2830,20 +2827,17 @@ PP(pp_lslice)
 
     for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
        ix = SvIVx(*lelem);
-       if (ix < 0) {
+       if (ix < 0)
            ix += max;
-           if (ix < 0)
-               *lelem = &PL_sv_undef;
-           else if (!(*lelem = firstrelem[ix]))
-               *lelem = &PL_sv_undef;
-       }
-       else {
+       else 
            ix -= arybase;
-           if (ix >= max || !(*lelem = firstrelem[ix]))
+       if (ix < 0 || ix >= max)
+           *lelem = &PL_sv_undef;
+       else {
+           is_something_there = TRUE;
+           if (!(*lelem = firstrelem[ix]))
                *lelem = &PL_sv_undef;
        }
-       if (!is_something_there && (SvOK(*lelem) || SvGMAGICAL(*lelem)))
-           is_something_there = TRUE;
     }
     if (is_something_there)
        SP = lastlelem;
@@ -4698,7 +4692,7 @@ PP(pp_pack)
                {
                    char   buf[1 + sizeof(UV)];
                    char  *in = buf + sizeof(buf);
-                   UV     auv = U_V(adouble);;
+                   UV     auv = U_V(adouble);
 
                    do {
                        *--in = (auv & 0x7f) | 0x80;
@@ -5012,8 +5006,10 @@ PP(pp_split)
     else if (rx->check_substr && !rx->nparens
             && (rx->reganch & ROPT_CHECK_ALL)
             && !(rx->reganch & ROPT_ANCH)) {
+       int tail = SvTAIL(rx->check_substr) != 0;
+
        i = SvCUR(rx->check_substr);
-       if (i == 1 && !SvTAIL(rx->check_substr)) {
+       if (i == 1 && !tail) {
            i = *SvPVX(rx->check_substr);
            while (--limit) {
                /*SUPPRESS 530*/
@@ -5032,7 +5028,7 @@ PP(pp_split)
 #ifndef lint
            while (s < strend && --limit &&
              (m=fbm_instr((unsigned char*)s, (unsigned char*)strend,
-                   rx->check_substr, 0)) )
+                   rx->check_substr, PL_multiline ? FBMrf_MULTILINE : 0)) )
 #endif
            {
                dstr = NEWSV(31, m-s);
@@ -5040,7 +5036,7 @@ PP(pp_split)
                if (make_mortal)
                    sv_2mortal(dstr);
                XPUSHs(dstr);
-               s = m + i;
+               s = m + i - tail;       /* Fake \n at the end */
            }
        }
     }
@@ -5050,15 +5046,14 @@ PP(pp_split)
               CALLREGEXEC(rx, s, strend, orig, 1, sv, NULL, 0))
        {
            TAINT_IF(RX_MATCH_TAINTED(rx));
-           if (rx->subbase
-             && rx->subbase != orig) {
+           if (RX_MATCH_COPIED(rx) && rx->subbeg != orig) {
                m = s;
                s = orig;
-               orig = rx->subbase;
+               orig = rx->subbeg;
                s = orig + (m - s);
                strend = s + (strend - m);
            }
-           m = rx->startp[0];
+           m = rx->startp[0] + orig;
            dstr = NEWSV(32, m-s);
            sv_setpvn(dstr, s, m-s);
            if (make_mortal)
@@ -5066,8 +5061,8 @@ PP(pp_split)
            XPUSHs(dstr);
            if (rx->nparens) {
                for (i = 1; i <= rx->nparens; i++) {
-                   s = rx->startp[i];
-                   m = rx->endp[i];
+                   s = rx->startp[i] + orig;
+                   m = rx->endp[i] + orig;
                    if (m && s) {
                        dstr = NEWSV(33, m-s);
                        sv_setpvn(dstr, s, m-s);
@@ -5079,7 +5074,7 @@ PP(pp_split)
                    XPUSHs(dstr);
                }
            }
-           s = rx->endp[0];
+           s = rx->endp[0] + orig;
        }
     }