Commit 3cbfe485 authored by Tom Lane's avatar Tom Lane

Remove useless "retry memory" logic within regex engine.

Apparently some primordial version of Spencer's engine needed cdissect()
and child functions to be able to continue matching from a previous
position when re-called.  That is dead code, though, since trivial
inspection shows that cdissect can never be entered without having
previously done zapmem which resets the relevant retry counter.  I have
also verified experimentally that no case in the Tcl regression tests
reaches cdissect with a nonzero retry value.  Accordingly, remove that
logic.  This doesn't really save any noticeable number of cycles in itself,
but it is one step towards making dissect() and cdissect() equivalent,
which will allow removing hundreds of lines of near-duplicated code.

Since struct subre's "retry" field is no longer particularly related to
any kind of retry, rename it to "id".  As of this commit it's only used
for identifying a subre node in debug printouts, so you might think we
should get rid of the field entirely; but I have a plan for another use.
parent 1fbacbf9
......@@ -1623,7 +1623,7 @@ subre(struct vars * v,
ret->op = op;
ret->flags = flags;
ret->retry = 0;
ret->id = 0; /* will be assigned later */
ret->subno = 0;
ret->min = ret->max = 1;
ret->left = NULL;
......@@ -1693,7 +1693,7 @@ optst(struct vars * v,
}
/*
* numst - number tree nodes (assigning retry indexes)
* numst - number tree nodes (assigning "id" indexes)
*/
static int /* next number */
numst(struct subre * t,
......@@ -1704,7 +1704,7 @@ numst(struct subre * t,
assert(t != NULL);
i = start;
t->retry = (short) i++;
t->id = (short) i++;
if (t->left != NULL)
i = numst(t->left, i);
if (t->right != NULL)
......@@ -1999,11 +1999,11 @@ stid(struct subre * t,
char *buf,
size_t bufsize)
{
/* big enough for hex int or decimal t->retry? */
if (bufsize < sizeof(void *) * 2 + 3 || bufsize < sizeof(t->retry) * 3 + 1)
/* big enough for hex int or decimal t->id? */
if (bufsize < sizeof(void *) * 2 + 3 || bufsize < sizeof(t->id) * 3 + 1)
return "unable";
if (t->retry != 0)
sprintf(buf, "%d", t->retry);
if (t->id != 0)
sprintf(buf, "%d", t->id);
else
sprintf(buf, "%p", t);
return buf;
......
This diff is collapsed.
......@@ -409,7 +409,7 @@ struct subre
#define PREF(f) ((f)&LOCAL)
#define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2))
#define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2))
short retry; /* index into retry memory */
short id; /* ID of subre (1..ntree) */
int subno; /* subexpression number (for 'b' and '(') */
short min; /* min repetitions for iteration or backref */
short max; /* max repetitions for iteration or backref */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment