on master help sign in
Add a new Closure type for raw data and have that be allocated

with idris_alloc.

commit610387c171e0b48e4a62656bce5913450a2ffc33 authorNiklas Larsson <niklas@mm.st> dateFri 10 Apr 2015, 10:12 (12 years ago) parent68d844c
3 files changed+20−2
rts/idris_gc.c+7 rts/idris_rts.c+11−1 rts/idris_rts.h+2−1
rts/idris_gc.c+7
@@ -53,6 +53,13 @@ VAL copy(VM* vm, VAL x) {
5353 break;
5454 case FWD:
5555 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;
5663 default:
5764 break;
5865 }
rts/idris_rts.c+11−1
@@ -143,7 +143,10 @@ int space(VM* vm, size_t size) {
143143}
144144
145145void* 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);
147150}
148151
149152void* idris_realloc(void* old, size_t old_size, size_t size) {
@@ -712,6 +715,13 @@ VAL doCopyTo(VM* vm, VAL x) {
712715 case BITS64:
713716 cl = idris_b64CopyForGC(vm, x);
714717 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;
715725 default:
716726 assert(0); // We're in trouble if this happens...
717727 }
rts/idris_rts.h+2−1
@@ -26,7 +26,7 @@
2626typedef enum {
2727 CON, INT, BIGINT, FLOAT, STRING, STROFFSET,
2828 BITS8, BITS16, BITS32, BITS64, UNIT, PTR, FWD,
29− MANAGEDPTR
29+ MANAGEDPTR, RAWDATA
3030} ClosureType;
3131
3232typedef struct Closure *VAL;
@@ -76,6 +76,7 @@ typedef struct Closure {
7676 __m128i* bits128p;
7777 Buffer* buf;
7878 ManagedPtr* mptr;
79+ size_t size;
7980 } info;
8081} Closure;
8182