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 f9165059..08cfa0bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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 e59b8ba8..eb90be67 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 6d3ea7e7..a19c20a8 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -7437,6 +7437,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;
@@ -7456,7 +7457,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 6af06960..b6957806 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -5017,6 +5017,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;
@@ -5036,7 +5037,6 @@ make_regnode(int type, NODE *exp)
}
n->re_exp = exp;
n->re_flags = CONSTANT;
- n->valref = 1;
}
return n;
}