Implement :std subpragma of the open pragma
[p5sagit/p5-mst-13.2.git] / op.c
diff --git a/op.c b/op.c
index 6530572..5b11567 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1,6 +1,6 @@
 /*    op.c
  *
- *    Copyright (c) 1991-2001, Larry Wall
+ *    Copyright (c) 1991-2002, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
 STATIC void *
 S_Slab_Alloc(pTHX_ int m, size_t sz)
 {
-    /* Add an overhead for pointer to slab and round up as a number of IVs */
-    sz = (sz + 2*sizeof(IV) -1)/sizeof(IV);
+    /*
+     * To make incrementing use count easy PL_OpSlab is an I32 *
+     * To make inserting the link to slab PL_OpPtr is I32 **
+     * So compute size in units of sizeof(I32 *) as that is how Pl_OpPtr increments
+     * Add an overhead for pointer to slab and round up as a number of pointers
+     */
+    sz = (sz + 2*sizeof(I32 *) -1)/sizeof(I32 *);
     if ((PL_OpSpace -= sz) < 0) {
-       PL_OpSlab = (IV *) PerlMemShared_malloc(PERL_SLAB_SIZE*sizeof(IV));
-       if (!PL_OpSlab) {
+       PL_OpPtr = (I32 **) PerlMemShared_malloc(PERL_SLAB_SIZE*sizeof(I32*));
+       if (!PL_OpPtr) {
            return NULL;
        }
-       Zero(PL_OpSlab,PERL_SLAB_SIZE,IV);
-       /* We reserve the 0'th word as a use count */
-       PL_OpSpace = PERL_SLAB_SIZE - 1 - sz;
+       Zero(PL_OpPtr,PERL_SLAB_SIZE,I32 **);
+       /* We reserve the 0'th I32 sized chunk as a use count */
+       PL_OpSlab = (I32 *) PL_OpPtr;
+       /* Reduce size by the use count word, and by the size we need.
+        * Latter is to mimic the '-=' in the if() above
+        */
+       PL_OpSpace = PERL_SLAB_SIZE - (sizeof(I32)+sizeof(I32 **)-1)/sizeof(I32 **) - sz;
        /* Allocation pointer starts at the top.
           Theory: because we build leaves before trunk allocating at end
           means that at run time access is cache friendly upward
         */
-       PL_OpPtr   = (IV **) &PL_OpSlab[PERL_SLAB_SIZE];
+       PL_OpPtr += PERL_SLAB_SIZE;
     }
     assert( PL_OpSpace >= 0 );
     /* Move the allocation pointer down */
     PL_OpPtr   -= sz;
-    assert( PL_OpPtr > (IV **) PL_OpSlab );
+    assert( PL_OpPtr > (I32 **) PL_OpSlab );
     *PL_OpPtr   = PL_OpSlab;   /* Note which slab it belongs to */
     (*PL_OpSlab)++;            /* Increment use count of slab */
-    assert( (IV *) (PL_OpPtr+sz) <= (PL_OpSlab + PERL_SLAB_SIZE) );
+    assert( PL_OpPtr+sz <= ((I32 **) PL_OpSlab + PERL_SLAB_SIZE) );
     assert( *PL_OpSlab > 0 );
     return (void *)(PL_OpPtr + 1);
 }
@@ -67,10 +76,10 @@ S_Slab_Alloc(pTHX_ int m, size_t sz)
 STATIC void
 S_Slab_Free(pTHX_ void *op)
 {
-    IV **ptr = (IV **) op;
-    IV *slab = ptr[-1];
-    assert( ptr-1 > (IV **) slab );
-    assert( (IV *) ptr < (slab + PERL_SLAB_SIZE) );
+    I32 **ptr = (I32 **) op;
+    I32 *slab = ptr[-1];
+    assert( ptr-1 > (I32 **) slab );
+    assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
     assert( *slab > 0 );
     if (--(*slab) == 0) {
        PerlMemShared_free(slab);
@@ -918,7 +927,9 @@ S_cop_free(pTHX_ COP* cop)
 #ifdef USE_ITHREADS
        STRLEN len;
         char *s = SvPV(cop->cop_io,len);
-       Perl_warn(aTHX_ "io='%.*s'",(int) len,s);
+#if 0
+       Perl_warn(aTHX_ "io='%.*s'",(int) len,s); /* ??? --jhi */
+#endif
 #else
        SvREFCNT_dec(cop->cop_io);
 #endif
@@ -1018,7 +1029,7 @@ Perl_scalar(pTHX_ OP *o)
     case OP_SPLIT:
        if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
            if (!kPMOP->op_pmreplroot)
-               deprecate("implicit split to @_");
+               deprecate_old("implicit split to @_");
        }
        /* FALL THROUGH */
     case OP_MATCH:
@@ -1265,7 +1276,7 @@ Perl_scalarvoid(pTHX_ OP *o)
     case OP_SPLIT:
        if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
            if (!kPMOP->op_pmreplroot)
-               deprecate("implicit split to @_");
+               deprecate_old("implicit split to @_");
        }
        break;
     }
