on master help sign in
Fix reference to old heap in idris_concat
c79d4d3Edwin Brady
rts/idris_rts.c+10−4
@@ -460,6 +460,11 @@ void dumpVal(VAL v) {
460 case CT_STRING:
460 case CT_STRING:
461 printf("STR[%s]", v->info.str.str);
461 printf("STR[%s]", v->info.str.str);
462 break;
462 break;
463+ case CT_STROFFSET:
464+ printf("OFFSET[");
465+ dumpVal((VAL)(v->info.str_offset->str));
466+ printf("]");
467+ break;
463 case CT_FWD:
468 case CT_FWD:
464 printf("CT_FWD ");
469 printf("CT_FWD ");
465 dumpVal((VAL)(v->info.ptr));
470 dumpVal((VAL)(v->info.ptr));
@@ -591,15 +596,16 @@ VAL idris_castStrFloat(VM* vm, VAL i) {
591VAL idris_concat(VM* vm, VAL l, VAL r) {
596VAL idris_concat(VM* vm, VAL l, VAL r) {
592 char *rs = GETSTR(r);
597 char *rs = GETSTR(r);
593 char *ls = GETSTR(l);
598 char *ls = GETSTR(l);
594− // dumpVal(l);
599+ int llen = GETSTRLEN(l);
595− // printf("\n");
600+ int rlen = GETSTRLEN(r);
601+
596− Closure* cl = allocate(sizeof(Closure) + GETSTRLEN(l) + GETSTRLEN(r) + 1, 0);
602+ Closure* cl = allocate(sizeof(Closure) + llen + rlen + 1, 0);
597 SETTY(cl, CT_STRING);
603 SETTY(cl, CT_STRING);
598 cl->info.str.str = (char*)cl + sizeof(Closure);
604 cl->info.str.str = (char*)cl + sizeof(Closure);
599 strcpy(cl->info.str.str, ls);
605 strcpy(cl->info.str.str, ls);
600 strcat(cl->info.str.str, rs);
606 strcat(cl->info.str.str, rs);
601
607
602− cl->info.str.len = GETSTRLEN(l) + GETSTRLEN(r);
608+ cl->info.str.len = llen + rlen;
603 return cl;
609 return cl;
604}
610}
605
611