From 907ce777a35160a554661255267668d024b3fa12 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 29 Jun 2018 13:47:06 +0300 Subject: [PATCH] - added extra validation for status bar classes Print a message when status bar class defined in GAMEINFO is missing or when it's not derived from BaseStatusBar Validate internal status bar classes for basic consistency in Debug configuration --- src/g_statusbar/sbarinfo.cpp | 6 ++++- src/g_statusbar/shared_sbar.cpp | 40 ++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 7e7ace6a3..9c3c71017 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1567,7 +1567,11 @@ DBaseStatusBar *CreateCustomStatusBar(int scriptno) auto script = SBarInfoScript[scriptno]; if (script == nullptr) return nullptr; - auto sbar = (DBaseStatusBar*)PClass::FindClass("SBarInfoWrapper")->CreateNew(); + PClass *sbarclass = PClass::FindClass("SBarInfoWrapper"); + assert(sbarclass != nullptr); + assert(sbarclass->IsDescendantOf(RUNTIME_CLASS(DBaseStatusBar))); + auto sbar = (DBaseStatusBar*)sbarclass->CreateNew(); + auto core = new DSBarInfo(sbar, script); sbar->PointerVar("core") = core; sbar->SetSize(script->height, script->_resW, script->_resH); diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index e0e2cc9d5..7236bc39b 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -247,6 +247,31 @@ static void CreateBaseStatusBar() StatusBar->SetSize(0); } +static void CreateGameInfoStatusBar(bool &shouldWarn) +{ + auto cls = PClass::FindClass(gameinfo.statusbarclass); + if (cls == nullptr) + { + if (shouldWarn) + { + Printf(TEXTCOLOR_RED "Unknown status bar class \"%s\"\n", gameinfo.statusbarclass.GetChars()); + shouldWarn = false; + } + } + else + { + if (cls->IsDescendantOf(RUNTIME_CLASS(DBaseStatusBar))) + { + StatusBar = (DBaseStatusBar *)cls->CreateNew(); + } + else if (shouldWarn) + { + Printf(TEXTCOLOR_RED "Status bar class \"%s\" is not derived from BaseStatusBar\n", gameinfo.statusbarclass.GetChars()); + shouldWarn = false; + } + } +} + void ST_CreateStatusBar(bool bTitleLevel) { if (StatusBar != NULL) @@ -255,6 +280,8 @@ void ST_CreateStatusBar(bool bTitleLevel) StatusBar = NULL; } + bool shouldWarn = true; + if (bTitleLevel) { CreateBaseStatusBar(); @@ -268,11 +295,7 @@ void ST_CreateStatusBar(bool bTitleLevel) int sbarinfofile = Wads.GetLumpFile(sbarinfolump); if (gameinfo.statusbarclassfile >= gameinfo.statusbarfile && gameinfo.statusbarclassfile >= sbarinfofile) { - auto cls = PClass::FindClass(gameinfo.statusbarclass); - if (cls != nullptr) - { - StatusBar = (DBaseStatusBar *)cls->CreateNew(); - } + CreateGameInfoStatusBar(shouldWarn); } } if (StatusBar == nullptr && SBarInfoScript[SCRIPT_CUSTOM] != nullptr) @@ -291,11 +314,7 @@ void ST_CreateStatusBar(bool bTitleLevel) // SBARINFO failed so try the current statusbarclass again. if (StatusBar == nullptr) { - auto cls = PClass::FindClass(gameinfo.statusbarclass); - if (cls != nullptr) - { - StatusBar = (DBaseStatusBar *)cls->CreateNew(); - } + CreateGameInfoStatusBar(shouldWarn); } } if (StatusBar == nullptr) @@ -311,6 +330,7 @@ void ST_CreateStatusBar(bool bTitleLevel) auto cls = PClass::FindClass(defname); if (cls != nullptr) { + assert(cls->IsDescendantOf(RUNTIME_CLASS(DBaseStatusBar))); StatusBar = (DBaseStatusBar *)cls->CreateNew(); } }