@@ -1478,7 +1489,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
                        || kid->op_type == OP_METHOD)
                    {
                        UNOP *newop;
-                       
+
                        NewOp(1101, newop, 1, UNOP);
                        newop->op_type = OP_RV2CV;
                        newop->op_ppaddr = PL_ppaddr[OP_RV2CV];
@@ -1488,7 +1499,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
                        newop->op_private |= OPpLVAL_INTRO;
                        break;
                    }
-               
+
                    if (kid->op_type != OP_RV2CV)
                        Perl_croak(aTHX_
                                   "panic: unexpected lvalue entersub "
@@ -1497,12 +1508,12 @@ Perl_mod(pTHX_ OP *o, I32 type)
                    kid->op_private |= OPpLVAL_INTRO;
                    break;      /* Postpone until runtime */
                }
-               
-               okid = kid;             
+
+               okid = kid;
                kid = kUNOP->op_first;
                if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
                    kid = kUNOP->op_first;
-               if (kid->op_type == OP_NULL)            
+               if (kid->op_type == OP_NULL)
                    Perl_croak(aTHX_
                               "Unexpected constant lvalue entersub "
                               "entry via type/targ %ld:%"UVuf,
@@ -1522,7 +1533,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
                    okid->op_private |= OPpLVAL_INTRO;
                    break;
                }
-               
+
                cv = GvCV(kGVOP_gv);
                if (!cv)
                    goto restore_2cv;
@@ -1569,7 +1580,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
            goto nomod;
        PL_modcount++;
        break;
-       
+
     case OP_COND_EXPR:
        for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
            mod(kid, type);
@@ -1640,7 +1651,7 @@ Perl_mod(pTHX_ OP *o, I32 type)
 
     case OP_PUSHMARK:
        break;
-       
+
     case OP_KEYS:
        if (type != OP_SASSIGN)
            goto nomod;
@@ -2489,30 +2500,6 @@ Perl_fold_constants(pTHX_ register OP *o)
     }
 
   nope:
-    if (!(PL_opargs[type] & OA_OTHERINT))
-       return o;
-
-    if (!(PL_hints & HINT_INTEGER)) {
-       if (type == OP_MODULO
-           || type == OP_DIVIDE
-           || !(o->op_flags & OPf_KIDS))
-       {
-           return o;
-       }
-
-       for (curop = ((UNOP*)o)->op_first; curop; curop = curop->op_sibling) {
-           if (curop->op_type == OP_CONST) {
-               if (SvIOK(((SVOP*)curop)->op_sv))
-                   continue;
-               return o;
-           }
-           if (PL_opargs[curop->op_type] & OA_RETINTEGER)
-               continue;
-           return o;
-       }
-       o->op_ppaddr = PL_ppaddr[++(o->op_type)];
-    }
-
     return o;
 }
 
@@ -2537,6 +2524,7 @@ Perl_gen_constant_list(pTHX_ register OP *o)
 
     o->op_type = OP_RV2AV;
     o->op_ppaddr = PL_ppaddr[OP_RV2AV];
+    o->op_seq = 0;             /* needs to be revisited in peep() */
     curop = ((UNOP*)o)->op_first;
     ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*PL_stack_sp--));
     op_free(curop);
@@ -3369,7 +3357,7 @@ Perl_package(pTHX_ OP *o)
        op_free(o);
     }
     else {
-       deprecate("\"package\" with no arguments");
+       deprecate_old("\"package\" with no arguments");
        sv_setpv(PL_curstname,"<none>");
        PL_curstash = Nullhv;
     }
