diff options
author | Karl Williamson <public@khwilliamson.com> | 2013-07-12 15:11:26 -0600 |
---|---|---|
committer | Karl Williamson <public@khwilliamson.com> | 2013-07-16 13:58:12 -0600 |
commit | 4c60406d0e89efe615812945449c96f48bf70433 (patch) | |
tree | 6fe559069a877628fbbab7873bcfd09fa539b6e0 /inline_invlist.c | |
parent | bb023b4f5363e492abb21c941380d9a69f29631b (diff) | |
download | perl-4c60406d0e89efe615812945449c96f48bf70433.tar.gz |
Remove redundant field from inversion lists
The number of elements in an inversion list is a simple calculation
based on SvCUR(). Prior to this patch there was a field that contained
that number directly, and the two values diverged, causing a bug. A
single value can't get out-of-sync with itself.
Diffstat (limited to 'inline_invlist.c')
-rw-r--r-- | inline_invlist.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/inline_invlist.c b/inline_invlist.c index a29964524b..470659bea8 100644 --- a/inline_invlist.c +++ b/inline_invlist.c @@ -13,15 +13,19 @@ #define ELEMENT_RANGE_MATCHES_INVLIST(i) (! ((i) & 1)) #define PREV_RANGE_MATCHES_INVLIST(i) (! ELEMENT_RANGE_MATCHES_INVLIST(i)) -PERL_STATIC_INLINE STRLEN* -S__get_invlist_len_addr(pTHX_ SV* invlist) +/* This converts to/from our UVs to what the SV code is expecting: bytes. */ +#define TO_INTERNAL_SIZE(x) ((x) * sizeof(UV)) +#define FROM_INTERNAL_SIZE(x) ((x)/ sizeof(UV)) + +PERL_STATIC_INLINE bool* +S_get_invlist_offset_addr(pTHX_ SV* invlist) { - /* Return the address of the UV that contains the current number - * of used elements in the inversion list */ + /* Return the address of the field that says whether the inversion list is + * offset (it contains 1) or not (contains 0) */ - PERL_ARGS_ASSERT__GET_INVLIST_LEN_ADDR; + PERL_ARGS_ASSERT_GET_INVLIST_OFFSET_ADDR; - return &(((XINVLIST*) SvANY(invlist))->count); + return &(((XINVLIST*) SvANY(invlist))->is_offset); } PERL_STATIC_INLINE UV @@ -32,7 +36,9 @@ S__invlist_len(pTHX_ SV* const invlist) PERL_ARGS_ASSERT__INVLIST_LEN; - return *_get_invlist_len_addr(invlist); + return (SvCUR(invlist) == 0) + ? 0 + : FROM_INTERNAL_SIZE(SvCUR(invlist)) - *get_invlist_offset_addr(invlist); } PERL_STATIC_INLINE bool @@ -47,4 +53,11 @@ S__invlist_contains_cp(pTHX_ SV* const invlist, const UV cp) return index >= 0 && ELEMENT_RANGE_MATCHES_INVLIST(index); } +# if defined(PERL_IN_UTF8_C) || defined(PERL_IN_REGEXEC_C) + +/* These symbols are only needed later in regcomp.c */ +# undef TO_INTERNAL_SIZE +# undef FROM_INTERNAL_SIZE +# endif + #endif |