d87f6c9
--- src/language/eval.c
d87f6c9
+++ src/language/eval.c
d87f6c9
@@ -1079,11 +1079,11 @@
d87f6c9
         break;
d87f6c9
       }
d87f6c9
 
d87f6c9
-#define EVAL_f(f) \
d87f6c9
+#define EVAL_f0(f) f()
d87f6c9
+#define EVAL_f1(f) sp--; f(st[sp])
d87f6c9
+#define EVAL_fn(f) \
d87f6c9
   switch (ep->arity) \
d87f6c9
   { \
d87f6c9
-    case 0: f(); break; \
d87f6c9
-    case 1: sp--; f(st[sp]); break; \
d87f6c9
     case 2: sp-=2; f(st[sp],st[sp+1]); break; \
d87f6c9
     case 3: sp-=3; f(st[sp],st[sp+1],st[sp+2]); break; \
d87f6c9
     case 4: sp-=4; f(st[sp],st[sp+1],st[sp+2],st[sp+3]); break; \
d87f6c9
@@ -1114,7 +1114,12 @@
d87f6c9
         GEN res;
d87f6c9
         /* Macro Madness : evaluate function ep->value on arguments
d87f6c9
          * st[sp-ep->arity .. sp]. Set res = result. */
d87f6c9
-        EVAL_f(res = ((GEN (*)(ANYARG))ep->value));
d87f6c9
+        switch (ep->arity)
d87f6c9
+        {
d87f6c9
+          case 0:  EVAL_f0(res = ((GEN (*)(void))ep->value)); break;
d87f6c9
+          case 1:  EVAL_f1(res = ((GEN (*)(long))ep->value)); break;
d87f6c9
+          default: EVAL_fn(res = ((GEN (*)(long, ...))ep->value));
d87f6c9
+        }
d87f6c9
         if (br_status) goto endeval;
d87f6c9
         gel(st,sp++)=res;
d87f6c9
         break;
d87f6c9
@@ -1133,7 +1138,12 @@
d87f6c9
       {
d87f6c9
         entree *ep = (entree *)operand;
d87f6c9
         long res;
d87f6c9
-        EVAL_f(res = ((long (*)(ANYARG))ep->value));
d87f6c9
+        switch (ep->arity)
d87f6c9
+        {
d87f6c9
+          case 0:  EVAL_f0(res = ((long (*)(void))ep->value)); break;
d87f6c9
+          case 1:  EVAL_f1(res = ((long (*)(long))ep->value)); break;
d87f6c9
+          default: EVAL_fn(res = ((long (*)(long, ...))ep->value));
d87f6c9
+        }
d87f6c9
         if (br_status) goto endeval;
d87f6c9
         st[sp++] = res;
d87f6c9
         break;
d87f6c9
@@ -1142,7 +1152,12 @@
d87f6c9
       {
d87f6c9
         entree *ep = (entree *)operand;
d87f6c9
         long res;
d87f6c9
-        EVAL_f(res = ((int (*)(ANYARG))ep->value));
d87f6c9
+        switch (ep->arity)
d87f6c9
+        {
d87f6c9
+          case 0:  EVAL_f0(res = ((int (*)(void))ep->value)); break;
d87f6c9
+          case 1:  EVAL_f1(res = ((int (*)(long))ep->value)); break;
d87f6c9
+          default: EVAL_fn(res = ((int (*)(long, ...))ep->value));
d87f6c9
+        }
d87f6c9
         if (br_status) goto endeval;
d87f6c9
         st[sp++] = res;
d87f6c9
         break;
d87f6c9
@@ -1150,11 +1165,18 @@
d87f6c9
     case OCcallvoid:
d87f6c9
       {
d87f6c9
         entree *ep = (entree *)operand;
d87f6c9
-        EVAL_f(((void (*)(ANYARG))ep->value));
d87f6c9
+        switch (ep->arity)
d87f6c9
+        {
d87f6c9
+          case 0:  EVAL_f0(((void (*)(void))ep->value)); break;
d87f6c9
+          case 1:  EVAL_f1(((void (*)(long))ep->value)); break;
d87f6c9
+          default: EVAL_fn(((void (*)(long, ...))ep->value));
d87f6c9
+        }
d87f6c9
         if (br_status) goto endeval;
d87f6c9
         break;
d87f6c9
       }
d87f6c9
-#undef EVAL_f
d87f6c9
+#undef EVAL_f0
d87f6c9
+#undef EVAL_f1
d87f6c9
+#undef EVAL_fn
d87f6c9
 
d87f6c9
     case OCcalluser:
d87f6c9
       {