Skip to content

Commit

Permalink
Move battle tests off the heap (#3414)
Browse files Browse the repository at this point in the history
  • Loading branch information
mrgriffin authored Oct 13, 2023
1 parent 231ebea commit 45897ce
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 24 deletions.
23 changes: 23 additions & 0 deletions gflib/malloc.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#include "global.h"
#include "malloc.h"
#if TESTING
#include "test/test.h"
#endif

static void *sHeapStart;
static u32 sHeapSize;
Expand Down Expand Up @@ -71,7 +74,27 @@ void *AllocInternal(void *heapStart, u32 size, const char *location)
}

if (pos->next == head)
{
#if TESTING
const struct MemBlock *head = HeapHead();
const struct MemBlock *block = head;
do
{
if (block->allocated)
{
const char *location = MemBlockLocation(block);
if (location)
MgbaPrintf_("%s: %d bytes allocated", location, block->size);
else
MgbaPrintf_("<unknown>: %d bytes allocated", block->size);
}
block = block->next;
}
while (block != head);
Test_ExitWithResult(TEST_RESULT_ERROR, "%s: OOM allocating %d bytes", location, size);
#endif
return NULL;
}

pos = pos->next;
}
Expand Down
1 change: 1 addition & 0 deletions include/fieldmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "main.h"

extern struct BackupMapLayout gBackupMapLayout;
extern u16 ALIGNED(4) sBackupMapData[MAX_MAP_DATA_SIZE];

u32 MapGridGetMetatileIdAt(int, int);
u32 MapGridGetMetatileBehaviorAt(int, int);
Expand Down
2 changes: 1 addition & 1 deletion include/test/battle.h
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,7 @@ struct BattleTestRunnerState
};

extern const struct TestRunner gBattleTestRunner;
extern struct BattleTestRunnerState *gBattleTestRunnerState;
extern struct BattleTestRunnerState *const gBattleTestRunnerState;

#define MEMBERS(...) VARARG_8(MEMBERS_, __VA_ARGS__)
#define MEMBERS_0()
Expand Down
2 changes: 1 addition & 1 deletion src/fieldmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ struct ConnectionFlags
u8 east:1;
};

EWRAM_DATA static u16 ALIGNED(4) sBackupMapData[MAX_MAP_DATA_SIZE] = {0};
EWRAM_DATA u16 ALIGNED(4) sBackupMapData[MAX_MAP_DATA_SIZE] = {0};
EWRAM_DATA struct MapHeader gMapHeader = {0};
EWRAM_DATA struct Camera gCamera = {0};
EWRAM_DATA static struct ConnectionFlags sMapConnectionFlags = {0};
Expand Down
35 changes: 13 additions & 22 deletions test/test_runner_battle.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "battle_anim.h"
#include "battle_controllers.h"
#include "characters.h"
#include "fieldmap.h"
#include "item_menu.h"
#include "main.h"
#include "malloc.h"
Expand Down Expand Up @@ -33,7 +34,9 @@
#undef Q_4_12
#define Q_4_12(n) (s32)((n) * 4096)

EWRAM_DATA struct BattleTestRunnerState *gBattleTestRunnerState = NULL;
// Alias sBackupMapData to avoid using heap.
struct BattleTestRunnerState *const gBattleTestRunnerState = (void *)sBackupMapData;
STATIC_ASSERT(sizeof(struct BattleTestRunnerState) <= sizeof(sBackupMapData), sBackupMapDataSpace);

static void CB2_BattleTest_NextParameter(void);
static void CB2_BattleTest_NextTrial(void);
Expand Down Expand Up @@ -122,9 +125,6 @@ static u32 BattleTest_EstimateCost(void *data)
{
u32 cost;
const struct BattleTest *test = data;
STATE = AllocZeroed(sizeof(*STATE));
if (!STATE)
return 0;
STATE->runRandomly = TRUE;
InvokeTestFunction(test);
cost = 1;
Expand All @@ -134,23 +134,21 @@ static u32 BattleTest_EstimateCost(void *data)
cost *= 3;
else if (STATE->trials > 1)
cost *= STATE->trials;
FREE_AND_SET_NULL(STATE);
return cost;
}

static void BattleTest_SetUp(void *data)
{
const struct BattleTest *test = data;
STATE = AllocZeroed(sizeof(*STATE));
if (!STATE)
Test_ExitWithResult(TEST_RESULT_ERROR, "OOM: STATE = AllocZerod(%d)", sizeof(*STATE));
memset(STATE, 0, sizeof(*STATE));
InvokeTestFunction(test);
STATE->parameters = STATE->parametersCount;
if (STATE->parametersCount == 0 && test->resultsSize > 0)
Test_ExitWithResult(TEST_RESULT_INVALID, "results without PARAMETRIZE");
STATE->results = AllocZeroed(test->resultsSize * STATE->parameters);
if (!STATE->results)
Test_ExitWithResult(TEST_RESULT_ERROR, "OOM: STATE->results = AllocZerod(%d)", sizeof(test->resultsSize * STATE->parameters));
if (sizeof(*STATE) + test->resultsSize * STATE->parameters > sizeof(sBackupMapData))
Test_ExitWithResult(TEST_RESULT_ERROR, "OOM: STATE (%d) + STATE->results (%d) too big for sBackupMapData (%d)", sizeof(*STATE), test->resultsSize * STATE->parameters, sizeof(sBackupMapData));
STATE->results = (void *)((char *)sBackupMapData + sizeof(struct BattleTestRunnerState));
memset(STATE->results, 0, test->resultsSize * STATE->parameters);
switch (test->type)
{
case BATTLE_TEST_SINGLES:
Expand Down Expand Up @@ -962,15 +960,10 @@ static void CB2_BattleTest_NextTrial(void)

static void BattleTest_TearDown(void *data)
{
if (STATE)
{
// Free resources that aren't cleaned up when the battle was
// aborted unexpectedly.
if (STATE->tearDownBattle)
TearDownBattle();
FREE_AND_SET_NULL(STATE->results);
FREE_AND_SET_NULL(STATE);
}
// Free resources that aren't cleaned up when the battle was
// aborted unexpectedly.
if (STATE->tearDownBattle)
TearDownBattle();
}

static bool32 BattleTest_CheckProgress(void *data)
Expand Down Expand Up @@ -1843,8 +1836,6 @@ void QueueStatus(u32 sourceLine, struct BattlePokemon *battler, struct StatusEve
void ValidateFinally(u32 sourceLine)
{
// Defer this error until after estimating the cost.
if (STATE->results == NULL)
return;
INVALID_IF(STATE->parametersCount == 0, "FINALLY without PARAMETRIZE");
}

Expand Down

0 comments on commit 45897ce

Please sign in to comment.