diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-06-29 06:45:28 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-06-29 06:45:28 -0700 |
commit | 7cb61818d24d0ba948172984d5cc676aab219de7 (patch) | |
tree | d179626eb20f41e9ae7af462a8b97313ecbf7829 /ffi.c | |
parent | 54563bdf9c33c75e69c1fdd3d99dea6eb7f4355a (diff) | |
download | txr-7cb61818d24d0ba948172984d5cc676aab219de7.tar.gz txr-7cb61818d24d0ba948172984d5cc676aab219de7.tar.bz2 txr-7cb61818d24d0ba948172984d5cc676aab219de7.zip |
ffi: make-union can initialize.
* ffi.c (make_union): Two arguments added. These
are optional.
(ffi_init): Update registration of make-union as
three-parameter function, with one required arg.
* ffi.h (make_union): Declaration updated.
* txr.1: Documented.
Diffstat (limited to 'ffi.c')
-rw-r--r-- | ffi.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -5270,11 +5270,20 @@ mem_t *union_get_ptr(val uni) return us->data; } -val make_union(val type) +val make_union(val type, val init, val memb) { + val self = lit("make-union"); struct txr_ffi_type *tft = ffi_type_struct_checked(type); mem_t *data = chk_calloc(1, tft->size); - return make_union_common(data, tft); + val uni = make_union_common(data, tft); + if (!missingp(init)) { + if (tft->nelem == 0) + uw_throwf(error_s, lit("~a: ~s cannot be initialized: no members"), + self, type, nao); + memb = default_arg(memb, tft->memb[0].mname); + union_put(uni, memb, init); + } + return uni; } val union_members(val uni) @@ -5455,7 +5464,7 @@ void ffi_init(void) reg_fun(intern(lit("num-carray"), user_package), func_n1(num_carray)); reg_fun(intern(lit("put-carray"), user_package), func_n3o(put_carray, 1)); reg_fun(intern(lit("fill-carray"), user_package), func_n3o(fill_carray, 1)); - reg_fun(intern(lit("make-union"), user_package), func_n1(make_union)); + reg_fun(intern(lit("make-union"), user_package), func_n3o(make_union, 1)); reg_fun(intern(lit("union-members"), user_package), func_n1(union_members)); reg_fun(intern(lit("union-get"), user_package), func_n2(union_get)); reg_fun(intern(lit("union-put"), user_package), func_n3(union_put)); |