@@ -3465,11 +3453,22 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *id, OP *arg)
            newSTATEOP(0, Nullch, imop) ));
 
     if (packname) {
-        if (ckWARN(WARN_MISC) && !gv_stashpvn(packname, packlen, FALSE)) {
-            Perl_warner(aTHX_ WARN_MISC,
-                        "Package `%s' not found "
-                        "(did you use the incorrect case?)", packname);
-        }
+        /* The "did you use incorrect case?" warning used to be here.
+         * The problem is that on case-insensitive filesystems one
+         * might get false positives for "use" (and "require"):
+         * "use Strict" or "require CARP" will work.  This causes
+         * portability problems for the script: in case-strict
+         * filesystems the script will stop working.
+         *
+         * The "incorrect case" warning checked whether "use Foo"
+         * imported "Foo" to your namespace, but that is wrong, too:
+         * there is no requirement nor promise in the language that
+         * a Foo.pm should or would contain anything in package "Foo".
+         *
+         * There is very little Configure-wise that can be done, either:
+         * the case-sensitivity of the build filesystem of Perl does not
+         * help in guessing the case-sensitivity of the runtime environment.
+         */
         safefree(packname);
     }
 
@@ -3705,7 +3704,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
                            if (gv == PL_defgv || SvCUR(gv) == PL_generation)
                                break;
                            SvCUR(gv) = PL_generation;
-                       }       
+                       }
                    }
                    else
                        break;
