Fix regexec.c so $^N and $+ are correctly updated so that they work properly inside...
[p5sagit/p5-mst-13.2.git] / universal.c
index 36b9807..7d1bd55 100644 (file)
@@ -158,10 +158,10 @@ Perl_sv_does(pTHX_ SV *sv, const char *name)
 
     PUSHMARK(SP);
     XPUSHs(sv);
-    XPUSHs(sv_2mortal(newSVpv(name, 0)));
+    mXPUSHs(newSVpv(name, 0));
     PUTBACK;
 
-    methodname = sv_2mortal(newSVpv("isa", 0));
+    methodname = newSVpvs_flags("isa", SVs_TEMP);
     /* ugly hack: use the SvSCREAM flag so S_method_common
      * can figure out we're calling DOES() and not isa(),
      * and report eventual errors correctly. --rgs */
@@ -176,26 +176,6 @@ Perl_sv_does(pTHX_ SV *sv, const char *name)
     return does_it;
 }
 
-regexp *
-Perl_get_re_arg( pTHX_ SV *sv, U32 flags, MAGIC **mgp) {
-    MAGIC *mg;
-    if (sv) {
-        if (SvMAGICAL(sv))
-            mg_get(sv);
-        if (SvROK(sv) &&
-            (sv = (SV*)SvRV(sv)) &&     /* assign deliberate */
-            SvTYPE(sv) == SVt_PVMG &&
-            (mg = mg_find(sv, PERL_MAGIC_qr))) /* assign deliberate */
-        {        
-            if (mgp) *mgp = mg;
-            return (regexp *)mg->mg_obj;       
-        }
-    }    
-    if (mgp) *mgp = NULL;
-    return ((flags && PL_curpm) ? PM_GETRE(PL_curpm) : NULL);
-}
-
-
 PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv);
 PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv);
 PERL_XS_EXPORT_C void XS_UNIVERSAL_DOES(pTHX_ CV *cv);
@@ -225,7 +205,6 @@ XS(XS_Internals_SvREADONLY);
 XS(XS_Internals_SvREFCNT);
 XS(XS_Internals_hv_clear_placehold);
 XS(XS_PerlIO_get_layers);
-XS(XS_Regexp_DESTROY);
 XS(XS_Internals_hash_seed);
 XS(XS_Internals_rehash_seed);
 XS(XS_Internals_HvREHASH);
@@ -239,8 +218,8 @@ XS(XS_Tie_Hash_NamedCapture_STORE);
 XS(XS_Tie_Hash_NamedCapture_DELETE);
 XS(XS_Tie_Hash_NamedCapture_CLEAR);
 XS(XS_Tie_Hash_NamedCapture_EXISTS);
-XS(XS_Tie_Hash_NamedCapture_FIRSTKEY);
-XS(XS_Tie_Hash_NamedCapture_NEXTKEY);
+XS(XS_Tie_Hash_NamedCapture_FIRSTK);
+XS(XS_Tie_Hash_NamedCapture_NEXTK);
 XS(XS_Tie_Hash_NamedCapture_SCALAR);
 XS(XS_Tie_Hash_NamedCapture_flags);
 
@@ -289,7 +268,6 @@ Perl_boot_core_UNIVERSAL(pTHX)
                XS_Internals_hv_clear_placehold, file, "\\%");
     newXSproto("PerlIO::get_layers",
                XS_PerlIO_get_layers, file, "*;@");
-    newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
     newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
     newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
     newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
@@ -302,8 +280,8 @@ Perl_boot_core_UNIVERSAL(pTHX)
     newXS("Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, file);
     newXS("Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, file);
     newXS("Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, file);
-    newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTKEY, file);
-    newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTKEY, file);
+    newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, file);
+    newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, file);
     newXS("Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, file);
     newXS("Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, file);
 }
@@ -509,7 +487,7 @@ XS(XS_version_new)
        if ( strcmp(classname,"version") != 0 ) /* inherited new() */
            sv_bless(rv, gv_stashpv(classname, GV_ADD));
 
-       PUSHs(sv_2mortal(rv));
+       mPUSHs(rv);
        PUTBACK;
        return;
     }
@@ -532,7 +510,7 @@ XS(XS_version_stringify)
          else
               Perl_croak(aTHX_ "lobj is not of type version");
 
-         PUSHs(sv_2mortal(vstringify(lobj)));
+         mPUSHs(vstringify(lobj));
 
          PUTBACK;
          return;
@@ -556,7 +534,7 @@ XS(XS_version_numify)
          else
               Perl_croak(aTHX_ "lobj is not of type version");
 
-         PUSHs(sv_2mortal(vnumify(lobj)));
+         mPUSHs(vnumify(lobj));
 
          PUTBACK;
          return;
@@ -580,7 +558,7 @@ XS(XS_version_normal)
          else
               Perl_croak(aTHX_ "lobj is not of type version");
 
-         PUSHs(sv_2mortal(vnormal(lobj)));
+         mPUSHs(vnormal(lobj));
 
          PUTBACK;
          return;
@@ -625,7 +603,7 @@ XS(XS_version_vcmp)
                    rs = newSViv(vcmp(lobj,rvs));
               }
 
-              PUSHs(sv_2mortal(rs));
+              mPUSHs(rs);
          }
 
          PUTBACK;
@@ -644,7 +622,7 @@ XS(XS_version_boolean)
     if (sv_derived_from(ST(0), "version")) {
        SV * const lobj = SvRV(ST(0));
        SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
-       PUSHs(sv_2mortal(rs));
+       mPUSHs(rs);
        PUTBACK;
        return;
     }
