can now handle > vector sized parameters

This commit is contained in:
Bill Currie 2003-04-22 20:11:16 +00:00
parent e732cf591d
commit f7d806e8d5
13 changed files with 103 additions and 60 deletions

View File

@ -320,7 +320,7 @@ typedef struct pr_va_list_s {
} pr_va_list_t; } pr_va_list_t;
#define PROG_ID_VERSION 6 #define PROG_ID_VERSION 6
#define PROG_VERSION 0x00fff002 // MMmmmRRR 0.fff.002 (hex) #define PROG_VERSION 0x00fff003 // MMmmmRRR 0.fff.003 (hex)
typedef struct dprograms_s { typedef struct dprograms_s {
unsigned int version; unsigned int version;

View File

@ -134,7 +134,7 @@ qboolean PR_EdictValid (progs_t *pr, int e);
#define G_GPOINTER(p,o) PR_GetPointer (p, o) #define G_GPOINTER(p,o) PR_GetPointer (p, o)
#define G_STRUCT(p,t,o) (*(t *)G_GPOINTER (p, o)) #define G_STRUCT(p,t,o) (*(t *)G_GPOINTER (p, o))
#define P_var(p,n,t) G_var (p, (OFS_PARM0 + (n) * 3), t) #define P_var(p,n,t) ((p)->pr_params[n]->t##_var)
#define P_FLOAT(p,n) P_var (p, n, float) #define P_FLOAT(p,n) P_var (p, n, float)
#define P_INT(p,n) P_var (p, n, integer) #define P_INT(p,n) P_var (p, n, integer)
@ -150,7 +150,7 @@ qboolean PR_EdictValid (progs_t *pr, int e);
#define P_GPOINTER(p,n) PR_GetPointer (p, P_POINTER (p, n)) #define P_GPOINTER(p,n) PR_GetPointer (p, P_POINTER (p, n))
#define P_STRUCT(p,t,n) (*(t *)P_GPOINTER (p, n)) #define P_STRUCT(p,t,n) (*(t *)P_GPOINTER (p, n))
#define R_var(p,t) G_var (p, OFS_RETURN, t) #define R_var(p,t) ((p)->pr_return->t##_var)
#define R_FLOAT(p) R_var (p, float) #define R_FLOAT(p) R_var (p, float)
#define R_INT(p) R_var (p, integer) #define R_INT(p) R_var (p, integer)
@ -320,6 +320,10 @@ struct progs_s {
pr_type_t *pr_globals; // same as pr_global_struct pr_type_t *pr_globals; // same as pr_global_struct
int globals_size; int globals_size;
pr_type_t *pr_return;
pr_type_t *pr_params[MAX_PARMS];
int pr_param_size; // covers both params and return
int pr_edict_size; // in bytes int pr_edict_size; // in bytes
int pr_edictareasize; // for bounds checking, starts at 0 int pr_edictareasize; // for bounds checking, starts at 0

View File

@ -598,7 +598,7 @@ PF_charcount (progs_t *pr)
# define INT_WIDTH 20 # define INT_WIDTH 20
#endif #endif
#define MAX_ARG 23 #define MAX_ARG 7
static void static void
PF_sprintf (progs_t *pr) PF_sprintf (progs_t *pr)
@ -611,7 +611,7 @@ PF_sprintf (progs_t *pr)
fmt_precision, fmt_signed, fmt_space, fmt_type, looping, fmt_precision, fmt_signed, fmt_space, fmt_type, looping,
ret; ret;
size_t new_format_i; size_t new_format_i;
int curarg = 3, out_max = 32, out_size = 0; int curarg = 1, out_max = 32, out_size = 0;
format = P_GSTRING (pr, 0); format = P_GSTRING (pr, 0);
c = format; c = format;
@ -656,7 +656,7 @@ PF_sprintf (progs_t *pr)
} }
else if (*c == '*') { else if (*c == '*') {
fmt_minwidth = P_INT (pr, 0 + curarg); fmt_minwidth = P_INT (pr, 0 + curarg);
curarg += 3; curarg++;
} }
// precision // precision
@ -672,7 +672,7 @@ PF_sprintf (progs_t *pr)
} }
} else if (*c == '*') { } else if (*c == '*') {
fmt_precision = P_INT (pr, 0 + curarg); fmt_precision = P_INT (pr, 0 + curarg);
curarg += 3; curarg++;
} }
} }
if (!*c) if (!*c)
@ -734,7 +734,7 @@ PF_sprintf (progs_t *pr)
out = o; out = o;
} }
out_size += ret; out_size += ret;
curarg += 3; curarg++;
break; break;
case 'f': case 'f':
while ((ret = snprintf (&out[out_size], out_max - out_size, while ((ret = snprintf (&out[out_size], out_max - out_size,
@ -749,7 +749,7 @@ PF_sprintf (progs_t *pr)
out = o; out = o;
} }
out_size += ret; out_size += ret;
curarg += 3; curarg++;
break; break;
case 'v': { case 'v': {
int i; int i;
@ -758,8 +758,7 @@ PF_sprintf (progs_t *pr)
goto maxargs; goto maxargs;
while ((ret = snprintf (&out[out_size], while ((ret = snprintf (&out[out_size],
out_max - out_size, new_format, out_max - out_size, new_format,
P_FLOAT (pr, 0 + P_VECTOR (pr, 0 + curarg)[i]))
curarg)))
>= out_max - out_size) { >= out_max - out_size) {
char *o; char *o;
out_max *= 2; out_max *= 2;
@ -769,9 +768,9 @@ PF_sprintf (progs_t *pr)
out = o; out = o;
} }
out_size += ret; out_size += ret;
curarg++;
i++; i++;
} }
curarg++;
break; break;
} }
} }
@ -791,7 +790,7 @@ PF_sprintf (progs_t *pr)
out = o; out = o;
} }
out_size += ret; out_size += ret;
curarg += 3; curarg++;
c += 2; c += 2;
} else { } else {
if (*c == '%') if (*c == '%')

View File

@ -129,10 +129,9 @@ PR_EnterFunction (progs_t * pr, dfunction_t *f)
} }
argc->integer_var = pr->pr_argc - i; argc->integer_var = pr->pr_argc - i;
argv->integer_var = o; argv->integer_var = o;
while (i < MAX_PARMS) { if (i < MAX_PARMS) {
memcpy (&pr->pr_globals[o], &P_INT (pr, i), 3); memcpy (&pr->pr_globals[o], &P_INT (pr, i),
o += 3; (MAX_PARMS - i) * pr->pr_param_size * sizeof (pr_type_t));
i++;
} }
} }
@ -679,7 +678,7 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum)
break; break;
case OP_DONE: case OP_DONE:
case OP_RETURN: case OP_RETURN:
memcpy (&R_INT (pr), &OPA, 3 * sizeof (OPA)); memcpy (&R_INT (pr), &OPA, pr->pr_param_size * sizeof (OPA));
PR_LeaveFunction (pr); PR_LeaveFunction (pr);
st = pr->pr_statements + pr->pr_xstatement; st = pr->pr_statements + pr->pr_xstatement;
if (pr->pr_depth == exitdepth) { if (pr->pr_depth == exitdepth) {

View File

@ -359,7 +359,7 @@ pr_obj_msg_sendv (progs_t *pr)
if (args.count > 6) if (args.count > 6)
args.count = 6; args.count = 6;
memcpy (P_GPOINTER (pr, 2), G_GPOINTER (pr, args.list), memcpy (P_GPOINTER (pr, 2), G_GPOINTER (pr, args.list),
args.count * 4 * 3); args.count * 4 * pr->pr_param_size);
call_function (pr, imp); call_function (pr, imp);
} }

