[前][次][番号順一覧][スレッド一覧]

ruby-changes:74421

From: TSUYUSATO <ko1@a...>
Date: Wed, 9 Nov 2022 23:22:05 +0900 (JST)
Subject: [ruby-changes:74421] cbabba9c82 (master): Add index to the latest NULL_CHECK_STACK for fast matching

https://git.ruby-lang.org/ruby.git/commit/?id=cbabba9c82

From cbabba9c82f3401a67d470ee6ef9213cb6161f57 Mon Sep 17 00:00:00 2001
From: TSUYUSATO Kitsune <make.just.on@g...>
Date: Thu, 6 Oct 2022 17:11:33 +0900
Subject: Add index to the latest NULL_CHECK_STACK for fast matching

---
 regexec.c | 21 +++++++++++++++++----
 regint.h  |  1 +
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/regexec.c b/regexec.c
index 07e5ed28c6..f54efea774 100644
--- a/regexec.c
+++ b/regexec.c
@@ -978,6 +978,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L978
 #define STACK_PUSH_TYPE(stack_type) do {\
   STACK_ENSURE(1);\
   stk->type = (stack_type);\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   STACK_INC;\
 } while(0)
 
@@ -1047,6 +1048,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1048
 # define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\
   STACK_ENSURE(1);\
   stk->type = (stack_type);\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.state.pcode     = (pat);\
   stk->u.state.pstr      = (s);\
   stk->u.state.pstr_prev = (sprev);\
@@ -1056,6 +1058,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1058
 
 # define STACK_PUSH_ENSURED(stack_type,pat) do {\
   stk->type = (stack_type);\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.state.pcode = (pat);\
   STACK_INC;\
 } while(0)
@@ -1091,6 +1094,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1094
 #define STACK_PUSH_REPEAT(id, pat) do {\
   STACK_ENSURE(1);\
   stk->type = STK_REPEAT;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.repeat.num    = (id);\
   stk->u.repeat.pcode  = (pat);\
   stk->u.repeat.count  = 0;\
@@ -1100,6 +1104,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1104
 #define STACK_PUSH_REPEAT_INC(sindex) do {\
   STACK_ENSURE(1);\
   stk->type = STK_REPEAT_INC;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.repeat_inc.si  = (sindex);\
   STACK_INC;\
 } while(0)
@@ -1107,6 +1112,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1112
 #define STACK_PUSH_MEM_START(mnum, s) do {\
   STACK_ENSURE(1);\
   stk->type = STK_MEM_START;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.mem.num      = (mnum);\
   stk->u.mem.pstr     = (s);\
   stk->u.mem.start    = mem_start_stk[mnum];\
@@ -1119,6 +1125,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1125
 #define STACK_PUSH_MEM_END(mnum, s) do {\
   STACK_ENSURE(1);\
   stk->type = STK_MEM_END;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.mem.num    = (mnum);\
   stk->u.mem.pstr   = (s);\
   stk->u.mem.start  = mem_start_stk[mnum];\
@@ -1130,6 +1137,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1137
 #define STACK_PUSH_MEM_END_MARK(mnum) do {\
   STACK_ENSURE(1);\
   stk->type = STK_MEM_END_MARK;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.mem.num = (mnum);\
   STACK_INC;\
 } while(0)
@@ -1171,6 +1179,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1179
 #define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\
   STACK_ENSURE(1);\
   stk->type = STK_NULL_CHECK_START;\
+  stk->null_check = (OnigStackIndex)(stk - stk_base);\
   stk->u.null_check.num  = (cnum);\
   stk->u.null_check.pstr = (s);\
   STACK_INC;\
@@ -1179,6 +1188,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1188
 #define STACK_PUSH_NULL_CHECK_END(cnum) do {\
   STACK_ENSURE(1);\
   stk->type = STK_NULL_CHECK_END;\
+  stk->null_check = (OnigStackIndex)(stk - stk_base);\
   stk->u.null_check.num  = (cnum);\
   STACK_INC;\
 } while(0)
@@ -1186,6 +1196,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1196
 #define STACK_PUSH_CALL_FRAME(pat) do {\
   STACK_ENSURE(1);\
   stk->type = STK_CALL_FRAME;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.call_frame.ret_addr = (pat);\
   STACK_INC;\
 } while(0)
@@ -1193,12 +1204,14 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1204
 #define STACK_PUSH_RETURN do {\
   STACK_ENSURE(1);\
   stk->type = STK_RETURN;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   STACK_INC;\
 } while(0)
 
 #define STACK_PUSH_ABSENT_POS(start, end) do {\
   STACK_ENSURE(1);\
   stk->type = STK_ABSENT_POS;\
+  stk->null_check = stk == stk_base ? 0 : (stk-1)->null_check;\
   stk->u.absent_pos.abs_pstr = (start);\
   stk->u.absent_pos.end_pstr = (end);\
   STACK_INC;\
@@ -1362,7 +1375,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1375
 } while(0)
 
 #define STACK_NULL_CHECK(isnull,id,s) do {\
-  OnigStackType* k = stk;\
+  OnigStackType* k = STACK_AT((stk-1)->null_check)+1;\
   while (1) {\
     k--;\
     STACK_BASE_CHECK(k, "STACK_NULL_CHECK"); \
@@ -1377,7 +1390,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1390
 
 #define STACK_NULL_CHECK_REC(isnull,id,s) do {\
   int level = 0;\
-  OnigStackType* k = stk;\
+  OnigStackType* k = STACK_AT((stk-1)->null_check)+1;\
   while (1) {\
     k--;\
     STACK_BASE_CHECK(k, "STACK_NULL_CHECK_REC"); \
@@ -1397,7 +1410,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1410
 } while(0)
 
 #define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\
-  OnigStackType* k = stk;\
+  OnigStackType* k = STACK_AT((stk-1)->null_check)+1;\
   while (1) {\
     k--;\
     STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST"); \
@@ -1437,7 +1450,7 @@ stack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end, https://github.com/ruby/ruby/blob/trunk/regexec.c#L1450
 
 #define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\
   int level = 0;\
-  OnigStackType* k = stk;\
+  OnigStackType* k = STACK_AT((stk-1)->null_check)+1;\
   while (1) {\
     k--;\
     STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST_REC"); \
diff --git a/regint.h b/regint.h
index c310946886..9642389936 100644
--- a/regint.h
+++ b/regint.h
@@ -828,6 +828,7 @@ typedef intptr_t OnigStackIndex; https://github.com/ruby/ruby/blob/trunk/regint.h#L828
 
 typedef struct _OnigStackType {
   unsigned int type;
+  OnigStackIndex null_check;
   union {
     struct {
       UChar *pcode;      /* byte code position */
-- 
cgit v1.2.3


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]