浏览代码

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 年前
提交者 Paul J. Davis
父节点
当前提交
ae712b58c5
共有 1 个文件被更改,包括 5 次插入20 次删除
  1. +5
    -20
      c_src/encoder.c

+ 5
- 20
c_src/encoder.c 查看文件

@ -656,17 +656,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;
@ -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)) {
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;
@ -705,10 +701,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);
@ -766,17 +758,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;
@ -811,17 +799,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);

正在加载...
取消
保存