View File

@ -164,7 +164,32 @@ PR_ResolveGlobals (progs_t *pr)
{ {
const char *sym; const char *sym;
ddef_t *def; ddef_t *def;
int i;
if (pr->progs->version == PROG_ID_VERSION) {
pr->pr_return = &pr->pr_globals[OFS_RETURN];
pr->pr_params[0] = &pr->pr_globals[OFS_PARM0];
pr->pr_params[1] = &pr->pr_globals[OFS_PARM1];
pr->pr_params[2] = &pr->pr_globals[OFS_PARM2];
pr->pr_params[3] = &pr->pr_globals[OFS_PARM3];
pr->pr_params[4] = &pr->pr_globals[OFS_PARM4];
pr->pr_params[5] = &pr->pr_globals[OFS_PARM5];
pr->pr_params[6] = &pr->pr_globals[OFS_PARM6];
pr->pr_params[7] = &pr->pr_globals[OFS_PARM7];
pr->pr_param_size = OFS_PARM1 - OFS_PARM0;
} else {
if (!(def = PR_FindGlobal (pr, sym = ".return")))
goto error;
pr->pr_return = &pr->pr_globals[def->ofs];
for (i = 0; i < MAX_PARMS; i++) {
if (!(def = PR_FindGlobal (pr, sym = va(".param_%d", i))))
goto error;
pr->pr_params[i] = &pr->pr_globals[def->ofs];
}
if (!(def = PR_FindGlobal (pr, sym = ".param_size")))
goto error;
pr->pr_param_size = G_INT (pr, def->ofs);
}
if (!(def = PR_FindGlobal (pr, sym = "time"))) if (!(def = PR_FindGlobal (pr, sym = "time")))
goto error; goto error;
pr->globals.time = &G_FLOAT (pr, def->ofs); pr->globals.time = &G_FLOAT (pr, def->ofs);

View File

@ -73,8 +73,8 @@ extern type_t *type_category;
extern type_t *type_ivar; extern type_t *type_ivar;
extern type_t *type_module; extern type_t *type_module;
extern type_t type_va_list; extern type_t type_va_list;
extern type_t *type_param; extern type_t type_param;
extern type_t *type_zero; extern type_t type_zero;
extern type_t *vector_struct; extern type_t *vector_struct;

View File

@ -671,7 +671,7 @@ new_this_expr (void)
static expr_t * static expr_t *
param_expr (const char *name, type_t *type) param_expr (const char *name, type_t *type)
{ {
def_t *def = get_def (type_param, name, pr.scope, st_extern);; def_t *def = get_def (&type_param, name, pr.scope, st_extern);;
expr_t *def_expr; expr_t *def_expr;
def_initialized (def); def_initialized (def);

View File

@ -345,7 +345,7 @@ clear_immediates (void)
} }
imm = calloc (1, sizeof (immediate_t)); imm = calloc (1, sizeof (immediate_t));
imm->def = get_def (type_zero, ".zero", pr.scope, st_extern); imm->def = get_def (&type_zero, ".zero", pr.scope, st_extern);
Hash_AddElement (string_imm_defs, imm); Hash_AddElement (string_imm_defs, imm);
Hash_AddElement (float_imm_defs, imm); Hash_AddElement (float_imm_defs, imm);

View File

@ -91,22 +91,20 @@ typedef union defref_s {
typedef struct builtin_sym_s { typedef struct builtin_sym_s {
const char *name; const char *name;
etype_t basic_type; type_t *type;
const char *full_type;
int size;
} builtin_sym_t; } builtin_sym_t;
static builtin_sym_t builtin_symbols[] = { static builtin_sym_t builtin_symbols[] = {
{".zero", ev_struct, "{-*fEFv(v)^viI}", 1}, {".zero", &type_zero},
{".return", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".return", &type_param},
{".param_0", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_0", &type_param},
{".param_1", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_1", &type_param},
{".param_2", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_2", &type_param},
{".param_3", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_3", &type_param},
{".param_4", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_4", &type_param},
{".param_5", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_5", &type_param},
{".param_6", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_6", &type_param},
{".param_7", ev_struct, "{-*fVEFv(v)^viI}", 3}, {".param_7", &type_param},
}; };
static defref_t *free_defrefs; static defref_t *free_defrefs;
@ -704,12 +702,18 @@ linker_begin (void)
pr.strings = strings; pr.strings = strings;
if (!options.partial_link) { if (!options.partial_link) {
dstring_t *encoding = dstring_new ();
for (i = 0; for (i = 0;
i < sizeof (builtin_symbols) / sizeof (builtin_symbols[0]); i < sizeof (builtin_symbols) / sizeof (builtin_symbols[0]);
i++) { i++) {
define_def (builtin_symbols[i].name, builtin_symbols[i].basic_type, etype_t basic_type = builtin_symbols[i].type->type;
builtin_symbols[i].full_type, builtin_symbols[i].size, int size = type_size (builtin_symbols[i].type);
0);
dstring_clearstr (encoding);
encode_type (encoding, builtin_symbols[i].type);
define_def (builtin_symbols[i].name, basic_type, encoding->str,
size, 0);
} }
} }
} }

View File

@ -349,16 +349,16 @@ begin_compilation (void)
static void static void
setup_param_block (void) setup_param_block (void)
{ {
def_initialized (get_def (type_zero, ".zero", pr.scope, st_global)); def_initialized (get_def (&type_zero, ".zero", pr.scope, st_global));
def_initialized (get_def (type_param, ".return", pr.scope, st_global)); def_initialized (get_def (&type_param, ".return", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_0", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_0", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_1", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_1", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_2", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_2", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_3", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_3", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_4", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_4", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_5", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_5", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_6", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_6", pr.scope, st_global));
def_initialized (get_def (type_param, ".param_7", pr.scope, st_global)); def_initialized (get_def (&type_param, ".param_7", pr.scope, st_global));
} }
static qboolean static qboolean
@ -395,6 +395,13 @@ finish_compilation (void)
if (errors) if (errors)
return !errors; return !errors;
if (!options.traditional) {
e.type = ex_integer;
e.e.integer_val = type_size (&type_param);
ReuseConstant (&e, get_def (&type_integer, ".param_size", pr.scope,
st_global));
}
if (options.code.debug) { if (options.code.debug) {
e.type = ex_string; e.type = ex_string;
e.e.string_val = debugfile; e.e.string_val = debugfile;

View File

@ -92,8 +92,8 @@ type_t *type_category;
type_t *type_ivar; type_t *type_ivar;
type_t *type_module; type_t *type_module;
type_t type_va_list; type_t type_va_list;
type_t *type_param; type_t type_param;
type_t *type_zero; type_t type_zero;
type_t *vector_struct; type_t *vector_struct;
@ -594,7 +594,8 @@ init_types (void)
{ {
type_t *type; type_t *type;
type = type_zero = new_union (0); init_struct (malloc (sizeof (struct_t)), type = &type_zero, 0);
((struct_t *) type->class)->is_union = 1;
new_struct_field (type, &type_string, "string_val", vis_public); new_struct_field (type, &type_string, "string_val", vis_public);
new_struct_field (type, &type_float, "float_val", vis_public); new_struct_field (type, &type_float, "float_val", vis_public);
new_struct_field (type, &type_entity, "entity_val", vis_public); new_struct_field (type, &type_entity, "entity_val", vis_public);
@ -604,7 +605,8 @@ init_types (void)
new_struct_field (type, &type_integer, "integer_val", vis_public); new_struct_field (type, &type_integer, "integer_val", vis_public);
new_struct_field (type, &type_uinteger, "uinteger_val", vis_public); new_struct_field (type, &type_uinteger, "uinteger_val", vis_public);
type = type_param = new_union (0); init_struct (malloc (sizeof (struct_t)), type = &type_param, 0);
((struct_t *) type->class)->is_union = 1;
new_struct_field (type, &type_string, "string_val", vis_public); new_struct_field (type, &type_string, "string_val", vis_public);
new_struct_field (type, &type_float, "float_val", vis_public); new_struct_field (type, &type_float, "float_val", vis_public);
new_struct_field (type, &type_vector, "vector_val", vis_public); new_struct_field (type, &type_vector, "vector_val", vis_public);
@ -680,7 +682,7 @@ init_types (void)
init_struct (malloc (sizeof (struct_t)), &type_va_list, 0); init_struct (malloc (sizeof (struct_t)), &type_va_list, 0);
new_struct_field (&type_va_list, &type_integer, "count", vis_public); new_struct_field (&type_va_list, &type_integer, "count", vis_public);
new_struct_field (&type_va_list, pointer_type (type_param), "list", new_struct_field (&type_va_list, pointer_type (&type_param), "list",
vis_public); vis_public);
#if 0 #if 0
type = type_module = new_struct ("obj_module_t"); type = type_module = new_struct ("obj_module_t");
@ -704,8 +706,8 @@ chain_initial_types (void)
chain_type (&type_pointer); chain_type (&type_pointer);
chain_type (&type_floatfield); chain_type (&type_floatfield);
chain_type (type_param); chain_type (&type_param);
chain_type (type_zero); chain_type (&type_zero);
if (options.traditional) if (options.traditional)
return; return;

View File

@ -152,16 +152,19 @@ bi_printf (progs_t *pr)
if (c == '%' && count < 7) { if (c == '%' && count < 7) {
switch (c = *fmt++) { switch (c = *fmt++) {
case 'i': case 'i':
fprintf (stdout, "%i", P_INT (pr, 1 + count++ * 3)); fprintf (stdout, "%i",
P_INT (pr, 1 + count++ * pr->pr_param_size));
break; break;
case 'f': case 'f':
fprintf (stdout, "%f", P_FLOAT (pr, 1 + count++ * 3)); fprintf (stdout, "%f",
P_FLOAT (pr, 1 + count++ * pr->pr_param_size));
break; break;
case 's': case 's':
fputs (P_GSTRING (pr, 1 + count++ * 3), stdout); fputs (P_GSTRING (pr, 1 + count++ * pr->pr_param_size),
stdout);
break; break;
case 'v': case 'v':
v = P_VECTOR (pr, 1 + count++ * 3); v = P_VECTOR (pr, 1 + count++ * pr->pr_param_size);
fprintf (stdout, "'%f %f %f'", v[0], v[1], v[2]); fprintf (stdout, "'%f %f %f'", v[0], v[1], v[2]);
break; break;
default: default: