quakeforge/libs/gamecode/test/head.c
Bill Currie b3909dbe4c [gamecode] Add a test for call and return
It currently fails for two reasons:
 - call's mode selection is incorrect (never updated from when there was
   only the one call instruction and the mode was encoded in operand c)
 - return should automatically restore the stack pointer to the value it
   had on entry to the function, thus allowing local values stored on
   the stack to be safely returned.
2022-01-17 14:26:12 +09:00

54 lines
1.4 KiB
C

#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "QF/progs.h"
static int verbose = 0;
// both calculates the number of globals in the test, and ensures that both
// init and expect are the same size (will product a "void value not ignored"
// error if the sizes differ)
#define num_globals(init, expect) \
__builtin_choose_expr ( \
sizeof (init) == sizeof (expect), \
(sizeof (init) / sizeof (init[0])) \
* (sizeof (init[0]) / sizeof (pr_type_t)), \
(void) 0\
)
// calculate the numver of statements in the test
#define num_statements(statements) \
(sizeof (statements) / sizeof (statements[0]))
#define num_functions(functions) \
(sizeof (functions) / sizeof (functions[0]))
#define BASE(b, base) (((base) & 3) << OP_##b##_SHIFT)
#define OP(a, b, c, op) ((op) | BASE(A, a) | BASE(B, b) | BASE(C, c))
typedef struct {
const char *desc;
pointer_t edict_area;
pointer_t stack_size;
pr_uint_t extra_globals;
pr_uint_t num_globals;
pr_uint_t num_statements;
dstatement_t *statements;
pr_int_t *init_globals;
pr_int_t *expect_globals;
const char *strings;
pr_uint_t string_size;
// pointers/globals for state
double *double_time;
pr_uint_t dtime;
float *float_time;
pr_uint_t ftime;
pr_uint_t self;
// fields for state
pr_uint_t think;
pr_uint_t nextthink;
pr_uint_t frame;
bfunction_t *functions;
pr_uint_t num_functions;
} test_t;