Remove extra work from `is_reserved`
Currently the `is_reserved` method in the WGSL parser uses the `operator==` on the token to check the reserved words. This ends up re-doing a bunch of work as it checks the token type, then gets the `string_view` or `string` from the variant, then compares. This CL adds a precondition that the token is an identifier (which is true in the only case we call this method) and then extracts the string from the token once and uses that for all the comparisons. Change-Id: If425afea38e727169de7991a84f6fa1e47f660ef Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/128140 Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
03d68fa33f
commit
45ff7a8c4a
|
@ -72,39 +72,42 @@ constexpr uint32_t kMaxParseDepth = 128;
|
|||
constexpr size_t const kMaxResynchronizeLookahead = 32;
|
||||
|
||||
// https://gpuweb.github.io/gpuweb/wgsl.html#reserved-keywords
|
||||
//
|
||||
// Must be called with an identifier token.
|
||||
bool is_reserved(const Token& t) {
|
||||
return t == "NULL" || t == "Self" || t == "abstract" || t == "active" || t == "alignas" ||
|
||||
t == "alignof" || t == "as" || t == "asm" || t == "asm_fragment" || t == "async" ||
|
||||
t == "attribute" || t == "auto" || t == "await" || t == "become" ||
|
||||
t == "binding_array" || t == "cast" || t == "catch" || t == "class" || t == "co_await" ||
|
||||
t == "co_return" || t == "co_yield" || t == "coherent" || t == "column_major" ||
|
||||
t == "common" || t == "compile" || t == "compile_fragment" || t == "concept" ||
|
||||
t == "const_cast" || t == "consteval" || t == "constexpr" || t == "constinit" ||
|
||||
t == "crate" || t == "debugger" || t == "decltype" || t == "delete" || t == "demote" ||
|
||||
t == "demote_to_helper" || t == "do" || t == "dynamic_cast" || t == "enum" ||
|
||||
t == "explicit" || t == "export" || t == "extends" || t == "extern" || t == "external" ||
|
||||
t == "filter" || t == "final" || t == "finally" || t == "friend" || t == "from" ||
|
||||
t == "fxgroup" || t == "get" || t == "goto" || t == "groupshared" || t == "highp" ||
|
||||
t == "impl" || t == "implements" || t == "import" || t == "inline" ||
|
||||
t == "instanceof" || t == "interface" || t == "layout" || t == "lowp" || t == "macro" ||
|
||||
t == "macro_rules" || t == "match" || t == "mediump" || t == "meta" || t == "mod" ||
|
||||
t == "module" || t == "move" || t == "mut" || t == "mutable" || t == "namespace" ||
|
||||
t == "new" || t == "nil" || t == "noexcept" || t == "noinline" ||
|
||||
t == "nointerpolation" || t == "noperspective" || t == "null" || t == "nullptr" ||
|
||||
t == "of" || t == "operator" || t == "package" || t == "packoffset" ||
|
||||
t == "partition" || t == "pass" || t == "patch" || t == "pixelfragment" ||
|
||||
t == "precise" || t == "precision" || t == "premerge" || t == "priv" ||
|
||||
t == "protected" || t == "pub" || t == "public" || t == "readonly" || t == "ref" ||
|
||||
t == "regardless" || t == "register" || t == "reinterpret_cast" || t == "require" ||
|
||||
t == "resource" || t == "restrict" || t == "self" || t == "set" || t == "shared" ||
|
||||
t == "sizeof" || t == "smooth" || t == "snorm" || t == "static" ||
|
||||
t == "static_assert" || t == "static_cast" || t == "std" || t == "subroutine" ||
|
||||
t == "super" || t == "target" || t == "template" || t == "this" || t == "thread_local" ||
|
||||
t == "throw" || t == "trait" || t == "try" || t == "type" || t == "typedef" ||
|
||||
t == "typeid" || t == "typename" || t == "typeof" || t == "union" || t == "unless" ||
|
||||
t == "unorm" || t == "unsafe" || t == "unsized" || t == "use" || t == "using" ||
|
||||
t == "varying" || t == "virtual" || t == "volatile" || t == "wgsl" || t == "where" ||
|
||||
t == "with" || t == "writeonly" || t == "yield";
|
||||
auto s = t.to_str_view();
|
||||
return s == "NULL" || s == "Self" || s == "abstract" || s == "active" || s == "alignas" ||
|
||||
s == "alignof" || s == "as" || s == "asm" || s == "asm_fragment" || s == "async" ||
|
||||
s == "attribute" || s == "auto" || s == "await" || s == "become" ||
|
||||
s == "binding_array" || s == "cast" || s == "catch" || s == "class" || s == "co_await" ||
|
||||
s == "co_return" || s == "co_yield" || s == "coherent" || s == "column_major" ||
|
||||
s == "common" || s == "compile" || s == "compile_fragment" || s == "concept" ||
|
||||
s == "const_cast" || s == "consteval" || s == "constexpr" || s == "constinit" ||
|
||||
s == "crate" || s == "debugger" || s == "decltype" || s == "delete" || s == "demote" ||
|
||||
s == "demote_to_helper" || s == "do" || s == "dynamic_cast" || s == "enum" ||
|
||||
s == "explicit" || s == "export" || s == "extends" || s == "extern" || s == "external" ||
|
||||
s == "filter" || s == "final" || s == "finally" || s == "friend" || s == "from" ||
|
||||
s == "fxgroup" || s == "get" || s == "goto" || s == "groupshared" || s == "highp" ||
|
||||
s == "impl" || s == "implements" || s == "import" || s == "inline" ||
|
||||
s == "instanceof" || s == "interface" || s == "layout" || s == "lowp" || s == "macro" ||
|
||||
s == "macro_rules" || s == "match" || s == "mediump" || s == "meta" || s == "mod" ||
|
||||
s == "module" || s == "move" || s == "mut" || s == "mutable" || s == "namespace" ||
|
||||
s == "new" || s == "nil" || s == "noexcept" || s == "noinline" ||
|
||||
s == "nointerpolation" || s == "noperspective" || s == "null" || s == "nullptr" ||
|
||||
s == "of" || s == "operator" || s == "package" || s == "packoffset" ||
|
||||
s == "partition" || s == "pass" || s == "patch" || s == "pixelfragment" ||
|
||||
s == "precise" || s == "precision" || s == "premerge" || s == "priv" ||
|
||||
s == "protected" || s == "pub" || s == "public" || s == "readonly" || s == "ref" ||
|
||||
s == "regardless" || s == "register" || s == "reinterpret_cast" || s == "require" ||
|
||||
s == "resource" || s == "restrict" || s == "self" || s == "set" || s == "shared" ||
|
||||
s == "sizeof" || s == "smooth" || s == "snorm" || s == "static" ||
|
||||
s == "static_assert" || s == "static_cast" || s == "std" || s == "subroutine" ||
|
||||
s == "super" || s == "target" || s == "template" || s == "this" || s == "thread_local" ||
|
||||
s == "throw" || s == "trait" || s == "try" || s == "type" || s == "typedef" ||
|
||||
s == "typeid" || s == "typename" || s == "typeof" || s == "union" || s == "unless" ||
|
||||
s == "unorm" || s == "unsafe" || s == "unsized" || s == "use" || s == "using" ||
|
||||
s == "varying" || s == "virtual" || s == "volatile" || s == "wgsl" || s == "where" ||
|
||||
s == "with" || s == "writeonly" || s == "yield";
|
||||
}
|
||||
|
||||
/// Enter-exit counters for block token types.
|
||||
|
|
|
@ -256,6 +256,18 @@ std::string Token::to_str() const {
|
|||
}
|
||||
}
|
||||
|
||||
std::string_view Token::to_str_view() const {
|
||||
if (type_ != Type::kIdentifier) {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (auto* view = std::get_if<std::string_view>(&value_)) {
|
||||
return *view;
|
||||
}
|
||||
auto& s = std::get<std::string>(value_);
|
||||
return {s.data(), s.length()};
|
||||
}
|
||||
|
||||
double Token::to_f64() const {
|
||||
return std::get<double>(value_);
|
||||
}
|
||||
|
|
|
@ -334,6 +334,10 @@ class Token {
|
|||
/// Returns the string value of the token
|
||||
/// @return std::string
|
||||
std::string to_str() const;
|
||||
/// Returns the string view of the token
|
||||
/// @return std::string_view
|
||||
/// @note if the token is not an identifier, an empty string_view will be returned.
|
||||
std::string_view to_str_view() const;
|
||||
/// Returns the float value of the token. 0 is returned if the token does not
|
||||
/// contain a float value.
|
||||
/// @return double
|
||||
|
|
Loading…
Reference in New Issue