diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-04-30 08:53:45 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-04-30 08:53:45 -0700 |
commit | 310bc8183d5b3d794618ace3122f3aa2f16dc47a (patch) | |
tree | 3c1648fc5542c6bec72371c79061d20bb85c2ad8 | |
parent | dde97c714b4303f1fa715dae9adb1978afe8c8ef (diff) | |
download | txr-310bc8183d5b3d794618ace3122f3aa2f16dc47a.tar.gz txr-310bc8183d5b3d794618ace3122f3aa2f16dc47a.tar.bz2 txr-310bc8183d5b3d794618ace3122f3aa2f16dc47a.zip |
ffi: put function for str-d needed.
* ffi.c (ffi_str_d_put): New static function.
(ffi_type_compile): Use ffi_str_d_put for str-d instead of
ffi_str_put. The difference is that ffi_str_d_put doesn't
place the pointer into the rtvec[] array. Doing so is wrong
because this ttype of string has no reserved place in that
array, and no registered in handler to free it (which would
be wrong).
-rw-r--r-- | ffi.c | 17 |
1 files changed, 16 insertions, 1 deletions
@@ -633,6 +633,21 @@ static void ffi_str_put(struct txr_ffi_type *tft, val s, mem_t *dst, } } +static void ffi_str_d_put(struct txr_ffi_type *tft, val s, mem_t *dst, + mem_t *rtvec[], val self) +{ + (void) rtvec; + + if (s == nil) { + *coerce(const char **, dst) = 0; + } else { + const wchar_t *ws = c_str(s); + char *u8s = utf8_dup_to(ws); + *coerce(const char **, dst) = u8s; + } +} + + static val ffi_str_get(struct txr_ffi_type *tft, mem_t *src, val self) { (void) tft; @@ -1430,7 +1445,7 @@ val ffi_type_compile(val syntax) } else if (syntax == str_d_s) { val type = make_ffi_type_builtin(syntax, str_s, sizeof (mem_t *), &ffi_type_pointer, - ffi_str_put, ffi_str_d_get); + ffi_str_d_put, ffi_str_d_get); return type; } else if (syntax == wstr_s) { return make_ffi_type_builtin(syntax, str_s, sizeof (mem_t *), |