From 8cf3a9d144a529967728e34443f0bb8af9354e3c Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sun, 10 Mar 2013 19:02:20 -0700 Subject: [PATCH] breakout initialdecimal state to improve binary matching --- src/jsx_decoder.erl | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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).