Explorar el Código

fixup! Refactor trapping and trap more often during decode

We never leave the NIF during encoding or decoding, so we're not
going to start working on a different binary or screw the
arguments up. Add assertions when trapping/returning and leave it
at that.
pull/176/head
John Högberg hace 6 años
padre
commit
d3938b4add
Se han modificado 2 ficheros con 8 adiciones y 23 borrados
  1. +5
    -18
      c_src/decoder.c
  2. +3
    -5
      c_src/encoder.c

+ 5
- 18
c_src/decoder.c Ver fichero

@ -89,7 +89,7 @@ dec_new(ErlNifEnv* env)
d->p = NULL;
d->len = -1;
d->i = -1;
d->i = 0;
d->st_data = (char*) enif_alloc(STACK_SIZE_INC);
d->st_size = STACK_SIZE_INC;
@ -113,16 +113,6 @@ dec_init(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg, ErlNifBinary* bin)
d->p = bin->data;
d->len = bin->size;
// I'd like to be more forceful on this check so that when
// we run a second iteration of the decoder we are sure
// that we're using the same binary. Unfortunately, I don't
// think there's a value to base this assertion on.
if(d->i < 0) {
d->i = 0;
} else {
assert(d->i <= d->len && "mismatched binary lengths");
}
}
void
@ -730,16 +720,10 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
size_t start;
size_t bytes_processed = 0;
if(argc != 5) {
return enif_make_badarg(env);
} else if(!enif_inspect_binary(env, argv[0], &bin)) {
if(!enif_inspect_binary(env, argv[0], &bin)) {
return enif_make_badarg(env);
} else if(!enif_get_resource(env, argv[1], st->res_dec, (void**) &d)) {
return enif_make_badarg(env);
} else if(!enif_is_list(env, argv[3])) {
return enif_make_badarg(env);
} else if(!enif_is_list(env, argv[4])) {
return enif_make_badarg(env);
}
dec_init(d, env, argv[0], &bin);
@ -754,6 +738,9 @@ decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
if(should_yield(env, bytes_processed, d->bytes_per_red)) {
ERL_NIF_TERM tmp_argv[5];
assert(enif_is_list(env, objs));
assert(enif_is_list(env, curr));
tmp_argv[0] = argv[0];
tmp_argv[1] = argv[1];
tmp_argv[2] = val;

+ 3
- 5
c_src/encoder.c Ver fichero

@ -776,11 +776,7 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
size_t start;
size_t bytes_processed = 0;
if(argc != 3) {
return enif_make_badarg(env);
} else if(!enif_get_resource(env, argv[0], st->res_enc, (void**) &e)) {
return enif_make_badarg(env);
} else if(!enif_is_list(env, argv[2])) {
if(!enif_get_resource(env, argv[0], st->res_enc, (void**) &e)) {
return enif_make_badarg(env);
}
@ -802,6 +798,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
if(should_yield(env, bytes_processed, e->bytes_per_red)) {
ERL_NIF_TERM tmp_argv[3];
assert(enif_is_list(env, e->iolist));
tmp_argv[0] = argv[0];
tmp_argv[1] = termstack_save(env, &stack);
tmp_argv[2] = e->iolist;

Cargando…
Cancelar
Guardar