fixed embarassing non-termination bug
This commit is contained in:
parent
bbc291c7c4
commit
0d7a6f9720
4 changed files with 862 additions and 91 deletions
|
@ -72,8 +72,8 @@ start(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts) when ?is_nonzero(S)
|
|||
start(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> start(Resume, Stack, Callbacks, Opts) end);
|
||||
start(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> start(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -99,9 +99,9 @@ maybe_done(Bin, [], Callbacks, ?stream_mode(Opts)) ->
|
|||
end};
|
||||
maybe_done(<<>>, [], Callbacks, Opts) ->
|
||||
{fold(end_of_json, Callbacks), fun(Stream) -> maybe_done(Stream, [], Callbacks, Opts) end};
|
||||
maybe_done(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
maybe_done(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> maybe_done(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -118,8 +118,8 @@ object(<<?end_object/?encoding, Rest/binary>>, [key|Stack], Callbacks, Opts) ->
|
|||
object(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> object(Resume, Stack, Callbacks, Opts) end);
|
||||
object(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> object(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -152,8 +152,8 @@ array(<<?end_array/?encoding, Rest/binary>>, [array|Stack], Callbacks, Opts) ->
|
|||
array(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> array(Resume, Stack, Callbacks, Opts) end);
|
||||
array(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> array(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -184,8 +184,8 @@ value(<<?start_array/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
|||
value(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> value(Resume, Stack, Callbacks, Opts) end);
|
||||
value(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> value(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -200,8 +200,8 @@ colon(<<?colon/?encoding, Rest/binary>>, [key|Stack], Callbacks, Opts) ->
|
|||
colon(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> colon(Resume, Stack, Callbacks, Opts) end);
|
||||
colon(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> colon(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -216,8 +216,8 @@ key(<<?quote/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
|||
key(<<?solidus/?encoding, Rest/binary>>, Stack, Callbacks, ?comments_enabled(Opts)) ->
|
||||
maybe_comment(Rest, fun(Resume) -> key(Resume, Stack, Callbacks, Opts) end);
|
||||
key(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> key(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -317,8 +317,8 @@ escape(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc)
|
|||
when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus ->
|
||||
string(Rest, Stack, Callbacks, Opts, [S] ++ Acc);
|
||||
escape(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> escape(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -372,8 +372,8 @@ escaped_unicode(<<D/?encoding, Rest/binary>>, Stack, Callbacks, Opts, String, [C
|
|||
escaped_unicode(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, String, Acc) when ?is_hex(S) ->
|
||||
escaped_unicode(Rest, Stack, Callbacks, Opts, String, [S] ++ Acc);
|
||||
escaped_unicode(Bin, Stack, Callbacks, Opts, String, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> escaped_unicode(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, String, Acc) end
|
||||
|
@ -408,8 +408,8 @@ negative(<<$0/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) ->
|
|||
negative(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when ?is_nonzero(S) ->
|
||||
integer(Rest, Stack, Callbacks, Opts, [S] ++ Acc);
|
||||
negative(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> negative(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -440,8 +440,8 @@ zero(<<>>, [], Callbacks, Opts, Acc) ->
|
|||
{fold(end_of_json, fold({integer, lists:reverse(Acc)}, Callbacks)),
|
||||
fun(Stream) -> zero(Stream, [], Callbacks, Opts, Acc) end};
|
||||
zero(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> zero(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -480,8 +480,8 @@ integer(<<>>, [], Callbacks, Opts, Acc) ->
|
|||
{fold(end_of_json, fold({integer, lists:reverse(Acc)}, Callbacks)),
|
||||
fun(Stream) -> integer(Stream, [], Callbacks, Opts, Acc) end};
|
||||
integer(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> integer(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -494,8 +494,8 @@ initial_decimal(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when
|
|||
initial_decimal(<<?zero/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) ->
|
||||
decimal(Rest, Stack, Callbacks, Opts, [?zero] ++ Acc);
|
||||
initial_decimal(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> initial_decimal(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -532,8 +532,8 @@ decimal(<<>>, [], Callbacks, Opts, Acc) ->
|
|||
{fold(end_of_json, fold({float, lists:reverse(Acc)}, Callbacks)),
|
||||
fun(Stream) -> decimal(Stream, [], Callbacks, Opts, Acc) end};
|
||||
decimal(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> decimal(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -546,8 +546,8 @@ e(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?
|
|||
e(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when S =:= ?positive; S =:= ?negative ->
|
||||
ex(Rest, Stack, Callbacks, Opts, [S] ++ Acc);
|
||||
e(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> e(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -558,8 +558,8 @@ e(Bin, Stack, Callbacks, Opts, Acc) ->
|
|||
ex(<<S/?encoding, Rest/binary>>, Stack, Callbacks, Opts, Acc) when S =:= ?zero; ?is_nonzero(S) ->
|
||||
exp(Rest, Stack, Callbacks, Opts, [S] ++ Acc);
|
||||
ex(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> ex(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -592,8 +592,8 @@ exp(<<>>, [], Callbacks, Opts, Acc) ->
|
|||
{fold(end_of_json, fold({float, lists:reverse(Acc)}, Callbacks)),
|
||||
fun(Stream) -> exp(Stream, [], Callbacks, Opts, Acc) end};
|
||||
exp(Bin, Stack, Callbacks, Opts, Acc) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> exp(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts, Acc) end
|
||||
|
@ -604,8 +604,8 @@ exp(Bin, Stack, Callbacks, Opts, Acc) ->
|
|||
tr(<<$r/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
tru(Rest, Stack, Callbacks, Opts);
|
||||
tr(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> tr(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -616,8 +616,8 @@ tr(Bin, Stack, Callbacks, Opts) ->
|
|||
tru(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
true(Rest, Stack, Callbacks, Opts);
|
||||
tru(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> tru(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -628,8 +628,8 @@ tru(Bin, Stack, Callbacks, Opts) ->
|
|||
true(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
maybe_done(Rest, Stack, fold({literal, true}, Callbacks), Opts);
|
||||
true(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> true(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -640,8 +640,8 @@ true(Bin, Stack, Callbacks, Opts) ->
|
|||
fa(<<$a/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
fal(Rest, Stack, Callbacks, Opts);
|
||||
fa(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> fa(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -652,8 +652,8 @@ fa(Bin, Stack, Callbacks, Opts) ->
|
|||
fal(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
fals(Rest, Stack, Callbacks, Opts);
|
||||
fal(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> fal(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -664,8 +664,8 @@ fal(Bin, Stack, Callbacks, Opts) ->
|
|||
fals(<<$s/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
false(Rest, Stack, Callbacks, Opts);
|
||||
fals(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> fals(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -676,8 +676,8 @@ fals(Bin, Stack, Callbacks, Opts) ->
|
|||
false(<<$e/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
maybe_done(Rest, Stack, fold({literal, false}, Callbacks), Opts);
|
||||
false(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> false(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -688,8 +688,8 @@ false(Bin, Stack, Callbacks, Opts) ->
|
|||
nu(<<$u/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
nul(Rest, Stack, Callbacks, Opts);
|
||||
nu(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> nu(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -700,8 +700,8 @@ nu(Bin, Stack, Callbacks, Opts) ->
|
|||
nul(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
null(Rest, Stack, Callbacks, Opts);
|
||||
nul(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> nul(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -712,8 +712,8 @@ nul(Bin, Stack, Callbacks, Opts) ->
|
|||
null(<<$l/?encoding, Rest/binary>>, Stack, Callbacks, Opts) ->
|
||||
maybe_done(Rest, Stack, fold({literal, null}, Callbacks), Opts);
|
||||
null(Bin, Stack, Callbacks, Opts) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> null(<<Bin/binary, Stream/binary>>, Stack, Callbacks, Opts) end
|
||||
|
@ -730,8 +730,8 @@ null(Bin, Stack, Callbacks, Opts) ->
|
|||
maybe_comment(<<?star/?encoding, Rest/binary>>, Resume) ->
|
||||
comment(Rest, Resume);
|
||||
maybe_comment(Bin, Resume) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete,
|
||||
fun(Stream) -> maybe_comment(<<Bin/binary, Stream/binary>>, Resume) end
|
||||
|
@ -744,8 +744,8 @@ comment(<<?star/?encoding, Rest/binary>>, Resume) ->
|
|||
comment(<<_/?encoding, Rest/binary>>, Resume) ->
|
||||
comment(Rest, Resume);
|
||||
comment(Bin, Resume) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete, fun(Stream) -> comment(<<Bin/binary, Stream/binary>>, Resume) end}
|
||||
end.
|
||||
|
@ -756,8 +756,8 @@ maybe_comment_done(<<?solidus/?encoding, Rest/binary>>, Resume) ->
|
|||
maybe_comment_done(<<_/?encoding, Rest/binary>>, Resume) ->
|
||||
comment(Rest, Resume);
|
||||
maybe_comment_done(Bin, Resume) ->
|
||||
case byte_size(Bin) of
|
||||
?symbol_size -> {error, badjson}
|
||||
case byte_size(Bin) >= ?symbol_size of
|
||||
true -> {error, badjson}
|
||||
; _ ->
|
||||
{incomplete, fun(Stream) -> maybe_comment_done(<<Bin/binary, Stream/binary>>, Resume) end}
|
||||
end.
|
Loading…
Add table
Add a link
Reference in a new issue