aboutsummaryrefslogtreecommitdiffstats
path: root/re.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2015-06-19 12:42:37 +0300
committerArnold D. Robbins <arnold@skeeve.com>2015-06-19 12:42:37 +0300
commitec58524cb5a671c18c4af1b893e599eb04c7760a (patch)
tree1d1c3d298ec82caa03c0cf5caeb0dd14b08ce247 /re.c
parent76e1f5bfee032dbcb5c19b3e4e92f96aa05731c3 (diff)
parentf7cd8a03c09a00c4cb520f881bbe838cf76e718f (diff)
downloadegawk-ec58524cb5a671c18c4af1b893e599eb04c7760a.tar.gz
egawk-ec58524cb5a671c18c4af1b893e599eb04c7760a.tar.bz2
egawk-ec58524cb5a671c18c4af1b893e599eb04c7760a.zip
Merge branch 'master' into feature/cmake
Diffstat (limited to 're.c')
-rw-r--r--re.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/re.c b/re.c
index 39453b1c..b67a02fa 100644
--- a/re.c
+++ b/re.c
@@ -351,10 +351,14 @@ re_update(NODE *t)
/* regex was compiled with settings matching IGNORECASE */
if ((t->re_flags & CONSTANT) != 0) {
/* it's a constant, so just return it as is */
- assert(t->type == Node_regex);
+ assert(t->type == Node_regex || t->type == Node_typedregex);
return t->re_reg;
}
t1 = t->re_exp;
+ if (t1->type == Node_typedregex) {
+ assert((t1->re_flags & CONSTANT) != 0);
+ return t1->re_reg;
+ }
if (t->re_text != NULL) {
/* if contents haven't changed, just return it */
if (cmp_nodes(t->re_text, t1) == 0)
@@ -429,6 +433,15 @@ avoid_dfa(NODE *re, char *str, size_t len)
{
char *end;
+ /*
+ * f = @/.../
+ * if ("foo" ~ f) ...
+ *
+ * This creates a Node_dynregex with NULL re_reg.
+ */
+ if (re->re_reg == NULL)
+ return false;
+
if (! re->re_reg->has_anchor)
return false;