diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 240abbaf..51392fc2 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -73,6 +73,7 @@ object Cyc_global_set(void *thd, object *glo, object value); tmp = arg_var; \ } \ var[i].hdr.mark = gc_color_red; \ + var[i].hdr.grayed = 0; \ var[i].tag = cons_tag; \ var[i].cons_car = tmp; \ var[i].cons_cdr = (i == (count-1)) ? nil : &var[i + 1]; \ diff --git a/include/cyclone/types.h b/include/cyclone/types.h index 3b6c85b6..9ca3af8b 100644 --- a/include/cyclone/types.h +++ b/include/cyclone/types.h @@ -260,7 +260,7 @@ typedef void (*function_type_va)(int, object, object, object, ...); /* Define C-variable integration type */ typedef struct {gc_header_type hdr; tag_type tag; object *pvar;} cvar_type; typedef cvar_type *cvar; -#define make_cvar(n,v) cvar_type n; n.hdr.mark = gc_color_red; n.tag = cvar_tag; n.pvar = v; +#define make_cvar(n,v) cvar_type n; n.hdr.mark = gc_color_red; n.hdr.grayed = 0; n.tag = cvar_tag; n.pvar = v; /* Define boolean type. */ typedef struct {gc_header_type hdr; const tag_type tag; const char *pname;} boolean_type; @@ -281,9 +281,9 @@ static object quote_##name = nil; /* Define numeric types */ typedef struct {gc_header_type hdr; tag_type tag; int value;} integer_type; -#define make_int(n,v) integer_type n; n.hdr.mark = gc_color_red; n.tag = integer_tag; n.value = v; +#define make_int(n,v) integer_type n; n.hdr.mark = gc_color_red; n.hdr.grayed = 0; n.tag = integer_tag; n.value = v; typedef struct {gc_header_type hdr; tag_type tag; double value;} double_type; -#define make_double(n,v) double_type n; n.hdr.mark = gc_color_red; n.tag = double_tag; n.value = v; +#define make_double(n,v) double_type n; n.hdr.mark = gc_color_red; n.hdr.grayed = 0; n.tag = double_tag; n.value = v; #define integer_value(x) (((integer_type *) x)->value) #define double_value(x) (((double_type *) x)->value) @@ -294,16 +294,16 @@ typedef struct {gc_header_type hdr; tag_type tag; int len; char *str;} string_ty //// all functions that allocate strings, the GC, cgen, and maybe more. //// Because these strings are (at least for now) allocaed on the stack. #define make_string(cs, s) string_type cs; \ -{ int len = strlen(s); cs.tag = string_tag; cs.len = len; cs.hdr.mark = gc_color_red; \ +{ int len = strlen(s); cs.tag = string_tag; cs.len = len; cs.hdr.mark = gc_color_red; n.hdr.grayed = 0; \ cs.str = alloca(sizeof(char) * (len + 1)); \ memcpy(cs.str, s, len + 1);} -#define make_string_with_len(cs, s, length) string_type cs; cs.hdr.mark = gc_color_red; \ +#define make_string_with_len(cs, s, length) string_type cs; cs.hdr.mark = gc_color_red; n.hdr.grayed = 0; \ { int len = length; \ cs.tag = string_tag; cs.len = len; \ cs.str = alloca(sizeof(char) * (len + 1)); \ memcpy(cs.str, s, len); \ cs.str[len] = '\0';} -#define make_string_noalloc(cs, s, length) string_type cs; cs.hdr.mark = gc_color_red; \ +#define make_string_noalloc(cs, s, length) string_type cs; cs.hdr.mark = gc_color_red; n.hdr.grayed = 0; \ { cs.tag = string_tag; cs.len = length; \ cs.str = s; } @@ -317,14 +317,14 @@ typedef struct {gc_header_type hdr; tag_type tag; int len; char *str;} string_ty // TODO: a simple wrapper around FILE may not be good enough long-term // TODO: how exactly mode will be used. need to know r/w, bin/txt typedef struct {gc_header_type hdr; tag_type tag; FILE *fp; int mode;} port_type; -#define make_port(p,f,m) port_type p; p.hdr.mark = gc_color_red; p.tag = port_tag; p.fp = f; p.mode = m; +#define make_port(p,f,m) port_type p; p.hdr.mark = gc_color_red; n.hdr.grayed = 0; p.tag = port_tag; p.fp = f; p.mode = m; /* Vector type */ typedef struct {gc_header_type hdr; tag_type tag; int num_elt; object *elts;} vector_type; typedef vector_type *vector; -#define make_empty_vector(v) vector_type v; v.hdr.mark = gc_color_red; v.tag = vector_tag; v.num_elt = 0; v.elts = NULL; +#define make_empty_vector(v) vector_type v; v.hdr.mark = gc_color_red; n.hdr.grayed = 0; v.tag = vector_tag; v.num_elt = 0; v.elts = NULL; /* Define cons type. */ @@ -363,7 +363,7 @@ typedef cons_type *list; #define cddddr(x) (cdr(cdr(cdr(cdr(x))))) #define make_cons(n,a,d) \ -cons_type n; n.hdr.mark = gc_color_red; n.tag = cons_tag; n.cons_car = a; n.cons_cdr = d; +cons_type n; n.hdr.mark = gc_color_red; n.hdr.grayed = 0; n.tag = cons_tag; n.cons_car = a; n.cons_cdr = d; /* Closure types */ @@ -384,15 +384,15 @@ typedef closureN_type *closureN; typedef closure0_type *closure; typedef closure0_type *macro; -#define mmacro(c,f) macro_type c; c.hdr.mark = gc_color_red; c.tag = macro_tag; c.fn = f; c.num_args = -1; -#define mclosure0(c,f) closure0_type c; c.hdr.mark = gc_color_red; c.tag = closure0_tag; c.fn = f; c.num_args = -1; -#define mclosure1(c,f,a) closure1_type c; c.hdr.mark = gc_color_red; c.tag = closure1_tag; \ +#define mmacro(c,f) macro_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = macro_tag; c.fn = f; c.num_args = -1; +#define mclosure0(c,f) closure0_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = closure0_tag; c.fn = f; c.num_args = -1; +#define mclosure1(c,f,a) closure1_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = closure1_tag; \ c.fn = f; c.num_args = -1; c.elt1 = a; -#define mclosure2(c,f,a1,a2) closure2_type c; c.hdr.mark = gc_color_red; c.tag = closure2_tag; \ +#define mclosure2(c,f,a1,a2) closure2_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = closure2_tag; \ c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2; -#define mclosure3(c,f,a1,a2,a3) closure3_type c; c.hdr.mark = gc_color_red; c.tag = closure3_tag; \ +#define mclosure3(c,f,a1,a2,a3) closure3_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = closure3_tag; \ c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3; -#define mclosure4(c,f,a1,a2,a3,a4) closure4_type c; c.hdr.mark = gc_color_red; c.tag = closure4_tag; \ +#define mclosure4(c,f,a1,a2,a3,a4) closure4_type c; c.hdr.mark = gc_color_red; n.hdr.grayed = 0; c.tag = closure4_tag; \ c.fn = f; c.num_args = -1; c.elt1 = a1; c.elt2 = a2; c.elt3 = a3; c.elt4 = a4; #define mlist1(e1) (mcons(e1,nil)) diff --git a/runtime.c b/runtime.c index 11ad7906..d1a60d20 100644 --- a/runtime.c +++ b/runtime.c @@ -942,11 +942,13 @@ common_type Cyc_string2number(void *data, object str){ if (ceilf(n) == n) { result.integer_t.hdr.mark = gc_color_red; + result.integer_t.hdr.grayed = 0; result.integer_t.tag = integer_tag; result.integer_t.value = (int)n; } else { result.double_t.hdr.mark = gc_color_red; + result.double_t.hdr.grayed = 0; result.double_t.tag = double_tag; result.double_t.value = n; } @@ -1129,6 +1131,7 @@ object Cyc_command_line_arguments(void *data, object cont) { make_string(s, _cyc_argv[i - 1]); memcpy(ps, &s, sizeof(string_type)); ((list)pl)->hdr.mark = gc_color_red; + ((list)pl)->hdr.grayed = 0; ((list)pl)->tag = cons_tag; ((list)pl)->cons_car = ps; ((list)pl)->cons_cdr = lis; @@ -1143,6 +1146,7 @@ object Cyc_make_vector(void *data, object cont, object len, object fill) { Cyc_check_int(data, len); v = alloca(sizeof(vector_type)); ((vector)v)->hdr.mark = gc_color_red; + ((vector)v)->hdr.grayed = 0; ((vector)v)->tag = vector_tag; ((vector)v)->num_elt = ((integer_type *)len)->value; ((vector)v)->elts = @@ -1165,6 +1169,7 @@ object Cyc_list2vector(void *data, object cont, object l) { len = Cyc_length(data, l); v = alloca(sizeof(vector_type)); ((vector)v)->hdr.mark = gc_color_red; + ((vector)v)->hdr.grayed = 0; ((vector)v)->tag = vector_tag; ((vector)v)->num_elt = len.value; ((vector)v)->elts = @@ -1223,6 +1228,7 @@ common_type FUNC_OP(void *data, object x, object y) { \ common_type s; \ int tx = type_of(x), ty = type_of(y); \ s.double_t.hdr.mark = gc_color_red; \ + s.double_t.hdr.grayed = 0; \ s.double_t.tag = double_tag; \ if (DIV && \ ((ty == integer_tag && integer_value(y) == 0) || \ @@ -1231,6 +1237,7 @@ common_type FUNC_OP(void *data, object x, object y) { \ } \ if (tx == integer_tag && ty == integer_tag) { \ s.integer_t.hdr.mark = gc_color_red; \ + s.integer_t.hdr.grayed = 0; \ s.integer_t.tag = integer_tag; \ s.integer_t.value = ((integer_type *)x)->value OP ((integer_type *)y)->value; \ } else if (tx == double_tag && ty == integer_tag) { \ @@ -1274,6 +1281,7 @@ common_type Cyc_num_op_va_list(void *data, int argc, common_type (fn_op(void *, int i; if (argc == 0) { sum.integer_t.hdr.mark = gc_color_red; + sum.integer_t.hdr.grayed = 0; sum.integer_t.tag = integer_tag; sum.integer_t.value = 0; return sum; @@ -1281,10 +1289,12 @@ common_type Cyc_num_op_va_list(void *data, int argc, common_type (fn_op(void *, if (type_of(n) == integer_tag) { sum.integer_t.hdr.mark = gc_color_red; + sum.integer_t.hdr.grayed = 0; sum.integer_t.tag = integer_tag; sum.integer_t.value = ((integer_type *)n)->value; } else if (type_of(n) == double_tag) { sum.double_t.hdr.mark = gc_color_red; + sum.double_t.hdr.grayed = 0; sum.double_t.tag = double_tag; sum.double_t.value = ((double_type *)n)->value; } else { @@ -1298,10 +1308,12 @@ common_type Cyc_num_op_va_list(void *data, int argc, common_type (fn_op(void *, common_type result = fn_op(data, &sum, va_arg(ns, object)); if (type_of(&result) == integer_tag) { sum.integer_t.hdr.mark = gc_color_red; + sum.integer_t.hdr.grayed = 0; sum.integer_t.tag = integer_tag; sum.integer_t.value = ((integer_type *) &result)->value; } else if (type_of(&result) == double_tag) { sum.double_t.hdr.mark = gc_color_red; + sum.double_t.hdr.grayed = 0; sum.double_t.tag = double_tag; sum.double_t.value = ((double_type *) &result)->value; } else { @@ -1454,12 +1466,14 @@ object Cyc_io_peek_char(void *data, object port) { list mcons(a,d) object a,d; {register cons_type *c = malloc(sizeof(cons_type)); c->hdr.mark = gc_color_red; + c->hdr.grayed = 0; c->tag = cons_tag; c->cons_car = a; c->cons_cdr = d; return c;} cvar_type *mcvar(object *var) { cvar_type *c = malloc(sizeof(cvar_type)); c->hdr.mark = gc_color_red; + c->hdr.grayed = 0; c->tag = cvar_tag; c->pvar = var; return c;} @@ -1955,6 +1969,7 @@ void Cyc_apply(void *data, int argc, closure cont, object prim, ...){ for (i = 0; i < argc; i++) { tmp = va_arg(ap, object); args[i].hdr.mark = gc_color_red; + args[i].hdr.grayed = 0; args[i].tag = cons_tag; args[i].cons_car = tmp; args[i].cons_cdr = (i == (argc-1)) ? nil : &args[i + 1]; @@ -1984,6 +1999,7 @@ void Cyc_apply_from_buf(void *data, int argc, object prim, object *buf) { for (i = 1; i < argc; i++) { args[i - 1].hdr.mark = gc_color_red; + args[i - 1].hdr.grayed = 0; args[i - 1].tag = cons_tag; args[i - 1].cons_car = buf[i]; args[i - 1].cons_cdr = (i == (argc-1)) ? nil : &args[i]; diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index 2c218a1d..50ca02ae 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -1087,6 +1087,7 @@ (string-append "closureN_type " cv-name ";\n" cv-name ".hdr.mark = gc_color_red;\n " + cv-name ".hdr.grayed = 0;\n" cv-name ".tag = closureN_tag;\n " cv-name ".fn = (function_type)__lambda_" (number->string lid) ";\n" cv-name ".num_args = " (number->string (compute-num-args lam)) ";\n"