In perl.git, the branch smoke-me/nicholas/parse_start has been updated <http://perl5.git.perl.org/perl.git/commitdiff/60310164f39556e126b3f7cb5c3d2e52c632d41d?hp=ed15f089efe23c3c8ff3a832c0eb38cea446b2fc>
- Log ----------------------------------------------------------------- commit 60310164f39556e126b3f7cb5c3d2e52c632d41d Author: Nicholas Clark <n...@ccl4.org> Date: Wed Jun 5 12:15:57 2013 +0200 In regcomp.c, Set_Node_Cur_Length() uses parse_start, so explicitly pass it. The macro Set_Node_Cur_Length() had been referring to the variable parse_start within its body. This somewhat secret reference is potentially risky, as it was always taking a parameter node, hence one might assume that that was all that it used, and change the value stored in parse_start. (Specifically, one place that assigns RExC_parse - 1 to parse_start, and later uses parse_start + 1, which looks like an obvious cleanup candidate) So make parse_start an explicit parameter. Also, eliminate the never-used macro Set_Cur_Node_Length. This was added as part of commit fac927409d5ddf11 (April 2001) but never used. ----------------------------------------------------------------------- Summary of changes: regcomp.c | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diff --git a/regcomp.c b/regcomp.c index 8caa415..8e4dcb9 100644 --- a/regcomp.c +++ b/regcomp.c @@ -634,7 +634,7 @@ static const scan_data_t zero_scan_data = #define Set_Cur_Node_Offset #define Set_Node_Length_To_R(node,len) #define Set_Node_Length(node,len) -#define Set_Node_Cur_Length(node) +#define Set_Node_Cur_Length(node,start) #define Node_Offset(n) #define Node_Length(n) #define Set_Node_Offset_Length(node,offset,len) @@ -673,9 +673,8 @@ static const scan_data_t zero_scan_data = #define Set_Node_Length(node,len) \ Set_Node_Length_To_R((node)-RExC_emit_start, len) -#define Set_Cur_Node_Length(len) Set_Node_Length(RExC_emit, len) -#define Set_Node_Cur_Length(node) \ - Set_Node_Length(node, RExC_parse - parse_start) +#define Set_Node_Cur_Length(node, start) \ + Set_Node_Length(node, RExC_parse - start) /* Get offsets and lengths */ #define Node_Offset(n) (RExC_offsets[2*((n)-RExC_emit_start)-1]) @@ -8828,7 +8827,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth) *flagp |= HASWIDTH; Set_Node_Offset(ret, parse_start+1); - Set_Node_Cur_Length(ret); /* MJD */ + Set_Node_Cur_Length(ret, parse_start); nextchar(pRExC_state); return ret; @@ -9478,7 +9477,7 @@ S_reg(pTHX_ RExC_state_t *pRExC_state, I32 paren, I32 *flagp,U32 depth) if (paren == '>') node = SUSPEND, flag = 0; reginsert(pRExC_state, node,ret, depth+1); - Set_Node_Cur_Length(ret); + Set_Node_Cur_Length(ret, parse_start); Set_Node_Offset(ret, parse_start + 1); ret->flags = flag; REGTAIL_STUDY(pRExC_state, ret, reg_node(pRExC_state, TAIL)); @@ -9702,7 +9701,7 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth) RExC_naughty += 2 + RExC_naughty / 2; reginsert(pRExC_state, CURLY, ret, depth+1); Set_Node_Offset(ret, parse_start+1); /* MJD */ - Set_Node_Cur_Length(ret); + Set_Node_Cur_Length(ret, parse_start); } else { regnode * const w = reg_node(pRExC_state, WHILEM); @@ -10584,7 +10583,7 @@ tryagain: RExC_parse--; Set_Node_Offset(ret, parse_start + 2); - Set_Node_Cur_Length(ret); + Set_Node_Cur_Length(ret, parse_start); nextchar(pRExC_state); } break; @@ -10648,7 +10647,7 @@ tryagain: /* override incorrect value set in reganode MJD */ Set_Node_Offset(ret, parse_start+1); - Set_Node_Cur_Length(ret); /* MJD */ + Set_Node_Cur_Length(ret, parse_start); nextchar(pRExC_state); } @@ -10725,7 +10724,7 @@ tryagain: /* override incorrect value set in reganode MJD */ Set_Node_Offset(ret, parse_start+1); - Set_Node_Cur_Length(ret); /* MJD */ + Set_Node_Cur_Length(ret, parse_start); RExC_parse--; nextchar(pRExC_state); } @@ -11350,7 +11349,7 @@ tryagain: } RExC_parse = p - 1; - Set_Node_Cur_Length(ret); /* MJD */ + Set_Node_Cur_Length(ret, parse_start); nextchar(pRExC_state); { /* len is STRLEN which is unsigned, need to copy to signed */ -- Perl5 Master Repository