diff options
author | Norihiro Tanaka <noritnk@kcn.ne.jp> | 2014-05-25 17:41:11 +0900 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-09-27 20:56:42 -0700 |
commit | 67822cff1f9f54b0de5f4645c76e0777359f0d44 (patch) | |
tree | 0262523545682c423d03b15c2c5c951c87321614 | |
parent | faed4fd7cee4e452f8d3bd27c87fbbd92d56ae2e (diff) | |
download | grep-67822cff1f9f54b0de5f4645c76e0777359f0d44.tar.gz |
dfa: separate dfaexec function to help optimization by compiler
* src/dfa.c (dfaexec_main): Rename from dfaexec, add inline attribute.
(dfaexec_mb): New function. Run it when d->multibyte is true. For this
function inlination must be avoided.
(dfaexec_sb): New function. Run it when d->multibyte is false. For this
function inlination must be avoided.
(dfaexec): Call dfaexec_mb or dfaexec_sb accoding to d->multibyte.
-rw-r--r-- | src/dfa.c | 35 |
1 files changed, 29 insertions, 6 deletions
@@ -3267,9 +3267,9 @@ skip_remains_mb (struct dfa *d, unsigned char const *p, Finally, if BACKREF is non-NULL set *BACKREF to indicate whether we encountered a back-reference (1) or not (0). The caller may use this to decide whether to fall back on a backtracking matcher. */ -char * -dfaexec (struct dfa *d, char const *begin, char *end, - int allow_nl, size_t *count, int *backref) +static inline char * +dfaexec_main (struct dfa *d, char const *begin, char *end, + int allow_nl, size_t *count, int *backref, bool const multibyte) { state_num s, s1; /* Current state. */ unsigned char const *p, *mbp; /* Current input character. */ @@ -3291,7 +3291,7 @@ dfaexec (struct dfa *d, char const *begin, char *end, saved_end = *(unsigned char *) end; *end = eol; - if (d->multibyte) + if (multibyte) { memset (&d->mbs, 0, sizeof d->mbs); if (! d->mb_match_lens) @@ -3303,7 +3303,7 @@ dfaexec (struct dfa *d, char const *begin, char *end, for (;;) { - if (d->multibyte) + if (multibyte) { while ((t = trans[s]) != NULL) { @@ -3387,7 +3387,7 @@ dfaexec (struct dfa *d, char const *begin, char *end, } s1 = s; - if (d->multibyte) + if (multibyte) { /* Can match with a multibyte character (and multicharacter collating element). Transition table might be updated. */ @@ -3432,6 +3432,29 @@ dfaexec (struct dfa *d, char const *begin, char *end, return (char *) p; } +static char *__attribute__((noinline)) +dfaexec_mb (struct dfa *d, char const *begin, char *end, + int allow_nl, size_t *count, int *backref) +{ + return dfaexec_main (d, begin, end, allow_nl, count, backref, true); +} + +static char *__attribute__((noinline)) +dfaexec_sb (struct dfa *d, char const *begin, char *end, + int allow_nl, size_t *count, int *backref) +{ + return dfaexec_main (d, begin, end, allow_nl, count, backref, false); +} + +char * +dfaexec (struct dfa *d, char const *begin, char *end, + int allow_nl, size_t *count, int *backref) +{ + return (d->multibyte + ? dfaexec_mb (d, begin, end, allow_nl, count, backref) + : dfaexec_sb (d, begin, end, allow_nl, count, backref)); +} + struct dfa * dfasuperset (struct dfa const *d) { |