summaryrefslogtreecommitdiff
path: root/cop.h
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-03-21 00:09:09 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-03-21 00:09:09 +0000
commit9e5093700069f9f74b9ca2d59c30b0b9880239d2 (patch)
treed890c0349c764261d493a69d726793542a4bb392 /cop.h
parentd6fd2b02d50b0bf989dc521c19ed6e9f2fbfb325 (diff)
downloadperl-9e5093700069f9f74b9ca2d59c30b0b9880239d2.tar.gz
under useithreads, PUSHLOOP must save PL_curpad for looking up
iterdata, since dounwind() may defer LEAVEs p4raw-id: //depot/perl@5847
Diffstat (limited to 'cop.h')
-rw-r--r--cop.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/cop.h b/cop.h
index 5dd937e7d4..e588675012 100644
--- a/cop.h
+++ b/cop.h
@@ -181,6 +181,7 @@ struct block_loop {
OP * last_op;
#ifdef USE_ITHREADS
void * iterdata;
+ SV ** oldcurpad;
#else
SV ** itervar;
#endif
@@ -195,10 +196,11 @@ struct block_loop {
# define CxITERVAR(c) \
((c)->blk_loop.iterdata \
? (CxPADLOOP(cx) \
- ? &PL_curpad[(PADOFFSET)(c)->blk_loop.iterdata] \
+ ? &((c)->blk_loop.oldcurpad)[(PADOFFSET)(c)->blk_loop.iterdata] \
: &GvSV((GV*)(c)->blk_loop.iterdata)) \
: (SV**)NULL)
# define CX_ITERDATA_SET(cx,idata) \
+ cx->blk_loop.oldcurpad = PL_curpad; \
if ((cx->blk_loop.iterdata = (idata))) \
cx->blk_loop.itersave = SvREFCNT_inc(*CxITERVAR(cx));
#else