@@ -49,9 +49,8 @@ VM* init_vm(int stack_size, size_t heap_size,
4949 vm->ret = NULL;
5050 vm->reg1 = NULL;
5151#ifdef HAS_PTHREAD
52− vm->inbox = malloc(1024*sizeof(vm->inbox[0]));
53− assert(vm->inbox);
54− memset(vm->inbox, 0, 1024*sizeof(vm->inbox[0]));
52+ vm->inbox = malloc(1024*sizeof(VAL));
53+ memset(vm->inbox, 0, 1024*sizeof(VAL));
5554 vm->inbox_end = vm->inbox + 1024;
5655 vm->inbox_write = vm->inbox;
5756 vm->inbox_nextid = 1;
@@ -209,7 +208,7 @@ void * allocate(size_t sz, int lock) {
209208}
210209
211210void* iallocate(VM * vm, size_t isize, int outerlock) {
212−// return malloc(size);
211+// return malloc(isize);
213212 size_t size = aligned(isize);
214213
215214#ifdef HAS_PTHREAD
@@ -277,8 +276,7 @@ static VAL mkstrlen(VM* vm, const char * str, size_t len, int outer) {
277276 String * cl = allocStr(vm, len, outer);
278277 // hdr.u8 used to mark a null string
279278 cl->hdr.u8 = str == NULL;
280− if (!cl->hdr.u8)
281− memcpy(cl->str, str, len);
279+ memcpy(cl->str, str, len);
282280 return (VAL)cl;
283281}
284282
@@ -364,17 +362,11 @@ VAL MKMPTRc(VM* vm, void* ptr, size_t size) {
364362}
365363
366364VAL MKB8(VM* vm, uint8_t bits8) {
367− Bits8 * cl = iallocate(vm, sizeof(*cl), 1);
368− SETTY(cl, CT_BITS8);
369− cl->bits8 = bits8;
370− return (VAL)cl;
365+ return MKINT(bits8);
371366}
372367
373368VAL MKB16(VM* vm, uint16_t bits16) {
374− Bits16 * cl = iallocate(vm, sizeof(*cl), 1);
375− SETTY(cl, CT_BITS16);
376− cl->bits16 = bits16;
377− return (VAL)cl;
369+ return MKINT(bits16);
378370}
379371
380372VAL MKB32(VM* vm, uint32_t bits32) {
@@ -417,11 +409,10 @@ void dumpStack(VM* vm) {
417409void dumpVal(VAL v) {
418410 if (v==NULL) return;
419411 int i;
420− if (ISINT(v)) {
421− printf("%d ", (int)(GETINT(v)));
422− return;
423− }
424412 switch(GETTY(v)) {
413+ case CT_INT:
414+ printf("%d ", (int)(GETINT(v)));
415+ break;
425416 case CT_CON:
426417 {
427418 Con * cl = (Con*)v;
@@ -517,15 +508,10 @@ VAL idris_castBitsStr(VM* vm, VAL i) {
517508 ClosureType ty = GETTY(i);
518509
519510 switch (ty) {
520− case CT_BITS8:
521− // max length 8 bit unsigned int str 3 chars (256)
522− cl = allocStr(vm, 4, 0);
523− cl->slen = sprintf(cl->str, "%" PRIu8, GETBITS8(i));
524− break;
525− case CT_BITS16:
511+ case CT_INT: // 8/16 bits
526512 // max length 16 bit unsigned int str 5 chars (65,535)
527513 cl = allocStr(vm, 6, 0);
528− cl->slen = sprintf(cl->str, "%" PRIu16, GETBITS16(i));
514+ cl->slen = sprintf(cl->str, "%ld", GETBITS16(i));
529515 break;
530516 case CT_BITS32:
531517 // max length 32 bit unsigned int str 10 chars (4,294,967,295)
@@ -859,10 +845,12 @@ static void copyArray(VM* vm, VAL * dst, VAL * src, size_t len) {
859845static VAL doCopyTo(VM* vm, VAL x) {
860846 int ar;
861847 VAL cl;
862− if (x==NULL || ISINT(x)) {
848+ if (x==NULL) {
863849 return x;
864850 }
865851 switch(GETTY(x)) {
852+ case CT_INT:
853+ return x;
866854 case CT_CDATA:
867855 cl = MKCDATAc(vm, GETCDATA(x));
868856 break;
@@ -889,8 +877,6 @@ static VAL doCopyTo(VM* vm, VAL x) {
889877 case CT_FLOAT:
890878 case CT_PTR:
891879 case CT_MANAGEDPTR:
892− case CT_BITS8:
893− case CT_BITS16:
894880 case CT_BITS32:
895881 case CT_BITS64:
896882 case CT_RAWDATA:
@@ -901,6 +887,7 @@ static VAL doCopyTo(VM* vm, VAL x) {
901887 break;
902888 default:
903889 assert(0); // We're in trouble if this happens...
890+ cl = NULL;
904891 }
905892 return cl;
906893}
@@ -978,7 +965,7 @@ Msg* idris_checkInitMessages(VM* vm) {
978965 Msg* msg;
979966
980967 for (msg = vm->inbox; msg < vm->inbox_end && msg->msg != NULL; ++msg) {
981− if ((msg->channel_id & 1) == 1) { // init bit set
968+ if (msg->channel_id && 1 == 1) { // init bit set
982969 return msg;
983970 }
984971 }
@@ -1041,7 +1028,7 @@ Msg* idris_recvMessage(VM* vm) {
10411028
10421029Msg* idris_recvMessageFrom(VM* vm, int channel_id, VM* sender) {
10431030 Msg* msg;
1044− Msg* ret = malloc(sizeof(Msg));
1031+ Msg* ret;
10451032
10461033 struct timespec timeout;
10471034 int status;
@@ -1064,34 +1051,35 @@ Msg* idris_recvMessageFrom(VM* vm, int channel_id, VM* sender) {
10641051 }
10651052 pthread_mutex_unlock(&vm->inbox_block);
10661053
1067− if (msg != NULL) {
1068− ret->msg = msg->msg;
1069− ret->sender = msg->sender;
1070−
1071− pthread_mutex_lock(&(vm->inbox_lock));
1054+ if (msg == NULL) {
1055+ fprintf(stderr, "No messages waiting");
1056+ exit(-1);
1057+ }
10721058
1073− // Slide everything down after the message in the inbox,
1074− // Move the inbox_write pointer down, and clear the value at the
1075− // end - O(n) but it's easier since the message from a specific
1076− // sender could be anywhere in the inbox
1059+ ret = malloc(sizeof(Msg));
1060+ ret->msg = msg->msg;
1061+ ret->sender = msg->sender;
10771062
1078− for(;msg < vm->inbox_write; ++msg) {
1079− if (msg+1 != vm->inbox_end) {
1080− msg->sender = (msg + 1)->sender;
1081− msg->msg = (msg + 1)->msg;
1082− }
1083− }
1063+ pthread_mutex_lock(&(vm->inbox_lock));
10841064
1085− vm->inbox_write->msg = NULL;
1086− vm->inbox_write->sender = NULL;
1087− vm->inbox_write--;
1065+ // Slide everything down after the message in the inbox,
1066+ // Move the inbox_write pointer down, and clear the value at the
1067+ // end - O(n) but it's easier since the message from a specific
1068+ // sender could be anywhere in the inbox
10881069
1089− pthread_mutex_unlock(&(vm->inbox_lock));
1090− } else {
1091− fprintf(stderr, "No messages waiting");
1092− exit(-1);
1070+ for(;msg < vm->inbox_write; ++msg) {
1071+ if (msg+1 != vm->inbox_end) {
1072+ msg->sender = (msg + 1)->sender;
1073+ msg->msg = (msg + 1)->msg;
1074+ }
10931075 }
10941076
1077+ vm->inbox_write->msg = NULL;
1078+ vm->inbox_write->sender = NULL;
1079+ vm->inbox_write--;
1080+
1081+ pthread_mutex_unlock(&(vm->inbox_lock));
1082+
10951083 return ret;
10961084}
10971085#endif