@@ -222,9 +222,8 @@ void* allocate(size_t size, int outerlock) {
222 VM* vm = global_vm;
222 VM* vm = global_vm;
225− if ((size & 7)!=0) {
225+ size += 7;
226− size = 8 + ((size >> 3) << 3);
226+ size &= ~7;
229 size_t chunk_size = size + sizeof(size_t);
228 size_t chunk_size = size + sizeof(size_t);
@@ -260,10 +259,14 @@ void* allocate(size_t size, int outerlock) {
262+static size_t szMax(ssize_t a, ssize_t b) {
263+ return a > b? a : b;
263static Closure * allocStr(size_t len, int outer) {
266static Closure * allocStr(size_t len, int outer) {
267+ size_t sz = szMax(len + 1 - 8, 0);
264− Closure * cl = allocate(sizeof(*cl) + len + 1, outer);
268+ Closure * cl = allocate(sizeof(*cl) + sz, outer);
265 SETTY(cl, CT_STRING);
269 SETTY(cl, CT_STRING);
266− cl->info.str = cl->data;
267 cl->sz = len;
270 cl->sz = len;
268 return cl;
271 return cl;
@@ -290,16 +293,13 @@ VAL MKFLOAT(VM* vm, double val) {
291VAL MKSTRlen(VM* vm, const char * str, size_t len) {
294VAL MKSTRlen(VM* vm, const char * str, size_t len) {
292 Closure* cl = allocStr(len, 0);
295 Closure* cl = allocStr(len, 0);
294− memcpy(cl->info.str, str, len);
296+ memcpy(cl->info.str, str, len);
296− cl->info.str = NULL;
297+ cl->flag = str == NULL;
298 return cl;
298 return cl;
301VAL MKSTR(VM* vm, const char* str) {
301VAL MKSTR(VM* vm, const char* str) {
302− return MKSTRlen(vm, str, str? strlen(str) : ~0);
302+ return MKSTRlen(vm, str, str? strlen(str) : 0);
305char* GETSTROFF(VAL stroff) {
305char* GETSTROFF(VAL stroff) {
@@ -339,7 +339,7 @@ VAL MKPTR(VM* vm, void* ptr) {
339VAL MKMPTR(VM* vm, void* ptr, size_t size) {
339VAL MKMPTR(VM* vm, void* ptr, size_t size) {
340 Closure* cl = allocate(sizeof(Closure) + size, 0);
340 Closure* cl = allocate(sizeof(Closure) + size, 0);
341 SETTY(cl, CT_MANAGEDPTR);
341 SETTY(cl, CT_MANAGEDPTR);
342− memcpy(cl->info.managed_ptr, ptr, size);
342+ memcpy(cl->info.mptr, ptr, size);
343 cl->sz = size;
343 cl->sz = size;
344 return cl;
344 return cl;
@@ -351,7 +351,7 @@ VAL MKFLOATc(VM* vm, double val) {
351 return cl;
351 return cl;
354−VAL MKSTRclen(VM* vm, char* str, int len) {
354+VAL MKSTRclen(VM* vm, char* str, size_t len) {
355 Closure* cl = allocStr(len, 1);
355 Closure* cl = allocStr(len, 1);
356 memcpy(cl->info.str, str, len);
356 memcpy(cl->info.str, str, len);
357 return cl;
357 return cl;
@@ -371,7 +371,7 @@ VAL MKPTRc(VM* vm, void* ptr) {
371VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
371VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
372 Closure* cl = allocate(sizeof(Closure) + size, 1);
372 Closure* cl = allocate(sizeof(Closure) + size, 1);
373 SETTY(cl, CT_MANAGEDPTR);
373 SETTY(cl, CT_MANAGEDPTR);
374− memcpy(cl->info.managed_ptr, ptr, size);
374+ memcpy(cl->info.mptr, ptr, size);
375 cl->sz = size;
375 cl->sz = size;
376 return cl;
376 return cl;
@@ -567,8 +567,8 @@ VAL idris_castStrFloat(VM* vm, VAL i) {
567VAL idris_concat(VM* vm, VAL l, VAL r) {
567VAL idris_concat(VM* vm, VAL l, VAL r) {
568 char *rs = GETSTR(r);
568 char *rs = GETSTR(r);
569 char *ls = GETSTR(l);
569 char *ls = GETSTR(l);
570− int llen = GETSTRLEN(l);
570+ size_t llen = GETSTRLEN(l);
571− int rlen = GETSTRLEN(r);
571+ size_t rlen = GETSTRLEN(r);
573 Closure* cl = allocStr(llen + rlen, 0);
573 Closure* cl = allocStr(llen + rlen, 0);
574 memcpy(cl->info.str, ls, llen);
574 memcpy(cl->info.str, ls, llen);
@@ -677,7 +677,7 @@ VAL idris_strTail(VM* vm, VAL str) {
677VAL idris_strCons(VM* vm, VAL x, VAL xs) {
677VAL idris_strCons(VM* vm, VAL x, VAL xs) {
678 char *xstr = GETSTR(xs);
678 char *xstr = GETSTR(xs);
679 int xval = GETINT(x);
679 int xval = GETINT(x);
680− int xlen = GETSTRLEN(xs);
680+ size_t xlen = GETSTRLEN(xs);
682 if (xval < 0x80) { // ASCII char
682 if (xval < 0x80) { // ASCII char
683 Closure* cl = allocStr(xlen + 1, 0);
683 Closure* cl = allocStr(xlen + 1, 0);
@@ -702,8 +702,8 @@ VAL idris_strIndex(VM* vm, VAL str, VAL i) {
704VAL idris_substr(VM* vm, VAL offset, VAL length, VAL str) {
704VAL idris_substr(VM* vm, VAL offset, VAL length, VAL str) {
705− int offset_val = GETINT(offset);
705+ size_t offset_val = GETINT(offset);
706− int length_val = GETINT(length);
706+ size_t length_val = GETINT(length);
707 char* str_val = GETSTR(str);
707 char* str_val = GETSTR(str);
709 // If the substring is a suffix, use idris_strShift to avoid reallocating
709 // If the substring is a suffix, use idris_strShift to avoid reallocating
@@ -723,7 +723,7 @@ VAL idris_substr(VM* vm, VAL offset, VAL length, VAL str) {
724VAL idris_strRev(VM* vm, VAL str) {
724VAL idris_strRev(VM* vm, VAL str) {
725 char *xstr = GETSTR(str);
725 char *xstr = GETSTR(str);
726− int xlen = GETSTRLEN(str);
726+ size_t xlen = GETSTRLEN(str);
728 Closure* cl = allocStr(xlen, 0);
728 Closure* cl = allocStr(xlen, 0);
729 idris_utf8_rev(xstr, cl->info.str);
729 idris_utf8_rev(xstr, cl->info.str);
@@ -893,7 +893,7 @@ VAL doCopyTo(VM* vm, VAL x) {
893 cl = MKPTRc(vm, x->info.ptr);
893 cl = MKPTRc(vm, x->info.ptr);
895 case CT_MANAGEDPTR:
895 case CT_MANAGEDPTR:
896− cl = MKMPTRc(vm, x->info.managed_ptr, x->sz);
896+ cl = MKMPTRc(vm, x->info.mptr, x->sz);
898 case CT_CDATA:
898 case CT_CDATA:
899 cl = MKCDATAc(vm, x->info.c_heap_item);
899 cl = MKCDATAc(vm, x->info.c_heap_item);