support optional crypt() with PERL_OBJECT
[p5sagit/p5-mst-13.2.git] / doop.c
diff --git a/doop.c b/doop.c
index e7c5e35..e80fa48 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -28,11 +28,11 @@ do_trans(SV *sv, OP *arg)
     register U8 *d;
     register I32 ch;
     register I32 matches = 0;
-    register I32 squash = op->op_private & OPpTRANS_SQUASH;
+    register I32 squash = PL_op->op_private & OPpTRANS_SQUASH;
     register U8 *p;
     STRLEN len;
 
-    if (SvREADONLY(sv) && !(op->op_private & OPpTRANS_COUNTONLY))
+    if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_COUNTONLY))
        croak(no_modify);
     tbl = (short*)cPVOP->op_pv;
     s = (U8*)SvPV(sv, len);
@@ -45,7 +45,7 @@ do_trans(SV *sv, OP *arg)
     if (!tbl || !s)
        croak("panic: do_trans");
     DEBUG_t( deb("2.TBL\n"));
-    if (!op->op_private) {
+    if (!PL_op->op_private) {
        while (s < send) {
            if ((ch = tbl[*s]) >= 0) {
                matches++;
@@ -55,7 +55,7 @@ do_trans(SV *sv, OP *arg)
        }
        SvSETMAGIC(sv);
     }
-    else if (op->op_private & OPpTRANS_COUNTONLY) {
+    else if (PL_op->op_private & OPpTRANS_COUNTONLY) {
        while (s < send) {
            if (tbl[*s] >= 0)
                matches++;
@@ -106,7 +106,7 @@ do_join(register SV *sv, SV *del, register SV **mark, register SV **sp)
        sv_upgrade(sv, SVt_PV);
     if (SvLEN(sv) < len + items) {     /* current length is way too short */
        while (items-- > 0) {
-           if (*mark && !SvGMAGIC(*mark) && SvOK(*mark)) {
+           if (*mark && !SvGMAGICAL(*mark) && SvOK(*mark)) {
                SvPV(*mark, tmplen);
                len += tmplen;
            }
@@ -223,7 +223,7 @@ do_chop(register SV *astr, register SV *sv)
         max = AvFILL(av);
         for (i = 0; i <= max; i++) {
            sv = (SV*)av_fetch(av, i, FALSE);
-           if (sv && ((sv = *(SV**)sv), sv != &sv_undef))
+           if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
                do_chop(astr, sv);
        }
         return;
@@ -260,7 +260,7 @@ do_chomp(register SV *sv)
     STRLEN len;
     char *s;
 
-    if (RsSNARF(rs))
+    if (RsSNARF(PL_rs))
        return 0;
     count = 0;
     if (SvTYPE(sv) == SVt_PVAV) {
@@ -270,7 +270,7 @@ do_chomp(register SV *sv)
         max = AvFILL(av);
         for (i = 0; i <= max; i++) {
            sv = (SV*)av_fetch(av, i, FALSE);
-           if (sv && ((sv = *(SV**)sv), sv != &sv_undef))
+           if (sv && ((sv = *(SV**)sv), sv != &PL_sv_undef))
                count += do_chomp(sv);
        }
         return count;
@@ -289,7 +289,7 @@ do_chomp(register SV *sv)
        s = SvPV_force(sv, len);
     if (s && len) {
        s += --len;
-       if (RsPARA(rs)) {
+       if (RsPARA(PL_rs)) {
            if (*s != '\n')
                goto nope;
            ++count;
@@ -301,7 +301,7 @@ do_chomp(register SV *sv)
        }
        else {
            STRLEN rslen;
-           char *rsptr = SvPV(rs, rslen);
+           char *rsptr = SvPV(PL_rs, rslen);
            if (rslen == 1) {
                if (*s != *rsptr)
                    goto nope;
@@ -352,7 +352,7 @@ do_vop(I32 optype, SV *sv, SV *left, SV *right)
     len = leftlen < rightlen ? leftlen : rightlen;
     lensave = len;
     if (SvOK(sv) || SvTYPE(sv) > SVt_PVMG) {
-       dc = SvPV_force(sv, na);
+       dc = SvPV_force(sv, PL_na);
        if (SvCUR(sv) < len) {
            dc = SvGROW(sv, len + 1);
            (void)memzero(dc + SvCUR(sv), len - SvCUR(sv) + 1);
@@ -445,18 +445,19 @@ do_kv(ARGSproto)
 {
     djSP;
     HV *hv = (HV*)POPs;
+    HV *keys;
     register HE *entry;
     SV *tmpstr;
     I32 gimme = GIMME_V;
-    I32 dokeys =   (op->op_type == OP_KEYS);
-    I32 dovalues = (op->op_type == OP_VALUES);
+    I32 dokeys =   (PL_op->op_type == OP_KEYS);
+    I32 dovalues = (PL_op->op_type == OP_VALUES);
     I32 realhv = (SvTYPE(hv) == SVt_PVHV);
     
-    if (op->op_type == OP_RV2HV || op->op_type == OP_PADHV) 
+    if (PL_op->op_type == OP_RV2HV || PL_op->op_type == OP_PADHV) 
        dokeys = dovalues = TRUE;
 
     if (!hv) {
-       if (op->op_flags & OPf_MOD) {   /* lvalue */
+       if (PL_op->op_flags & OPf_MOD) {        /* lvalue */
            dTARGET;            /* make sure to clear its target here */
            if (SvTYPE(TARG) == SVt_PVLV)
                LvTARG(TARG) = Nullsv;
@@ -465,10 +466,8 @@ do_kv(ARGSproto)
        RETURN;
     }
 
-    if (realhv)
-       (void)hv_iterinit(hv);  /* always reset iterator regardless */
-    else
-       (void)avhv_iterinit((AV*)hv);
+    keys = realhv ? hv : avhv_keys((AV*)hv);
+    (void)hv_iterinit(keys);   /* always reset iterator regardless */
 
     if (gimme == G_VOID)
        RETURN;
@@ -477,35 +476,36 @@ do_kv(ARGSproto)
        IV i;
        dTARGET;
 
-       if (op->op_flags & OPf_MOD) {   /* lvalue */
+       if (PL_op->op_flags & OPf_MOD) {        /* lvalue */
            if (SvTYPE(TARG) < SVt_PVLV) {
                sv_upgrade(TARG, SVt_PVLV);
                sv_magic(TARG, Nullsv, 'k', Nullch, 0);
            }
            LvTYPE(TARG) = 'k';
-           LvTARG(TARG) = (SV*)hv;
+           if (LvTARG(TARG) != (SV*)keys) {
+               if (LvTARG(TARG))
+                   SvREFCNT_dec(LvTARG(TARG));
+               LvTARG(TARG) = SvREFCNT_inc(keys);
+           }
            PUSHs(TARG);
            RETURN;
        }
 
-       if (!SvRMAGICAL(hv) || !mg_find((SV*)hv,'P'))
-           i = HvKEYS(hv);
+       if (!SvRMAGICAL(keys) || !mg_find((SV*)keys,'P'))
+           i = HvKEYS(keys);
        else {
            i = 0;
            /*SUPPRESS 560*/
-           while (entry = realhv ? hv_iternext(hv) : avhv_iternext((AV*)hv)) {
-               i++;
-           }
+           while (hv_iternext(keys)) i++;
        }
        PUSHi( i );
        RETURN;
     }
 
-    /* Guess how much room we need.  hv_max may be a few too many.  Oh well. */
-    EXTEND(SP, HvMAX(hv) * (dokeys + dovalues));
+    EXTEND(SP, HvKEYS(keys) * (dokeys + dovalues));
 
     PUTBACK;   /* hv_iternext and hv_iterval might clobber stack_sp */
-    while (entry = realhv ? hv_iternext(hv) : avhv_iternext((AV*)hv)) {
+    while (entry = hv_iternext(keys)) {
        SPAGAIN;
        if (dokeys)
            XPUSHs(hv_iterkeysv(entry));        /* won't clobber stack_sp */
@@ -516,8 +516,8 @@ do_kv(ARGSproto)
                     hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry));
            DEBUG_H(sv_setpvf(tmpstr, "%lu%%%d=%lu",
                            (unsigned long)HeHASH(entry),
-                           HvMAX(hv)+1,
-                           (unsigned long)(HeHASH(entry) & HvMAX(hv))));
+                           HvMAX(keys)+1,
+                           (unsigned long)(HeHASH(entry) & HvMAX(keys))));
            SPAGAIN;
            XPUSHs(tmpstr);
        }