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.
This commit is contained in:
Paolo Bonzini 2017-08-11 13:44:32 +02:00 committed by Paul Smith
parent 9860296198
commit b280989ab7
3 changed files with 12 additions and 2 deletions

View File

@ -329,7 +329,10 @@ find_next_argument (char startparen, char endparen,
int count = 0; int count = 0;
for (; ptr < end; ++ptr) for (; ptr < end; ++ptr)
if (*ptr == startparen) if (!STOP_SET (*ptr, MAP_VARSEP|MAP_COMMA))
continue;
else if (*ptr == startparen)
++count; ++count;
else if (*ptr == endparen) 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. */ count might be high, but it'll never be low. */
for (nargs=1, end=beg; *end != '\0'; ++end) for (nargs=1, end=beg; *end != '\0'; ++end)
if (*end == ',') if (!STOP_SET (*end, MAP_VARSEP|MAP_COMMA))
continue;
else if (*end == ',')
++nargs; ++nargs;
else if (*end == openparen) else if (*end == openparen)
++count; ++count;

4
main.c
View File

@ -635,6 +635,10 @@ initialize_stopchar_map (void)
stopchar_map[(int)'|'] = MAP_PIPE; stopchar_map[(int)'|'] = MAP_PIPE;
stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC; stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC;
stopchar_map[(int)','] = MAP_COMMA; 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_VARIABLE;
stopchar_map[(int)'-'] = MAP_USERFUNC; stopchar_map[(int)'-'] = MAP_USERFUNC;

View File

@ -397,6 +397,7 @@ extern int unixy_shell;
#define MAP_SEMI 0x0010 #define MAP_SEMI 0x0010
#define MAP_EQUALS 0x0020 #define MAP_EQUALS 0x0020
#define MAP_COLON 0x0040 #define MAP_COLON 0x0040
#define MAP_VARSEP 0x0080
#define MAP_PIPE 0x0100 #define MAP_PIPE 0x0100
#define MAP_DOT 0x0200 #define MAP_DOT 0x0200
#define MAP_COMMA 0x0400 #define MAP_COMMA 0x0400