mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-05 12:16:35 +02:00
Port dispatch_apply to new calling convention
This commit is contained in:
parent
eca1956400
commit
b507485f55
2 changed files with 24 additions and 5 deletions
|
@ -176,7 +176,7 @@ object Cyc_global_set_cps(void *thd, object cont, object sym, object * glo, obje
|
||||||
/**@{*/
|
/**@{*/
|
||||||
object apply(void *data, object cont, object func, object args);
|
object apply(void *data, object cont, object func, object args);
|
||||||
void Cyc_apply(void *data, object cont, int argc, object *args);
|
void Cyc_apply(void *data, object cont, int argc, object *args);
|
||||||
void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...);
|
void dispatch_apply_va(void *data, object clo, int argc, object *args);
|
||||||
object apply_va(void *data, object cont, int argc, object func, ...);
|
object apply_va(void *data, object cont, int argc, object func, ...);
|
||||||
void dispatch(void *data, int argc, function_type func, object clo, object cont,
|
void dispatch(void *data, int argc, function_type func, object clo, object cont,
|
||||||
object args);
|
object args);
|
||||||
|
|
27
runtime.c
27
runtime.c
|
@ -5645,15 +5645,34 @@ void _call_95cc(void *data, object cont, object args)
|
||||||
} \
|
} \
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...)
|
//void dispatch_apply_va(void *data, int argc, object clo, object cont, object func, ...)
|
||||||
|
void dispatch_apply_va(void *data, object clo, int argc, object *args)
|
||||||
{
|
{
|
||||||
list lis = NULL, prev = NULL;
|
list lis = NULL, prev = NULL;
|
||||||
object tmp;
|
object tmp;
|
||||||
|
// cargs TODO: check num args to make this safe
|
||||||
|
object func = args[1];
|
||||||
int i;
|
int i;
|
||||||
va_list ap;
|
|
||||||
argc = argc - 1; // Required for "dispatch" function
|
argc = argc - 1; // Required for "dispatch" function
|
||||||
do_apply_va
|
if (argc == 2) {
|
||||||
apply(data, cont, func, lis);
|
lis = args[2];
|
||||||
|
Cyc_check_pair_or_null(data, lis);
|
||||||
|
} else {
|
||||||
|
lis = alloca(sizeof(pair_type));
|
||||||
|
tmp = args[2];
|
||||||
|
set_pair(lis, tmp, NULL);
|
||||||
|
prev = lis;
|
||||||
|
for (i = 3; i < argc - 1; i++) {
|
||||||
|
pair_type *next = alloca(sizeof(pair_type));
|
||||||
|
tmp = args[i];
|
||||||
|
set_pair(next, tmp, NULL);
|
||||||
|
cdr(prev) = next;
|
||||||
|
prev = next;
|
||||||
|
}
|
||||||
|
tmp = args[argc];
|
||||||
|
cdr(prev) = tmp;
|
||||||
|
}
|
||||||
|
apply(data, clo, func, lis);
|
||||||
}
|
}
|
||||||
|
|
||||||
object apply_va(void *data, object cont, int argc, object func, ...)
|
object apply_va(void *data, object cont, int argc, object func, ...)
|
||||||
|
|
Loading…
Add table
Reference in a new issue