diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2025-05-07 20:23:28 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2025-05-07 20:23:28 -0700 |
commit | 7244151cb5f99614935ae02d2e0c0f71f4dff578 (patch) | |
tree | fd75ffe99dd1e66b71dc886098131f840dd4aabf | |
parent | 9a8da964a294feceda8ff5d5f81ecc4a4937cd02 (diff) | |
download | txr-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.c | 6 | ||||
-rw-r--r-- | struct.c | 4 |
2 files changed, 5 insertions, 5 deletions
@@ -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); @@ -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)) { |