aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--awk.h6
-rw-r--r--awkgram.c2
-rw-r--r--awkgram.y2
4 files changed, 16 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 858a5fce..59fb425d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,18 @@
@include works in multibyte locales. Thanks to Hermann
Peifer for the bug report.
+2017-04-26 Andrew J. Schorr <aschorr@telemetry-investments.com>
+
+ * awkgram.y (make_regnode): Fix bug -- we should not set valref to 1
+ when creating a node of type Node_regex, since valref is appropriate
+ only for Node_val nodes. This fixes a bug introduced in commit
+ 687e6594. Also, add an assert to make it clear that this function
+ supports only Node_regex and Node_dynregex.
+ * awk.h (NODE): Restore sref to the `val' subportion, since it is not
+ really needed for Node_regex, now that the bug in make_regnode has
+ been fixed.
+ (valref): Restore macro definition.
+
2017-04-24 Arnold D. Robbins <arnold@skeeve.com>
* awk.h (NODE): Additional cleanups. Removed `aq' and `param_list'
diff --git a/awk.h b/awk.h
index 23552469..ab84c58b 100644
--- a/awk.h
+++ b/awk.h
@@ -374,6 +374,7 @@ typedef struct exp_node {
#endif
char *sp;
size_t slen;
+ long sref;
int idx;
wchar_t *wsp;
size_t wslen;
@@ -383,10 +384,6 @@ typedef struct exp_node {
NODETYPE type;
unsigned int flags;
- // We access valref for both Node_val and Node_regex values,
- // so it needs to be outside the union.
- long valref;
-
/* type = Node_val */
/*
* STRING and NUMBER are mutually exclusive, except for the special
@@ -494,6 +491,7 @@ typedef struct exp_node {
*/
#define stptr sub.val.sp
#define stlen sub.val.slen
+#define valref sub.val.sref
#define stfmt sub.val.idx
#define wstptr sub.val.wsp
#define wstlen sub.val.wslen
diff --git a/awkgram.c b/awkgram.c
index b63a4efd..1d06c4d9 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -7429,6 +7429,7 @@ make_regnode(int type, NODE *exp)
{
NODE *n;
+ assert(type == Node_regex || type == Node_dynregex);
getnode(n);
memset(n, 0, sizeof(NODE));
n->type = type;
@@ -7448,7 +7449,6 @@ make_regnode(int type, NODE *exp)
}
n->re_exp = exp;
n->re_flags = CONSTANT;
- n->valref = 1;
}
return n;
}
diff --git a/awkgram.y b/awkgram.y
index d24565c0..b72d1c82 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -5009,6 +5009,7 @@ make_regnode(int type, NODE *exp)
{
NODE *n;
+ assert(type == Node_regex || type == Node_dynregex);
getnode(n);
memset(n, 0, sizeof(NODE));
n->type = type;
@@ -5028,7 +5029,6 @@ make_regnode(int type, NODE *exp)
}
n->re_exp = exp;
n->re_flags = CONSTANT;
- n->valref = 1;
}
return n;
}