summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-12-16 04:21:55 -0800
committerKaz Kylheku <kaz@kylheku.com>2015-12-16 04:21:55 -0800
commitb860fe2ea8450109c4bcc0de755bccac40f377ef (patch)
tree38bcf0e084502ff2a676a3441d57d753f360f425
parent9bd8fabc9f45dbdb7c66c44f255904ab62df4ee3 (diff)
downloadtxr-b860fe2ea8450109c4bcc0de755bccac40f377ef.tar.gz
txr-b860fe2ea8450109c4bcc0de755bccac40f377ef.tar.bz2
txr-b860fe2ea8450109c4bcc0de755bccac40f377ef.zip
Support eight-argument intrinsic functions.
* lib.h (enum functype): New member, N8. (struct func): New members n8 and n8v in embedded f struct. (func_n8, func_n8v, func_n70, func_n8o): Declared. * lib.c (equal): Handle N8 in switch. (func_n8, func_n8v, func_n70, func_n8o): New functions. (generic_funcall): Handle N8 in two switches.
-rw-r--r--lib.c46
-rw-r--r--lib.h8
2 files changed, 53 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index 6041a11e..c87c2360 100644
--- a/lib.c
+++ b/lib.c
@@ -2139,6 +2139,7 @@ val equal(val left, val right)
case N5: return (left->f.f.n5 == right->f.f.n5) ? t : nil;
case N6: return (left->f.f.n6 == right->f.f.n6) ? t : nil;
case N7: return (left->f.f.n7 == right->f.f.n7) ? t : nil;
+ case N8: return (left->f.f.n8 == right->f.f.n8) ? t : nil;
}
return nil;
}
@@ -4526,6 +4527,20 @@ val func_n7(val (*fun)(val, val, val, val, val, val, val))
return obj;
}
+val func_n8(val (*fun)(val, val, val, val, val, val, val, val))
+{
+ val obj = make_obj();
+ obj->f.type = FUN;
+ obj->f.functype = N8;
+ obj->f.env = nil;
+ obj->f.f.n8 = fun;
+ obj->f.variadic = 0;
+ obj->f.fixparam = 8;
+ obj->f.optargs = 0;
+ return obj;
+}
+
+
val func_f0v(val env, val (*fun)(val, varg))
{
val obj = make_obj();
@@ -4695,6 +4710,19 @@ val func_n7v(val (*fun)(val, val, val, val, val, val, val, varg))
return obj;
}
+val func_n8v(val (*fun)(val, val, val, val, val, val, val, val, varg))
+{
+ val obj = make_obj();
+ obj->f.type = FUN;
+ obj->f.functype = N8;
+ obj->f.env = nil;
+ obj->f.f.n8v = fun;
+ obj->f.variadic = 1;
+ obj->f.fixparam = 8;
+ obj->f.optargs = 0;
+ return obj;
+}
+
val func_n1o(val (*fun)(val), int reqargs)
{
val obj = func_n1(fun);
@@ -4737,6 +4765,20 @@ val func_n6o(val (*fun)(val, val, val, val, val, val), int reqargs)
return obj;
}
+val func_n7o(val (*fun)(val, val, val, val, val, val, val), int reqargs)
+{
+ val obj = func_n7(fun);
+ obj->f.optargs = 7 - reqargs;
+ return obj;
+}
+
+val func_n8o(val (*fun)(val, val, val, val, val, val, val, val), int reqargs)
+{
+ val obj = func_n8(fun);
+ obj->f.optargs = 8 - reqargs;
+ return obj;
+}
+
val func_n1ov(val (*fun)(val, varg), int reqargs)
{
val obj = func_n1v(fun);
@@ -4936,6 +4978,8 @@ val generic_funcall(val fun, struct args *args_in)
return fun->f.f.n6(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]));
case N7:
return fun->f.f.n7(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]), z(arg[6]));
+ case N8:
+ return fun->f.f.n8(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]), z(arg[6]), z(arg[7]));
case FINTERP:
internal_error("unsupported function type");
}
@@ -4986,6 +5030,8 @@ val generic_funcall(val fun, struct args *args_in)
return fun->f.f.n6v(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]), args);
case N7:
return fun->f.f.n7v(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]), z(arg[6]), args);
+ case N8:
+ return fun->f.f.n8v(z(arg[0]), z(arg[1]), z(arg[2]), z(arg[3]), z(arg[4]), z(arg[5]), z(arg[6]), z(arg[7]), args);
}
}
diff --git a/lib.h b/lib.h
index 80412c29..76274535 100644
--- a/lib.h
+++ b/lib.h
@@ -69,7 +69,7 @@ typedef enum functype
{
FINTERP, /* Interpreted function. */
F0, F1, F2, F3, F4, /* Intrinsic functions with env. */
- N0, N1, N2, N3, N4, N5, N6, N7 /* No-env intrinsics. */
+ N0, N1, N2, N3, N4, N5, N6, N7, N8 /* No-env intrinsics. */
} functype_t;
typedef union obj obj_t;
@@ -152,6 +152,7 @@ struct func {
val (*n5)(val, val, val, val, val);
val (*n6)(val, val, val, val, val, val);
val (*n7)(val, val, val, val, val, val, val);
+ val (*n8)(val, val, val, val, val, val, val, val);
val (*f0v)(val, varg);
val (*f1v)(val, val, varg);
val (*f2v)(val, val, val, varg);
@@ -165,6 +166,7 @@ struct func {
val (*n5v)(val, val, val, val, val, varg);
val (*n6v)(val, val, val, val, val, val, varg);
val (*n7v)(val, val, val, val, val, val, val, varg);
+ val (*n8v)(val, val, val, val, val, val, val, val, varg);
} f;
};
@@ -764,6 +766,7 @@ val func_n4(val (*fun)(val, val, val, val));
val func_n5(val (*fun)(val, val, val, val, val));
val func_n6(val (*fun)(val, val, val, val, val, val));
val func_n7(val (*fun)(val, val, val, val, val, val, val));
+val func_n8(val (*fun)(val, val, val, val, val, val, val, val));
val func_f0v(val, val (*fun)(val env, varg));
val func_f1v(val, val (*fun)(val env, val, varg));
val func_f2v(val, val (*fun)(val env, val, val, varg));
@@ -777,12 +780,15 @@ val func_n4v(val (*fun)(val, val, val, val, varg));
val func_n5v(val (*fun)(val, val, val, val, val, varg));
val func_n6v(val (*fun)(val, val, val, val, val, val, varg));
val func_n7v(val (*fun)(val, val, val, val, val, val, val, varg));
+val func_n8v(val (*fun)(val, val, val, val, val, val, val, val, varg));
val func_n1o(val (*fun)(val), int reqargs);
val func_n2o(val (*fun)(val, val), int reqargs);
val func_n3o(val (*fun)(val, val, val), int reqargs);
val func_n4o(val (*fun)(val, val, val, val), int reqargs);
val func_n5o(val (*fun)(val, val, val, val, val), int reqargs);
val func_n6o(val (*fun)(val, val, val, val, val, val), int reqargs);
+val func_n7o(val (*fun)(val, val, val, val, val, val, val), int reqargs);
+val func_n8o(val (*fun)(val, val, val, val, val, val, val, val), int reqargs);
val func_n1ov(val (*fun)(val, varg), int reqargs);
val func_n2ov(val (*fun)(val, val, varg), int reqargs);
val func_n3ov(val (*fun)(val, val, val, varg), int reqargs);