Преглед на файлове

Move all atom checks under enif_is_atom

pull/176/head
John Högberg преди 6 години
родител
ревизия
61d506d851
променени са 1 файла, в които са добавени 67 реда и са изтрити 67 реда
  1. +67
    -67
      c_src/encoder.c

+ 67
- 67
c_src/encoder.c Целия файл

@ -868,76 +868,81 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
curr = termstack_pop(&stack);
if(enif_is_identical(curr, e->atoms->ref_object)) {
curr = termstack_pop(&stack);
if(!enif_get_list_cell(env, curr, &item, &curr)) {
if(!enc_end_object(e)) {
if(enif_is_atom(env, curr)) {
if(enif_is_identical(curr, e->atoms->ref_object)) {
curr = termstack_pop(&stack);
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_tuple(env, item, &arity, &tuple)) {
ret = enc_obj_error(e, "invalid_object_member", item);
goto done;
}
if(arity != 2) {
ret = enc_obj_error(e, "invalid_object_member_arity", item);
goto done;
}
if(!enc_comma(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
if(!enc_object_key(env, e, tuple[0])) {
ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]);
goto done;
}
if(!enc_colon(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
continue;
}
if(!enif_get_tuple(env, item, &arity, &tuple)) {
ret = enc_obj_error(e, "invalid_object_member", item);
goto done;
}
if(arity != 2) {
ret = enc_obj_error(e, "invalid_object_member_arity", item);
goto done;
}
if(!enc_comma(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
if(!enc_object_key(env, e, tuple[0])) {
ret = enc_obj_error(e, "invalid_object_member_key", tuple[0]);
goto done;
}
if(!enc_colon(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
termstack_push(&stack, curr);
termstack_push(&stack, e->atoms->ref_object);
termstack_push(&stack, tuple[1]);
} else if(enif_is_identical(curr, e->atoms->ref_array)) {
curr = termstack_pop(&stack);
if(!enif_get_list_cell(env, curr, &item, &curr)) {
if(!enc_end_array(e)) {
termstack_push(&stack, curr);
termstack_push(&stack, e->atoms->ref_object);
termstack_push(&stack, tuple[1]);
} else if(enif_is_identical(curr, e->atoms->ref_array)) {
curr = termstack_pop(&stack);
if(!enif_get_list_cell(env, curr, &item, &curr)) {
if(!enc_end_array(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
continue;
}
if(!enc_comma(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
continue;
}
if(!enc_comma(e)) {
ret = enc_error(e, "internal_error");
goto done;
}
termstack_push(&stack, curr);
termstack_push(&stack, e->atoms->ref_array);
termstack_push(&stack, item);
} else if(enif_is_identical(curr, e->atoms->atom_null)) {
if(!enc_literal(e, "null", 4)) {
ret = enc_error(e, "null");
goto done;
}
} else if(e->use_nil && enif_is_identical(curr, e->atoms->atom_nil)) {
if(!enc_literal(e, "null", 4)) {
ret = enc_error(e, "null");
goto done;
}
} else if(enif_is_identical(curr, e->atoms->atom_true)) {
if(!enc_literal(e, "true", 4)) {
ret = enc_error(e, "true");
goto done;
}
} else if(enif_is_identical(curr, e->atoms->atom_false)) {
if(!enc_literal(e, "false", 5)) {
ret = enc_error(e, "false");
termstack_push(&stack, curr);
termstack_push(&stack, e->atoms->ref_array);
termstack_push(&stack, item);
} else if(enif_is_identical(curr, e->atoms->atom_null)) {
if(!enc_literal(e, "null", 4)) {
ret = enc_error(e, "null");
goto done;
}
} else if(e->use_nil && enif_is_identical(curr, e->atoms->atom_nil)) {
if(!enc_literal(e, "null", 4)) {
ret = enc_error(e, "null");
goto done;
}
} else if(enif_is_identical(curr, e->atoms->atom_true)) {
if(!enc_literal(e, "true", 4)) {
ret = enc_error(e, "true");
goto done;
}
} else if(enif_is_identical(curr, e->atoms->atom_false)) {
if(!enc_literal(e, "false", 5)) {
ret = enc_error(e, "false");
goto done;
}
} else if(!enc_atom(e, curr)) {
ret = enc_obj_error(e, "invalid_string", curr);
goto done;
}
} else if(enif_is_binary(env, curr)) {
@ -945,11 +950,6 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ret = enc_obj_error(e, "invalid_string", curr);
goto done;
}
} else if(enif_is_atom(env, curr)) {
if(!enc_atom(e, curr)) {
ret = enc_obj_error(e, "invalid_string", curr);
goto done;
}
} else if(enif_get_int64(env, curr, &lval)) {
if(!enc_long(e, lval)) {
ret = enc_error(e, "internal_error");

Зареждане…
Отказ
Запис