|
|
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 |
{
|