[qfcc] Clean up some arg/param confusion

Only in expr_call.c, but that's probably where it's at its worst.
This commit is contained in:
Bill Currie 2024-11-10 23:34:07 +09:00
parent 819d0fc3be
commit a68aaad307

View file

@ -273,19 +273,19 @@ build_args (const expr_t *(*arg_exprs)[2], int *arg_expr_count,
const expr_t * const expr_t *
build_function_call (const expr_t *fexpr, const type_t *ftype, build_function_call (const expr_t *fexpr, const type_t *ftype,
const expr_t *params) const expr_t *args)
{ {
int param_count = 0; int param_count = 0;
expr_t *call; expr_t *call;
const expr_t *err = 0; const expr_t *err = 0;
int arg_count = params ? list_count (&params->list) : 0; int arg_count = args ? list_count (&args->list) : 0;
const expr_t *arguments[arg_count + 1] = {}; const expr_t *arguments[arg_count + 1] = {};
const type_t *arg_types[arg_count + 1] = {}; const type_t *arg_types[arg_count + 1] = {};
if (params) { if (args) {
// params is reversed (a, b, c) -> c, b, a // args is reversed (a, b, c) -> c, b, a
list_scatter_rev (&params->list, arguments); list_scatter_rev (&args->list, arguments);
} }
if ((err = optimize_arguments (arguments, arg_count))) { if ((err = optimize_arguments (arguments, arg_count))) {
@ -302,34 +302,34 @@ build_function_call (const expr_t *fexpr, const type_t *ftype,
scoped_src_loc (fexpr); scoped_src_loc (fexpr);
call = new_block_expr (0); call = new_block_expr (0);
call->block.is_call = 1; call->block.is_call = 1;
int arg_expr_count = 0; int num_args = 0;
const expr_t *arg_exprs[arg_count + 1][2]; const expr_t *arg_exprs[arg_count + 1][2];
auto args = build_args (arg_exprs, &arg_expr_count, arguments, arg_types, auto arg_list = build_args (arg_exprs, &num_args, arguments, arg_types,
arg_count, param_count, ftype); arg_count, param_count, ftype);
for (int i = 0; i < arg_expr_count; i++) { for (int i = 0; i < num_args; i++) {
scoped_src_loc (arg_exprs[i][0]); scoped_src_loc (arg_exprs[i][0]);
auto assign = assign_expr (arg_exprs[i][1], arg_exprs[i][0]); auto assign = assign_expr (arg_exprs[i][1], arg_exprs[i][0]);
append_expr (call, assign); append_expr (call, assign);
} }
auto ret_type = ftype->func.ret_type; auto ret_type = ftype->func.ret_type;
call->block.result = new_call_expr (fexpr, args, ret_type); call->block.result = new_call_expr (fexpr, arg_list, ret_type);
return call; return call;
} }
const expr_t * const expr_t *
function_expr (const expr_t *fexpr, const expr_t *params) function_expr (const expr_t *fexpr, const expr_t *args)
{ {
if (params) { if (args) {
for (auto p = params->list.head; p; p = p->next) { for (auto p = args->list.head; p; p = p->next) {
p->expr = convert_name (p->expr); p->expr = convert_name (p->expr);
} }
} }
if (fexpr->type == ex_symbol && fexpr->symbol->sy_type == sy_type) { if (fexpr->type == ex_symbol && fexpr->symbol->sy_type == sy_type) {
return constructor_expr (fexpr, params); return constructor_expr (fexpr, args);
} }
fexpr = find_function (fexpr, params); fexpr = find_function (fexpr, args);
fexpr = convert_name (fexpr); fexpr = convert_name (fexpr);
if (is_error (fexpr)) { if (is_error (fexpr)) {
return fexpr; return fexpr;
@ -344,18 +344,20 @@ function_expr (const expr_t *fexpr, const expr_t *params)
return error (fexpr, "Called object is not a function"); return error (fexpr, "Called object is not a function");
} }
if (fexpr->type == ex_symbol && params && is_string_val (params)) { if (fexpr->type == ex_symbol && args
&& args->list.head && is_string_val (args->list.head->expr)) {
auto arg = args->list.head->expr;
// FIXME eww, I hate this, but it's needed :( // FIXME eww, I hate this, but it's needed :(
// FIXME make a qc hook? :) // FIXME make a qc hook? :)
if (strncmp (fexpr->symbol->name, "precache_sound", 14) == 0) if (strncmp (fexpr->symbol->name, "precache_sound", 14) == 0)
PrecacheSound (expr_string (params), fexpr->symbol->name[14]); PrecacheSound (expr_string (arg), fexpr->symbol->name[14]);
else if (strncmp (fexpr->symbol->name, "precache_model", 14) == 0) else if (strncmp (fexpr->symbol->name, "precache_model", 14) == 0)
PrecacheModel (expr_string (params), fexpr->symbol->name[14]); PrecacheModel (expr_string (arg), fexpr->symbol->name[14]);
else if (strncmp (fexpr->symbol->name, "precache_file", 13) == 0) else if (strncmp (fexpr->symbol->name, "precache_file", 13) == 0)
PrecacheFile (expr_string (params), fexpr->symbol->name[13]); PrecacheFile (expr_string (arg), fexpr->symbol->name[13]);
} }
return build_function_call (fexpr, ftype, params); return build_function_call (fexpr, ftype, args);
} }
const expr_t * const expr_t *