MSG_PROXY for GNU/Hurd (previously we believed that
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 89bbba7..8e35e8a 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -202,7 +202,23 @@ PP(pp_padsv)
 
 PP(pp_readline)
 {
+    tryAMAGICunTARGET(iter, 0);
     PL_last_in_gv = (GV*)(*PL_stack_sp--);
+    if (PL_op->op_flags & OPf_SPECIAL) {       /* Are called as <$var> */
+       if (SvROK(PL_last_in_gv)) {
+           if (SvTYPE(SvRV(PL_last_in_gv)) != SVt_PVGV) 
+               goto hard_way;
+           PL_last_in_gv = (GV*)SvRV(PL_last_in_gv);
+       } else if (SvTYPE(PL_last_in_gv) != SVt_PVGV) {
+         hard_way: {
+           dSP;
+           XPUSHs((SV*)PL_last_in_gv);
+           PUTBACK;
+           pp_rv2gv(ARGS);
+           PL_last_in_gv = (GV*)(*PL_stack_sp--);
+         }
+       }
+    }
     return do_readline();
 }
 
@@ -220,7 +236,7 @@ PP(pp_preinc)
 {
     djSP;
     if (SvREADONLY(TOPs) || SvTYPE(TOPs) > SVt_PVLV)
-       croak(no_modify);
+       croak(PL_no_modify);
     if (SvIOK(TOPs) && !SvNOK(TOPs) && !SvPOK(TOPs) &&
        SvIVX(TOPs) != IV_MAX)
     {
@@ -311,7 +327,7 @@ PP(pp_print)
        gv = (GV*)*++MARK;
     else
        gv = PL_defoutgv;
-    if (SvRMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
+    if (mg = SvTIED_mg((SV*)gv, 'q')) {
        if (MARK == ORIGMARK) {
            /* If using default handle then we need to make space to 
             * pass object as 1st arg, so move other args up ...
@@ -322,7 +338,7 @@ PP(pp_print)
            ++SP;
        }
        PUSHMARK(MARK - 1);
-       *MARK = mg->mg_obj;
+       *MARK = SvTIED_obj((SV*)gv, mg);
        PUTBACK;
        ENTER;
        perl_call_method("PRINT", G_SCALAR);
@@ -403,16 +419,18 @@ PP(pp_print)
 
 PP(pp_rv2av)
 {
-    djSP; dPOPss;
+    djSP; dTOPss;
     AV *av;
 
     if (SvROK(sv)) {
       wasref:
+       tryAMAGICunDEREF(to_av);
+
        av = (AV*)SvRV(sv);
        if (SvTYPE(av) != SVt_PVAV)
            DIE("Not an ARRAY reference");
        if (PL_op->op_flags & OPf_REF) {
-           PUSHs((SV*)av);
+           SETs((SV*)av);
            RETURN;
        }
     }
@@ -420,7 +438,7 @@ PP(pp_rv2av)
        if (SvTYPE(sv) == SVt_PVAV) {
            av = (AV*)sv;
            if (PL_op->op_flags & OPf_REF) {
-               PUSHs((SV*)av);
+               SETs((SV*)av);
                RETURN;
            }
        }
@@ -438,16 +456,18 @@ PP(pp_rv2av)
                if (!SvOK(sv)) {
                    if (PL_op->op_flags & OPf_REF ||
                      PL_op->op_private & HINT_STRICT_REFS)
-                       DIE(no_usym, "an ARRAY");
+                       DIE(PL_no_usym, "an ARRAY");
                    if (ckWARN(WARN_UNINITIALIZED))
-                       warner(WARN_UNINITIALIZED, warn_uninit);
-                   if (GIMME == G_ARRAY)
+                       warner(WARN_UNINITIALIZED, PL_warn_uninit);
+                   if (GIMME == G_ARRAY) {
+                       POPs;
                        RETURN;
-                   RETPUSHUNDEF;
+                   }
+                   RETSETUNDEF;
                }
                sym = SvPV(sv,PL_na);
                if (PL_op->op_private & HINT_STRICT_REFS)
-                   DIE(no_symref, sym, "an ARRAY");
+                   DIE(PL_no_symref, sym, "an ARRAY");
                gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVAV);
            } else {
                gv = (GV*)sv;
@@ -456,7 +476,7 @@ PP(pp_rv2av)
            if (PL_op->op_private & OPpLVAL_INTRO)
                av = save_ary(gv);
            if (PL_op->op_flags & OPf_REF) {
-               PUSHs((SV*)av);
+               SETs((SV*)av);
                RETURN;
            }
        }
@@ -464,6 +484,7 @@ PP(pp_rv2av)
 
     if (GIMME == G_ARRAY) {
        I32 maxarg = AvFILL(av) + 1;
+       POPs;                           /* XXXX May be optimized away? */
        EXTEND(SP, maxarg);          
        if (SvRMAGICAL(av)) {
            U32 i; 
@@ -480,7 +501,7 @@ PP(pp_rv2av)
     else {
        dTARGET;
        I32 maxarg = AvFILL(av) + 1;
-       PUSHi(maxarg);
+       SETi(maxarg);
     }
     RETURN;
 }
@@ -492,6 +513,8 @@ PP(pp_rv2hv)
 
     if (SvROK(sv)) {
       wasref:
+       tryAMAGICunDEREF(to_hv);
+
        hv = (HV*)SvRV(sv);
        if (SvTYPE(hv) != SVt_PVHV && SvTYPE(hv) != SVt_PVAV)
            DIE("Not a HASH reference");
@@ -522,9 +545,9 @@ PP(pp_rv2hv)
                if (!SvOK(sv)) {
                    if (PL_op->op_flags & OPf_REF ||
                      PL_op->op_private & HINT_STRICT_REFS)
-                       DIE(no_usym, "a HASH");
+                       DIE(PL_no_usym, "a HASH");
                    if (ckWARN(WARN_UNINITIALIZED))
-                       warner(WARN_UNINITIALIZED, warn_uninit);
+                       warner(WARN_UNINITIALIZED, PL_warn_uninit);
                    if (GIMME == G_ARRAY) {
                        SP--;
                        RETURN;
@@ -533,7 +556,7 @@ PP(pp_rv2hv)
                }
                sym = SvPV(sv,PL_na);
                if (PL_op->op_private & HINT_STRICT_REFS)
-                   DIE(no_symref, sym, "a HASH");
+                   DIE(PL_no_symref, sym, "a HASH");
                gv = (GV*)gv_fetchpv(sym, TRUE, SVt_PVHV);
            } else {
                gv = (GV*)sv;
@@ -593,6 +616,7 @@ PP(pp_aassign)
      * clobber a value on the right that's used later in the list.
      */
     if (PL_op->op_private & OPpASSIGN_COMMON) {
+       EXTEND_MORTAL(lastrelem - firstrelem + 1);
         for (relem = firstrelem; relem <= lastrelem; relem++) {
             /*SUPPRESS 560*/
             if (sv = *relem) {
@@ -689,7 +713,7 @@ PP(pp_aassign)
            if (SvTHINKFIRST(sv)) {
                if (SvREADONLY(sv) && PL_curcop != &PL_compiling) {
                    if (!SvIMMORTAL(sv))
-                       DIE(no_modify);
+                       DIE(PL_no_modify);
                    if (relem <= lastrelem)
                        relem++;
                    break;
@@ -1055,9 +1079,9 @@ do_readline(void)
     I32 gimme = GIMME_V;
     MAGIC *mg;
 
-    if (SvRMAGICAL(PL_last_in_gv) && (mg = mg_find((SV*)PL_last_in_gv, 'q'))) {
+    if (mg = SvTIED_mg((SV*)PL_last_in_gv, 'q')) {
        PUSHMARK(SP);
-       XPUSHs(mg->mg_obj);
+       XPUSHs(SvTIED_obj((SV*)PL_last_in_gv, mg));
        PUTBACK;
        ENTER;
        perl_call_method("READLINE", gimme);
@@ -1367,7 +1391,7 @@ PP(pp_helem)
            SV* lv;
            SV* key2;
            if (!defer)
-               DIE(no_helem, SvPV(keysv, PL_na));
+               DIE(PL_no_helem, SvPV(keysv, PL_na));
            lv = sv_newmortal();
            sv_upgrade(lv, SVt_PVLV);
            LvTYPE(lv) = 'y';
@@ -1597,7 +1621,7 @@ PP(pp_subst)
     if (SvREADONLY(TARG)
        || (SvTYPE(TARG) > SVt_PVLV
            && !(SvTYPE(TARG) == SVt_PVGV && SvFAKE(TARG))))
-       croak(no_modify);
+       croak(PL_no_modify);
     PUTBACK;
 
     s = SvPV(TARG, len);
@@ -2009,12 +2033,16 @@ PP(pp_entersub)
            else
                sym = SvPV(sv, PL_na);
            if (!sym)
-               DIE(no_usym, "a subroutine");
+               DIE(PL_no_usym, "a subroutine");
            if (PL_op->op_private & HINT_STRICT_REFS)
-               DIE(no_symref, sym, "a subroutine");
+               DIE(PL_no_symref, sym, "a subroutine");
            cv = perl_get_cv(sym, TRUE);
            break;
        }
+       {
+           SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
+           tryAMAGICunDEREF(to_cv);
+       }       
        cv = (CV*)SvRV(sv);
        if (SvTYPE(cv) == SVt_PVCV)
            break;
@@ -2110,7 +2138,6 @@ PP(pp_entersub)
            DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: pp_entersub lock %p\n",
                                  thr, sv);)
            MUTEX_UNLOCK(MgMUTEXP(mg));
-           SvREFCNT_inc(sv);   /* Keep alive until magic_mutexfree */
            save_destructor(unlock_condpair, sv);
        }
        MUTEX_LOCK(CvMUTEXP(cv));
@@ -2427,7 +2454,7 @@ PP(pp_aelem)
        if (!svp || *svp == &PL_sv_undef) {
            SV* lv;
            if (!defer)
-               DIE(no_aelem, elem);
+               DIE(PL_no_aelem, elem);
            lv = sv_newmortal();
            sv_upgrade(lv, SVt_PVLV);
            LvTYPE(lv) = 'y';
@@ -2457,7 +2484,7 @@ vivify_ref(SV *sv, U32 to_what)
        mg_get(sv);
     if (!SvOK(sv)) {
        if (SvREADONLY(sv))
-           croak(no_modify);
+           croak(PL_no_modify);
        if (SvTYPE(sv) < SVt_RV)
            sv_upgrade(sv, SVt_RV);
        else if (SvTYPE(sv) >= SVt_PV) {
@@ -2518,7 +2545,7 @@ PP(pp_method)
        {
            if (!packname || 
                ((*(U8*)packname >= 0xc0 && IN_UTF8)
-                   ? !isIDFIRST_utf8(packname)
+                   ? !isIDFIRST_utf8((U8*)packname)
                    : !isIDFIRST(*packname)
                ))
            {