From 3888eb97101cd751f5a7300bce15e2090dc67820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= Date: Tue, 9 Apr 2019 07:18:34 +0200 Subject: [PATCH] Skip redundant enif_is_empty_list checks during encode enif_get_list_cell fails when the list is empty. --- c_src/encoder.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/c_src/encoder.c b/c_src/encoder.c index 181d3d4..2eb9ef0 100644 --- a/c_src/encoder.c +++ b/c_src/encoder.c @@ -740,17 +740,13 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) if(enif_is_identical(curr, e->atoms->ref_object)) { curr = termstack_pop(&stack); - if(enif_is_empty_list(env, curr)) { + if(!enif_get_list_cell(env, curr, &item, &curr)) { if(!enc_end_object(e)) { ret = enc_error(e, "internal_error"); goto done; } continue; } - if(!enif_get_list_cell(env, curr, &item, &curr)) { - ret = enc_error(e, "internal_error"); - goto done; - } if(!enif_get_tuple(env, item, &arity, &tuple)) { ret = enc_obj_error(e, "invalid_object_member", item); goto done; @@ -778,7 +774,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) } else if(enif_is_identical(curr, e->atoms->ref_array)) { curr = termstack_pop(&stack); - if(enif_is_empty_list(env, curr)) { + if(!enif_get_list_cell(env, curr, &item, &curr)) { if(!enc_end_array(e)) { ret = enc_error(e, "internal_error"); goto done; @@ -789,10 +785,6 @@ 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; - } termstack_push(&stack, curr); termstack_push(&stack, e->atoms->ref_array); @@ -850,17 +842,13 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ret = enc_error(e, "internal_error"); goto done; } - if(enif_is_empty_list(env, tuple[0])) { + if(!enif_get_list_cell(env, tuple[0], &item, &curr)) { if(!enc_end_object(e)) { ret = enc_error(e, "internal_error"); goto done; } continue; } - if(!enif_get_list_cell(env, tuple[0], &item, &curr)) { - ret = enc_error(e, "internal_error"); - goto done; - } if(!enif_get_tuple(env, item, &arity, &tuple)) { ret = enc_obj_error(e, "invalid_object_member", item); goto done; @@ -895,17 +883,14 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) ret = enc_error(e, "internal_error"); goto done; } - if(enif_is_empty_list(env, curr)) { + + if(!enif_get_list_cell(env, curr, &item, &curr)) { if(!enc_end_array(e)) { ret = enc_error(e, "internal_error"); goto done; } continue; } - if(!enif_get_list_cell(env, curr, &item, &curr)) { - ret = enc_error(e, "internal_error"); - goto done; - } termstack_push(&stack, curr); termstack_push(&stack, e->atoms->ref_array);