aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2024-03-08 17:11:54 +1100
committerNeil <nyamatongwe@gmail.com>2024-03-08 17:11:54 +1100
commit212219da82d0a430dbf4eac1528056440f07940c (patch)
treee5a21da94492f4a65ebd9aad41cad7280830b37d
parent990e88a854ce05b86f4ce0b6f9b6975b6df4a282 (diff)
downloadscintilla-mirror-212219da82d0a430dbf4eac1528056440f07940c.tar.gz
Use noexcept in CharacterCategoryMap.
-rw-r--r--src/CharacterCategoryMap.cxx19
-rw-r--r--src/CharacterCategoryMap.h12
2 files changed, 18 insertions, 13 deletions
diff --git a/src/CharacterCategoryMap.cxx b/src/CharacterCategoryMap.cxx
index b8b20fee7..3ef5bb748 100644
--- a/src/CharacterCategoryMap.cxx
+++ b/src/CharacterCategoryMap.cxx
@@ -4050,12 +4050,17 @@ constexpr int maskCategory = 0x1F;
// possibly for 0..0xff for most Western European text or 0..0xfff for most
// alphabetic languages.
-CharacterCategory CategoriseCharacter(int character) {
+CharacterCategory CategoriseCharacter(int character) noexcept {
if (character < 0 || character > maxUnicode)
return ccCn;
const int baseValue = character * (maskCategory+1) + maskCategory;
- const int *placeAfter = std::lower_bound(catRanges, std::end(catRanges), baseValue);
- return static_cast<CharacterCategory>(*(placeAfter-1) & maskCategory);
+ try {
+ // lower_bound will never throw with these args but its not marked noexcept so add catch to pretend.
+ const int *placeAfter = std::lower_bound(catRanges, std::end(catRanges), baseValue);
+ return static_cast<CharacterCategory>(*(placeAfter - 1) & maskCategory);
+ } catch (...) {
+ return ccCn;
+ }
}
// Implementation of character sets recommended for identifiers in Unicode Standard Annex #31.
@@ -4158,7 +4163,7 @@ bool OmitXidContinue(int character) noexcept {
// UAX #31 defines ID_Start as
// [[:L:][:Nl:][:Other_ID_Start:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]]
-bool IsIdStart(int character) {
+bool IsIdStart(int character) noexcept {
if (IsIdPattern(character)) {
return false;
}
@@ -4173,7 +4178,7 @@ bool IsIdStart(int character) {
// UAX #31 defines ID_Continue as
// [[:ID_Start:][:Mn:][:Mc:][:Nd:][:Pc:][:Other_ID_Continue:]--[:Pattern_Syntax:]--[:Pattern_White_Space:]]
-bool IsIdContinue(int character) {
+bool IsIdContinue(int character) noexcept {
if (IsIdPattern(character)) {
return false;
}
@@ -4187,7 +4192,7 @@ bool IsIdContinue(int character) {
}
// XID_Start is ID_Start modified for Normalization Form KC in UAX #31
-bool IsXidStart(int character) {
+bool IsXidStart(int character) noexcept {
if (OmitXidStart(character)) {
return false;
} else {
@@ -4196,7 +4201,7 @@ bool IsXidStart(int character) {
}
// XID_Continue is ID_Continue modified for Normalization Form KC in UAX #31
-bool IsXidContinue(int character) {
+bool IsXidContinue(int character) noexcept {
if (OmitXidContinue(character)) {
return false;
} else {
diff --git a/src/CharacterCategoryMap.h b/src/CharacterCategoryMap.h
index b3b03eb5a..cd75ec29c 100644
--- a/src/CharacterCategoryMap.h
+++ b/src/CharacterCategoryMap.h
@@ -22,20 +22,20 @@ enum CharacterCategory {
ccCc, ccCf, ccCs, ccCo, ccCn
};
-CharacterCategory CategoriseCharacter(int character);
+CharacterCategory CategoriseCharacter(int character) noexcept;
// Common definitions of allowable characters in identifiers from UAX #31.
-bool IsIdStart(int character);
-bool IsIdContinue(int character);
-bool IsXidStart(int character);
-bool IsXidContinue(int character);
+bool IsIdStart(int character) noexcept;
+bool IsIdContinue(int character) noexcept;
+bool IsXidStart(int character) noexcept;
+bool IsXidContinue(int character) noexcept;
class CharacterCategoryMap {
private:
std::vector<unsigned char> dense;
public:
CharacterCategoryMap();
- CharacterCategory CategoryFor(int character) const {
+ CharacterCategory CategoryFor(int character) const noexcept {
if (static_cast<size_t>(character) < dense.size()) {
return static_cast<CharacterCategory>(dense[character]);
} else {