on master help sign in
Add a new Closure type for raw data and have that be allocated
610387cNiklas Larsson
rts/idris_gc.c+7
@@ -53,6 +53,13 @@ VAL copy(VM* vm, VAL x) {
53 break;
53 break;
54 case FWD:
54 case FWD:
55 return x->info.ptr;
55 return x->info.ptr;
56+ case RAWDATA:
57+ {
58+ size_t size = x->info.size + sizeof(Closure);
59+ cl = allocate(size, 0);
60+ memcpy(cl, x, size);
61+ }
62+ break;
56 default:
63 default:
57 break;
64 break;
58 }
65 }
rts/idris_rts.c+11−1
@@ -143,7 +143,10 @@ int space(VM* vm, size_t size) {
143}
143}
144
144
145void* idris_alloc(size_t size) {
145void* idris_alloc(size_t size) {
146− return allocate(size, 0);
146+ Closure* cl = (Closure*) allocate(sizeof(Closure)+size, 0);
147+ SETTY(cl, RAWDATA);
148+ cl->info.size = size;
149+ return (void*)cl+sizeof(Closure);
147}
150}
148
151
149void* idris_realloc(void* old, size_t old_size, size_t size) {
152void* idris_realloc(void* old, size_t old_size, size_t size) {
@@ -712,6 +715,13 @@ VAL doCopyTo(VM* vm, VAL x) {
712 case BITS64:
715 case BITS64:
713 cl = idris_b64CopyForGC(vm, x);
716 cl = idris_b64CopyForGC(vm, x);
714 break;
717 break;
718+ case RAWDATA:
719+ {
720+ size_t size = x->info.size + sizeof(Closure);
721+ cl = allocate(size, 0);
722+ memcpy(cl, x, size);
723+ }
724+ break;
715 default:
725 default:
716 assert(0); // We're in trouble if this happens...
726 assert(0); // We're in trouble if this happens...
717 }
727 }
rts/idris_rts.h+2−1
@@ -26,7 +26,7 @@
26typedef enum {
26typedef enum {
27 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
27 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
28 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
28 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
29− MANAGEDPTR
29+ MANAGEDPTR, RAWDATA
30} ClosureType;
30} ClosureType;
31
31
32typedef struct Closure *VAL;
32typedef struct Closure *VAL;
@@ -76,6 +76,7 @@ typedef struct Closure {
76 __m128i* bits128p;
76 __m128i* bits128p;
77 Buffer* buf;
77 Buffer* buf;
78 ManagedPtr* mptr;
78 ManagedPtr* mptr;
79+ size_t size;
79 } info;
80 } info;
80} Closure;
81} Closure;
81
82