diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-05-24 21:28:54 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-05-24 21:28:54 -0700 |
commit | 0ee786a529ed1c10361965579958fff78834c502 (patch) | |
tree | 392392cb4162e5eea4c1e8d37747b335b9035976 | |
parent | a344fef1ec94ab38ab4b55d81919ef17758eb704 (diff) | |
download | txr-0ee786a529ed1c10361965579958fff78834c502.tar.gz txr-0ee786a529ed1c10361965579958fff78834c502.tar.bz2 txr-0ee786a529ed1c10361965579958fff78834c502.zip |
ffi: bugfix: gc issue affecting cptr and carray.
* ffi.c (ffi_type_compile): The problem here is using
make_ffi_type_builtin and then installing an eltype. That type
has no gc function that will mark tft->eltype, exposing
the eltype to premature reclamation. We must change these
to use make_ffi_type_pointer. That constructor takes the
element type too, so the code gets simplified.
-rw-r--r-- | ffi.c | 22 |
1 files changed, 7 insertions, 15 deletions
@@ -1784,22 +1784,14 @@ val ffi_type_compile(val syntax) return type; } else if (sym == cptr_s) { val tag = cadr(syntax); - val type = make_ffi_type_builtin(syntax, cptr_s, sizeof (mem_t *), - alignof (mem_t *), - &ffi_type_pointer, - ffi_cptr_put, ffi_cptr_get); - struct txr_ffi_type *tft = ffi_type_struct(type); - tft->eltype = tag; - return type; + return make_ffi_type_pointer(syntax, cptr_s, + ffi_cptr_put, ffi_cptr_get, + 0, 0, 0, tag); } else if (sym == carray_s) { - val element_type = ffi_type_compile(cadr(syntax)); - val type = make_ffi_type_builtin(syntax, carray_s, sizeof (mem_t *), - alignof (mem_t *), - &ffi_type_pointer, - ffi_carray_put, ffi_carray_get); - struct txr_ffi_type *tft = ffi_type_struct(type); - tft->eltype = element_type; - return type; + val eltype = ffi_type_compile(cadr(syntax)); + return make_ffi_type_pointer(syntax, carray_s, + ffi_carray_put, ffi_carray_get, + 0, 0, 0, eltype); } uw_throwf(error_s, lit("~a: unrecognized type operator: ~s"), self, sym, nao); |