mirror of
https://github.com/mirror/make.git
synced 2025-02-05 17:20:15 +08:00
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:
parent
9860296198
commit
b280989ab7
@ -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
4
main.c
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user