email address correction
[p5sagit/p5-mst-13.2.git] / regexec.c
index 4135d36..db3cecb 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -67,7 +67,8 @@
  *
  ****    Alterations to Henry's code are...
  ****
- ****    Copyright (c) 1991-2002, Larry Wall
+ ****    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ ****    2000, 2001, 2002, 2003, by Larry Wall and others
  ****
  ****    You may distribute under the terms of either the GNU General Public
  ****    License or the Artistic License, as specified in the README file.
@@ -171,7 +172,7 @@ S_regcppush(pTHX_ I32 parenfloor)
        Perl_croak(aTHX_ "panic: paren_elems_to_push < 0");
 
 #define REGCP_OTHER_ELEMS 6
-    SSCHECK(paren_elems_to_push + REGCP_OTHER_ELEMS);
+    SSGROW(paren_elems_to_push + REGCP_OTHER_ELEMS);
     for (p = PL_regsize; p > parenfloor; p--) {
 /* REGCP_PARENS_ELEMS are pushed per pairs of parentheses. */
        SSPUSHINT(PL_regendp[p]);
@@ -544,7 +545,7 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
            goto fail_finish;
        /* we may be pointing at the wrong string */
        if (s && RX_MATCH_COPIED(prog))
-           s = prog->subbeg + (s - SvPVX(sv));
+           s = strbeg + (s - SvPVX(sv));
        if (data)
            *data->scream_olds = s;
     }
@@ -852,10 +853,6 @@ Perl_re_intuit_start(pTHX_ regexp *prog, SV *sv, char *strpos,
        char *startpos = strbeg;
 
        t = s;
-       if (prog->reganch & ROPT_UTF8) {        
-           PL_regdata = prog->data;
-           PL_bostr = startpos;
-       }
        cache_re(prog);
        s = find_byclass(prog, prog->regstclass, s, endpos, startpos, 1);
        if (!s) {
@@ -1866,7 +1863,7 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
                                  PL_multiline ? FBMrf_MULTILINE : 0))) ) {
            /* we may be pointing at the wrong string */
            if ((flags & REXEC_SCREAM) && RX_MATCH_COPIED(prog))
-               s = prog->subbeg + (s - SvPVX(sv));
+               s = strbeg + (s - SvPVX(sv));
            DEBUG_r( did_match = 1 );
            if (HOPc(s, -back_max) > last1) {
                last1 = HOPc(s, -back_min);
@@ -1955,7 +1952,7 @@ Perl_regexec_flags(pTHX_ register regexp *prog, char *stringarg, register char *
                    last = scream_olds; /* Only one occurrence. */
                /* we may be pointing at the wrong string */
                else if (RX_MATCH_COPIED(prog))
-                   s = prog->subbeg + (s - SvPVX(sv));
+                   s = strbeg + (s - SvPVX(sv));
            }
            else {
                STRLEN len;
@@ -2838,6 +2835,7 @@ S_regmatch(pTHX_ regnode *prog)
            COP *ocurcop = PL_curcop;
            PAD *old_comppad;
            SV *ret;
+           struct regexp *oreg = PL_reg_re;
        
            n = ARG(scan);
            PL_op = (OP_4tree*)PL_regdata->data[n];
@@ -2867,13 +2865,17 @@ S_regmatch(pTHX_ regnode *prog)
                    re_cc_state state;
                    CHECKPOINT cp, lastcp;
                     int toggleutf;
+                   register SV *sv;
 
-                   if(SvROK(ret) || SvRMAGICAL(ret)) {
-                       SV *sv = SvROK(ret) ? SvRV(ret) : ret;
-
-                       if(SvMAGICAL(sv))
-                           mg = mg_find(sv, PERL_MAGIC_qr);
+                   if(SvROK(ret) && SvSMAGICAL(sv = SvRV(ret)))
+                       mg = mg_find(sv, PERL_MAGIC_qr);
+                   else if (SvSMAGICAL(ret)) {
+                       if (SvGMAGICAL(ret))
+                           sv_unmagic(ret, PERL_MAGIC_qr);
+                       else
+                           mg = mg_find(ret, PERL_MAGIC_qr);
                    }
+
                    if (mg) {
                        re = (regexp *)mg->mg_obj;
                        (void)ReREFCNT_inc(re);
@@ -2890,7 +2892,8 @@ S_regmatch(pTHX_ regnode *prog)
                         if (DO_UTF8(ret)) pm.op_pmdynflags |= PMdf_DYN_UTF8;
                        re = CALLREGCOMP(aTHX_ t, t + len, &pm);
                        if (!(SvFLAGS(ret)
-                             & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)))
+                             & (SVs_TEMP | SVs_PADTMP | SVf_READONLY
+                               | SVs_GMG)))
                            sv_magic(ret,(SV*)ReREFCNT_inc(re),
                                        PERL_MAGIC_qr,0,0);
                        PL_regprecomp = oprecomp;
@@ -2965,8 +2968,10 @@ S_regmatch(pTHX_ regnode *prog)
                sw = SvTRUE(ret);
                logical = 0;
            }
-           else
+           else {
                sv_setsv(save_scalar(PL_replgv), ret);
+               cache_re(oreg);
+           }
            break;
        }
        case OPEN: