@@ -223,16 +223,15 @@ void* iallocate(VM * vm, size_t isize, int outerlock) {
223 STATS_ALLOC(vm->stats, size)
223 STATS_ALLOC(vm->stats, size)
224 char* ptr = vm->heap.next;
224 char* ptr = vm->heap.next;
225 vm->heap.next += size;
225 vm->heap.next += size;
227 assert(vm->heap.next <= vm->heap.end);
226 assert(vm->heap.next <= vm->heap.end);
229 memset(ptr, 0, size);
227 memset(ptr, 0, size);
228+ ((Hdr*)ptr)->sz = isize;
230#ifdef HAS_PTHREAD
230#ifdef HAS_PTHREAD
231 if (lock) { // not message passing
231 if (lock) { // not message passing
232 pthread_mutex_unlock(&vm->alloc_lock);
232 pthread_mutex_unlock(&vm->alloc_lock);
235− ((Hdr*)ptr)->sz = size;
236 return (void*)ptr;
235 return (void*)ptr;
238 // If we're trying to allocate something bigger than the heap,
237 // If we're trying to allocate something bigger than the heap,
@@ -258,22 +257,42 @@ static String * allocStr(VM * vm, size_t len, int outer) {
258 return cl;
257 return cl;
261−VAL MKFLOAT(VM* vm, double val) {
260+static VAL mkfloat(VM* vm, double val, int outer) {
262− Float * cl = iallocate(vm, sizeof(*cl), 0);
261+ Float * cl = iallocate(vm, sizeof(*cl), outer);
263 SETTY(cl, CT_FLOAT);
262 SETTY(cl, CT_FLOAT);
264 cl->f = val;
263 cl->f = val;
265 return (VAL)cl;
264 return (VAL)cl;
267+VAL MKFLOAT(VM* vm, double val) {
268+ return mkfloat(vm, val, 0);
271+VAL MKFLOATc(VM* vm, double val) {
272+ return mkfloat(vm, val, 1);
268−VAL MKSTRlen(VM* vm, const char * str, size_t len) {
275+static VAL mkstrlen(VM* vm, const char * str, size_t len, int outer) {
269− String * cl = allocStr(vm, len, 0);
276+ String * cl = allocStr(vm, len, outer);
270 memcpy(cl->str, str, len);
277 memcpy(cl->str, str, len);
271− cl->__null = str == NULL;
278+ cl->_null = str == NULL;
272 return (VAL)cl;
279 return (VAL)cl;
282+VAL MKSTRlen(VM* vm, const char * str, size_t len) {
283+ return mkstrlen(vm, str, len, 0);
286+VAL MKSTRclen(VM* vm, char* str, size_t len) {
287+ return mkstrlen(vm, str, len, 1);
275VAL MKSTR(VM* vm, const char* str) {
290VAL MKSTR(VM* vm, const char* str) {
276− return MKSTRlen(vm, str, str? strlen(str) : 0);
291+ return mkstrlen(vm, str, str? strlen(str) : 0, 0);
294+VAL MKSTRc(VM* vm, char* str) {
295+ return mkstrlen(vm, str, strlen(str), 1);
279static char * getstroff(StrOffset * stroff) {
298static char * getstroff(StrOffset * stroff) {
@@ -295,65 +314,50 @@ size_t GETSTROFFLEN(VAL stroff) {
295 return getstrofflen((StrOffset*)stroff);
314 return getstrofflen((StrOffset*)stroff);
298−VAL MKCDATA(VM* vm, CHeapItem * item) {
317+static VAL mkcdata(VM * vm, CHeapItem * item, int outer) {
299 c_heap_insert_if_needed(vm, &vm->c_heap, item);
318 c_heap_insert_if_needed(vm, &vm->c_heap, item);
300− CDataC * cl = iallocate(vm, sizeof(*cl), 0);
319+ CDataC * cl = iallocate(vm, sizeof(*cl), outer);
301 SETTY(cl, CT_CDATA);
320 SETTY(cl, CT_CDATA);
302 cl->item = item;
321 cl->item = item;
303 return (VAL)cl;
322 return (VAL)cl;
325+VAL MKCDATA(VM* vm, CHeapItem * item) {
326+ return mkcdata(vm, item, 0);
306VAL MKCDATAc(VM* vm, CHeapItem * item) {
329VAL MKCDATAc(VM* vm, CHeapItem * item) {
307− c_heap_insert_if_needed(vm, &vm->c_heap, item);
330+ return mkcdata(vm, item, 1);
308− CDataC * cl = iallocate(vm, sizeof(*cl), 1);
309− SETTY(cl, CT_CDATA);
314−VAL MKPTR(VM* vm, void* ptr) {
333+static VAL mkptr(VM* vm, void* ptr, int outer) {
315− Ptr * cl = iallocate(vm, sizeof(*cl), 0);
334+ Ptr * cl = iallocate(vm, sizeof(*cl), outer);
316 SETTY(cl, CT_PTR);
335 SETTY(cl, CT_PTR);
317 cl->ptr = ptr;
336 cl->ptr = ptr;
318 return (VAL)cl;
337 return (VAL)cl;
321−VAL MKMPTR(VM* vm, void* ptr, size_t size) {
340+VAL MKPTR(VM* vm, void* ptr) {
322− ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, 0);
341+ return mkptr(vm, ptr, 0);
323− SETTY(cl, CT_MANAGEDPTR);
324− memcpy(cl->mptr, ptr, size);
328−VAL MKFLOATc(VM* vm, double val) {
344+VAL MKPTRc(VM* vm, void* ptr) {
329− Float * cl = iallocate(vm, sizeof(*cl), 1);
345+ return mkptr(vm, ptr, 1);
330− SETTY(cl, CT_FLOAT);
335−VAL MKSTRclen(VM* vm, char* str, size_t len) {
348+VAL mkmptr(VM* vm, void* ptr, size_t size, int outer) {
336− String * cl = allocStr(vm, len, 1);
349+ ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, outer);
350+ SETTY(cl, CT_MANAGEDPTR);
337− memcpy(cl->str, str, len);
351+ memcpy(cl->mptr, ptr, size);
338 return (VAL)cl;
352 return (VAL)cl;
341−VAL MKSTRc(VM* vm, char* str) {
342− return MKSTRclen(vm, str, strlen(str));
345−VAL MKPTRc(VM* vm, void* ptr) {
355+VAL MKMPTR(VM* vm, void* ptr, size_t size) {
346− Ptr * cl = iallocate(vm, sizeof(*cl), 1);
356+ return mkmptr(vm, ptr, size, 0);
352VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
359VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
353− ManagedPtr * cl = iallocate(vm, sizeof(*cl) + size, 1);
360+ return mkmptr(vm, ptr, size, 1);
354− SETTY(cl, CT_MANAGEDPTR);
355− memcpy(cl->mptr, ptr, size);
359VAL MKB8(VM* vm, uint8_t bits8) {
363VAL MKB8(VM* vm, uint8_t bits8) {
@@ -1105,25 +1109,16 @@ char* idris_showerror(int err) {
1105 return strerror(err);
1109 return strerror(err);
1108−VAL* nullary_cons;
1112+Con nullary_cons[256];
1110void init_nullaries(void) {
1114void init_nullaries(void) {
1112− nullary_cons = malloc(256 * sizeof(VAL));
1113 for(i = 0; i < 256; ++i) {
1116 for(i = 0; i < 256; ++i) {
1117+ Con * cl = nullary_cons + i;
1114− Con * cl = calloc(1, sizeof(*cl));
1118+ cl->hdr.sz = sizeof(*cl);
1115 SETTY(cl, CT_CON);
1119 SETTY(cl, CT_CON);
1116 cl->tag = i;
1120 cl->tag = i;
1117− nullary_cons[i] = (VAL)cl;
1121−void free_nullaries(void) {
1123− for(i = 0; i < 256; ++i) {
1124− free(nullary_cons[i]);
1126− free(nullary_cons);
1129int __idris_argc;
1124int __idris_argc;