implement C<goto &func> and other fixes (via private mail)
[p5sagit/p5-mst-13.2.git] / doop.c
diff --git a/doop.c b/doop.c
index c6270e4..c988bff 100644 (file)
--- a/doop.c
+++ b/doop.c
 #include <signal.h>
 #endif
 
-static I32
+#ifndef PERL_OBJECT
+static I32 do_trans_CC_simple _((SV *sv));
+static I32 do_trans_CC_count _((SV *sv));
+static I32 do_trans_CC_complex _((SV *sv));
+static I32 do_trans_UU_simple _((SV *sv));
+static I32 do_trans_UU_count _((SV *sv));
+static I32 do_trans_UU_complex _((SV *sv));
+static I32 do_trans_UC_simple _((SV *sv));
+static I32 do_trans_CU_simple _((SV *sv));
+static I32 do_trans_UC_trivial _((SV *sv));
+static I32 do_trans_CU_trivial _((SV *sv));
+#endif
+
+STATIC I32
 do_trans_CC_simple(SV *sv)
 {
     dTHR;
@@ -48,7 +61,7 @@ do_trans_CC_simple(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_CC_count(SV *sv)
 {
     dTHR;
@@ -74,7 +87,7 @@ do_trans_CC_count(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_CC_complex(SV *sv)
 {
     dTHR;
@@ -131,7 +144,7 @@ do_trans_CC_complex(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_UU_simple(SV *sv)
 {
     dTHR;
@@ -183,7 +196,7 @@ do_trans_UU_simple(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_UU_count(SV *sv)
 {
     dTHR;
@@ -202,16 +215,15 @@ do_trans_UU_count(SV *sv)
     send = s + len;
 
     while (s < send) {
-       if ((uv = swash_fetch(rv, s)) < none) {
-           s += UTF8SKIP(s);
+       if ((uv = swash_fetch(rv, s)) < none)
            matches++;
-       }
+       s += UTF8SKIP(s);
     }
 
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_UC_simple(SV *sv)
 {
     dTHR;
@@ -264,7 +276,7 @@ do_trans_UC_simple(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_CU_simple(SV *sv)
 {
     dTHR;
@@ -327,7 +339,7 @@ do_trans_CU_simple(SV *sv)
 
 /* utf-8 to latin-1 */
 
-static I32
+STATIC I32
 do_trans_UC_trivial(SV *sv)
 {
     dTHR;
@@ -359,7 +371,7 @@ do_trans_UC_trivial(SV *sv)
 
 /* latin-1 to utf-8 */
 
-static I32
+STATIC I32
 do_trans_CU_trivial(SV *sv)
 {
     dTHR;
@@ -393,7 +405,7 @@ do_trans_CU_trivial(SV *sv)
     return matches;
 }
 
-static I32
+STATIC I32
 do_trans_UU_complex(SV *sv)
 {
     dTHR;
@@ -581,6 +593,7 @@ do_trans_UU_complex(SV *sv)
 I32
 do_trans(SV *sv)
 {
+    dTHR;
     STRLEN len;
 
     if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
@@ -1048,7 +1061,7 @@ do_kv(ARGSproto)
            RETURN;
        }
 
-       if (!SvRMAGICAL(keys) || !mg_find((SV*)keys,'P'))
+       if (! SvTIED_mg((SV*)keys, 'P'))
            i = HvKEYS(keys);
        else {
            i = 0;
@@ -1067,10 +1080,9 @@ do_kv(ARGSproto)
        if (dokeys)
            XPUSHs(hv_iterkeysv(entry));        /* won't clobber stack_sp */
        if (dovalues) {
-           tmpstr = sv_newmortal();
            PUTBACK;
-           sv_setsv(tmpstr,realhv ?
-                    hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry));
+           tmpstr = realhv ?
+                    hv_iterval(hv,entry) : avhv_iterval((AV*)hv,entry);
            DEBUG_H(sv_setpvf(tmpstr, "%lu%%%d=%lu",
                            (unsigned long)HeHASH(entry),
                            HvMAX(keys)+1,