diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-02-24 08:01:17 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-02-24 08:01:17 -0800 |
commit | 423b56b353fd0de803d734613bc93372c0986a59 (patch) | |
tree | 9af94571d7911c82c17f75109cb0aaba0da3df22 /ffi.c | |
parent | 8604f52d07c4f58bad2c821f78855fa40bfa9780 (diff) | |
download | txr-423b56b353fd0de803d734613bc93372c0986a59.tar.gz txr-423b56b353fd0de803d734613bc93372c0986a59.tar.bz2 txr-423b56b353fd0de803d734613bc93372c0986a59.zip |
ffi: gc bug in enum type.
* ffi.c (make_ffi_type_enum): Allocate the sym_num an num_sym
hashes before the type object. That ensures they are older,
and may be assigned into the object without setcheck.
Also, move those assignments earlier, before the loop which
populates the hashes.
Diffstat (limited to 'ffi.c')
-rw-r--r-- | ffi.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -3013,14 +3013,14 @@ static val make_ffi_type_enum(val syntax, val enums, chk_calloc(1, sizeof *tft)); struct txr_ffi_type *btft = ffi_type_struct(base_type); + val sym_num = make_hash(nil, nil, t); + val num_sym = make_hash(nil, nil, nil); val obj = cobj(coerce(mem_t *, tft), ffi_type_s, &ffi_type_enum_ops); cnum lowest = INT_PTR_MAX; cnum highest = INT_PTR_MIN - 1; cnum cur = -1; ucnum count = 0; val iter; - val sym_num = make_hash(nil, nil, t); - val num_sym = make_hash(nil, nil, nil); val enum_env = make_env(nil, nil, nil); val shadow_menv = make_env(nil, nil, nil); @@ -3041,6 +3041,9 @@ static val make_ffi_type_enum(val syntax, val enums, tft->free = btft->free; tft->eltype = base_type; + tft->num_sym = num_sym; + tft->sym_num = sym_num; + for (iter = enums; !endp(iter); iter = cdr(iter), count++) { val en = car(iter); val nn; @@ -3092,9 +3095,6 @@ static val make_ffi_type_enum(val syntax, val enums, } } - tft->num_sym = num_sym; - tft->sym_num = sym_num; - return obj; } |