浏览代码

fixup! Never expand the encode buffer; emit it and start anew

pull/176/head
John Högberg 6 年前
父节点
当前提交
e14828fce2
共有 2 个文件被更改,包括 26 次插入14 次删除
  1. +25
    -14
      c_src/encoder.c
  2. +1
    -0
      test/jiffy_03_number_tests.erl

+ 25
- 14
c_src/encoder.c 查看文件

@ -158,12 +158,14 @@ enc_ensure(Encoder* e, size_t req)
{ {
size_t new_size = BIN_INC_SIZE; size_t new_size = BIN_INC_SIZE;
if(req < (e->buffer.size - e->i)) {
return 1;
}
if(e->have_buffer) {
if(req < (e->buffer.size - e->i)) {
return 1;
}
if(!enc_flush(e)) {
return 0;
if(!enc_flush(e)) {
return 0;
}
} }
for(new_size = BIN_INC_SIZE; new_size < req; new_size <<= 1); for(new_size = BIN_INC_SIZE; new_size < req; new_size <<= 1);
@ -193,6 +195,23 @@ enc_literal(Encoder* e, const char* literal, size_t len)
return 1; return 1;
} }
static inline int
enc_bignum(Encoder* e, ERL_NIF_TERM value) {
/* This is a bignum and we need to handle it up in Erlang code as
* the NIF API doesn't support them yet.
*
* Flush our current output and mark ourselves as needing a fixup
* after we return. */
if(!enc_flush(e)) {
return 0;
}
e->iolist = enif_make_list_cell(e->env, value, e->iolist);
e->partial_output = 1;
return 1;
}
static inline int static inline int
enc_special_character(Encoder* e, int val) { enc_special_character(Encoder* e, int val) {
switch(val) { switch(val) {
@ -893,18 +912,10 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
termstack_push(&stack, e->atoms->ref_array); termstack_push(&stack, e->atoms->ref_array);
termstack_push(&stack, item); termstack_push(&stack, item);
} else if(enif_is_number(env, curr)) { } else if(enif_is_number(env, curr)) {
/* This is a bignum and we need to handle it up in Erlang code as
* the NIF API doesn't support them yet.
*
* Flush our current output and mark ourselves as needing a fixup
* after we return. */
if(!enc_flush(e)) {
if(!enc_bignum(e, curr)) {
ret = enc_error(e, "internal_error"); ret = enc_error(e, "internal_error");
goto done; goto done;
} }
e->iolist = enif_make_list_cell(e->env, curr, e->iolist);
e->partial_output = 1;
} else { } else {
ret = enc_obj_error(e, "invalid_ejson", curr); ret = enc_obj_error(e, "invalid_ejson", curr);
goto done; goto done;

+ 1
- 0
test/jiffy_03_number_tests.erl 查看文件

@ -48,6 +48,7 @@ cases(ok) ->
{<<"1">>, 1}, {<<"1">>, 1},
{<<"12">>, 12}, {<<"12">>, 12},
{<<"-3">>, -3}, {<<"-3">>, -3},
{<<"{\"key\":9223372036854775808}">>,{[{<<"key">>,1 bsl 63}]}},
{<<"1234567890123456789012345">>, 1234567890123456789012345}, {<<"1234567890123456789012345">>, 1234567890123456789012345},
{<<"1310050760199">>, 1310050760199}, {<<"1310050760199">>, 1310050760199},
{ {

正在加载...
取消
保存