aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2013-05-30 21:05:38 +0300
committerArnold D. Robbins <arnold@skeeve.com>2013-05-30 21:05:38 +0300
commit0737d543cbf09f9142cc67db052d6d40f178560b (patch)
tree5d219cdab58625a0997018c3b28d36f31737a064
parent407dddb6e9b24c2ca139ec84f8e3f541fbb18451 (diff)
downloadegawk-0737d543cbf09f9142cc67db052d6d40f178560b.tar.gz
egawk-0737d543cbf09f9142cc67db052d6d40f178560b.tar.bz2
egawk-0737d543cbf09f9142cc67db052d6d40f178560b.zip
More fixes in profiler.
-rw-r--r--ChangeLog8
-rw-r--r--profile.c20
2 files changed, 16 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 223c798f..6df5d592 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-05-30 Arnold D. Robbins <arnold@skeeve.com>
+
+ * profile.c (pprint): For Op_in_array, parenthesize subscript if
+ the precedence is lower. E.g.: (c = tolower(foo)) in ARRAY.
+ (prec_level): Merge cases for precedence of 5.
+ (parenthesize): Simplify, as in 3.1.8. Avoids stuff like
+ `(x == 1 && (z ==2 && (q == 4 && w == 7)))'.
+
2013-05-29 Arnold D. Robbins <arnold@skeeve.com>
* profile.c (pp_group3): Renamed from pp_concat. Change all calls.
diff --git a/profile.c b/profile.c
index d3a93dbd..223a4e33 100644
--- a/profile.c
+++ b/profile.c
@@ -470,6 +470,9 @@ cleanup:
efree(sub);
} else {
t2 = pp_pop();
+ if (prec_level(t2->type) < prec_level(Op_in_array)) {
+ pp_parenthesize(t2);
+ }
sub = t2->pp_str;
str = pp_group3(sub, op2str(Op_in_array), array);
pp_free(t2);
@@ -1041,8 +1044,6 @@ prec_level(int type)
return 6;
case Op_less:
- return 5;
-
case Op_in_array:
return 5;
@@ -1168,7 +1169,7 @@ pp_parenthesize(NODE *sp)
sp->flags |= CAN_FREE;
}
-/* parenthesize --- parenthesize two nodes */
+/* parenthesize --- parenthesize two nodes relative to parent node type */
static void
parenthesize(int type, NODE *left, NODE *right)
@@ -1177,15 +1178,10 @@ parenthesize(int type, NODE *left, NODE *right)
int lprec = prec_level(left->type);
int prec = prec_level(type);
- if (prec > lprec) {
- if (is_binary(left->type)) /* (a - b) * c */
- pp_parenthesize(left);
- if (prec >= rprec && is_binary(right->type)) /* (a - b) * (c - d) */
- pp_parenthesize(right);
- } else {
- if (prec >= rprec && is_binary(right->type)) /* a - b - (c - d) */
- pp_parenthesize(right);
- }
+ if (lprec < prec)
+ pp_parenthesize(left);
+ if (rprec < prec)
+ pp_parenthesize(right);
}
/* pp_string --- pretty format a string or regex constant */