mirror of
https://github.com/gbdev/rgbds.git
synced 2026-06-14 20:52:11 +00:00
Simplify sectError handling, without the need for an empty-string sentinel
The `errorNoTrace` case for the empty-string sentinel was unreachable, so we can just have a `fatalNoTrace` error right away.
This commit is contained in:
+13
-23
@@ -271,18 +271,6 @@ static void mergeSections(
|
|||||||
) {
|
) {
|
||||||
sectErrors.clear();
|
sectErrors.clear();
|
||||||
|
|
||||||
auto sectAlreadyDefinedCallback = [§]() {
|
|
||||||
fprintf(stderr, "Section \"%s\" already defined\n", sect.name.c_str());
|
|
||||||
fstk_TraceCurrent();
|
|
||||||
fputs(" and also:\n", stderr);
|
|
||||||
sect.src->printBacktrace(sect.fileLine);
|
|
||||||
};
|
|
||||||
auto sectAlreadyDefinedError = []() {
|
|
||||||
// The empty string is a sentinel for the `sectAlreadyDefinedCallback` error,
|
|
||||||
// since it cannot be preformatted as a string
|
|
||||||
sectErrors.push_back("");
|
|
||||||
};
|
|
||||||
|
|
||||||
if (type != sect.type) {
|
if (type != sect.type) {
|
||||||
sectError(
|
sectError(
|
||||||
"Section \"%s\" already exists but with type `%s`",
|
"Section \"%s\" already exists but with type `%s`",
|
||||||
@@ -321,26 +309,28 @@ static void mergeSections(
|
|||||||
}
|
}
|
||||||
|
|
||||||
case SECTION_NORMAL:
|
case SECTION_NORMAL:
|
||||||
sectAlreadyDefinedError();
|
// Only union/fragment sections can end up with multiple errors queued in `sectErrors`,
|
||||||
|
// and they cannot encounter this error, so it's okay for this one to skip the queue.
|
||||||
|
// Queueing it in `sectErrors` would require a sentinel value anyway (e.g. an empty
|
||||||
|
// string) to handle the "no trace" callback.
|
||||||
|
assume(sectErrors.empty());
|
||||||
|
fatalNoTrace([§]() {
|
||||||
|
fprintf(stderr, "Section \"%s\" already defined\n", sect.name.c_str());
|
||||||
|
fstk_TraceCurrent();
|
||||||
|
fputs(" and also:\n", stderr);
|
||||||
|
sect.src->printBacktrace(sect.fileLine);
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size_t nbSectErrors = sectErrors.size(); nbSectErrors == 1) {
|
if (size_t nbSectErrors = sectErrors.size(); nbSectErrors == 1) {
|
||||||
// If there was only one error, print it as a fatal error
|
// If there was only one error, print it as a fatal error
|
||||||
if (std::string const &message = sectErrors[0]; message.empty()) {
|
fatal("%s", sectErrors.front().c_str());
|
||||||
fatalNoTrace(sectAlreadyDefinedCallback);
|
|
||||||
} else {
|
|
||||||
fatal("%s", message.c_str());
|
|
||||||
}
|
|
||||||
} else if (nbSectErrors > 1) {
|
} else if (nbSectErrors > 1) {
|
||||||
// If there were multiple errors, print each of them, followed by a fatal summary error
|
// If there were multiple errors, print each of them, followed by a fatal summary error
|
||||||
for (std::string const &message : sectErrors) {
|
for (std::string const &message : sectErrors) {
|
||||||
if (message.empty()) {
|
error("%s", message.c_str());
|
||||||
errorNoTrace(sectAlreadyDefinedCallback);
|
|
||||||
} else {
|
|
||||||
error("%s", message.c_str());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fatal(
|
fatal(
|
||||||
"Cannot create section \"%s\" (%zu error%s)",
|
"Cannot create section \"%s\" (%zu error%s)",
|
||||||
|
|||||||
Reference in New Issue
Block a user