Skip to content

Commit 05f9cf9

Browse files
authored
prevent exception evaluating recall tooltip for recall chain without a remember (#1309)
1 parent fafdc17 commit 05f9cf9

3 files changed

Lines changed: 26 additions & 3 deletions

File tree

src/ui/viewmodels/TriggerConditionViewModel.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -979,9 +979,12 @@ std::wstring TriggerConditionViewModel::GetRecallTooltip(bool bOperand2) const
979979
break;
980980
}
981981

982-
const auto* pOperand1 = rc_condition_get_real_operand1(pCondition);
983-
if ((pOperand1 && pOperand1->type == RC_OPERAND_RECALL) || pCondition->operand2.type == RC_OPERAND_RECALL)
984-
mRememberRef[nConditionIndex] = { nLastRememberIndex, pLastRememberCondition };
982+
if (pLastRememberCondition) // if something has been remembered, check for recalls that might map to it.
983+
{
984+
const auto* pOperand1 = rc_condition_get_real_operand1(pCondition);
985+
if ((pOperand1 && pOperand1->type == RC_OPERAND_RECALL) || pCondition->operand2.type == RC_OPERAND_RECALL)
986+
mRememberRef[nConditionIndex] = { nLastRememberIndex, pLastRememberCondition };
987+
}
985988

986989
if (pCondition->type == RC_CONDITION_REMEMBER)
987990
{

tests/devkit/data/models/CodeNoteModel_Tests.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ TEST_CLASS(CodeNoteModel_Tests)
132132
TestCodeNoteSize(L"[be float] Test", 4U, Memory::Size::FloatBigEndian);
133133
TestCodeNoteSize(L"[bigendian float] Test", 4U, Memory::Size::FloatBigEndian);
134134
TestCodeNoteSize(L"[32-bit] pointer to float", 4U, Memory::Size::ThirtyTwoBit);
135+
TestCodeNoteSize(L"[8-bit] can double down", 1U, Memory::Size::EightBit);
135136

136137
TestCodeNoteSize(L"[64-bit double] Test", 8U, Memory::Size::Double32);
137138
TestCodeNoteSize(L"[64-bit double BE] Test", 8U, Memory::Size::Double32BigEndian);

tests/ui/viewmodels/TriggerConditionViewModel_Tests.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,25 @@ TEST_CLASS(TriggerConditionViewModel_Tests)
16291629
Assert::AreEqual(std::wstring(L"0x00000000 (recall)\r\n[invalid recall]"), pCondition1->GetTooltip(TriggerConditionViewModel::SourceTypeProperty));
16301630
}
16311631

1632+
TEST_METHOD(TestTooltipRecallChainInvalid)
1633+
{
1634+
IndirectAddressTriggerViewModelHarness vmTrigger;
1635+
vmTrigger.mockGameContext.InitializeCodeNotes();
1636+
vmTrigger.Parse("K:{recall}+6_A:{recall}_0xH0000=1");
1637+
vmTrigger.mockConfiguration.SetFeatureEnabled(ra::services::Feature::PreferDecimal, true);
1638+
1639+
// there is no Remember for the first condition to point to
1640+
const auto* pCondition1 = vmTrigger.Conditions().GetItemAt(0);
1641+
Expects(pCondition1 != nullptr);
1642+
Assert::AreEqual(std::wstring(L"0x00000000 (recall)\r\n[invalid recall]"), pCondition1->GetTooltip(TriggerConditionViewModel::SourceTypeProperty));
1643+
1644+
// the second condition points to the first one, but it's broken too
1645+
const auto* pCondition2 = vmTrigger.Conditions().GetItemAt(1);
1646+
Expects(pCondition2 != nullptr);
1647+
Assert::AreEqual(std::wstring(L"0x00000006 (recall)\r\n1: 0x00000000 + 0x00000006 -> 0x00000006"),
1648+
pCondition2->GetTooltip(TriggerConditionViewModel::SourceTypeProperty));
1649+
}
1650+
16321651
TEST_METHOD(TestTooltipRecallInvalidInPauseIf)
16331652
{
16341653
IndirectAddressTriggerViewModelHarness vmTrigger;

0 commit comments

Comments
 (0)