From: Jan Maria Matejka Date: Wed, 29 Nov 2017 10:38:01 +0000 (+0100) Subject: Filter: recursion to loop X-Git-Tag: v1.6.4~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c601e6b7b7696b24ce5f5715fa14dbb91c71d6e;p=thirdparty%2Fbird.git 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. --- diff --git a/filter/filter.c b/filter/filter.c index db90941f1..85721dbdc 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; }