@@ -828,12 +828,16 @@ VAL copyTo(VM* vm, VAL x) {
828 switch(GETTY(x)) {
828 switch(GETTY(x)) {
829 case CON:
829 case CON:
830 ar = CARITY(x);
830 ar = CARITY(x);
831+ if (ar == 0 && CTAG(x) < 256) { // globally allocated
831− allocCon(cl, vm, CTAG(x), ar, 1);
834+ allocCon(cl, vm, CTAG(x), ar, 1);
833− argptr = (VAL*)(cl->info.c.args);
836+ argptr = (VAL*)(cl->info.c.args);
834− for(i = 0; i < ar; ++i) {
837+ for(i = 0; i < ar; ++i) {
835− *argptr = copyTo(vm, *((VAL*)(x->info.c.args)+i)); // recursive version
838+ *argptr = copyTo(vm, *((VAL*)(x->info.c.args)+i)); // recursive version
836− argptr++;
839+ argptr++;
839 case FLOAT:
843 case FLOAT:
@@ -962,6 +966,29 @@ VAL idris_recvMessage(VM* vm) {
962 return msg;
966 return msg;
972+void initNullaries() {
975+ nullary_cons = malloc(256 * sizeof(VAL));
976+ for(i = 0; i < 256; ++i) {
977+ cl = malloc(sizeof(Closure));
979+ cl->info.c.tag_arity = i << 8;
980+ nullary_cons[i] = cl;
984+void freeNullaries() {
986+ for(i = 0; i < 256; ++i) {
987+ free(nullary_cons[i]);
965int __idris_argc;
992int __idris_argc;
966char **__idris_argv;
993char **__idris_argv;