Skip to content

Commit 96557f0

Browse files
authored
prevent null reference exception trying to show tooltip for broken recall (#1270)
1 parent 2134b87 commit 96557f0

2 files changed

Lines changed: 38 additions & 5 deletions

File tree

src/ui/viewmodels/TriggerConditionViewModel.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -856,10 +856,15 @@ static void BuildRecallTooltip(std::wstring& sTooltip,
856856
BuildRecallTooltip(sTooltip, mRememberRef, pIter->second.first, *pIter->second.second, *pRecallOperand);
857857
}
858858

859-
sTooltip += ra::StringPrintf(L"\r\n%u: ", gsl::narrow_cast<uint32_t>(nConditionIndex + 1));
860-
861-
if (pOperand.value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF)
859+
if (!pOperand.value.memref)
860+
{
861+
// if memref is null, a Remember couldn't be found for the {recall}
862+
sTooltip.append(L"\r\n[invalid recall]");
863+
}
864+
else if (pOperand.value.memref->value.memref_type == RC_MEMREF_TYPE_MODIFIED_MEMREF)
862865
{
866+
sTooltip += ra::StringPrintf(L"\r\n%u: ", gsl::narrow_cast<uint32_t>(nConditionIndex + 1));
867+
863868
GSL_SUPPRESS_TYPE1 const rc_modified_memref_t* combining_memref =
864869
reinterpret_cast<rc_modified_memref_t*>(pOperand.value.memref);
865870
if (combining_memref->modifier_type == RC_OPERATOR_INDIRECT_READ)
@@ -945,7 +950,7 @@ std::wstring TriggerConditionViewModel::GetRecallTooltip(bool bOperand2) const
945950
if (pLastRememberCondition)
946951
BuildRecallTooltip(sTooltip, mRememberRef, nLastRememberIndex, *pLastRememberCondition, *pOperand);
947952
else
948-
sTooltip += L"???";
953+
sTooltip += L"\r\n[invalid recall]";
949954

950955
return sTooltip;
951956
}

tests/ui/viewmodels/TriggerConditionViewModel_Tests.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,7 @@ TEST_CLASS(TriggerConditionViewModel_Tests)
14031403
L"2: 0x00000302 & 0x000001ff -> 0x00000102\r\n"
14041404
L"3: 0x00000102 * 0x00000002 -> 0x00000204\r\n"
14051405
L"4: 0x00000204 + 0x00000004 -> 0x00000208"),
1406-
pCondition5->GetTooltip(TriggerConditionViewModel::TargetTypeProperty));
1406+
pCondition5->GetTooltip(TriggerConditionViewModel::TargetTypeProperty));
14071407
Assert::AreEqual(std::wstring(L""), pCondition5->GetTooltip(TriggerConditionViewModel::TargetValueProperty));
14081408

14091409
// $0010 = 0x0000 + 0x04 + 0x0208 = 0x020c
@@ -1565,6 +1565,34 @@ TEST_CLASS(TriggerConditionViewModel_Tests)
15651565
Assert::AreEqual(std::wstring(L"6"), pCondition10->GetTooltip(TriggerConditionViewModel::TargetValueProperty));
15661566
}
15671567

1568+
TEST_METHOD(TestTooltipRecallInvalid)
1569+
{
1570+
IndirectAddressTriggerViewModelHarness vmTrigger;
1571+
vmTrigger.mockGameContext.InitializeCodeNotes();
1572+
vmTrigger.Parse("A:{recall}_0xH0000=1");
1573+
vmTrigger.mockConfiguration.SetFeatureEnabled(ra::services::Feature::PreferDecimal, true);
1574+
1575+
const auto* pCondition1 = vmTrigger.Conditions().GetItemAt(0);
1576+
Expects(pCondition1 != nullptr);
1577+
1578+
// there is no Remember condition to point to
1579+
Assert::AreEqual(std::wstring(L"0x00000000 (recall)\r\n[invalid recall]"), pCondition1->GetTooltip(TriggerConditionViewModel::SourceTypeProperty));
1580+
}
1581+
1582+
TEST_METHOD(TestTooltipRecallInvalidInPauseIf)
1583+
{
1584+
IndirectAddressTriggerViewModelHarness vmTrigger;
1585+
vmTrigger.mockGameContext.InitializeCodeNotes();
1586+
vmTrigger.Parse("K:0xH0001*2_1=1_N:{recall}!=0_P:0xH0000=1");
1587+
vmTrigger.mockConfiguration.SetFeatureEnabled(ra::services::Feature::PreferDecimal, true);
1588+
1589+
const auto* pCondition3 = vmTrigger.Conditions().GetItemAt(2);
1590+
Expects(pCondition3 != nullptr);
1591+
1592+
// there is a Remember condition to point to, but it won't be processed until after this condition
1593+
Assert::AreEqual(std::wstring(L"0x00000000 (recall)\r\n[invalid recall]"), pCondition3->GetTooltip(TriggerConditionViewModel::SourceTypeProperty));
1594+
}
1595+
15681596
TEST_METHOD(TestIsModifying)
15691597
{
15701598
TriggerConditionViewModelHarness condition;

0 commit comments

Comments
 (0)