From 7c601e6b7b7696b24ce5f5715fa14dbb91c71d6e Mon Sep 17 00:00:00 2001 From: Jan Maria Matejka Date: Wed, 29 Nov 2017 11:38:01 +0100 Subject: [PATCH] Filter: recursion to loop It was supposed to do tail-recursion in interpret() but it didn't compile as such. Converting it to loop makes a significant filter performance improvement for flat filters. --- filter/filter.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/filter/filter.c b/filter/filter.c index db90941f..85721dbd 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -633,15 +633,13 @@ static struct f_val interpret(struct f_inst *what) { struct symbol *sym; - struct f_val v1, v2, res, *vp; + struct f_val v1, v2, res = { .type = T_VOID }, *vp; unsigned u1, u2; int i; u32 as; + for ( ; what; what = what->next) { res.type = T_VOID; - if (!what) - return res; - switch(what->fi_code) { case FI_COMMA: TWOARGS; @@ -1510,9 +1508,7 @@ interpret(struct f_inst *what) default: bug( "Unknown instruction %d (%c)", what->fi_code, what->fi_code & 0xff); - } - if (what->next) - return interpret(what->next); + }} return res; }