@@ -19,13 +19,13 @@ VAL copy(VM* vm, VAL x) {
20 case CT_BIGINT:
20 case CT_BIGINT:
21 cl = MKBIGMc(vm, GETMPZ(x));
21 cl = MKBIGMc(vm, GETMPZ(x));
23 case CT_CON:
23 case CT_CON:
24 ar = CARITY(x);
24 ar = CARITY(x);
25 if (ar == 0 && CTAG(x) < 256) {
25 if (ar == 0 && CTAG(x) < 256) {
28− // FALLTHROUGH
28+ // FALLTHROUGH
29 case CT_ARRAY:
29 case CT_ARRAY:
30 case CT_STRING:
30 case CT_STRING:
31 case CT_REF:
31 case CT_REF:
@@ -38,11 +38,8 @@ VAL copy(VM* vm, VAL x) {
38 case CT_BITS32:
38 case CT_BITS32:
39 case CT_BITS64:
39 case CT_BITS64:
40 case CT_RAWDATA:
40 case CT_RAWDATA:
43− cl = iallocate(vm, s->sz, 1);
41+ cl = iallocate(vm, x->hdr.sz, 1);
44− memcpy(cl, x, s->sz);
42+ memcpy(cl, x, x->hdr.sz);
48 cl = NULL;
45 cl = NULL;
@@ -60,26 +57,34 @@ void cheney(VM *vm) {
60 VAL heap_item = (VAL)scan;
57 VAL heap_item = (VAL)scan;
61 // If it's a CT_CON, CT_REF or CT_STROFFSET, copy its arguments
58 // If it's a CT_CON, CT_REF or CT_STROFFSET, copy its arguments
62 switch(GETTY(heap_item)) {
59 switch(GETTY(heap_item)) {
63− case CT_CON: {
60+ case CT_CON:
64− Con * c = (Con*)heap_item;
62+ Con * c = (Con*)heap_item;
65− size_t len = CARITY(c);
63+ size_t len = CARITY(c);
66− for(size_t i = 0; i < len; ++i)
64+ for(size_t i = 0; i < len; ++i)
67− c->args[i] = copy(vm, c->args[i]);
65+ c->args[i] = copy(vm, c->args[i]);
69− case CT_ARRAY: {
68+ case CT_ARRAY:
70− Array * a = (Array*)heap_item;
70+ Array * a = (Array*)heap_item;
71− size_t len = CELEM(a);
71+ size_t len = CELEM(a);
72− for(size_t i = 0; i < len; ++i)
72+ for(size_t i = 0; i < len; ++i)
73− a->array[i] = copy(vm, a->array[i]);
73+ a->array[i] = copy(vm, a->array[i]);
75− case CT_REF: {
76+ case CT_REF:
76− Ref * r = (Ref*)heap_item;
78+ Ref * r = (Ref*)heap_item;
77− r->ref = copy(vm, r->ref);
79+ r->ref = copy(vm, r->ref);
79− case CT_STROFFSET: {
82+ case CT_STROFFSET:
80− StrOffset * s = (StrOffset*)heap_item;
84+ StrOffset * s = (StrOffset*)heap_item;
81− s->base = (String*)copy(vm, (VAL)s->base);
85+ s->base = (String*)copy(vm, (VAL)s->base);
83 default: // Nothing to copy
88 default: // Nothing to copy