diff options
author | Ori Bernstein <ori@eigenstate.org> | 2016-10-09 00:26:30 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2016-10-09 00:26:30 -0700 |
commit | 5d433bdf4af606e395b54aace8c0a27f745ae9ce (patch) | |
tree | b8e3cd2a11cac4bae7880a61898a1a668c296a2a /mi | |
parent | a2352649c2a8f5937335a8c791f3581f52cd8d6f (diff) | |
download | mc-5d433bdf4af606e395b54aace8c0a27f745ae9ce.tar.gz |
Fix bug with postinc returns.
We were draining the postinc queue before the rval. Oops.
Diffstat (limited to 'mi')
-rw-r--r-- | mi/flatten.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/mi/flatten.c b/mi/flatten.c index 0df229e..25d35ed 100644 --- a/mi/flatten.c +++ b/mi/flatten.c @@ -468,10 +468,17 @@ static Node *rval(Flattenctx *s, Node *n) break;; case Oret: /* drain the increment queue before we return */ - t = rval(s, args[0]); - for (i = 0; i < s->nqueue; i++) - append(s, s->incqueue[i]); - lfree(&s->incqueue, &s->nqueue); + v = rval(s, args[0]); + if (!s->nqueue) { + t = v; + } else { + t = temp(s, v); + u = assign(s, t, v); + append(s, u); + for (i = 0; i < s->nqueue; i++) + append(s, s->incqueue[i]); + lfree(&s->incqueue, &s->nqueue); + } append(s, mkexpr(n->loc, Oret, t, NULL)); break; case Oasn: |