diff options
author | Yves Orton <demerphq@gmail.com> | 2006-06-14 15:54:04 +0200 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2006-06-14 12:11:13 +0000 |
commit | e68ec53fb89aea41859fe8c109fe9b03a3599284 (patch) | |
tree | 4ae853d02c9b47af4dfdaba44be6931b4a0a8dd7 /regcomp.h | |
parent | 4bf88892922e6ea671fc32c0d448f3468e183c24 (diff) | |
download | perl-e68ec53fb89aea41859fe8c109fe9b03a3599284.tar.gz |
fix re debug segvs in global destruction, and a tweak to Benchmark to prevent infinite loops. (Re: ext/re/t/regop.pl SEGV)
Message-ID: <9b18b3110606140454p19f4241exae6528f1c7bb32d7@mail.gmail.com>
p4raw-id: //depot/perl@28393
Diffstat (limited to 'regcomp.h')
-rw-r--r-- | regcomp.h | 49 |
1 files changed, 27 insertions, 22 deletions
@@ -568,57 +568,62 @@ re.pm, especially to the documentation. #define RE_DEBUG_EXTRA_TRIE 0x010000 #define RE_DEBUG_EXTRA_OFFSETS 0x020000 +#define RE_DEBUG_FLAG(x) (re_debug_flags & x) /* Compile */ #define DEBUG_COMPILE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_MASK) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_MASK) x ) #define DEBUG_PARSE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_PARSE) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_PARSE) x ) #define DEBUG_OPTIMISE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_OPTIMISE) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_OPTIMISE) x ) #define DEBUG_PARSE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_PARSE) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_PARSE) x ) #define DEBUG_DUMP_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_DUMP) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_DUMP) x ) #define DEBUG_OFFSETS_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_OFFSETS) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_OFFSETS) x ) #define DEBUG_TRIE_COMPILE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_COMPILE_TRIE) x ) + if (re_debug_flags & RE_DEBUG_COMPILE_TRIE) x ) /* Execute */ #define DEBUG_EXECUTE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXECUTE_MASK) x ) + if (re_debug_flags & RE_DEBUG_EXECUTE_MASK) x ) #define DEBUG_INTUIT_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXECUTE_INTUIT) x ) + if (re_debug_flags & RE_DEBUG_EXECUTE_INTUIT) x ) #define DEBUG_MATCH_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXECUTE_MATCH) x ) + if (re_debug_flags & RE_DEBUG_EXECUTE_MATCH) x ) #define DEBUG_TRIE_EXECUTE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXECUTE_TRIE) x ) + if (re_debug_flags & RE_DEBUG_EXECUTE_TRIE) x ) /* Extra */ #define DEBUG_EXTRA_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXTRA_MASK) x ) + if (re_debug_flags & RE_DEBUG_EXTRA_MASK) x ) #define MJD_OFFSET_DEBUG(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXTRA_OFFSETS) \ + if (re_debug_flags & RE_DEBUG_EXTRA_OFFSETS) \ Perl_warn_nocontext x ) #define DEBUG_TRIE_COMPILE_MORE_r(x) DEBUG_TRIE_COMPILE_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXTRA_TRIE) x ) + if (re_debug_flags & RE_DEBUG_EXTRA_TRIE) x ) #define DEBUG_TRIE_EXECUTE_MORE_r(x) DEBUG_TRIE_EXECUTE_r( \ - if (SvIV(re_debug_flags) & RE_DEBUG_EXTRA_TRIE) x ) + if (re_debug_flags & RE_DEBUG_EXTRA_TRIE) x ) #define DEBUG_TRIE_r(x) DEBUG_r( \ - if (SvIV(re_debug_flags) & (RE_DEBUG_COMPILE_TRIE \ + if (re_debug_flags & (RE_DEBUG_COMPILE_TRIE \ | RE_DEBUG_EXECUTE_TRIE )) x ) /* initialization */ /* get_sv() can return NULL during global destruction. */ -#define GET_RE_DEBUG_FLAGS DEBUG_r( \ - re_debug_flags = get_sv(RE_DEBUG_FLAGS, 1); \ - if (re_debug_flags && !SvIOK(re_debug_flags)) { \ - sv_setiv(re_debug_flags, RE_DEBUG_COMPILE_DUMP | RE_DEBUG_EXECUTE_MASK ); \ - } ) +#define GET_RE_DEBUG_FLAGS DEBUG_r({ \ + SV * re_debug_flags_sv = NULL; \ + re_debug_flags_sv = get_sv(RE_DEBUG_FLAGS, 1); \ + if (re_debug_flags_sv) { \ + if (!SvUOK(re_debug_flags_sv)) \ + sv_setuv(re_debug_flags_sv, RE_DEBUG_COMPILE_DUMP | RE_DEBUG_EXECUTE_MASK ); \ + re_debug_flags=SvUV(re_debug_flags_sv); \ + }\ +}) #ifdef DEBUGGING -#define GET_RE_DEBUG_FLAGS_DECL SV *re_debug_flags = NULL; GET_RE_DEBUG_FLAGS; +#define GET_RE_DEBUG_FLAGS_DECL UV re_debug_flags = 0; GET_RE_DEBUG_FLAGS; #else #define GET_RE_DEBUG_FLAGS_DECL #endif |