Copy immutable fields

This commit is contained in:
Justin Ethier 2019-04-30 18:43:04 -04:00
parent 465167445f
commit 4bc8bf1899

5
gc.c
View file

@ -797,6 +797,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
case pair_tag:{ case pair_tag:{
list hp = dest; list hp = dest;
hp->hdr.mark = thd->gc_alloc_color; hp->hdr.mark = thd->gc_alloc_color;
hp->hdr.immutable = immutable(obj);
type_of(hp) = pair_tag; type_of(hp) = pair_tag;
car(hp) = car(obj); car(hp) = car(obj);
cdr(hp) = cdr(obj); cdr(hp) = cdr(obj);
@ -808,6 +809,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
s = ((char *)hp) + sizeof(string_type); s = ((char *)hp) + sizeof(string_type);
memcpy(s, string_str(obj), string_len(obj) + 1); memcpy(s, string_str(obj), string_len(obj) + 1);
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
immutable(hp) = immutable(obj);
type_of(hp) = string_tag; type_of(hp) = string_tag;
string_num_cp(hp) = string_num_cp(obj); string_num_cp(hp) = string_num_cp(obj);
string_len(hp) = string_len(obj); string_len(hp) = string_len(obj);
@ -824,6 +826,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
case vector_tag:{ case vector_tag:{
vector_type *hp = dest; vector_type *hp = dest;
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
immutable(hp) = immutable(obj);
type_of(hp) = vector_tag; type_of(hp) = vector_tag;
hp->num_elements = ((vector) obj)->num_elements; hp->num_elements = ((vector) obj)->num_elements;
hp->elements = (object *) (((char *)hp) + sizeof(vector_type)); hp->elements = (object *) (((char *)hp) + sizeof(vector_type));
@ -833,6 +836,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
case bytevector_tag:{ case bytevector_tag:{
bytevector_type *hp = dest; bytevector_type *hp = dest;
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
immutable(hp) = immutable(obj);
type_of(hp) = bytevector_tag; type_of(hp) = bytevector_tag;
hp->len = ((bytevector) obj)->len; hp->len = ((bytevector) obj)->len;
hp->data = (((char *)hp) + sizeof(bytevector_type)); hp->data = (((char *)hp) + sizeof(bytevector_type));
@ -911,6 +915,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
case c_opaque_tag:{ case c_opaque_tag:{
c_opaque_type *hp = dest; c_opaque_type *hp = dest;
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
immutable(hp) = immutable(obj);
type_of(hp) = c_opaque_tag; type_of(hp) = c_opaque_tag;
hp->ptr = ((c_opaque_type *) obj)->ptr; hp->ptr = ((c_opaque_type *) obj)->ptr;
return (char *)hp; return (char *)hp;