cyclone/dispatch-hack.c
Justin Ethier 6549bc0213 WIP
2020-06-29 19:05:46 -04:00

81 lines
2 KiB
C

#include "cyclone/types.h"
#include "cyclone/runtime.h"
//#ifdef C_HACKED_APPLY
//# if defined(C_MACOSX) || defined(__MINGW32__) || defined(__CYGWIN__)
//extern void C_do_apply_hack(void *proc, C_word *args, int count) C_noret;
//# else
//extern void _C_do_apply_hack(void *proc, C_word *args, int count) C_noret;
extern void _C_do_apply_hack(void *proc, object args, int count);
# define C_do_apply_hack _C_do_apply_hack
//# endif
//#endif
/*
#ifdef C_HACKED_APPLY
C_word *buf = C_temporary_stack_limit;
void *proc;
#endif
if(c < 4) C_bad_min_argc(c, 4);
if(C_immediatep(fn) || C_header_bits(fn) != C_CLOSURE_TYPE) {
barf(C_NOT_A_CLOSURE_ERROR, "apply", fn);
}
va_start(v, fn);
for(i = n; i > 1; --i) {
x = va_arg(v, C_word);
#ifdef C_HACKED_APPLY
*(buf++) = x;
#endif
#ifdef C_HACKED_APPLY
if(buf >= C_temporary_stack_bottom) barf(C_TOO_MANY_PARAMETERS_ERROR, "apply");
*(buf++) = x;
#else
#ifdef C_HACKED_APPLY
// 3 additional args + 1 slot for stack-pointer + two for stack-alignment to 16 bytes
buf = alloca((n + 6) * sizeof(C_word));
# ifdef __x86_64__
// XXX Shouldn't this check for C_SIXTY_FOUR in general?
buf = (void *)C_align16((C_uword)buf);
# endif
buf[ 0 ] = n + 2;
buf[ 1 ] = fn;
buf[ 2 ] = k;
C_memcpy(&buf[ 3 ], C_temporary_stack_limit, n * sizeof(C_word));
proc = (void *)C_block_item(fn, 0);
C_do_apply_hack(proc, buf, n + 3);
#else
C_do_apply(n, fn, k);
#endif
*/
void do_dispatch(void *data, int argc, function_type func, object clo, object *b) {
int *buf;
void *proc;
buf = alloca((argc + 6) * sizeof(object));
buf = (void *)((((unsigned int)buf) + 15) & ~15); // JAE - ????
buf[0] = data;
buf[1] = argc + 3;
buf[2] = clo;
memcpy(&buf[3], b, argc * sizeof(object));
proc = (void *)func;
C_do_apply_hack(proc, buf, argc + 3);
// switch(argc) {case 0:func(data,0,clo);
//case 1:func(data,1,clo,*(b+0));
//
// default:
// {
// char buf[1024];
// snprintf(buf, 1023, "Unhandled number of function arguments: %d\n", argc);
// Cyc_rt_raise_msg(data, buf);
// }
// }
}