early exit from value when encountering literals and less list allocation
for number parsing
This commit is contained in:
parent
34771087ff
commit
c39515bd60
1 changed files with 38 additions and 16 deletions
|
@ -181,26 +181,48 @@ value(<<?start_object, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
object(Rest, handle_event(start_object, Handler, Config), [key|Stack], Config);
|
object(Rest, handle_event(start_object, Handler, Config), [key|Stack], Config);
|
||||||
value(<<?start_array, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<?start_array, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
array(Rest, handle_event(start_array, Handler, Config), [array|Stack], Config);
|
array(Rest, handle_event(start_array, Handler, Config), [array|Stack], Config);
|
||||||
|
value(<<$t, $r, $u, $e, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
maybe_done(Rest, handle_event({literal, true}, Handler, Config), Stack, Config);
|
||||||
|
value(<<$f, $a, $l, $s, $e, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
maybe_done(Rest, handle_event({literal, false}, Handler, Config), Stack, Config);
|
||||||
|
value(<<$n, $u, $l, $l, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
maybe_done(Rest, handle_event({literal, null}, Handler, Config), Stack, Config);
|
||||||
|
value(<<?zero, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
zero(Rest, Handler, [$0], Stack, Config);
|
||||||
|
value(<<$1, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$1], Stack, Config);
|
||||||
|
value(<<$2, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$2], Stack, Config);
|
||||||
|
value(<<$3, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$3], Stack, Config);
|
||||||
|
value(<<$4, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$4], Stack, Config);
|
||||||
|
value(<<$5, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$5], Stack, Config);
|
||||||
|
value(<<$6, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$6], Stack, Config);
|
||||||
|
value(<<$7, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$7], Stack, Config);
|
||||||
|
value(<<$8, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$8], Stack, Config);
|
||||||
|
value(<<$9, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
integer(Rest, Handler, [$9], Stack, Config);
|
||||||
|
value(<<?negative, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
negative(Rest, Handler, [$-], Stack, Config);
|
||||||
|
value(<<?newline, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
value(Rest, Handler, Stack, Config);
|
||||||
value(<<$t, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<$t, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
true(Rest, Handler, Stack, Config);
|
true(Rest, Handler, Stack, Config);
|
||||||
value(<<$f, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<$f, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
false(Rest, Handler, Stack, Config);
|
false(Rest, Handler, Stack, Config);
|
||||||
value(<<$n, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<$n, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
null(Rest, Handler, Stack, Config);
|
null(Rest, Handler, Stack, Config);
|
||||||
value(<<?negative, Rest/binary>>, Handler, Stack, Config) ->
|
|
||||||
negative(Rest, Handler, [$-], Stack, Config);
|
|
||||||
value(<<?zero, Rest/binary>>, Handler, Stack, Config) ->
|
|
||||||
zero(Rest, Handler, [$0], Stack, Config);
|
|
||||||
value(<<?newline, Rest/binary>>, Handler, Stack, Config) ->
|
|
||||||
value(Rest, Handler, Stack, Config);
|
|
||||||
value(<<?tab, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<?tab, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
value(Rest, Handler, Stack, Config);
|
value(Rest, Handler, Stack, Config);
|
||||||
value(<<?cr, Rest/binary>>, Handler, Stack, Config) ->
|
value(<<?cr, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
value(Rest, Handler, Stack, Config);
|
value(Rest, Handler, Stack, Config);
|
||||||
value(<<?singlequote, Rest/binary>>, Handler, Stack, Config=#config{strict_single_quotes=false}) ->
|
value(<<?singlequote, Rest/binary>>, Handler, Stack, Config=#config{strict_single_quotes=false}) ->
|
||||||
string(Rest, Handler, [singlequote|Stack], Config);
|
string(Rest, Handler, [singlequote|Stack], Config);
|
||||||
value(<<S, Rest/binary>>, Handler, Stack, Config) when ?is_nonzero(S) ->
|
|
||||||
integer(Rest, Handler, [S], Stack, Config);
|
|
||||||
value(<<?end_array, _/binary>> = Rest, Handler, Stack, Config=#config{strict_commas=false}) ->
|
value(<<?end_array, _/binary>> = Rest, Handler, Stack, Config=#config{strict_commas=false}) ->
|
||||||
maybe_done(Rest, Handler, Stack, Config);
|
maybe_done(Rest, Handler, Stack, Config);
|
||||||
value(<<?solidus, Rest/binary>>, Handler, Stack, Config=#config{strict_comments=true}) ->
|
value(<<?solidus, Rest/binary>>, Handler, Stack, Config=#config{strict_comments=true}) ->
|
||||||
|
@ -845,7 +867,7 @@ zero(<<?decimalpoint, Rest/binary>>, Handler, Acc, Stack, Config) ->
|
||||||
zero(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
zero(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
||||||
e(Rest, Handler, [Acc, ".0e"], Stack, Config);
|
e(Rest, Handler, [Acc, ".0e"], Stack, Config);
|
||||||
zero(Bin, Handler, Acc, Stack, Config) ->
|
zero(Bin, Handler, Acc, Stack, Config) ->
|
||||||
finish_number(Bin, Handler, {zero, lists:flatten(Acc)}, Stack, Config).
|
finish_number(Bin, Handler, {zero, iolist_to_binary(Acc)}, Stack, Config).
|
||||||
|
|
||||||
|
|
||||||
integer(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
integer(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
||||||
|
@ -855,7 +877,7 @@ integer(<<?decimalpoint, Rest/binary>>, Handler, Acc, Stack, Config) ->
|
||||||
integer(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
integer(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
||||||
e(Rest, Handler, [Acc, ".0e"], Stack, Config);
|
e(Rest, Handler, [Acc, ".0e"], Stack, Config);
|
||||||
integer(Bin, Handler, Acc, Stack, Config) ->
|
integer(Bin, Handler, Acc, Stack, Config) ->
|
||||||
finish_number(Bin, Handler, {integer, lists:flatten(Acc)}, Stack, Config).
|
finish_number(Bin, Handler, {integer, iolist_to_binary(Acc)}, Stack, Config).
|
||||||
|
|
||||||
|
|
||||||
initialdecimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
initialdecimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
||||||
|
@ -872,7 +894,7 @@ decimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_n
|
||||||
decimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
decimal(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E ->
|
||||||
e(Rest, Handler, [Acc, $e], Stack, Config);
|
e(Rest, Handler, [Acc, $e], Stack, Config);
|
||||||
decimal(Bin, Handler, Acc, Stack, Config) ->
|
decimal(Bin, Handler, Acc, Stack, Config) ->
|
||||||
finish_number(Bin, Handler, {decimal, lists:flatten(Acc)}, Stack, Config).
|
finish_number(Bin, Handler, {decimal, iolist_to_binary(Acc)}, Stack, Config).
|
||||||
|
|
||||||
|
|
||||||
e(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
e(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
||||||
|
@ -896,7 +918,7 @@ ex(Bin, Handler, Acc, Stack, Config) ->
|
||||||
exp(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
exp(<<S, Rest/binary>>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) ->
|
||||||
exp(Rest, Handler, [Acc, S], Stack, Config);
|
exp(Rest, Handler, [Acc, S], Stack, Config);
|
||||||
exp(Bin, Handler, Acc, Stack, Config) ->
|
exp(Bin, Handler, Acc, Stack, Config) ->
|
||||||
finish_number(Bin, Handler, {exp, lists:flatten(Acc)}, Stack, Config).
|
finish_number(Bin, Handler, {exp, iolist_to_binary(Acc)}, Stack, Config).
|
||||||
|
|
||||||
|
|
||||||
finish_number(Rest, Handler, Acc, [], Config=#config{stream=false}) ->
|
finish_number(Rest, Handler, Acc, [], Config=#config{stream=false}) ->
|
||||||
|
@ -907,10 +929,10 @@ finish_number(Rest, Handler, Acc, Stack, Config) ->
|
||||||
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config).
|
maybe_done(Rest, handle_event(format_number(Acc), Handler, Config), Stack, Config).
|
||||||
|
|
||||||
|
|
||||||
format_number({zero, Acc}) -> {integer, list_to_integer(Acc)};
|
format_number({zero, Acc}) -> {integer, binary_to_integer(Acc)};
|
||||||
format_number({integer, Acc}) -> {integer, list_to_integer(Acc)};
|
format_number({integer, Acc}) -> {integer, binary_to_integer(Acc)};
|
||||||
format_number({decimal, Acc}) -> {float, list_to_float(Acc)};
|
format_number({decimal, Acc}) -> {float, binary_to_float(Acc)};
|
||||||
format_number({exp, Acc}) -> {float, list_to_float(Acc)}.
|
format_number({exp, Acc}) -> {float, binary_to_float(Acc)}.
|
||||||
|
|
||||||
|
|
||||||
true(<<$r, $u, $e, Rest/binary>>, Handler, Stack, Config) ->
|
true(<<$r, $u, $e, Rest/binary>>, Handler, Stack, Config) ->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue