This commit is contained in:
2026-01-20 01:23:52 -08:00
parent 243a012d3e
commit 4c04e71078
11 changed files with 145 additions and 33 deletions
+21 -12
View File
@@ -226,37 +226,44 @@ call_simple_native(LispVal *orig_func, LispFunction *fobj, LispVal *args) {
fprintf(stderr, "Wrong arg count!!\n");
abort();
}
LispVal *arg_arr[MAX_NATIVE_FUNCTION_ARGS];
size_t acount = 0;
FOREACH(args, arg) {
add_local_reference(arg);
if (fobj->flags.no_eval_args) {
arg_arr[acount] = arg;
} else {
arg_arr[acount] = Feval(arg);
}
add_local_reference(arg_arr[acount++]);
}
LispVal *retval;
switch (fobj->args.n_req) {
switch (acount) {
case 0:
retval = fobj->impl.native.zero();
break;
case 1:
retval = fobj->impl.native.one(FIRST(args));
retval = fobj->impl.native.one(arg_arr[0]);
break;
case 2:
retval = fobj->impl.native.two(FIRST(args), SECOND(args));
retval = fobj->impl.native.two(arg_arr[0], arg_arr[1]);
break;
case 3:
retval =
fobj->impl.native.three(FIRST(args), SECOND(args), THIRD(args));
retval = fobj->impl.native.three(arg_arr[0], arg_arr[1], arg_arr[2]);
break;
case 4:
retval = fobj->impl.native.four(FIRST(args), SECOND(args), THIRD(args),
FOURTH(args));
retval = fobj->impl.native.four(arg_arr[0], arg_arr[1], arg_arr[2],
arg_arr[3]);
break;
case 5:
retval = fobj->impl.native.five(FIRST(args), SECOND(args), THIRD(args),
FOURTH(args), FIFTH(args));
retval = fobj->impl.native.five(arg_arr[0], arg_arr[1], arg_arr[2],
arg_arr[3], arg_arr[4]);
break;
default:
abort();
}
the_stack.nogc_retval = retval;
pop_stack_frame();
add_local_reference(the_stack.nogc_retval);
return retval;
}
@@ -351,9 +358,10 @@ call_complex_native(LispVal *orig_func, LispFunction *fobj, LispVal *args) {
for (intptr_t i = 0; i < count; ++i) {
if (!arg_arr[i]) {
arg_arr[i] = Qnil;
} else {
add_local_reference(arg_arr[i]);
} else if (!fobj->flags.no_eval_args) {
arg_arr[i] = Feval(arg_arr[i]);
}
add_local_reference(arg_arr[i]);
}
LispVal *retval;
switch (count) {
@@ -382,6 +390,7 @@ call_complex_native(LispVal *orig_func, LispFunction *fobj, LispVal *args) {
}
the_stack.nogc_retval = retval;
pop_stack_frame();
add_local_reference(the_stack.nogc_retval);
return retval;
}