From f01770755da4993aeb0e45693ddf45170391f933 Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Wed, 2 Jan 2019 16:42:31 -0600 Subject: [PATCH] Allow encoding of improper lists --- c_src/encoder.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/c_src/encoder.c b/c_src/encoder.c index afc3c14..f121011 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -632,6 +632,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ERL_NIF_TERM stack; ERL_NIF_TERM curr; ERL_NIF_TERM item; + ERL_NIF_TERM tmp; const ERL_NIF_TERM* tuple; int arity; ErlNifSInt64 lval; @@ -689,9 +690,11 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } continue; } - if(!enif_get_list_cell(env, curr, &item, &curr)) { - ret = enc_error(e, "internal_error"); - goto done; + if(!enif_get_list_cell(env, curr, &item, &tmp)) { + item = curr; + curr = enif_make_list(env, 0); + } else { + curr = tmp; } if(!enif_get_tuple(env, item, &arity, &tuple)) { ret = enc_obj_error(e, "invalid_object_member", item); @@ -732,9 +735,11 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ret = enc_error(e, "internal_error"); goto done; } - if(!enif_get_list_cell(env, curr, &item, &curr)) { - ret = enc_error(e, "internal_error"); - goto done; + if(!enif_get_list_cell(env, curr, &item, &tmp)) { + item = curr; + curr = enif_make_list(env, 0); + } else { + curr = tmp; } stack = enif_make_list_cell(env, curr, stack); stack = enif_make_list_cell(env, e->atoms->ref_array, stack);