diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-02 21:34:01 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-02 21:34:01 +0200 |
commit | af1cce266d1b6c875cf01db6c47ada89cbf64411 (patch) | |
tree | 11e7ad37eda1a0d73ec9321af585228a69bdfae1 /profile.c | |
parent | 99d0b82fbf3ff42019fadef5fbb396551aa20070 (diff) | |
parent | c5227d1685aa158e63d4b6a6289063ae985673c1 (diff) | |
download | egawk-af1cce266d1b6c875cf01db6c47ada89cbf64411.tar.gz egawk-af1cce266d1b6c875cf01db6c47ada89cbf64411.tar.bz2 egawk-af1cce266d1b6c875cf01db6c47ada89cbf64411.zip |
Merge branch 'gawk-4.1-stable'
Diffstat (limited to 'profile.c')
-rw-r--r-- | profile.c | 26 |
1 files changed, 24 insertions, 2 deletions
@@ -1237,6 +1237,26 @@ pp_parenthesize(NODE *sp) sp->flags |= CAN_FREE; } +/* div_on_left_mul_on_right --- have / or % on left and * on right */ + +static bool +div_on_left_mul_on_right(int o1, int o2) +{ + OPCODE op1 = (OPCODE) o1; + OPCODE op2 = (OPCODE) o2; + + switch (op1) { + case Op_quotient: + case Op_quotient_i: + case Op_mod: + case Op_mod_i: + return (op2 == Op_times || op2 == Op_times_i); + + default: + return false; + } +} + /* parenthesize --- parenthesize two nodes relative to parent node type */ static void @@ -1246,9 +1266,11 @@ parenthesize(int type, NODE *left, NODE *right) int lprec = prec_level(left->type); int prec = prec_level(type); - if (lprec < prec) + if (lprec < prec + || (lprec == prec && div_on_left_mul_on_right(left->type, type))) pp_parenthesize(left); - if (rprec < prec) + if (rprec < prec + || (rprec == prec && div_on_left_mul_on_right(type, right->type))) pp_parenthesize(right); } |