aboutsummaryrefslogtreecommitdiffstats
path: root/regint.h
diff options
context:
space:
mode:
authorTSUYUSATO Kitsune <make.just.on@gmail.com>2023-04-19 13:08:28 +0900
committerGitHub <noreply@github.com>2023-04-19 13:08:28 +0900
commita1c2c274eebcc2a5275b677ebf94a8dbff380770 (patch)
treeb3ae0486cccb292ecd43226ac599943fa5b165b2 /regint.h
parent8023da746c7cee630cbb12ca0c60083127af885a (diff)
downloadruby-a1c2c274eebcc2a5275b677ebf94a8dbff380770.tar.gz
Refactor `Regexp#match` cache implementation (#7724)
* Refactor Regexp#match cache implementation Improved variable and function names Fixed [Bug 19537] (Maybe fixed in https://github.com/ruby/ruby/pull/7694) * Add a comment of the glossary for "match cache" * Skip to reset match cache when no cache point on null check
Diffstat (limited to 'regint.h')
-rw-r--r--regint.h36
1 files changed, 18 insertions, 18 deletions
diff --git a/regint.h b/regint.h
index cee766ad6e..a91870bfaa 100644
--- a/regint.h
+++ b/regint.h
@@ -35,19 +35,15 @@
/* #define ONIG_DEBUG_COMPILE */
/* #define ONIG_DEBUG_SEARCH */
/* #define ONIG_DEBUG_MATCH */
+/* #define ONIG_DEBUG_MATCH_CACHE */
/* #define ONIG_DEBUG_MEMLEAK */
/* #define ONIG_DONT_OPTIMIZE */
/* for byte-code statistical data. */
/* #define ONIG_DEBUG_STATISTICS */
-/* enable matching optimization by using cache. */
-#define USE_CACHE_MATCH_OPT
-
-#ifdef USE_CACHE_MATCH_OPT
-# define NUM_CACHE_OPCODE_FAIL -1
-# define NUM_CACHE_OPCODE_UNINIT -2
-#endif
+/* enable the match optimization by using a cache. */
+#define USE_MATCH_CACHE
#if defined(ONIG_DEBUG_PARSE_TREE) || defined(ONIG_DEBUG_MATCH) || \
defined(ONIG_DEBUG_SEARCH) || defined(ONIG_DEBUG_COMPILE) || \
@@ -880,12 +876,14 @@ typedef struct _OnigStackType {
} u;
} OnigStackType;
-#ifdef USE_CACHE_MATCH_OPT
+#ifdef USE_MATCH_CACHE
typedef struct {
UChar *addr;
- long num;
- int outer_repeat;
-} OnigCacheIndex;
+ long cache_point;
+ int outer_repeat_mem;
+ long num_cache_points_at_outer_repeat;
+ long num_cache_points_in_outer_repeat;
+} OnigCacheOpcode;
#endif
typedef struct {
@@ -910,16 +908,18 @@ typedef struct {
#else
uint64_t end_time;
#endif
-#ifdef USE_CACHE_MATCH_OPT
- long num_fail;
- int enable_cache_match_opt;
- long num_cache_opcode;
- long num_cache_table;
- OnigCacheIndex* cache_index_table;
- uint8_t* match_cache;
+#ifdef USE_MATCH_CACHE
+ int enable_match_cache;
+ long num_fails;
+ long num_cache_opcodes;
+ OnigCacheOpcode* cache_opcodes;
+ long num_cache_points;
+ uint8_t* match_cache_buf;
#endif
} OnigMatchArg;
+#define NUM_CACHE_OPCODES_IMPOSSIBLE -1
+#define NUM_CACHE_OPCODES_UNINIT -2
#define IS_CODE_SB_WORD(enc,code) \
(ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_WORD(enc,code))