]> granicus.if.org Git - onig/commitdiff
add backtrack_mem member into ScanEnv
authorK.Kosako <kosako@sofnec.co.jp>
Tue, 27 Aug 2019 04:20:16 +0000 (13:20 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 29 Aug 2019 00:19:59 +0000 (09:19 +0900)
src/regcomp.c
src/regparse.c
src/regparse.h

index ec714a127f8e2befdd6cdb652beda5b57ef4a24b..1bd05490f864dc1011a91ecbbe9efa2927183ea6 100644 (file)
@@ -3706,8 +3706,10 @@ recursive_call_check_trav(Node* node, ScanEnv* env, int state)
           if (! NODE_IS_RECURSION(node)) {
             NODE_STATUS_ADD(node, MARK1);
             r = recursive_call_check(NODE_BODY(node));
-            if (r != 0)
+            if (r != 0) {
               NODE_STATUS_ADD(node, RECURSION);
+              MEM_STATUS_ON(env->backtrack_mem, en->m.regnum);
+            }
             NODE_STATUS_REMOVE(node, MARK1);
           }
 
@@ -4985,6 +4987,7 @@ setup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)
         if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT | IN_MULTI_ENTRY)) != 0
             || NODE_IS_RECURSION(node)) {
           MEM_STATUS_ON(env->st_mem_start, en->m.regnum);
+          MEM_STATUS_ON(env->backtrack_mem, en->m.regnum);
         }
         r = setup_tree(NODE_BODY(node), reg, state, env);
         break;
index 5d667cdc02c491139815d785278af5a9dabc307d..7ba4b2655152c33a244fc274e2dc3c955ebe9d72 100644 (file)
@@ -1948,6 +1948,7 @@ scan_env_clear(ScanEnv* env)
   MEM_STATUS_CLEAR(env->cap_history);
   MEM_STATUS_CLEAR(env->st_mem_start);
   MEM_STATUS_CLEAR(env->st_mem_end);
+  MEM_STATUS_CLEAR(env->backtrack_mem);
   MEM_STATUS_CLEAR(env->backrefed_mem);
   env->error      = (UChar* )NULL;
   env->error_end  = (UChar* )NULL;
index 0ee42d4446dcd4be6cbf74c006b4948e4b6d98cc..bb346a1418e11877fa8ce64560871406b878ad6a 100644 (file)
@@ -401,6 +401,7 @@ typedef struct {
   MemStatusType    cap_history;
   MemStatusType    st_mem_start;
   MemStatusType    st_mem_end;
+  MemStatusType    backtrack_mem; /* backtrack/recursion */
   MemStatusType    backrefed_mem;
   UChar*           pattern;
   UChar*           pattern_end;