@@ -707,7 +685,7 @@ XS(XS_version_qv)
        }
        else
        {
-           PUSHs(sv_2mortal(new_version(ver)));
+           mPUSHs(new_version(ver));
        }
 
        PUTBACK;
@@ -901,12 +879,6 @@ XS(XS_Internals_hv_clear_placehold)
     }
 }
 
-XS(XS_Regexp_DESTROY)
-{
-    PERL_UNUSED_CONTEXT;
-    PERL_UNUSED_ARG(cv);
-}
-
 XS(XS_PerlIO_get_layers)
 {
     dVAR;
@@ -971,7 +943,6 @@ XS(XS_PerlIO_get_layers)
        }
 
        if (gv && (io = GvIO(gv))) {
-            dTARGET;
             AV* const av = PerlIO_get_layers(aTHX_ input ?
                                        IoIFP(io) : IoOFP(io));
             I32 i;
@@ -989,25 +960,25 @@ XS(XS_PerlIO_get_layers)
 
                  if (details) {
                       XPUSHs(namok
-                             ? newSVpvn(SvPVX_const(*namsvp), SvCUR(*namsvp))
+                             ? sv_2mortal(newSVpvn(SvPVX_const(*namsvp), SvCUR(*namsvp)))
                              : &PL_sv_undef);
                       XPUSHs(argok
-                             ? newSVpvn(SvPVX_const(*argsvp), SvCUR(*argsvp))
+                             ? sv_2mortal(newSVpvn(SvPVX_const(*argsvp), SvCUR(*argsvp)))
                              : &PL_sv_undef);
                       if (flgok)
-                           XPUSHi(SvIVX(*flgsvp));
+                           mXPUSHi(SvIVX(*flgsvp));
                       else
                            XPUSHs(&PL_sv_undef);
                       nitem += 3;
                  }
                  else {
                       if (namok && argok)
-                           XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
+                           XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
                                                 SVfARG(*namsvp),
-                                                SVfARG(*argsvp)));
+                                                SVfARG(*argsvp))));
                       else if (namok)
-                           XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf,
-                                                SVfARG(*namsvp)));
+                           XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf,
+                                                SVfARG(*namsvp))));
                       else
                            XPUSHs(&PL_sv_undef);
                       nitem++;
@@ -1015,7 +986,7 @@ XS(XS_PerlIO_get_layers)
                            const IV flags = SvIVX(*flgsvp);
 
                            if (flags & PERLIO_F_UTF8) {
-                                XPUSHs(newSVpvs("utf8"));
+                                XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
                                 nitem++;
                            }
                       }
@@ -1075,22 +1046,17 @@ XS(XS_re_is_regexp)
 {
     dVAR; 
     dXSARGS;
+    PERL_UNUSED_VAR(cv);
+
     if (items != 1)
        Perl_croak(aTHX_ "Usage: %s(%s)", "re::is_regexp", "sv");
-    PERL_UNUSED_VAR(cv); /* -W */
-    PERL_UNUSED_VAR(ax); /* -Wall */
+
     SP -= items;
-    {
-       SV *    sv = ST(0);
-        if ( Perl_get_re_arg( aTHX_ sv, 0, NULL ) ) 
-        {
-            XSRETURN_YES;
-        } else {
-            XSRETURN_NO;
-        }
-        /* NOTREACHED */        
-       PUTBACK;
-       return;
+
+    if (SvRXOK(ST(0))) {
+        XSRETURN_YES;
+    } else {
+        XSRETURN_NO;
     }
 }
 
@@ -1143,11 +1109,11 @@ XS(XS_re_regname)
         XSRETURN_UNDEF;
 
     if (items == 2 && SvTRUE(ST(1))) {
-        flags = RXf_HASH_ALL;
+        flags = RXapif_ALL;
     } else {
-        flags = RXf_HASH_ONE;
+        flags = RXapif_ONE;
     }
-    ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXf_HASH_REGNAME));
+    ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
 
     if (ret) {
         if (SvROK(ret))
@@ -1182,14 +1148,14 @@ XS(XS_re_regnames)
         XSRETURN_UNDEF;
 
     if (items == 1 && SvTRUE(ST(0))) {
-        flags = RXf_HASH_ALL;
+        flags = RXapif_ALL;
     } else {
-        flags = RXf_HASH_ONE;
+        flags = RXapif_ONE;
     }
 
     SP -= items;
 
-    ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXf_HASH_REGNAMES));
+    ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
 
     SPAGAIN;
 
@@ -1345,7 +1311,7 @@ XS(XS_Tie_Hash_NamedCapture_EXISTS)
        return;
 }
 
-XS(XS_Tie_Hash_NamedCapture_FIRSTKEY)
+XS(XS_Tie_Hash_NamedCapture_FIRSTK)
 {
     dVAR;
     dXSARGS;
@@ -1378,7 +1344,7 @@ XS(XS_Tie_Hash_NamedCapture_FIRSTKEY)
 
 }
 
-XS(XS_Tie_Hash_NamedCapture_NEXTKEY)
+XS(XS_Tie_Hash_NamedCapture_NEXTK)
 {
     dVAR;
     dXSARGS;
@@ -1452,8 +1418,8 @@ XS(XS_Tie_Hash_NamedCapture_flags)
     if (items != 0)
         Perl_croak(aTHX_ "Usage: Tie::Hash::NamedCapture::flags()");
 
-       XPUSHs(sv_2mortal(newSVuv(RXf_HASH_ONE)));
-       XPUSHs(sv_2mortal(newSVuv(RXf_HASH_ALL)));
+       mXPUSHu(RXapif_ONE);
+       mXPUSHu(RXapif_ALL);
        PUTBACK;
        return;
 }