GC support for vectors

This commit is contained in:
Justin Ethier 2015-06-01 20:59:36 -04:00
parent e5e22d8277
commit 71dad6366f

View file

@ -1302,6 +1302,18 @@ char *transport(x, gcgen) char *x; int gcgen;
forward(x) = nx; type_of(x) = forward_tag; forward(x) = nx; type_of(x) = forward_tag;
x = (char *) nx; allocp = ((char *) nx)+sizeof(closureN_type) + sizeof(object) * nx->num_elt; x = (char *) nx; allocp = ((char *) nx)+sizeof(closureN_type) + sizeof(object) * nx->num_elt;
return (char *) nx;} return (char *) nx;}
case vector_tag:
{register vector_type nx = (vector) allocp;
int i;
type_of(nx) = vector_tag;
nx->num_elt = ((vector) x)->num_elt;
nx->elts = (object *)(((char *)nx) + sizeof(vector_type));
for (i = 0; i < nx->num_elt; i++) {
nx->elts[i] = ((vector) x)->elts[i];
}
forward(x) = nx; type_of(x) = forward_tag;
x = (char *) nx; allocp = ((char *) nx)+sizeof(vector_type) + sizeof(object) * nx->num_elt;
return (char *) nx;}
case string_tag: case string_tag:
{register string_type *nx = (string_type *) allocp; {register string_type *nx = (string_type *) allocp;
type_of(nx) = string_tag; type_of(nx) = string_tag;
@ -1428,6 +1440,7 @@ void GC_loop(int major, closure cont, object *ans, int num_ans)
// GC's of list/car-cdr from same generation // GC's of list/car-cdr from same generation
transp(car(o)); transp(car(o));
transp(cdr(o)); transp(cdr(o));
// TODO: } else if (type_of(o) == vector_tag) {
} else if (type_of(o) == forward_tag) { } else if (type_of(o) == forward_tag) {
// Already transported, skip // Already transported, skip
} else { } else {
@ -1497,6 +1510,17 @@ void GC_loop(int major, closure cont, object *ans, int num_ans)
scanp += sizeof(closureN_type) + sizeof(object) * n; scanp += sizeof(closureN_type) + sizeof(object) * n;
} }
break; break;
case vector_tag:
#if DEBUG_GC
printf("DEBUG transport vector \n");
#endif
{int i; int n = ((vector) scanp)->num_elt;
for (i = 0; i < n; i++) {
transp(((vector) scanp)->elts[i]);
}
scanp += sizeof(vector_type) + sizeof(object) * n;
}
break;
case string_tag: case string_tag:
#if DEBUG_GC #if DEBUG_GC
printf("DEBUG transport string \n"); printf("DEBUG transport string \n");