@@ -4769,13 +4768,15 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
     name = o ? SvPVx(cSVOPo->op_sv, n_a) : Nullch;
     if (!name && PERLDB_NAMEANON && CopLINE(PL_curcop)) {
        SV *sv = sv_newmortal();
-       Perl_sv_setpvf(aTHX_ sv, "__ANON__[%s:%"IVdf"]",
+       Perl_sv_setpvf(aTHX_ sv, "%s[%s:%"IVdf"]",
+                      PL_curstash ? "__ANON__" : "__ANON__::__ANON__",
                       CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
        aname = SvPVX(sv);
     }
     else
        aname = Nullch;
-    gv = gv_fetchpv(name ? name : (aname ? aname : "__ANON__"),
+    gv = gv_fetchpv(name ? name : (aname ? aname : 
+                   (PL_curstash ? "__ANON__" : "__ANON__::__ANON__")),
                    GV_ADDMULTI | ((block || attrs) ? 0 : GV_NOINIT),
                    SVt_PVCV);
 
@@ -5193,7 +5194,9 @@ Used by C<xsubpp> to hook up XSUBs as Perl subs.
 CV *
 Perl_newXS(pTHX_ char *name, XSUBADDR_t subaddr, char *filename)
 {
-    GV *gv = gv_fetchpv(name ? name : "__ANON__", GV_ADDMULTI, SVt_PVCV);
+    GV *gv = gv_fetchpv(name ? name :
+                       (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"),
+                       GV_ADDMULTI, SVt_PVCV);
     register CV *cv;
 
     if ((cv = (name ? GvCV(gv) : Nullcv))) {
@@ -5377,7 +5380,7 @@ Perl_oopsAV(pTHX_ OP *o)
        o->op_type = OP_PADAV;
        o->op_ppaddr = PL_ppaddr[OP_PADAV];
        return ref(o, OP_RV2AV);
-       
+
     case OP_RV2SV:
        o->op_type = OP_RV2AV;
        o->op_ppaddr = PL_ppaddr[OP_RV2AV];
@@ -5426,8 +5429,8 @@ Perl_newAVREF(pTHX_ OP *o)
        return o;
     }
     else if ((o->op_type == OP_RV2AV || o->op_type == OP_PADAV)
-               && ckWARN(WARN_DEPRECATED)) {
-       Perl_warner(aTHX_ WARN_DEPRECATED,
+               && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) {
+       Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                "Using an array as a reference is deprecated");
     }
     return newUNOP(OP_RV2AV, 0, scalar(o));
@@ -5450,8 +5453,8 @@ Perl_newHVREF(pTHX_ OP *o)
        return o;
     }
     else if ((o->op_type == OP_RV2HV || o->op_type == OP_PADHV)
-               && ckWARN(WARN_DEPRECATED)) {
-       Perl_warner(aTHX_ WARN_DEPRECATED,
+               && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) {
+       Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                "Using a hash as a reference is deprecated");
     }
     return newUNOP(OP_RV2HV, 0, scalar(o));
@@ -5538,7 +5541,7 @@ Perl_ck_spair(pTHX_ OP *o)
             !(PL_opargs[newop->op_type] & OA_RETSCALAR) ||
             newop->op_type == OP_PADAV || newop->op_type == OP_PADHV ||
             newop->op_type == OP_RV2AV || newop->op_type == OP_RV2HV)) {
-       
+
            return o;
        }
        op_free(kUNOP->op_first);
@@ -5905,15 +5908,15 @@ Perl_ck_fun(pTHX_ OP *o)
                    Perl_warner(aTHX_ WARN_SYNTAX,
                        "Useless use of %s with no values",
                        PL_op_desc[type]);
-               
+
                if (kid->op_type == OP_CONST &&
                    (kid->op_private & OPpCONST_BARE))
                {
                    char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
                    OP *newop = newAVREF(newGVOP(OP_GV, 0,
                        gv_fetchpv(name, TRUE, SVt_PVAV) ));
-                   if (ckWARN(WARN_DEPRECATED))
-                       Perl_warner(aTHX_ WARN_DEPRECATED,
+                   if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
+                       Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                            "Array @%s missing the @ in argument %"IVdf" of %s()",
                            name, (IV)numargs, PL_op_desc[type]);
                    op_free(kid);
@@ -5932,8 +5935,8 @@ Perl_ck_fun(pTHX_ OP *o)
                    char *name = SvPVx(((SVOP*)kid)->op_sv, n_a);
                    OP *newop = newHVREF(newGVOP(OP_GV, 0,
                        gv_fetchpv(name, TRUE, SVt_PVHV) ));
-                   if (ckWARN(WARN_DEPRECATED))
-                       Perl_warner(aTHX_ WARN_DEPRECATED,
+                   if (ckWARN2(WARN_DEPRECATED, WARN_SYNTAX))
+                       Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                            "Hash %%%s missing the %% in argument %"IVdf" of %s()",
                            name, (IV)numargs, PL_op_desc[type]);
                    op_free(kid);
@@ -6190,7 +6193,7 @@ Perl_ck_lfun(pTHX_ OP *o)
 OP *
 Perl_ck_defined(pTHX_ OP *o)           /* 19990527 MJD */
 {
-    if ((o->op_flags & OPf_KIDS) && ckWARN(WARN_DEPRECATED)) {
+    if ((o->op_flags & OPf_KIDS) && ckWARN2(WARN_DEPRECATED, WARN_SYNTAX)) {
        switch (cUNOPo->op_first->op_type) {
        case OP_RV2AV:
            /* This is needed for
@@ -6200,9 +6203,9 @@ Perl_ck_defined(pTHX_ OP *o)              /* 19990527 MJD */
            break;                      /* Globals via GV can be undef */
        case OP_PADAV:
        case OP_AASSIGN:                /* Is this a good idea? */
-           Perl_warner(aTHX_ WARN_DEPRECATED,
+           Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                        "defined(@array) is deprecated");
-           Perl_warner(aTHX_ WARN_DEPRECATED,
+           Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                        "\t(Maybe you should just omit the defined()?)\n");
        break;
        case OP_RV2HV:
@@ -6212,9 +6215,9 @@ Perl_ck_defined(pTHX_ OP *o)              /* 19990527 MJD */
               */
            break;                      /* Globals via GV can be undef */
        case OP_PADHV:
-           Perl_warner(aTHX_ WARN_DEPRECATED,
+           Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                        "defined(%%hash) is deprecated");
-           Perl_warner(aTHX_ WARN_DEPRECATED,
+           Perl_warner(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                        "\t(Maybe you should just omit the defined()?)\n");
            break;
        default:
@@ -6255,7 +6258,7 @@ Perl_ck_listiob(pTHX_ OP *o)
            kid = kid->op_sibling;
        }
     }
-       
+
     if (!kid)
        append_elem(o->op_type, o, newDEFSVOP());
 
@@ -6463,7 +6466,7 @@ Perl_ck_shift(pTHX_ OP *o)
 
     if (!(o->op_flags & OPf_KIDS)) {
        OP *argop;
-       
+
        op_free(o);
 #ifdef USE_5005THREADS
        if (!CvUNIQUE(PL_compcv)) {
@@ -7164,7 +7167,7 @@ Perl_peep(pTHX_ register OP *o)
                }
            }
            break;
-       
+
        case OP_HELEM: {
            UNOP *rop;
            SV *lexname;
@@ -7173,7 +7176,7 @@ Perl_peep(pTHX_ register OP *o)
            I32 ind;
            char *key = NULL;
            STRLEN keylen;
-       
+
            o->op_seq = PL_op_seqmax++;
 
            if (((BINOP*)o)->op_last->op_type != OP_CONST)
@@ -7225,7 +7228,7 @@ Perl_peep(pTHX_ register OP *o)
            *svp = sv;
            break;
        }
-       
+
        case OP_HSLICE: {
            UNOP *rop;
            SV *lexname;
@@ -7355,4 +7358,3 @@ const_sv_xsub(pTHX_ CV* cv)
     ST(0) = (SV*)XSANY.any_ptr;
     XSRETURN(1);
 }
-