mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-11 15:21:51 +00:00
- added write barriers to the menu code.
The GC was causing some crash issues with the items not having been subjected to a write barrier.
This commit is contained in:
parent
470dc138c6
commit
5cfac78116
6 changed files with 47 additions and 0 deletions
|
@ -89,6 +89,10 @@ public:
|
||||||
desc->mItems[mStartItem+5] = new DOptionMenuItemStaticText(" ", false);
|
desc->mItems[mStartItem+5] = new DOptionMenuItemStaticText(" ", false);
|
||||||
desc->mItems[mStartItem+6] = new DOptionMenuItemCommand("Undo changes", "undocolorpic");
|
desc->mItems[mStartItem+6] = new DOptionMenuItemCommand("Undo changes", "undocolorpic");
|
||||||
desc->mItems[mStartItem+7] = new DOptionMenuItemStaticText(" ", false);
|
desc->mItems[mStartItem+7] = new DOptionMenuItemStaticText(" ", false);
|
||||||
|
for (auto &p : desc->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
desc->mSelectedItem = mStartItem + 2;
|
desc->mSelectedItem = mStartItem + 2;
|
||||||
Init(parent, desc);
|
Init(parent, desc);
|
||||||
desc->mIndent = 0;
|
desc->mIndent = 0;
|
||||||
|
|
|
@ -322,6 +322,10 @@ FOptionMenuDescriptor *UpdateJoystickConfigMenu(IJoystickConfig *joy)
|
||||||
opt->mItems.Push(it);
|
opt->mItems.Push(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto &p : opt->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
opt->mScrollPos = 0;
|
opt->mScrollPos = 0;
|
||||||
opt->mSelectedItem = -1;
|
opt->mSelectedItem = -1;
|
||||||
opt->mIndent = 0;
|
opt->mIndent = 0;
|
||||||
|
@ -402,6 +406,10 @@ void UpdateJoystickMenu(IJoystickConfig *selected)
|
||||||
if (i == itemnum) opt->mSelectedItem = opt->mItems.Size();
|
if (i == itemnum) opt->mSelectedItem = opt->mItems.Size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto &p : opt->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
if (opt->mSelectedItem >= (int)opt->mItems.Size())
|
if (opt->mSelectedItem >= (int)opt->mItems.Size())
|
||||||
{
|
{
|
||||||
opt->mSelectedItem = opt->mItems.Size() - 1;
|
opt->mSelectedItem = opt->mItems.Size() - 1;
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
|
|
||||||
IMPLEMENT_CLASS(DListMenu, false, false)
|
IMPLEMENT_CLASS(DListMenu, false, false)
|
||||||
|
|
||||||
|
IMPLEMENT_POINTERS_START(DListMenu)
|
||||||
|
IMPLEMENT_POINTER(mFocusControl)
|
||||||
|
IMPLEMENT_POINTERS_END
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
|
@ -520,6 +520,7 @@ public:
|
||||||
class DListMenu : public DMenu
|
class DListMenu : public DMenu
|
||||||
{
|
{
|
||||||
DECLARE_CLASS(DListMenu, DMenu)
|
DECLARE_CLASS(DListMenu, DMenu)
|
||||||
|
HAS_OBJECT_POINTERS;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FListMenuDescriptor *mDesc;
|
FListMenuDescriptor *mDesc;
|
||||||
|
@ -609,6 +610,7 @@ extern FOptionMap OptionValues;
|
||||||
class DOptionMenu : public DMenu
|
class DOptionMenu : public DMenu
|
||||||
{
|
{
|
||||||
DECLARE_CLASS(DOptionMenu, DMenu)
|
DECLARE_CLASS(DOptionMenu, DMenu)
|
||||||
|
HAS_OBJECT_POINTERS;
|
||||||
|
|
||||||
bool CanScrollUp;
|
bool CanScrollUp;
|
||||||
bool CanScrollDown;
|
bool CanScrollDown;
|
||||||
|
|
|
@ -475,6 +475,10 @@ static void ParseListMenuBody(FScanner &sc, FListMenuDescriptor *desc)
|
||||||
sc.ScriptError("Unknown keyword '%s'", sc.String);
|
sc.ScriptError("Unknown keyword '%s'", sc.String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto &p : desc->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -927,6 +931,10 @@ static void ParseOptionMenuBody(FScanner &sc, FOptionMenuDescriptor *desc)
|
||||||
sc.ScriptError("Unknown keyword '%s'", sc.String);
|
sc.ScriptError("Unknown keyword '%s'", sc.String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto &p : desc->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
@ -1101,6 +1109,10 @@ static void BuildEpisodeMenu()
|
||||||
ld->mAutoselect = ld->mSelectedItem;
|
ld->mAutoselect = ld->mSelectedItem;
|
||||||
}
|
}
|
||||||
success = true;
|
success = true;
|
||||||
|
for (auto &p : ld->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1125,6 +1137,7 @@ static void BuildEpisodeMenu()
|
||||||
{
|
{
|
||||||
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(AllEpisodes[i].mEpisodeName, "Skillmenu", i);
|
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(AllEpisodes[i].mEpisodeName, "Skillmenu", i);
|
||||||
od->mItems.Push(it);
|
od->mItems.Push(it);
|
||||||
|
GC::WriteBarrier(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1230,6 +1243,10 @@ static void BuildPlayerclassMenu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
success = true;
|
success = true;
|
||||||
|
for (auto &p : ld->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1261,11 +1278,13 @@ static void BuildPlayerclassMenu()
|
||||||
{
|
{
|
||||||
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(pname, "Episodemenu", i);
|
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu(pname, "Episodemenu", i);
|
||||||
od->mItems.Push(it);
|
od->mItems.Push(it);
|
||||||
|
GC::WriteBarrier(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu("Random", "Episodemenu", -1);
|
DOptionMenuItemSubmenu *it = new DOptionMenuItemSubmenu("Random", "Episodemenu", -1);
|
||||||
od->mItems.Push(it);
|
od->mItems.Push(it);
|
||||||
|
GC::WriteBarrier(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1355,6 +1374,10 @@ static void InitKeySections()
|
||||||
menu->mItems.Push(item);
|
menu->mItems.Push(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (auto &p : menu->mItems)
|
||||||
|
{
|
||||||
|
GC::WriteBarrier(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1488,6 +1511,7 @@ void M_StartupSkillMenu(FGameStartup *gs)
|
||||||
pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, i);
|
pItemText? *pItemText : skill.MenuName, ld->mFont, color,ld->mFontColor2, action, i);
|
||||||
}
|
}
|
||||||
ld->mItems.Push(li);
|
ld->mItems.Push(li);
|
||||||
|
GC::WriteBarrier(li);
|
||||||
y += ld->mLinespacing;
|
y += ld->mLinespacing;
|
||||||
}
|
}
|
||||||
if (AllEpisodes[gs->Episode].mNoSkill || AllSkills.Size() == 1)
|
if (AllEpisodes[gs->Episode].mNoSkill || AllSkills.Size() == 1)
|
||||||
|
@ -1541,6 +1565,7 @@ fail:
|
||||||
}
|
}
|
||||||
li = new DOptionMenuItemSubmenu(pItemText? *pItemText : skill.MenuName, action, i);
|
li = new DOptionMenuItemSubmenu(pItemText? *pItemText : skill.MenuName, action, i);
|
||||||
od->mItems.Push(li);
|
od->mItems.Push(li);
|
||||||
|
GC::WriteBarrier(li);
|
||||||
if (!done)
|
if (!done)
|
||||||
{
|
{
|
||||||
done = true;
|
done = true;
|
||||||
|
|
|
@ -66,6 +66,10 @@ void M_DrawConText (int color, int x, int y, const char *str)
|
||||||
|
|
||||||
IMPLEMENT_CLASS(DOptionMenu, false, false)
|
IMPLEMENT_CLASS(DOptionMenu, false, false)
|
||||||
|
|
||||||
|
IMPLEMENT_POINTERS_START(DOptionMenu)
|
||||||
|
IMPLEMENT_POINTER(mFocusControl)
|
||||||
|
IMPLEMENT_POINTERS_END
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue