}
else {
if (SvTYPE(sv) != SVt_PVGV) {
+ char *sym;
+
if (SvGMAGICAL(sv)) {
mg_get(sv);
if (SvROK(sv))
DIE(no_usym, "a symbol");
RETSETUNDEF;
}
+ sym = SvPV(sv, na);
if (op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, "a symbol");
- sv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE, SVt_PVGV);
+ DIE(no_symref, sym, "a symbol");
+ sv = (SV*)gv_fetchpv(sym, TRUE, SVt_PVGV);
}
}
if (op->op_private & OPpLVAL_INTRO) {
GP *ogp = GvGP(sv);
SSCHECK(3);
- SSPUSHPTR(sv);
+ SSPUSHPTR(SvREFCNT_inc(sv));
SSPUSHPTR(ogp);
SSPUSHINT(SAVEt_GP);
if (op->op_flags & OPf_SPECIAL) {
GvGP(sv)->gp_refcnt++; /* will soon be assigned */
- GvFLAGS(sv) |= GVf_INTRO;
+ GvINTRO_on(sv);
}
else {
GP *gp;
RETURN;
}
-PP(pp_sv2len)
-{
- dSP; dTARGET;
- dPOPss;
- PUSHi(sv_len(sv));
- RETURN;
-}
-
PP(pp_rv2sv)
{
dSP; dTOPss;
}
else {
GV *gv = sv;
+ char *sym;
+
if (SvTYPE(gv) != SVt_PVGV) {
if (SvGMAGICAL(sv)) {
mg_get(sv);
DIE(no_usym, "a SCALAR");
RETSETUNDEF;
}
+ sym = SvPV(sv, na);
if (op->op_private & HINT_STRICT_REFS)
- DIE(no_symref, "a SCALAR");
- gv = (SV*)gv_fetchpv(SvPV(sv, na), TRUE, SVt_PV);
+ DIE(no_symref, sym, "a SCALAR");
+ gv = (SV*)gv_fetchpv(sym, TRUE, SVt_PV);
}
sv = GvSV(gv);
}
if (op->op_flags & OPf_MOD) {
if (op->op_private & OPpLVAL_INTRO)
sv = save_scalar((GV*)TOPs);
- else if (op->op_private & (OPpDEREF_HV|OPpDEREF_AV)) {
- if (SvGMAGICAL(sv))
- mg_get(sv);
- if (!SvOK(sv)) {
- (void)SvUPGRADE(sv, SVt_RV);
- SvRV(sv) = (op->op_private & OPpDEREF_HV ?
- (SV*)newHV() : (SV*)newAV());
- SvROK_on(sv);
- SvSETMAGIC(sv);
- }
- }
+ else if (op->op_private & (OPpDEREF_HV|OPpDEREF_AV))
+ provide_ref(op, sv);
}
SETs(sv);
RETURN;
GV *gv;
HV *stash;
- /* We always try to add a non-existent subroutine in case of AUTOLOAD. */
- CV *cv = sv_2cv(TOPs, &stash, &gv, TRUE);
+ /* We usually try to add a non-existent subroutine in case of AUTOLOAD. */
+ /* (But not in defined().) */
+ CV *cv = sv_2cv(TOPs, &stash, &gv, !(op->op_flags & OPf_SPECIAL));
+ if (!cv)
+ cv = (CV*)&sv_undef;
SETs((SV*)cv);
RETURN;
}
+PP(pp_prototype)
+{
+ dSP;
+ CV *cv;
+ HV *stash;
+ GV *gv;
+ SV *ret;
+
+ ret = &sv_undef;
+ cv = sv_2cv(TOPs, &stash, &gv, FALSE);
+ if (cv && SvPOK(cv)) {
+ char *p = SvPVX(cv);
+ ret = sv_2mortal(newSVpv(p ? p : "", SvLEN(cv)));
+ }
+ SETs(ret);
+ RETURN;
+}
+
PP(pp_anoncode)
{
dSP;
- XPUSHs(cSVOP->op_sv);
+ CV* cv = (CV*)cSVOP->op_sv;
+ EXTEND(SP,1);
+
+ if (CvCLONE(cv))
+ cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
+
+ PUSHs((SV*)cv);
RETURN;
}
sv = POPs;
if (!sv || !SvROK(sv))
- RETPUSHUNDEF;
+ RETPUSHNO;
sv = SvRV(sv);
pv = sv_reftype(sv,TRUE);
PP(pp_study)
{
- dSP; dTARGET;
+ dSP; dPOPss;
register unsigned char *s;
register I32 pos;
register I32 ch;
I32 retval;
STRLEN len;
- s = (unsigned char*)(SvPV(TARG, len));
+ s = (unsigned char*)(SvPV(sv, len));
pos = len;
- if (lastscream)
- SvSCREAM_off(lastscream);
- lastscream = TARG;
+ if (sv == lastscream)
+ SvSCREAM_off(sv);
+ else {
+ if (lastscream) {
+ SvSCREAM_off(lastscream);
+ SvREFCNT_dec(lastscream);
+ }
+ lastscream = SvREFCNT_inc(sv);
+ }
if (pos <= 0) {
retval = 0;
goto ret;
sfirst[fold[ch]] = pos;
}
- SvSCREAM_on(TARG);
+ SvSCREAM_on(sv);
+ sv_magic(sv, Nullsv, 'g', Nullch, 0); /* piggyback on m//g magic */
retval = 1;
ret:
XPUSHs(sv_2mortal(newSViv((I32)retval)));
sv = GvSV(defgv);
EXTEND(SP,1);
}
- TARG = NEWSV(27,0);
+ TARG = sv_newmortal();
PUSHi(do_trans(sv, op));
RETURN;
}
RETPUSHNO;
switch (SvTYPE(sv)) {
case SVt_PVAV:
- if (AvMAX(sv) >= 0)
+ if (AvMAX(sv) >= 0 || SvRMAGICAL(sv))
RETPUSHYES;
break;
case SVt_PVHV:
- if (HvARRAY(sv))
+ if (HvARRAY(sv) || SvRMAGICAL(sv))
RETPUSHYES;
break;
case SVt_PVCV:
cv_undef((CV*)sv);
sub_generation++;
break;
+ case SVt_PVGV:
+ if (SvFAKE(sv)) {
+ sv_setsv(sv, &sv_undef);
+ break;
+ }
default:
- if (sv != GvSV(defgv)) {
- if (SvPOK(sv) && SvLEN(sv)) {
- (void)SvOOK_off(sv);
- Safefree(SvPVX(sv));
- SvPV_set(sv, Nullch);
- SvLEN_set(sv, 0);
- }
- (void)SvOK_off(sv);
- SvSETMAGIC(sv);
+ if (SvPOK(sv) && SvLEN(sv)) {
+ (void)SvOOK_off(sv);
+ Safefree(SvPVX(sv));
+ SvPV_set(sv, Nullch);
+ SvLEN_set(sv, 0);
}
+ (void)SvOK_off(sv);
+ SvSETMAGIC(sv);
}
RETPUSHUNDEF;
PP(pp_predec)
{
dSP;
- sv_dec(TOPs);
+ if (SvIOK(TOPs)) {
+ --SvIVX(TOPs);
+ SvFLAGS(TOPs) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK);
+ }
+ else
+ sv_dec(TOPs);
SvSETMAGIC(TOPs);
return NORMAL;
}
{
dSP; dTARGET;
sv_setsv(TARG, TOPs);
- sv_inc(TOPs);
+ if (SvIOK(TOPs)) {
+ ++SvIVX(TOPs);
+ SvFLAGS(TOPs) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK);
+ }
+ else
+ sv_inc(TOPs);
SvSETMAGIC(TOPs);
if (!SvOK(TARG))
sv_setiv(TARG, 0);
{
dSP; dTARGET;
sv_setsv(TARG, TOPs);
- sv_dec(TOPs);
+ if (SvIOK(TOPs)) {
+ --SvIVX(TOPs);
+ SvFLAGS(TOPs) &= ~(SVf_NOK|SVf_POK|SVp_NOK|SVp_POK);
+ }
+ else
+ sv_dec(TOPs);
SvSETMAGIC(TOPs);
SETs(TARG);
return NORMAL;
PP(pp_repeat)
{
- dSP; dATARGET;
+ dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
+ {
register I32 count = POPi;
if (GIMME == G_ARRAY && op->op_private & OPpREPEAT_DOLIST) {
dMARK;
PUSHTARG;
}
RETURN;
+ }
}
PP(pp_subtract)
{
dSP; dATARGET; tryAMAGICbin(lshift,opASSIGN);
{
- dPOPTOPiirl;
- SETi( left << right );
- RETURN;
+ dPOPTOPiirl;
+ SETi( left << right );
+ RETURN;
}
}
dSP; dATARGET; tryAMAGICbin(band,opASSIGN);
{
dPOPTOPssrl;
- if (SvNIOK(left) || SvNIOK(right)) {
+ if (SvNIOKp(left) || SvNIOKp(right)) {
unsigned long value = U_L(SvNV(left));
value = value & U_L(SvNV(right));
SETn((double)value);
dSP; dATARGET; tryAMAGICbin(bxor,opASSIGN);
{
dPOPTOPssrl;
- if (SvNIOK(left) || SvNIOK(right)) {
+ if (SvNIOKp(left) || SvNIOKp(right)) {
unsigned long value = U_L(SvNV(left));
value = value ^ U_L(SvNV(right));
SETn((double)value);
dSP; dATARGET; tryAMAGICbin(bor,opASSIGN);
{
dPOPTOPssrl;
- if (SvNIOK(left) || SvNIOK(right)) {
+ if (SvNIOKp(left) || SvNIOKp(right)) {
unsigned long value = U_L(SvNV(left));
value = value | U_L(SvNV(right));
SETn((double)value);
dSP; dTARGET; tryAMAGICun(neg);
{
dTOPss;
- if (SvNIOK(sv))
+ if (SvGMAGICAL(sv))
+ mg_get(sv);
+ if (SvNIOKp(sv))
SETn(-SvNV(sv));
- else if (SvPOK(sv)) {
+ else if (SvPOKp(sv)) {
STRLEN len;
char *s = SvPV(sv, len);
if (isALPHA(*s) || *s == '_') {
sv_setnv(TARG, -SvNV(sv));
SETTARG;
}
+ else
+ SETn(-SvNV(sv));
}
RETURN;
}
dTOPss;
register I32 anum;
- if (SvNIOK(sv)) {
- SETi( ~SvIV(sv) );
+ if (SvNIOKp(sv)) {
+ IV iv = ~SvIV(sv);
+ if (iv < 0)
+ SETn( (double) ~U_L(SvNV(sv)) );
+ else
+ SETi( iv );
}
else {
register char *tmps;
/* integer versions of some of the above */
-PP(pp_i_preinc)
-{
-#ifndef OVERLOAD
- dSP; dTOPiv;
- sv_setiv(TOPs, value + 1);
- SvSETMAGIC(TOPs);
-#else
- dSP;
- if (SvAMAGIC(TOPs) ) {
- sv_inc(TOPs);
- } else {
- dTOPiv;
- sv_setiv(TOPs, value + 1);
- SvSETMAGIC(TOPs);
- }
-#endif /* OVERLOAD */
- return NORMAL;
-}
-
-PP(pp_i_predec)
-{
-#ifndef OVERLOAD
- dSP; dTOPiv;
- sv_setiv(TOPs, value - 1);
- SvSETMAGIC(TOPs);
-#else
- dSP;
- if (SvAMAGIC(TOPs)) {
- sv_dec(TOPs);
- } else {
- dTOPiv;
- sv_setiv(TOPs, value - 1);
- SvSETMAGIC(TOPs);
- }
-#endif /* OVERLOAD */
- return NORMAL;
-}
-
-PP(pp_i_postinc)
-{
- dSP; dTARGET;
- sv_setsv(TARG, TOPs);
-#ifndef OVERLOAD
- sv_setiv(TOPs, SvIV(TOPs) + 1);
- SvSETMAGIC(TOPs);
-#else
- if (SvAMAGIC(TOPs) ) {
- sv_inc(TOPs);
- } else {
- sv_setiv(TOPs, SvIV(TOPs) + 1);
- SvSETMAGIC(TOPs);
- }
-#endif /* OVERLOAD */
- if (!SvOK(TARG))
- sv_setiv(TARG, 0);
- SETs(TARG);
- return NORMAL;
-}
-
-PP(pp_i_postdec)
-{
- dSP; dTARGET;
- sv_setsv(TARG, TOPs);
-#ifndef OVERLOAD
- sv_setiv(TOPs, SvIV(TOPs) - 1);
- SvSETMAGIC(TOPs);
-#else
- if (SvAMAGIC(TOPs) ) {
- sv_dec(TOPs);
- } else {
- sv_setiv(TOPs, SvIV(TOPs) - 1);
- SvSETMAGIC(TOPs);
- }
-#endif /* OVERLOAD */
- SETs(TARG);
- return NORMAL;
-}
-
PP(pp_i_multiply)
{
dSP; dATARGET; tryAMAGICbin(mult,opASSIGN);
{
dSP; dTARGET;
char *tmps;
+ unsigned long value;
I32 argtype;
tmps = POPp;
- XPUSHi( scan_hex(tmps, 99, &argtype) );
+ value = scan_hex(tmps, 99, &argtype);
+ if ((IV)value >= 0)
+ XPUSHi(value);
+ else
+ XPUSHn(U_V(value));
RETURN;
}
PP(pp_oct)
{
dSP; dTARGET;
- I32 value;
+ unsigned long value;
I32 argtype;
char *tmps;
tmps = POPp;
- while (*tmps && (isSPACE(*tmps) || *tmps == '0'))
+ while (*tmps && isSPACE(*tmps))
+ tmps++;
+ if (*tmps == '0')
tmps++;
if (*tmps == 'x')
- value = (I32)scan_hex(++tmps, 99, &argtype);
+ value = scan_hex(++tmps, 99, &argtype);
else
- value = (I32)scan_oct(tmps, 99, &argtype);
- XPUSHi(value);
+ value = scan_oct(tmps, 99, &argtype);
+ if ((IV)value >= 0)
+ XPUSHi(value);
+ else
+ XPUSHn(U_V(value));
RETURN;
}
if (MAXARG < 3)
len = curlen;
else if (len < 0) {
- len += curlen;
+ len += curlen - pos;
if (len < 0)
len = 0;
}
rem = len;
sv_setpvn(TARG, tmps, rem);
if (lvalue) { /* it's an lvalue! */
+ if (!SvGMAGICAL(sv))
+ (void)SvPOK_only(sv);
if (SvTYPE(TARG) < SVt_PVLV) {
sv_upgrade(TARG, SVt_PVLV);
sv_magic(TARG, Nullsv, 'x', Nullch, 0);
retnum = 0;
else {
offset >>= 3;
- if (size == 16)
- retnum = (unsigned long) s[offset] << 8;
- else if (size == 32) {
- if (offset < len) {
- if (offset + 1 < len)
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16) +
- (s[offset + 2] << 8);
- else
- retnum = ((unsigned long) s[offset] << 24) +
- ((unsigned long) s[offset + 1] << 16);
- }
+ if (size == 16) {
+ if (offset >= srclen)
+ retnum = 0;
else
+ retnum = (unsigned long) s[offset] << 8;
+ }
+ else if (size == 32) {
+ if (offset >= srclen)
+ retnum = 0;
+ else if (offset + 1 >= srclen)
retnum = (unsigned long) s[offset] << 24;
+ else if (offset + 2 >= srclen)
+ retnum = ((unsigned long) s[offset] << 24) +
+ ((unsigned long) s[offset + 1] << 16);
+ else
+ retnum = ((unsigned long) s[offset] << 24) +
+ ((unsigned long) s[offset + 1] << 16) +
+ (s[offset + 2] << 8);
}
}
}
dSP; dTARGET;
char *tmps;
- if (!SvPOK(TARG)) {
- (void)SvUPGRADE(TARG,SVt_PV);
- SvGROW(TARG,1);
- }
+ (void)SvUPGRADE(TARG,SVt_PV);
+ SvGROW(TARG,2);
SvCUR_set(TARG, 1);
tmps = SvPVX(TARG);
- *tmps = POPi;
+ *tmps++ = POPi;
+ *tmps = '\0';
(void)SvPOK_only(TARG);
XPUSHs(TARG);
RETURN;
if (len) {
(void)SvUPGRADE(TARG, SVt_PV);
- SvGROW(TARG, len * 2);
+ SvGROW(TARG, (len * 2) + 1);
d = SvPVX(TARG);
while (len--) {
if (!isALNUM(*s))
register SV** svp;
register AV* av = (AV*)POPs;
register I32 lval = op->op_flags & OPf_MOD;
+ I32 arybase = curcop->cop_arybase;
+ I32 elem;
if (SvTYPE(av) == SVt_PVAV) {
+ if (lval && op->op_private & OPpLVAL_INTRO) {
+ I32 max = -1;
+ for (svp = mark + 1; svp <= sp; svp++) {
+ elem = SvIVx(*svp);
+ if (elem > max)
+ max = elem;
+ }
+ if (max > AvMAX(av))
+ av_extend(av, max);
+ }
while (++MARK <= SP) {
- I32 elem = SvIVx(*MARK);
+ elem = SvIVx(*MARK);
+ if (elem > 0)
+ elem -= arybase;
svp = av_fetch(av, elem, lval);
if (lval) {
if (!svp || *svp == &sv_undef)
*MARK = svp ? *svp : &sv_undef;
}
}
- else if (GIMME != G_ARRAY) {
+ if (GIMME != G_ARRAY) {
MARK = ORIGMARK;
*++MARK = *SP;
SP = MARK;
{
dSP; dTARGET;
HV *hash = (HV*)POPs;
- HE *entry = hv_iternext(hash);
+ HE *entry;
I32 i;
char *tmps;
+
+ PUTBACK;
+ entry = hv_iternext(hash); /* might clobber stack_sp */
+ SPAGAIN;
EXTEND(SP, 2);
if (entry) {
- tmps = hv_iterkey(entry, &i);
+ tmps = hv_iterkey(entry, &i); /* won't clobber stack_sp */
if (!i)
tmps = "";
PUSHs(sv_2mortal(newSVpv(tmps, i)));
if (GIMME == G_ARRAY) {
- sv_setsv(TARG, hv_iterval(hash, entry));
+ PUTBACK;
+ sv_setsv(TARG, hv_iterval(hash, entry)); /* might clobber stack_sp */
+ SPAGAIN;
PUSHs(TARG);
}
}
DIE("Not a HASH reference");
}
tmps = SvPV(tmpsv, len);
- sv = hv_delete(hv, tmps, len);
+ sv = hv_delete(hv, tmps, len,
+ op->op_private & OPpLEAVE_VOID ? G_DISCARD : 0);
if (!sv)
RETPUSHUNDEF;
PUSHs(sv);
SV **firstlelem = stack_base + POPMARK + 1;
register SV **firstrelem = lastlelem + 1;
I32 arybase = curcop->cop_arybase;
+ I32 lval = op->op_flags & OPf_MOD;
+ I32 is_something_there = lval;
register I32 max = lastrelem - lastlelem;
register SV **lelem;
register I32 ix;
if (GIMME != G_ARRAY) {
- ix = SvIVx(*lastlelem) - arybase;
+ ix = SvIVx(*lastlelem);
+ if (ix < 0)
+ ix += max;
+ else
+ ix -= arybase;
if (ix < 0 || ix >= max)
*firstlelem = &sv_undef;
else
}
for (lelem = firstlelem; lelem <= lastlelem; lelem++) {
- ix = SvIVx(*lelem) - arybase;
+ ix = SvIVx(*lelem);
if (ix < 0) {
ix += max;
if (ix < 0)
else if (!(*lelem = firstrelem[ix]))
*lelem = &sv_undef;
}
- else if (ix >= max || !(*lelem = firstrelem[ix]))
- *lelem = &sv_undef;
+ else {
+ ix -= arybase;
+ if (ix >= max || !(*lelem = firstrelem[ix]))
+ *lelem = &sv_undef;
+ }
+ if (!is_something_there && (SvOKp(*lelem) || SvGMAGICAL(*lelem)))
+ is_something_there = TRUE;
}
- SP = lastlelem;
+ if (is_something_there)
+ SP = lastlelem;
+ else
+ SP = firstlelem - 1;
RETURN;
}
I16 ashort;
int aint;
I32 along;
-#ifdef QUAD
- quad aquad;
+#ifdef HAS_QUAD
+ Quad_t aquad;
#endif
U16 aushort;
unsigned int auint;
U32 aulong;
-#ifdef QUAD
- unsigned quad auquad;
+#ifdef HAS_QUAD
+ unsigned Quad_t auquad;
#endif
char *aptr;
float afloat;
if (GIMME != G_ARRAY) { /* arrange to do first one only */
/*SUPPRESS 530*/
for (patend = pat; !isALPHA(*patend) || *patend == 'x'; patend++) ;
- if (strchr("aAbBhH", *patend) || *pat == '%') {
+ if (strchr("aAbBhHP", *patend) || *pat == '%') {
patend++;
while (isDIGIT(*patend) || *patend == '*')
patend++;
sv_setpvn(sv, aptr, len);
PUSHs(sv_2mortal(sv));
break;
-#ifdef QUAD
+#ifdef HAS_QUAD
case 'q':
EXTEND(SP, len);
while (len-- > 0) {
- if (s + sizeof(quad) > strend)
+ if (s + sizeof(Quad_t) > strend)
aquad = 0;
else {
- Copy(s, &aquad, 1, quad);
- s += sizeof(quad);
+ Copy(s, &aquad, 1, Quad_t);
+ s += sizeof(Quad_t);
}
sv = NEWSV(42, 0);
sv_setiv(sv, (IV)aquad);
case 'Q':
EXTEND(SP, len);
while (len-- > 0) {
- if (s + sizeof(unsigned quad) > strend)
+ if (s + sizeof(unsigned Quad_t) > strend)
auquad = 0;
else {
- Copy(s, &auquad, 1, unsigned quad);
- s += sizeof(unsigned quad);
+ Copy(s, &auquad, 1, unsigned Quad_t);
+ s += sizeof(unsigned Quad_t);
}
sv = NEWSV(43, 0);
sv_setiv(sv, (IV)auquad);
unsigned int auint;
I32 along;
U32 aulong;
-#ifdef QUAD
- quad aquad;
- unsigned quad auquad;
+#ifdef HAS_QUAD
+ Quad_t aquad;
+ unsigned Quad_t auquad;
#endif
char *aptr;
float afloat;
sv_catpvn(cat, (char*)&along, sizeof(I32));
}
break;
-#ifdef QUAD
+#ifdef HAS_QUAD
case 'Q':
while (len-- > 0) {
fromstr = NEXTFROM;
- auquad = (unsigned quad)SvIV(fromstr);
- sv_catpvn(cat, (char*)&auquad, sizeof(unsigned quad));
+ auquad = (unsigned Quad_t)SvIV(fromstr);
+ sv_catpvn(cat, (char*)&auquad, sizeof(unsigned Quad_t));
}
break;
case 'q':
while (len-- > 0) {
fromstr = NEXTFROM;
- aquad = (quad)SvIV(fromstr);
- sv_catpvn(cat, (char*)&aquad, sizeof(quad));
+ aquad = (Quad_t)SvIV(fromstr);
+ sv_catpvn(cat, (char*)&aquad, sizeof(Quad_t));
}
break;
-#endif /* QUAD */
+#endif /* HAS_QUAD */
case 'P':
len = 1; /* assume SV is correct length */
/* FALL THROUGH */
AV *oldstack = stack;
register REGEXP *rx = pm->op_pmregexp;
I32 gimme = GIMME;
+ I32 oldsave = savestack_ix;
if (!pm || !s)
DIE("panic: do_split");
while (isSPACE(*s))
s++;
}
+ if (pm->op_pmflags & (PMf_MULTILINE|PMf_SINGLELINE)) {
+ SAVEINT(multiline);
+ multiline = pm->op_pmflags & PMf_MULTILINE;
+ }
+
if (!limit)
limit = maxiters + 2;
if (pm->op_pmflags & PMf_WHITE) {
else {
maxiters += (strend - s) * rx->nparens;
while (s < strend && --limit &&
- regexec(rx, s, strend, orig, 1, Nullsv, TRUE) ) {
+ pregexec(rx, s, strend, orig, 1, Nullsv, TRUE) ) {
if (rx->subbase
&& rx->subbase != orig) {
m = s;
for (i = 1; i <= rx->nparens; i++) {
s = rx->startp[i];
m = rx->endp[i];
- dstr = NEWSV(33, m-s);
- sv_setpvn(dstr, s, m-s);
+ if (m && s) {
+ dstr = NEWSV(33, m-s);
+ sv_setpvn(dstr, s, m-s);
+ }
+ else
+ dstr = NEWSV(33, 0);
if (!realarray)
sv_2mortal(dstr);
XPUSHs(dstr);
s = rx->endp[0];
}
}
+ LEAVE_SCOPE(oldsave);
iters = (SP - stack_base) - base;
if (iters > maxiters)
DIE("Split loop");