@@ -19,13 +19,13 @@ VAL copy(VM* vm, VAL x) {
1919 break;
2020 case CT_BIGINT:
2121 cl = MKBIGMc(vm, GETMPZ(x));
22− break;
22+ break;
2323 case CT_CON:
2424 ar = CARITY(x);
2525 if (ar == 0 && CTAG(x) < 256) {
2626 return x;
2727 }
28− // FALLTHROUGH
28+ // FALLTHROUGH
2929 case CT_ARRAY:
3030 case CT_STRING:
3131 case CT_REF:
@@ -38,11 +38,8 @@ VAL copy(VM* vm, VAL x) {
3838 case CT_BITS32:
3939 case CT_BITS64:
4040 case CT_RAWDATA:
41− {
42− Hdr * s = (Hdr*)x;
43− cl = iallocate(vm, s->sz, 1);
44− memcpy(cl, x, s->sz);
45− }
41+ cl = iallocate(vm, x->hdr.sz, 1);
42+ memcpy(cl, x, x->hdr.sz);
4643 break;
4744 default:
4845 cl = NULL;
@@ -60,26 +57,34 @@ void cheney(VM *vm) {
6057 VAL heap_item = (VAL)scan;
6158 // If it's a CT_CON, CT_REF or CT_STROFFSET, copy its arguments
6259 switch(GETTY(heap_item)) {
63− case CT_CON: {
64− Con * c = (Con*)heap_item;
65− size_t len = CARITY(c);
66− for(size_t i = 0; i < len; ++i)
67− c->args[i] = copy(vm, c->args[i]);
68− } break;
69− case CT_ARRAY: {
70− Array * a = (Array*)heap_item;
71− size_t len = CELEM(a);
72− for(size_t i = 0; i < len; ++i)
73− a->array[i] = copy(vm, a->array[i]);
74− } break;
75− case CT_REF: {
76− Ref * r = (Ref*)heap_item;
77− r->ref = copy(vm, r->ref);
78− } break;
79− case CT_STROFFSET: {
80− StrOffset * s = (StrOffset*)heap_item;
81− s->base = (String*)copy(vm, (VAL)s->base);
82− } break;
60+ case CT_CON:
61+ {
62+ Con * c = (Con*)heap_item;
63+ size_t len = CARITY(c);
64+ for(size_t i = 0; i < len; ++i)
65+ c->args[i] = copy(vm, c->args[i]);
66+ }
67+ break;
68+ case CT_ARRAY:
69+ {
70+ Array * a = (Array*)heap_item;
71+ size_t len = CELEM(a);
72+ for(size_t i = 0; i < len; ++i)
73+ a->array[i] = copy(vm, a->array[i]);
74+ }
75+ break;
76+ case CT_REF:
77+ {
78+ Ref * r = (Ref*)heap_item;
79+ r->ref = copy(vm, r->ref);
80+ }
81+ break;
82+ case CT_STROFFSET:
83+ {
84+ StrOffset * s = (StrOffset*)heap_item;
85+ s->base = (String*)copy(vm, (VAL)s->base);
86+ }
87+ break;
8388 default: // Nothing to copy
8489 break;
8590 }