Skip to content

Commit b133991

Browse files
committed
optimize rule validation
1 parent 3df7141 commit b133991

2 files changed

Lines changed: 22 additions & 11 deletions

File tree

cpp2rust/converter/translation_rule.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,24 +303,35 @@ void ExprRule::dump() const {
303303
}
304304
}
305305

306-
std::array<const char *, kMaxGenerics> kGenericPlaceholders = {
307-
"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9"};
308-
309306
void ExprRule::validate(const std::string &name) const {
310307
if (src.empty()) {
311308
llvm::errs() << name << '\n';
312309
dump();
313-
assert(0 && "Expr rule loaded from IR but has no src");
310+
llvm::report_fatal_error("Expr rule loaded from IR but has no src");
311+
}
312+
313+
if (generics.empty())
314+
return;
315+
316+
bool has_generic[kMaxGenerics] = {false};
317+
for (size_t i = 0, e = src.size(); i < e; ++i) {
318+
auto pos = src.find('T', i);
319+
if (pos == std::string::npos)
320+
break;
321+
auto ch = pos + 1 < e ? src[pos + 1] : '\0';
322+
if (ch >= '1' && ch <= '9') {
323+
has_generic[ch - '1'] = true;
324+
i = pos + 1;
325+
}
314326
}
315327

316-
for (unsigned i = 0, e = generics.size(); i < e; ++i) {
317-
const char *placeholder = kGenericPlaceholders[i];
318-
if (src.find(placeholder) == std::string::npos) {
328+
for (size_t i = 0, e = generics.size(); i < e; ++i) {
329+
if (!has_generic[i]) {
319330
llvm::errs() << name << '\n';
320331
dump();
321-
llvm::errs() << "generic " << placeholder
332+
llvm::errs() << "generic T" << (i + 1)
322333
<< " declared but missing from src: " << src << '\n';
323-
assert(0 && "Expr rule declares a generic absent from its src");
334+
llvm::report_fatal_error("Absent generic from src");
324335
}
325336
}
326337
}

cpp2rust/converter/translation_rule.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515

1616
namespace cpp2rust::TranslationRule {
1717

18-
inline constexpr unsigned kMaxGenerics = 9;
18+
static inline constexpr unsigned kMaxGenerics = 9;
1919

2020
struct TextFragment {
2121
std::string text;
2222

2323
void dump() const;
2424
};
2525

26-
enum class Access { kRead, kWrite, kMove };
26+
enum class Access : int8_t { kRead, kWrite, kMove };
2727

2828
struct PlaceholderFragment {
2929
unsigned n; // "a0", "a1", ...

0 commit comments

Comments
 (0)