From 4b3fa9b903688508d3ebd6b009fbfb50ab61779d Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sun, 7 Dec 2014 19:12:43 -0800 Subject: [PATCH] further unrolling of string parsing states and elimination of `when` guards --- src/jsx_decoder.erl | 12 ++++++------ src/jsx_parser.erl | 17 ++++++++++------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index 1ba5c07..497edaf 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -647,16 +647,16 @@ count(<<127, Rest/binary>>, N, Config) -> count(<<_, Rest/binary>>, N, Config=#config{dirty_strings=true}) -> count(Rest, N + 1, Config); count(<<_/utf8, _/binary>>, N, #config{uescape=true}) -> N; -count(<>, N, Config) when X < 16#800 -> - count(Rest, N + 2, Config); %% u+2028 count(<<226, 128, 168, _/binary>>, N, _) -> N; %% u+2029 count(<<226, 128, 169, _/binary>>, N, _) -> N; -count(<>, N, Config) when X < 16#10000 -> - count(Rest, N + 3, Config); -count(<<_/utf8, Rest/binary>>, N, Config) -> - count(Rest, N + 4, Config); +count(<>, N, Config) -> + case X of + X when X < 16#800 -> count(Rest, N + 2, Config); + X when X < 16#10000 -> count(Rest, N + 3, Config); + _ -> count(Rest, N + 4, Config) + end; count(_, N, _) -> N. diff --git a/src/jsx_parser.erl b/src/jsx_parser.erl index e99ef53..1773361 100644 --- a/src/jsx_parser.erl +++ b/src/jsx_parser.erl @@ -451,13 +451,16 @@ count(<<126, Rest/binary>>, N, Config) -> count(<<127, Rest/binary>>, N, Config) -> count(Rest, N + 1, Config); count(<<_/utf8, _/binary>>, N, #config{uescape=true}) -> N; -count(<>, N, _) when X == 16#2028; X == 16#2029 -> N; -count(<>, N, Config) when X < 16#800 -> - count(Rest, N + 2, Config); -count(<>, N, Config) when X < 16#10000 -> - count(Rest, N + 3, Config); -count(<<_/utf8, Rest/binary>>, N, Config) -> - count(Rest, N + 4, Config); +%% u+2028 +count(<<226, 128, 168, _/binary>>, N, _) -> N; +%% u+2029 +count(<<226, 128, 169, _/binary>>, N, _) -> N; +count(<>, N, Config) -> + case X of + X when X < 16#800 -> count(Rest, N + 2, Config); + X when X < 16#10000 -> count(Rest, N + 3, Config); + _ -> count(Rest, N + 4, Config) + end; count(<<_, _/binary>>, N, _) -> N.