summaryrefslogtreecommitdiff
path: root/src/backend/regex/rege_dfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/regex/rege_dfa.c')
-rw-r--r--src/backend/regex/rege_dfa.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/backend/regex/rege_dfa.c b/src/backend/regex/rege_dfa.c
index 957ceb8137d..1db52d1005c 100644
--- a/src/backend/regex/rege_dfa.c
+++ b/src/backend/regex/rege_dfa.c
@@ -499,7 +499,7 @@ newdfa(struct vars *v,
struct dfa *d;
size_t nss = cnfa->nstates * 2;
int wordsper = (cnfa->nstates + UBITS - 1) / UBITS;
- struct smalldfa *smallwas = sml;
+ bool ismalloced = false;
assert(cnfa != NULL && cnfa->nstates != 0);
@@ -514,6 +514,7 @@ newdfa(struct vars *v,
ERR(REG_ESPACE);
return NULL;
}
+ ismalloced = true;
}
d = &sml->dfa;
d->ssets = sml->ssets;
@@ -521,8 +522,8 @@ newdfa(struct vars *v,
d->work = &d->statesarea[nss];
d->outsarea = sml->outsarea;
d->incarea = sml->incarea;
- d->cptsmalloced = 0;
- d->mallocarea = (smallwas == NULL) ? (char *) sml : NULL;
+ d->ismalloced = ismalloced;
+ d->arraysmalloced = false; /* not separately allocated, anyway */
}
else
{
@@ -540,8 +541,9 @@ newdfa(struct vars *v,
sizeof(struct sset *));
d->incarea = (struct arcp *) MALLOC(nss * cnfa->ncolors *
sizeof(struct arcp));
- d->cptsmalloced = 1;
- d->mallocarea = (char *) d;
+ d->ismalloced = true;
+ d->arraysmalloced = true;
+ /* now freedfa() will behave sanely */
if (d->ssets == NULL || d->statesarea == NULL ||
d->outsarea == NULL || d->incarea == NULL)
{
@@ -573,7 +575,7 @@ newdfa(struct vars *v,
static void
freedfa(struct dfa *d)
{
- if (d->cptsmalloced)
+ if (d->arraysmalloced)
{
if (d->ssets != NULL)
FREE(d->ssets);
@@ -585,8 +587,8 @@ freedfa(struct dfa *d)
FREE(d->incarea);
}
- if (d->mallocarea != NULL)
- FREE(d->mallocarea);
+ if (d->ismalloced)
+ FREE(d);
}
/*