mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-08 05:27:33 +02:00
WIP - "grayed" flag to indicate grayed stack object
This commit is contained in:
parent
9ded782a06
commit
c75c86f028
4 changed files with 33 additions and 15 deletions
|
@ -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]; \
|
||||
|
|
|
@ -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))
|
||||
|
|
16
runtime.c
16
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];
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue