Przeglądaj źródła

Skip redundant enif_is_empty_list checks during encode

enif_get_list_cell fails when the list is empty.
pull/176/head
John Högberg 6 lat temu
rodzic
commit
3888eb9710
1 zmienionych plików z 5 dodań i 20 usunięć
  1. +5
    -20
      c_src/encoder.c

+ 5
- 20
c_src/encoder.c Wyświetl plik

@ -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);

Ładowanie…
Anuluj
Zapisz