decoder now returns end_json event at earliest possible time, Next() returns nothing but {error, badjson} if fed bad input or incomplete after that point, even if forced
This commit is contained in:
parent
d58343bff3
commit
a9ecb733e3
2 changed files with 28 additions and 11 deletions
|
@ -101,14 +101,18 @@ incremental_decode(<<C:1/binary, Rest/binary>>, Flags) ->
|
||||||
|
|
||||||
incremental_decode_loop({incomplete, Next, _}, <<C:1/binary, Rest/binary>>, Acc) ->
|
incremental_decode_loop({incomplete, Next, _}, <<C:1/binary, Rest/binary>>, Acc) ->
|
||||||
incremental_decode_loop(Next(C), Rest, Acc);
|
incremental_decode_loop(Next(C), Rest, Acc);
|
||||||
incremental_decode_loop({incomplete, _, Force}, <<>>, Acc) ->
|
incremental_decode_loop({incomplete, _Next, Force}, <<>>, Acc) ->
|
||||||
incremental_decode_loop(Force(), <<>>, Acc);
|
case Force() of
|
||||||
incremental_decode_loop({event, end_json, Next}, <<C:1/binary, Rest/binary>>, Acc) ->
|
{error, badjson} -> {error, badjson}
|
||||||
incremental_decode_loop(Next(C), Rest, Acc);
|
; {incomplete, _, _} -> Acc
|
||||||
incremental_decode_loop({event, end_json, _}, <<>>, Acc) ->
|
; _ -> incremental_decode_loop(Force(), <<>>, Acc)
|
||||||
|
end;
|
||||||
|
incremental_decode_loop({event, end_json, Next}, Rest, Acc) ->
|
||||||
|
incremental_decode_loop(Next(), Rest, lists:reverse(Acc));
|
||||||
|
incremental_decode_loop({event, end_json, _Next}, <<>>, Acc) ->
|
||||||
lists:reverse(Acc);
|
lists:reverse(Acc);
|
||||||
incremental_decode_loop({event, Event, F}, Rest, Acc) ->
|
incremental_decode_loop({event, Event, Next}, Rest, Acc) ->
|
||||||
incremental_decode_loop(F(), Rest, [Event] ++ Acc).
|
incremental_decode_loop(Next(), Rest, [Event] ++ Acc).
|
||||||
|
|
||||||
|
|
||||||
multi_decode(JSON, Flags) ->
|
multi_decode(JSON, Flags) ->
|
||||||
|
|
|
@ -90,10 +90,13 @@ maybe_done(<<?solidus/?encoding, Rest/binary>>, Stack, ?comments_enabled(Opts))
|
||||||
maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Opts) end);
|
maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Opts) end);
|
||||||
maybe_done(Rest, [], ?multi_term(Opts)) ->
|
maybe_done(Rest, [], ?multi_term(Opts)) ->
|
||||||
{event, end_json, fun() -> start(Rest, [], Opts) end};
|
{event, end_json, fun() -> start(Rest, [], Opts) end};
|
||||||
maybe_done(<<>>, [], Opts) ->
|
maybe_done(Rest, [], Opts) ->
|
||||||
{incomplete,
|
{event, end_json, fun() ->
|
||||||
fun(Stream) -> maybe_done(Stream, [], Opts) end,
|
{incomplete,
|
||||||
fun() -> {event, end_json, fun() -> maybe_done(<<>>, [], Opts) end} end
|
fun(Stream) -> done(<<Rest/binary, Stream/binary>>, Opts) end,
|
||||||
|
fun() -> done(Rest, Opts) end
|
||||||
|
}
|
||||||
|
end
|
||||||
};
|
};
|
||||||
maybe_done(Bin, Stack, Opts) ->
|
maybe_done(Bin, Stack, Opts) ->
|
||||||
?incomplete(?partial_codepoint(Bin),
|
?incomplete(?partial_codepoint(Bin),
|
||||||
|
@ -101,6 +104,16 @@ maybe_done(Bin, Stack, Opts) ->
|
||||||
?ferror
|
?ferror
|
||||||
).
|
).
|
||||||
|
|
||||||
|
done(<<S/?encoding, Rest/binary>>, Opts) when ?is_whitespace(S) ->
|
||||||
|
done(Rest, Opts);
|
||||||
|
done(<<?solidus/?encoding, Rest/binary>>, ?comments_enabled(Opts)) ->
|
||||||
|
maybe_comment(Rest, fun(Resume) -> done(Resume, Opts) end);
|
||||||
|
done(Bin, Opts) ->
|
||||||
|
?incomplete(?partial_codepoint(Bin),
|
||||||
|
fun(Stream) -> done(<<Bin/binary, Stream/binary>>, Opts) end,
|
||||||
|
fun() -> done(Bin, Opts) end
|
||||||
|
).
|
||||||
|
|
||||||
|
|
||||||
object(<<S/?encoding, Rest/binary>>, Stack, Opts) when ?is_whitespace(S) ->
|
object(<<S/?encoding, Rest/binary>>, Stack, Opts) when ?is_whitespace(S) ->
|
||||||
object(Rest, Stack, Opts);
|
object(Rest, Stack, Opts);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue