diff options
author | David Mitchell <davem@iabyn.com> | 2013-04-24 11:14:39 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2013-04-24 16:39:47 +0100 |
commit | b00652470bcd63ec9dee77ad3149214aebcee0df (patch) | |
tree | 8a8229c86f95d3e11abc13d6c7ab1e6154682a71 /cop.h | |
parent | fc941f37b0048ca24b67f61973e6b9f50f9f908f (diff) | |
download | perl-b00652470bcd63ec9dee77ad3149214aebcee0df.tar.gz |
PUSH_MULTICALL_WITHDEPTH becomes ..._FLAGS
Two non-API macros were added with 5.17.1 to support the more
complex calling conventions required by /({})/ code blocks:
PUSH_MULTICALL_WITHDEPTH(the_cv, depth)
CHANGE_MULTICALL_WITHDEPTH(the_cv, depth)
which allowed us to do the same as the API versions, but to optionally
not increment the caller depth, and to change the current CV.
Replace these with two new macros:
PUSH_MULTICALL_FLAGS(the_cv, flags)
CHANGE_MULTICALL_FLAGS(the_cv, flags)
which instead allow us to set extra flags in cx->cx_type.
The depth increment skip is handled by the new CXp_SUB_RE_FAKE flag,
and all (?{}) calls set the new CXp_SUB_RE flag.
These two new flags will shortly allow us to change how caller() and
__SUB__ handle code blocks.
Diffstat (limited to 'cop.h')
-rw-r--r-- | cop.h | 22 |
1 files changed, 13 insertions, 9 deletions
@@ -968,6 +968,8 @@ struct context { /* private flags for CXt_SUB and CXt_FORMAT */ #define CXp_HASARGS 0x20 +#define CXp_SUB_RE 0x40 /* code called within regex, i.e. (?{}) */ +#define CXp_SUB_RE_FAKE 0x80 /* fake sub CX for (?{}) in current scope */ /* private flags for CXt_EVAL */ #define CXp_REAL 0x20 /* truly eval'', not a lookalike */ @@ -1182,12 +1184,12 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>. U8 hasargs = 0 /* used by PUSHSUB */ #define PUSH_MULTICALL(the_cv) \ - PUSH_MULTICALL_WITHDEPTH(the_cv, 1); + PUSH_MULTICALL_FLAGS(the_cv, 0) -/* Like PUSH_MULTICALL, but allows you to specify the CvDEPTH increment, - * rather than the default of 1 (this isn't part of the public API) */ +/* Like PUSH_MULTICALL, but allows you to specify extra flags + * for the CX stack entry (this isn't part of the public API) */ -#define PUSH_MULTICALL_WITHDEPTH(the_cv, depth) \ +#define PUSH_MULTICALL_FLAGS(the_cv, flags) \ STMT_START { \ CV * const _nOnclAshIngNamE_ = the_cv; \ CV * const cv = _nOnclAshIngNamE_; \ @@ -1197,9 +1199,10 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>. SAVETMPS; SAVEVPTR(PL_op); \ CATCH_SET(TRUE); \ PUSHSTACKi(PERLSI_SORT); \ - PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp); \ + PUSHBLOCK(cx, (CXt_SUB|CXp_MULTICALL|flags), PL_stack_sp); \ PUSHSUB(cx); \ - CvDEPTH(cv) += depth; \ + if (!(flags & CXp_SUB_RE_FAKE)) \ + CvDEPTH(cv)++; \ if (CvDEPTH(cv) >= 2) { \ PERL_STACK_OVERFLOW_CHECK(); \ Perl_pad_push(aTHX_ padlist, CvDEPTH(cv)); \ @@ -1232,7 +1235,7 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>. /* Change the CV of an already-pushed MULTICALL CxSUB block. * (this isn't part of the public API) */ -#define CHANGE_MULTICALL_WITHDEPTH(the_cv, depth) \ +#define CHANGE_MULTICALL_FLAGS(the_cv, flags) \ STMT_START { \ CV * const _nOnclAshIngNamE_ = the_cv; \ CV * const cv = _nOnclAshIngNamE_; \ @@ -1242,9 +1245,10 @@ See L<perlcall/LIGHTWEIGHT CALLBACKS>. if (! ((CvDEPTH(multicall_cv) = cx->blk_sub.olddepth)) ) { \ LEAVESUB(multicall_cv); \ } \ - cx->cx_type &= ~CXp_HASARGS; \ + cx->cx_type = (CXt_SUB|CXp_MULTICALL|flags); \ PUSHSUB(cx); \ - CvDEPTH(cv) += depth; \ + if (!(flags & CXp_SUB_RE_FAKE)) \ + CvDEPTH(cv)++; \ if (CvDEPTH(cv) >= 2) { \ PERL_STACK_OVERFLOW_CHECK(); \ Perl_pad_push(aTHX_ padlist, CvDEPTH(cv)); \ |