From b280989ab7aee115a97b9c0fe4627075566c5995 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 11 Aug 2017 13:44:32 +0200 Subject: [PATCH] Speedup parsing of functions. Use the stopchar map to quickly jump over everything that is not an open/close brace, an open/close parenthesis or a comma. This saves 1% on QEMU's noop build (from 11.23s to 11.1s). * function.c (find_next_argument, handle_function): Check with STOP_SET before comparing against individual characters. * main.c (initialize_stopchar_map): Initialize MAP_VARSEP mappings in stopchar_map. * makeint.h (MAP_VARSEP): New. --- function.c | 9 +++++++-- main.c | 4 ++++ makeint.h | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/function.c b/function.c index edfacdf1..a22352ff 100644 --- a/function.c +++ b/function.c @@ -329,7 +329,10 @@ find_next_argument (char startparen, char endparen, int count = 0; for (; ptr < end; ++ptr) - if (*ptr == startparen) + if (!STOP_SET (*ptr, MAP_VARSEP|MAP_COMMA)) + continue; + + else if (*ptr == startparen) ++count; else if (*ptr == endparen) @@ -2458,7 +2461,9 @@ handle_function (char **op, const char **stringp) count might be high, but it'll never be low. */ for (nargs=1, end=beg; *end != '\0'; ++end) - if (*end == ',') + if (!STOP_SET (*end, MAP_VARSEP|MAP_COMMA)) + continue; + else if (*end == ',') ++nargs; else if (*end == openparen) ++count; diff --git a/main.c b/main.c index 5e0b7aa6..9fa2c840 100644 --- a/main.c +++ b/main.c @@ -635,6 +635,10 @@ initialize_stopchar_map (void) stopchar_map[(int)'|'] = MAP_PIPE; stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC; stopchar_map[(int)','] = MAP_COMMA; + stopchar_map[(int)'('] = MAP_VARSEP; + stopchar_map[(int)'{'] = MAP_VARSEP; + stopchar_map[(int)'}'] = MAP_VARSEP; + stopchar_map[(int)')'] = MAP_VARSEP; stopchar_map[(int)'$'] = MAP_VARIABLE; stopchar_map[(int)'-'] = MAP_USERFUNC; diff --git a/makeint.h b/makeint.h index d71c043e..2adab63b 100644 --- a/makeint.h +++ b/makeint.h @@ -397,6 +397,7 @@ extern int unixy_shell; #define MAP_SEMI 0x0010 #define MAP_EQUALS 0x0020 #define MAP_COLON 0x0040 +#define MAP_VARSEP 0x0080 #define MAP_PIPE 0x0100 #define MAP_DOT 0x0200 #define MAP_COMMA 0x0400