summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-02-24 08:01:17 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-02-24 08:01:17 -0800
commit423b56b353fd0de803d734613bc93372c0986a59 (patch)
tree9af94571d7911c82c17f75109cb0aaba0da3df22 /ffi.c
parent8604f52d07c4f58bad2c821f78855fa40bfa9780 (diff)
downloadtxr-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.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/ffi.c b/ffi.c
index 0b119486..9643ac87 100644
--- a/ffi.c
+++ b/ffi.c
@@ -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;
}