Add eval
This commit is contained in:
+21
-12
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user