From 9300ec55f03fb8754c223fd193828141e6601a06 Mon Sep 17 00:00:00 2001 From: Fabian Homborg Date: Fri, 2 Nov 2018 12:28:09 +0100 Subject: [PATCH] parser_keywords: Use unordered_set instead of arrays This makes the test mentioned in #5305: for i in (seq 100000); test 1 = 1; end run ~5% faster. --- src/parser_keywords.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/parser_keywords.cpp b/src/parser_keywords.cpp index 98d400325..b479c45f1 100644 --- a/src/parser_keywords.cpp +++ b/src/parser_keywords.cpp @@ -2,6 +2,7 @@ #include "config.h" // IWYU pragma: keep #include +#include #include "common.h" #include "fallback.h" // IWYU pragma: keep @@ -11,17 +12,17 @@ bool parser_keywords_skip_arguments(const wcstring &cmd) { return cmd == L"else" || cmd == L"begin"; } -static const wchar_t *const subcommand_keywords[] = {L"command", L"builtin", L"while", L"exec", +static const std::unordered_set subcommand_keywords = {L"command", L"builtin", L"while", L"exec", L"if", L"and", L"or", L"not"}; bool parser_keywords_is_subcommand(const wcstring &cmd) { return parser_keywords_skip_arguments(cmd) || contains(subcommand_keywords, cmd); } -static const wchar_t *const block_keywords[] = {L"for", L"while", L"if", +static const std::unordered_set block_keywords = {L"for", L"while", L"if", L"function", L"switch", L"begin"}; bool parser_keywords_is_block(const wcstring &word) { return contains(block_keywords, word); } -static const wchar_t *const reserved_keywords[] = {L"end", L"case", L"else", L"return", +static const std::unordered_set reserved_keywords = {L"end", L"case", L"else", L"return", L"continue", L"break", L"argparse", L"read", L"set", L"status", L"test", L"["}; bool parser_keywords_is_reserved(const wcstring &word) {