From 1c4f8cfc5db843715598120335310472621a49a4 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sun, 15 Jun 2014 17:59:27 +1000 Subject: [PATCH] parsergen: fix return of final result. We cannot really shift the final result onto the stack, because there is not 'goto' for '$eof' in that final state. So if the shift() fails, hold onto the result and ultimately return it. This means we don't need to pop it off the stack at the end. Signed-off-by: NeilBrown --- csrc/parsergen.mdc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/csrc/parsergen.mdc b/csrc/parsergen.mdc index fbb561c..47cbfc2 100644 --- a/csrc/parsergen.mdc +++ b/csrc/parsergen.mdc @@ -2629,6 +2629,7 @@ since the last state which could have been at the start of a line. } if (states[p.next.state].reduce_prod >= 0) { void **body; + void *res; int prod = states[p.next.state].reduce_prod; int size = states[p.next.state].reduce_size; int bufsize; @@ -2641,10 +2642,13 @@ since the last state which could have been at the start of a line. bufsize = do_reduce(prod, body, config, buf); pop(&p, size, do_free); - shift(&p, memdup(buf, bufsize), states); + res = memdup(buf, bufsize); memset(buf, 0, bufsize); - if (prod == 0) + if (!shift(&p, res, states)) { + if (prod != 0) abort(); accepted = 1; + ret = res; + } continue; } if (tk->num == TK_out) { @@ -2691,10 +2695,7 @@ since the last state which could have been at the start of a line. break; } free(tk); - if (accepted) - ret = p.asn_stack[0]; - else - pop(&p, p.tos, do_free); + pop(&p, p.tos, do_free); free(p.asn_stack); free(p.stack); return ret; -- 2.43.0