Fix issues with garbage collection.
* Refs became atoms to make sure they can live across calls
to the NIF functions.
* Initialized curr in decode so that I'm no longer pushing
random values into the Erlang VM.
diff --git a/c_src/decoder.c b/c_src/decoder.c
index 16effd6..9822d66 100644
--- a/c_src/decoder.c
+++ b/c_src/decoder.c
@@ -633,7 +633,7 @@
ErlNifBinary bin;
ERL_NIF_TERM objs = enif_make_list(env, 0);
- ERL_NIF_TERM curr;
+ ERL_NIF_TERM curr = enif_make_list(env, 0);
ERL_NIF_TERM val;
ERL_NIF_TERM ret;
diff --git a/c_src/encoder.c b/c_src/encoder.c
index 37dc822..1238cd7 100644
--- a/c_src/encoder.c
+++ b/c_src/encoder.c
@@ -364,7 +364,7 @@
return enif_make_badarg(env);
}
- stack = enif_make_list1(env, argv[0]);
+ stack = enif_make_list(env, 1, argv[0]);
while(!enif_is_empty_list(env, stack)) {
if(!enif_get_list_cell(env, stack, &curr, &stack)) {
diff --git a/c_src/jiffy.c b/c_src/jiffy.c
index 13e2979..fd67e62 100644
--- a/c_src/jiffy.c
+++ b/c_src/jiffy.c
@@ -15,8 +15,9 @@
st->atom_false = make_atom(env, "false");
st->atom_bignum = make_atom(env, "bignum");
- st->ref_object = enif_make_ref(env);
- st->ref_array = enif_make_ref(env);
+ // Markers used in encoding
+ st->ref_object = make_atom(env, "$object_ref$");
+ st->ref_array = make_atom(env, "$array_ref$");
*priv = (void*) st;