Remove the _ prototype, as Maintainers is used by makemeta, and in turn
[p5sagit/p5-mst-13.2.git] / regexec.c
index 6496694..e64846f 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2255,15 +2255,24 @@ S_regtry(pTHX_ regmatch_info *reginfo, char **startpos)
            Newxz(PL_reg_curpm, 1, PMOP);
 #ifdef USE_ITHREADS
             {
-               SV* const repointer = newSViv(0);
-                /* so we know which PL_regex_padav element is PL_reg_curpm */
-                SvFLAGS(repointer) |= SVf_BREAK;
-                av_push(PL_regex_padav,repointer);
+               SV* const repointer = &PL_sv_undef;
+                /* this regexp is also owned by the new PL_reg_curpm, which
+                  will try to free it.  */
+                av_push(PL_regex_padav, repointer);
                 PL_reg_curpm->op_pmoffset = av_len(PL_regex_padav);
                 PL_regex_pad = AvARRAY(PL_regex_padav);
             }
 #endif      
         }
+#ifdef USE_ITHREADS
+       /* It seems that non-ithreads works both with and without this code.
+          So for efficiency reasons it seems best not to have the code
+          compiled when it is not needed.  */
+       /* This is safe against NULLs: */
+       ReREFCNT_dec(PM_GETRE(PL_reg_curpm));
+       /* PM_reg_curpm owns a reference to this regexp.  */
+       ReREFCNT_inc(rx);
+#endif
        PM_SETRE(PL_reg_curpm, rx);
        PL_reg_oldcurpm = PL_curpm;
        PL_curpm = PL_reg_curpm;
@@ -3633,7 +3642,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
 #define ST st->u.eval
        {
            SV *ret;
-           SV *re_sv;
+           REGEXP *re_sv;
             regexp *re;
             regexp_internal *rei;
             regnode *startpoint;
@@ -3720,13 +3729,13 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
                        SV *const sv = SvRV(ret);
 
                        if (SvTYPE(sv) == SVt_REGEXP) {
-                           rx = sv;
+                           rx = (REGEXP*) sv;
                        } else if (SvSMAGICAL(sv)) {
                            mg = mg_find(sv, PERL_MAGIC_qr);
                            assert(mg);
                        }
                    } else if (SvTYPE(ret) == SVt_REGEXP) {
-                       rx = ret;
+                       rx = (REGEXP*) ret;
                    } else if (SvSMAGICAL(ret)) {
                        if (SvGMAGICAL(ret)) {
                            /* I don't believe that there is ever qr magic
@@ -3745,7 +3754,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
                    }
 
                    if (mg) {
-                       rx = mg->mg_obj; /*XXX:dmq*/
+                       rx = (REGEXP *) mg->mg_obj; /*XXX:dmq*/
                        assert(rx);
                    }
                    if (rx) {
@@ -3774,7 +3783,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
                            /* This isn't a first class regexp. Instead, it's
                               caching a regexp onto an existing, Perl visible
                               scalar.  */
-                           sv_magic(ret, rx, PERL_MAGIC_qr, 0, 0);
+                           sv_magic(ret, (SV*) rx, PERL_MAGIC_qr, 0, 0);
                        }
                        PL_regsize = osize;
                    }