diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index df16a3f..344df03 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -762,21 +762,25 @@ zero(Bin, Handler, Acc, Stack, Config) -> integer(<>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) -> integer(Rest, Handler, acc_seq(Acc, S), Stack, Config); integer(<>, Handler, Acc, Stack, Config) -> - decimal(Rest, Handler, acc_seq(Acc, ?decimalpoint), Stack, Config); + initialdecimal(Rest, Handler, acc_seq(Acc, ?decimalpoint), Stack, Config); integer(<>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E -> e(Rest, Handler, acc_seq(Acc, ".0e"), Stack, Config); integer(Bin, Handler, Acc, Stack, Config) -> finish_number(Bin, Handler, {integer, Acc}, Stack, Config). +initialdecimal(<>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) -> + decimal(Rest, Handler, acc_seq(Acc, S), Stack, Config); +initialdecimal(<<>>, Handler, [?decimalpoint|Acc], Stack, Config) -> + incomplete(integer, <>, Handler, Acc, Stack, Config); +initialdecimal(Bin, Handler, Acc, Stack, Config) -> + ?error(decimal, Bin, Handler, Acc, Stack, Config). + + decimal(<>, Handler, Acc, Stack, Config) when S =:= ?zero; ?is_nonzero(S) -> decimal(Rest, Handler, acc_seq(Acc, S), Stack, Config); -%% guard against the insidious `1.e1` error decimal(<>, Handler, Acc, Stack, Config) when S =:= $e; S =:= $E -> - case Acc of - [?decimalpoint|_] -> ?error(decimal, <>, Handler, Acc, Stack, Config); - _ -> e(Rest, Handler, acc_seq(Acc, $e), Stack, Config) - end; + e(Rest, Handler, acc_seq(Acc, $e), Stack, Config); decimal(Bin, Handler, Acc, Stack, Config) -> finish_number(Bin, Handler, {decimal, Acc}, Stack, Config).