@@ -828,12 +828,16 @@ VAL copyTo(VM* vm, VAL x) {
828828 switch(GETTY(x)) {
829829 case CON:
830830 ar = CARITY(x);
831− allocCon(cl, vm, CTAG(x), ar, 1);
832−
833− argptr = (VAL*)(cl->info.c.args);
834− for(i = 0; i < ar; ++i) {
835− *argptr = copyTo(vm, *((VAL*)(x->info.c.args)+i)); // recursive version
836− argptr++;
831+ if (ar == 0 && CTAG(x) < 256) { // globally allocated
832+ cl = x;
833+ } else {
834+ allocCon(cl, vm, CTAG(x), ar, 1);
835+
836+ argptr = (VAL*)(cl->info.c.args);
837+ for(i = 0; i < ar; ++i) {
838+ *argptr = copyTo(vm, *((VAL*)(x->info.c.args)+i)); // recursive version
839+ argptr++;
840+ }
837841 }
838842 break;
839843 case FLOAT:
@@ -962,6 +966,29 @@ VAL idris_recvMessage(VM* vm) {
962966 return msg;
963967}
964968#endif
969+
970+VAL* nullary_cons;
971+
972+void initNullaries() {
973+ int i;
974+ VAL cl;
975+ nullary_cons = malloc(256 * sizeof(VAL));
976+ for(i = 0; i < 256; ++i) {
977+ cl = malloc(sizeof(Closure));
978+ SETTY(cl, CON);
979+ cl->info.c.tag_arity = i << 8;
980+ nullary_cons[i] = cl;
981+ }
982+}
983+
984+void freeNullaries() {
985+ int i;
986+ for(i = 0; i < 256; ++i) {
987+ free(nullary_cons[i]);
988+ }
989+ free(nullary_cons);
990+}
991+
965992int __idris_argc;
966993char **__idris_argv;
967994