diff --git a/priv/jsx_test.escript b/priv/jsx_test.escript index 3553d53..3c33779 100755 --- a/priv/jsx_test.escript +++ b/priv/jsx_test.escript @@ -101,14 +101,18 @@ incremental_decode(<>, Flags) -> incremental_decode_loop({incomplete, Next, _}, <>, Acc) -> incremental_decode_loop(Next(C), Rest, Acc); -incremental_decode_loop({incomplete, _, Force}, <<>>, Acc) -> - incremental_decode_loop(Force(), <<>>, Acc); -incremental_decode_loop({event, end_json, Next}, <>, Acc) -> - incremental_decode_loop(Next(C), Rest, Acc); -incremental_decode_loop({event, end_json, _}, <<>>, Acc) -> +incremental_decode_loop({incomplete, _Next, Force}, <<>>, Acc) -> + case Force() of + {error, badjson} -> {error, badjson} + ; {incomplete, _, _} -> 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); -incremental_decode_loop({event, Event, F}, Rest, Acc) -> - incremental_decode_loop(F(), Rest, [Event] ++ Acc). +incremental_decode_loop({event, Event, Next}, Rest, Acc) -> + incremental_decode_loop(Next(), Rest, [Event] ++ Acc). multi_decode(JSON, Flags) -> diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index cbbf8ea..d64d9bf 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -90,16 +90,29 @@ maybe_done(<>, Stack, ?comments_enabled(Opts)) maybe_comment(Rest, fun(Resume) -> maybe_done(Resume, Stack, Opts) end); maybe_done(Rest, [], ?multi_term(Opts)) -> {event, end_json, fun() -> start(Rest, [], Opts) end}; -maybe_done(<<>>, [], Opts) -> - {incomplete, - fun(Stream) -> maybe_done(Stream, [], Opts) end, - fun() -> {event, end_json, fun() -> maybe_done(<<>>, [], Opts) end} end +maybe_done(Rest, [], Opts) -> + {event, end_json, fun() -> + {incomplete, + fun(Stream) -> done(<>, Opts) end, + fun() -> done(Rest, Opts) end + } + end }; maybe_done(Bin, Stack, Opts) -> ?incomplete(?partial_codepoint(Bin), fun(Stream) -> maybe_done(<>, Stack, Opts) end, ?ferror ). + +done(<>, Opts) when ?is_whitespace(S) -> + done(Rest, Opts); +done(<>, ?comments_enabled(Opts)) -> + maybe_comment(Rest, fun(Resume) -> done(Resume, Opts) end); +done(Bin, Opts) -> + ?incomplete(?partial_codepoint(Bin), + fun(Stream) -> done(<>, Opts) end, + fun() -> done(Bin, Opts) end + ). object(<>, Stack, Opts) when ?is_whitespace(S) ->