summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-03-13 22:45:19 +1100
committerMaxime Coste <mawww@kakoune.org>2023-03-13 22:45:19 +1100
commitcb3512f01e7243919241eed80d975e1f08a0903d (patch)
treeb2a38e7fa7ae61f553c455f2201ad7d5515fbe31
parent81787792d0a85c1bc58419536ac48e50731cbdd8 (diff)
Grow dual thread stack after pushing a thread on the next queue
The previous code was assuming it was fine to push_next without growing, which used to be the case with the previous implementation because we always have poped the current thread that we try to push. However now that we use a ring-buffer, m_next_begin == m_next_end can either mean full, or empty. We solve this by assuming it means empty and never allowing the buffer to become full, which means we need to grow after pushing to next if we get full. Fixes #4859
-rw-r--r--src/regex_impl.hh3
-rw-r--r--test/regression/4859-regex-invalid-behaviour/cmd1
-rw-r--r--test/regression/4859-regex-invalid-behaviour/in3
-rw-r--r--test/regression/4859-regex-invalid-behaviour/out1
-rw-r--r--test/regression/4859-regex-invalid-behaviour/rc1
5 files changed, 7 insertions, 2 deletions
diff --git a/src/regex_impl.hh b/src/regex_impl.hh
index 9d1748bb..57f07c8b 100644
--- a/src/regex_impl.hh
+++ b/src/regex_impl.hh
@@ -504,7 +504,6 @@ private:
if (start_desc and m_threads.next_is_empty())
to_next_start(pos, config, *start_desc);
m_threads.push_next({first_inst, -1});
- m_threads.grow_ifn(false);
}
m_threads.swap_next();
}
@@ -632,7 +631,7 @@ private:
void push_current(Thread thread) { m_data[decrement(m_current)] = thread; grow_ifn(true); }
Thread pop_current() { return m_data[post_increment(m_current)]; }
- void push_next(Thread thread) { m_data[post_increment(m_next_end)] = thread; }
+ void push_next(Thread thread) { m_data[post_increment(m_next_end)] = thread; grow_ifn(false); }
Thread pop_next() { return m_data[decrement(m_next_end)]; }
void swap_next()
diff --git a/test/regression/4859-regex-invalid-behaviour/cmd b/test/regression/4859-regex-invalid-behaviour/cmd
new file mode 100644
index 00000000..170cee79
--- /dev/null
+++ b/test/regression/4859-regex-invalid-behaviour/cmd
@@ -0,0 +1 @@
+ge<a-/><ret>d
diff --git a/test/regression/4859-regex-invalid-behaviour/in b/test/regression/4859-regex-invalid-behaviour/in
new file mode 100644
index 00000000..73573eb5
--- /dev/null
+++ b/test/regression/4859-regex-invalid-behaviour/in
@@ -0,0 +1,3 @@
+ ddddd
+ aaaaa
+ bbbbb
diff --git a/test/regression/4859-regex-invalid-behaviour/out b/test/regression/4859-regex-invalid-behaviour/out
new file mode 100644
index 00000000..df031279
--- /dev/null
+++ b/test/regression/4859-regex-invalid-behaviour/out
@@ -0,0 +1 @@
+ bbbbb
diff --git a/test/regression/4859-regex-invalid-behaviour/rc b/test/regression/4859-regex-invalid-behaviour/rc
new file mode 100644
index 00000000..fabf8e5f
--- /dev/null
+++ b/test/regression/4859-regex-invalid-behaviour/rc
@@ -0,0 +1 @@
+reg slash '(?S)((^ {13}d.*\n)(^ {13}.*\n)*?)?^.'