@@ -107,6 +107,7 @@ void* allocate(VM* vm, size_t size, int outerlock) {
107107
108108}
109109
110+/* Now a macro
110111void* allocCon(VM* vm, int arity, int outer) {
111112 Closure* cl = allocate(vm, sizeof(Closure) + sizeof(VAL)*arity,
112113 outer);
@@ -117,6 +118,7 @@ void* allocCon(VM* vm, int arity, int outer) {
117118// printf("%p\n", cl);
118119 return (void*)cl;
119120}
121+*/
120122
121123VAL MKFLOAT(VM* vm, double val) {
122124 Closure* cl = allocate(vm, sizeof(Closure), 0);
@@ -166,25 +168,6 @@ VAL MKPTRc(VM* vm, void* ptr) {
166168 return cl;
167169}
168170
169−VAL MKCON(VM* vm, VAL cl, int tag, int arity, ...) {
170− int i;
171− va_list args;
172−
173− va_start(args, arity);
174−
175−// Closure* cl = allocCon(vm, arity);
176− cl -> info.c.tag = tag;
177− cl -> info.c.arity = arity;
178− // printf("... %p %p\n", cl, argptr);
179−
180− for (i = 0; i < arity; ++i) {
181− VAL v = va_arg(args, VAL);
182− cl->info.c.args[i] = v;
183− }
184− va_end(args);
185− return cl;
186−}
187−
188171void PROJECT(VM* vm, VAL r, int loc, int arity) {
189172 int i;
190173 for(i = 0; i < arity; ++i) {
@@ -223,8 +206,8 @@ void dumpVal(VAL v) {
223206 }
224207 switch(GETTY(v)) {
225208 case CON:
226− printf("%d[", v->info.c.tag);
227− for(i = 0; i < v->info.c.arity; ++i) {
209+ printf("%d[", TAG(v));
210+ for(i = 0; i < ARITY(v); ++i) {
228211 dumpVal(v->info.c.args[i]);
229212 }
230213 printf("] ");
@@ -432,7 +415,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
432415// VM is assumed to be a different vm from the one x lives on
433416
434417VAL copyTo(VM* vm, VAL x) {
435− int i;
418+ int i, ar;
436419 VAL* argptr;
437420 Closure* cl;
438421 if (x==NULL || ISINT(x)) {
@@ -440,12 +423,11 @@ VAL copyTo(VM* vm, VAL x) {
440423 }
441424 switch(GETTY(x)) {
442425 case CON:
443− cl = allocCon(vm, x->info.c.arity, 1);
444− cl->info.c.tag = x->info.c.tag;
445− cl->info.c.arity = x->info.c.arity;
426+ ar = CARITY(x);
427+ allocCon(cl, vm, CTAG(x), ar, 1);
446428
447429 argptr = (VAL*)(cl->info.c.args);
448− for(i = 0; i < x->info.c.arity; ++i) {
430+ for(i = 0; i < ar; ++i) {
449431 *argptr = copyTo(vm, *((VAL*)(x->info.c.args)+i)); // recursive version
450432 argptr++;
451433 }