diff --git a/gc.c b/gc.c index 6f58fdd6..170c6438 100644 --- a/gc.c +++ b/gc.c @@ -347,6 +347,13 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data *thd) hp->pvar = ((cvar_type *) obj)->pvar; return (char *)hp; } + case c_opaque_tag: { + c_opaque_type *hp = dest; + mark(hp) = thd->gc_alloc_color; + type_of(hp) = c_opaque_tag; + hp->ptr = ((c_opaque_type *) obj)->ptr; + return (char *)hp; + } case mutex_tag: { mutex_type *hp = dest; mark(hp) = thd->gc_alloc_color; @@ -527,6 +534,7 @@ size_t gc_allocated_bytes(object obj, gc_free_list *q, gc_free_list *r) if (t == double_tag) return gc_heap_align(sizeof(double_type)); if (t == port_tag) return gc_heap_align(sizeof(port_type)); if (t == cvar_tag) return gc_heap_align(sizeof(cvar_type)); + if (t == c_opaque_tag) return gc_heap_align(sizeof(c_opaque_type)); if (t == mutex_tag) return gc_heap_align(sizeof(mutex_type)); if (t == cond_var_tag) return gc_heap_align(sizeof(cond_var_type)); diff --git a/runtime.c b/runtime.c index ed238a24..2375e799 100644 --- a/runtime.c +++ b/runtime.c @@ -2831,9 +2831,12 @@ char *gc_move(char *obj, gc_thread_data *thd, int *alloci, int *heap_grown) { cvar_type *hp = gc_alloc(Cyc_heap, sizeof(cvar_type), obj, thd, heap_grown); return gc_fixup_moved_obj(thd, alloci, obj, hp); } + case c_opaque_tag: { + c_opaque_type *hp = gc_alloc(Cyc_heap, sizeof(c_opaque_type), obj, thd, heap_grown); + return gc_fixup_moved_obj(thd, alloci, obj, hp); + } case forward_tag: return (char *)forward(obj); - case c_opaque_tag: break; case eof_tag: break; case primitive_tag: break; case boolean_tag: break; @@ -2965,9 +2968,9 @@ int gc_minor(void *data, object low_limit, object high_limit, closure cont, obje case double_tag: case port_tag: case cvar_tag: + case c_opaque_tag: break; // These types are not heap-allocated - case c_opaque_tag: case eof_tag: case primitive_tag: case symbol_tag: