[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
[PATCH] More COW lvalues
-DPERL_DEBUG_COW revealed more invalid lvalues, caused by Change #25571.
SvCUR= is relatively easy to fix because we have SvCUR_set.
op.c: In function `Perl_ck_require':
op.c:7525: error: invalid lvalue in assignment
make: *** [op.o] Error 1
diff -u sv.h.orig sv.h
--- sv.h.orig 2008-06-08 15:41:31.000000000 +0000
+++ sv.h 2008-06-09 14:52:57.187500000 +0000
@@ -1232,7 +1232,7 @@
(((XPV*) SvANY(sv))->xpv_len = (val)); } STMT_END
#define SvEND_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- (SvCUR(sv) = (val) - SvPVX(sv)); } STMT_END
+ SvCUR_set(sv, (val) - SvPVX(sv)); } STMT_END
#define SvPV_renew(sv,n) \
STMT_START { SvLEN_set(sv, n); \
But what about SvIVX(sv)++
regcomp.c: In function `S_reg':
regcomp.c:5672: error: invalid lvalue in increment
SvIVX(sv_dat)++;
regcomp.c:5678: error: invalid lvalue in assignment
SvIVX(sv_dat)= 1;
I can only think of disallowing the PERL_DEBUG_COW macro here.
This is ugly, but at least it works now.
--
Reini Urban
http://phpwiki.org/ http://murbreak.at/
difforig sv.h regcomp.c
diff -u sv.h.orig sv.h
--- sv.h.orig 2008-06-08 15:41:31.000000000 +0000
+++ sv.h 2008-06-09 14:52:57.187500000 +0000
@@ -1232,7 +1232,7 @@
(((XPV*) SvANY(sv))->xpv_len = (val)); } STMT_END
#define SvEND_set(sv, val) \
STMT_START { assert(SvTYPE(sv) >= SVt_PV); \
- (SvCUR(sv) = (val) - SvPVX(sv)); } STMT_END
+ SvCUR_set(sv, (val) - SvPVX(sv)); } STMT_END
#define SvPV_renew(sv,n) \
STMT_START { SvLEN_set(sv, n); \
diff -u regcomp.c.orig regcomp.c
--- regcomp.c.orig 2008-05-18 12:11:54.000000000 +0000
+++ regcomp.c 2008-06-09 15:02:56.625000000 +0000
@@ -5669,13 +5669,21 @@
pv = (I32*)SvGROW(sv_dat, SvCUR(sv_dat) + sizeof(I32)+1);
SvCUR_set(sv_dat, SvCUR(sv_dat) + sizeof(I32));
pv[count] = RExC_npar;
+#ifdef PERL_DEBUG_COW
+ ((XPVIV*) SvANY(sv_dat))->xiv_iv++;
+#else
SvIVX(sv_dat)++;
+#endif
}
} else {
(void)SvUPGRADE(sv_dat,SVt_PVNV);
sv_setpvn(sv_dat, (char *)&(RExC_npar), sizeof(I32));
SvIOK_on(sv_dat);
- SvIVX(sv_dat)= 1;
+#ifdef PERL_DEBUG_COW
+ ((XPVIV*) SvANY(sv_dat))->xiv_iv = 1;
+#else
+ SvIVX(sv_dat)=1;
+#endif
}
#ifdef DEBUGGING
if (!av_store(RExC_paren_name_list, RExC_npar, SvREFCNT_inc(svname)))
- Follow-Ups from:
-
Reini Urban <rurban@x-ray.at>
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]