Browse Source

Skip redundant enif_is_empty_list checks during encode

enif_get_list_cell fails when the list is empty.
pull/184/head
John Högberg 6 years ago
committed by Paul J. Davis
parent
commit
ae712b58c5
1 changed files with 5 additions and 20 deletions
  1. +5
    -20
      c_src/encoder.c

+ 5
- 20
c_src/encoder.c View File

@ -656,17 +656,13 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
if(enif_is_identical(curr, e->atoms->ref_object)) { if(enif_is_identical(curr, e->atoms->ref_object)) {
curr = termstack_pop(&stack); 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)) { if(!enc_end_object(e)) {
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
} }
continue; 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)) { if(!enif_get_tuple(env, item, &arity, &tuple)) {
ret = enc_obj_error(e, "invalid_object_member", item); ret = enc_obj_error(e, "invalid_object_member", item);
goto done; goto done;
@ -694,7 +690,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
} else if(enif_is_identical(curr, e->atoms->ref_array)) { } else if(enif_is_identical(curr, e->atoms->ref_array)) {
curr = termstack_pop(&stack); 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)) { if(!enc_end_array(e)) {
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
@ -705,10 +701,6 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; 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, curr);
termstack_push(&stack, e->atoms->ref_array); termstack_push(&stack, e->atoms->ref_array);
@ -766,17 +758,13 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; 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)) { if(!enc_end_object(e)) {
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
} }
continue; 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)) { if(!enif_get_tuple(env, item, &arity, &tuple)) {
ret = enc_obj_error(e, "invalid_object_member", item); ret = enc_obj_error(e, "invalid_object_member", item);
goto done; goto done;
@ -811,17 +799,14 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
} }
if(enif_is_empty_list(env, curr)) {
if(!enif_get_list_cell(env, curr, &item, &curr)) {
if(!enc_end_array(e)) { if(!enc_end_array(e)) {
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
} }
continue; 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, curr);
termstack_push(&stack, e->atoms->ref_array); termstack_push(&stack, e->atoms->ref_array);

Loading…
Cancel
Save