WIP, updating function calling conventions

This commit is contained in:
Justin Ethier 2021-02-16 22:42:36 -05:00
parent 2de1eb9e7f
commit d5ba874ae2
3 changed files with 30 additions and 32 deletions

View file

@ -248,10 +248,9 @@ object Cyc_set_cvar(object var, object value);
*/ */
/**@{*/ /**@{*/
object Cyc_display(void *data, object, FILE * port); object Cyc_display(void *data, object, FILE * port);
void dispatch_display_va(void *data, int argc, object clo, object cont, void dispatch_display_va(void *data, object clo, int argc, object *args);
object x, ...);
object Cyc_display_va(void *data, int argc, object x, ...); object Cyc_display_va(void *data, int argc, object x, ...);
object Cyc_display_va_list(void *data, int argc, object x, va_list ap); object Cyc_display_va_list(void *data, object x, object opts);
object Cyc_write_char(void *data, object c, object port); object Cyc_write_char(void *data, object c, object port);
object Cyc_write(void *data, object, FILE * port); object Cyc_write(void *data, object, FILE * port);
void dispatch_write_va(void *data, int argc, object clo, object cont, void dispatch_write_va(void *data, int argc, object clo, object cont,

View file

@ -1457,7 +1457,7 @@ typedef struct {
gc_header_type hdr; gc_header_type hdr;
tag_type tag; tag_type tag;
const char *desc; const char *desc;
function_type fn; primitive_function_type fn;
} primitive_type; } primitive_type;
typedef primitive_type *primitive; typedef primitive_type *primitive;

View file

@ -976,47 +976,40 @@ int double2buffer(char *buf, int buf_size, double num)
return i; return i;
} }
// TODO: need to change I/O functions (including display/write below) void dispatch_display_va(void *data, object cont, int argc, object *args)
// to accept an optional port arg. also, if port is not specified, should
// use (current-output-port) instead of stdout. will need to expose the
// (current-*port) functions somehow (tricky since we do not have param
// object yet) then figure out how to use them.
//
// If port is omitted from any output procedure, it defaults
// to the value returned by (current-output-port). It is an
// error to attempt an output operation on a closed port
//
void dispatch_display_va(void *data, int argc, object clo, object cont,
object x, ...)
{ {
object x = args[0];
object opts = boolean_f;
object result; object result;
va_list ap; if (argc > 1) {
va_start(ap, x); opts = args[1];
result = Cyc_display_va_list(data, argc - 1, x, ap); }
va_end(ap); result = Cyc_display_va_list(data, x, opts);
return_closcall1(data, cont, result); return_closcall1(data, cont, result);
} }
object Cyc_display_va(void *data, int argc, object x, ...) object Cyc_display_va(void *data, int argc, object x, ...)
{ {
object result; object result;
object opts = boolean_f;
va_list ap; va_list ap;
va_start(ap, x); va_start(ap, x);
result = Cyc_display_va_list(data, argc, x, ap); if (argc > 1) {
opts = va_arg(ap, object);
}
result = Cyc_display_va_list(data, x, opts);
va_end(ap); va_end(ap);
return result; return result;
} }
object Cyc_display_va_list(void *data, int argc, object x, va_list ap) object Cyc_display_va_list(void *data, object x, object opts)
{ {
FILE *fp = stdout; // TODO: just a placeholder, should use current-output-port FILE *fp = stdout;
if (argc > 1) { if (opts != boolean_f) {
object tmp; Cyc_check_port(data, opts);
tmp = va_arg(ap, object); fp = ((port_type *) opts)->fp;
Cyc_check_port(data, tmp);
fp = ((port_type *) tmp)->fp;
if (fp == NULL) { if (fp == NULL) {
Cyc_rt_raise2(data, "Unable to write to closed port: ", tmp); Cyc_rt_raise2(data, "Unable to write to closed port: ", opts);
return quote_void; return quote_void;
} }
} }
@ -5553,9 +5546,15 @@ void _display(void *data, object cont, object args)
Cyc_check_num_args(data, "display", 1, args); Cyc_check_num_args(data, "display", 1, args);
{ {
object argc = Cyc_length(data, args); object argc = Cyc_length(data, args);
dispatch(data, obj_obj2int(argc), (function_type) dispatch_display_va, cont, int c = obj_obj2int(argc);
cont, args); object buf[2];
}} buf[0] = car(args);
if (c > 1) {
buf[1] = cadr(args);
}
dispatch_display_va(data, cont, argc, buf);
}
}
void _call_95cc(void *data, object cont, object args) void _call_95cc(void *data, object cont, object args)
{ {