mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-15 08:47:35 +02:00
GC support for vectors
This commit is contained in:
parent
e5e22d8277
commit
71dad6366f
1 changed files with 24 additions and 0 deletions
24
runtime.c
24
runtime.c
|
@ -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");
|
||||||
|
|
Loading…
Add table
Reference in a new issue