[tint][spirv] Remove use of locale
Fixed: 42250983
Change-Id: Iafbf454d3d369570fae90635ee281232f5603ad1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/186940
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
index e4cf3ef..efb14a2 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
@@ -29,7 +29,7 @@
#include <algorithm>
#include <limits>
-#include <locale>
+#include <string_view>
#include <utility>
#include "source/opt/build_module.h"
@@ -775,11 +775,10 @@
return true;
}
-bool ASTParser::IsValidIdentifier(const std::string& str) {
+bool ASTParser::IsValidIdentifier(std::string_view str) {
if (str.empty()) {
return false;
}
- std::locale c_locale("C");
if (str[0] == '_') {
if (str.length() == 1u || str[1] == '_') {
// https://www.w3.org/TR/WGSL/#identifiers
@@ -787,14 +786,28 @@
// must not start with two underscores
return false;
}
- } else if (!std::isalpha(str[0], c_locale)) {
- return false;
}
- for (const char& ch : str) {
- if ((ch != '_') && !std::isalnum(ch, c_locale)) {
+
+ // Must begin with an XID_Source unicode character, or underscore
+ {
+ auto* utf8 = reinterpret_cast<const uint8_t*>(str.data());
+ auto [code_point, n] = tint::utf8::Decode(utf8, str.size());
+ if (code_point != tint::CodePoint('_') && !code_point.IsXIDStart()) {
return false;
}
+ str = str.substr(n);
}
+
+ // Must continue with an XID_Continue unicode character
+ while (!str.empty()) {
+ auto* utf8 = reinterpret_cast<const uint8_t*>(str.data());
+ auto [code_point, n] = tint::utf8::Decode(utf8, str.size());
+ if (!code_point.IsXIDContinue()) {
+ return false;
+ }
+ str = str.substr(n);
+ }
+
return true;
}
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.h b/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
index 86f60e7..8f755f7 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.h
@@ -628,7 +628,7 @@
/// @param str a candidate identifier
/// @returns true if the given string is a valid WGSL identifier.
- static bool IsValidIdentifier(const std::string& str);
+ static bool IsValidIdentifier(std::string_view str);
/// Returns true if the given SPIR-V ID is a declared specialization constant,
/// generated by one of OpConstantTrue, OpConstantFalse, or OpSpecConstant