Refactor compiler warning handling.

Compiler warnings are now accumulated in a vector of strings within the mjSpec object. New API functions `mjs_numWarnings` and `mjs_getWarning` are added to access these warnings. The compiler's log handler now chains warnings to the global log handler, ensuring they are still displayed immediately. Call sites in `mj_loadXML`, `mj_compile`, and the Python and WASM bindings have been updated to use the new warning API.

PiperOrigin-RevId: 933361650
Change-Id: I47cab98a460c57b0898c0a1a43fce2a5b9648eb1
This commit is contained in:
Yuval Tassa
2026-06-16 16:27:52 -07:00
committed by Copybara-Service
parent 55c6332f20
commit 6f8bb5ef55
25 changed files with 640 additions and 89 deletions
+26 -4
View File
@@ -483,15 +483,37 @@ const double* mjs_getTimer(mjSpec* s) {
return modelC->timer;
}
// check if model has warnings
// check if model has warnings (but no error)
// TODO(tassa): delete this function
int mjs_isWarning(mjSpec* s) {
if (!s) {
return 0;
}
mjCModel* modelC = static_cast<mjCModel*>(s->element);
return modelC->GetError().warning;
return modelC->GetError().message[0] == '\0' &&
!modelC->GetWarnings().empty();
}
// get number of warnings
int mjs_numWarnings(const mjSpec* spec) {
if (!spec) {
return 0;
}
const mjCModel* modelC = static_cast<const mjCModel*>(spec->element);
return static_cast<int>(modelC->GetWarnings().size());
}
// get the i-th warning message
const char* mjs_getWarning(const mjSpec* spec, int index) {
if (!spec) {
return nullptr;
}
const mjCModel* modelC = static_cast<const mjCModel*>(spec->element);
if (index < 0 || index >= static_cast<int>(modelC->GetWarnings().size())) {
return nullptr;
}
return modelC->GetWarnings()[index].c_str();
}
// delete model
void mj_deleteSpec(mjSpec* s) {