summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2025-05-07 20:23:28 -0700
committerKaz Kylheku <kaz@kylheku.com>2025-05-07 20:23:28 -0700
commit7244151cb5f99614935ae02d2e0c0f71f4dff578 (patch)
treefd75ffe99dd1e66b71dc886098131f840dd4aabf
parent9a8da964a294feceda8ff5d5f81ecc4a4937cd02 (diff)
downloadtxr-7244151cb5f99614935ae02d2e0c0f71f4dff578.tar.gz
txr-7244151cb5f99614935ae02d2e0c0f71f4dff578.tar.bz2
txr-7244151cb5f99614935ae02d2e0c0f71f4dff578.zip
args: type check uses of dargs in places.
The DARG object type (dynamic args) is used in a few places. It has no safe accessors that do type checks and is directly accessed for efficiency. We need some modicum of safety when is is planted into the environment of functions, because those are mutable. * eval.c (do_args_apf, do_args_ipf, do_callf): type check the dargs object from the function to be DARG before accessing it. * struct.c (method_args_fun, umethod_args_fun): Likewise.
-rw-r--r--eval.c6
-rw-r--r--struct.c4
2 files changed, 5 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index e1515b2b..59e9f3b8 100644
--- a/eval.c
+++ b/eval.c
@@ -7061,7 +7061,7 @@ static val do_apf(val fun, varg args)
static val do_args_apf(val dargs, varg args)
{
val self = lit("apf");
- val fun = dargs->a.car;
+ val fun = (type_check(self, dargs, DARG), dargs->a.car);
varg da = dargs->a.args;
cnum da_nargs = da->fill + c_num(length(da->list), self);
args_decl(args_call, max(args->fill + da_nargs, ARGS_MIN));
@@ -7088,7 +7088,7 @@ static val do_ipf(val fun, varg args)
static val do_args_ipf(val dargs, varg args)
{
val self = lit("ipf");
- val fun = dargs->a.car;
+ val fun = (type_check(self, dargs, DARG), dargs->a.car);
varg da = dargs->a.args;
cnum da_nargs = da->fill + c_num(length(da->list), self);
args_decl(args_call, max(args->fill + da_nargs, ARGS_MIN));
@@ -7111,7 +7111,7 @@ static val ipf(val fun, varg args)
static val do_callf(val dargs, varg inargs)
{
val self = lit("callf");
- val func = dargs->a.car;
+ val func = (type_check(self, dargs, DARG), dargs->a.car);
varg funlist = dargs->a.args;
cnum funcount = args_count(funlist, self);
cnum inacount = args_count(inargs, self);
diff --git a/struct.c b/struct.c
index 6b8dde90..8122cf4e 100644
--- a/struct.c
+++ b/struct.c
@@ -1699,7 +1699,7 @@ static val method_fun(val env, varg args)
static val method_args_fun(val dargs, varg args)
{
val self = lit("method");
- varg da = dargs->a.args;
+ varg da = (type_check(self, dargs, DARG), dargs->a.args);
val fun = dargs->a.car;
val strct = dargs->a.cdr;
cnum da_nargs = da->fill + c_num(length(da->list), self);
@@ -1778,7 +1778,7 @@ static val umethod_fun(val sym, varg args)
static val umethod_args_fun(val dargs, varg args)
{
val self = lit("umethod");
- val sym = dargs->a.car;
+ val sym = (type_check(self, dargs, DARG), dargs->a.car);
varg da = dargs->a.args;
if (!args_more(args, 0)) {