From 738c6667f1c9d2b42b2f7d4be84e98adb416ebee Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Wed, 2 Nov 2011 01:11:58 -0700 Subject: [PATCH] building strings internally as lists of codepoints and then converting to binaries is faster than building binaries directly or stripping strings from binaries with binary:copy --- src/jsx_decoder.erl | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index afb278c..68a2217 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -120,12 +120,12 @@ decoder(Opts) -> ). -endif. --define(new_seq(), <<>>). --define(new_seq(C), <>). +-define(new_seq(), []). +-define(new_seq(C), [C]). --define(acc_seq(Seq, C), <>). +-define(acc_seq(Seq, C), [C] ++ Seq). --define(end_seq(Seq), Seq). +-define(end_seq(Seq), unicode:characters_to_binary(lists:reverse(Seq))). start(<>, Out, Stack, Opts) -> @@ -141,11 +141,11 @@ start(<<$f, Rest/binary>>, Out, Stack, Opts) -> start(<<$n, Rest/binary>>, Out, Stack, Opts) -> nu(Rest, Out, Stack, Opts); start(<>, Out, Stack, Opts) -> - negative(Rest, Out, [[$-]|Stack], Opts); + negative(Rest, Out, [?new_seq($-)|Stack], Opts); start(<>, Out, Stack, Opts) -> - zero(Rest, Out, [[$0]|Stack], Opts); + zero(Rest, Out, [?new_seq($0)|Stack], Opts); start(<>, Out, Stack, Opts) when ?is_nonzero(S) -> - integer(Rest, Out, [[S]|Stack], Opts); + integer(Rest, Out, [?new_seq(S)|Stack], Opts); start(<>, Out, Stack, Opts) when ?is_whitespace(S) -> start(Rest, Out, Stack, Opts); start(<<>>, Out, Stack, Opts) -> @@ -175,11 +175,11 @@ array(<<$f, Rest/binary>>, Out, Stack, Opts) -> array(<<$n, Rest/binary>>, Out, Stack, Opts) -> nu(Rest, Out, Stack, Opts); array(<>, Out, Stack, Opts) -> - negative(Rest, Out, [[$-]|Stack], Opts); + negative(Rest, Out, [?new_seq($-)|Stack], Opts); array(<>, Out, Stack, Opts) -> - zero(Rest, Out, [[$0]|Stack], Opts); + zero(Rest, Out, [?new_seq($0)|Stack], Opts); array(<>, Out, Stack, Opts) when ?is_nonzero(S) -> - integer(Rest, Out, [[S]|Stack], Opts); + integer(Rest, Out, [?new_seq(S)|Stack], Opts); array(<>, Out, Stack, Opts) -> ?event([start_object], object, Rest, Out, [key|Stack], Opts); array(<>, Out, Stack, Opts) -> @@ -203,11 +203,11 @@ value(<<$f, Rest/binary>>, Out, Stack, Opts) -> value(<<$n, Rest/binary>>, Out, Stack, Opts) -> nu(Rest, Out, Stack, Opts); value(<>, Out, Stack, Opts) -> - negative(Rest, Out, [[$-]|Stack], Opts); + negative(Rest, Out, [?new_seq($-)|Stack], Opts); value(<>, Out, Stack, Opts) -> - zero(Rest, Out, [[$0]|Stack], Opts); + zero(Rest, Out, [?new_seq($0)|Stack], Opts); value(<>, Out, Stack, Opts) when ?is_nonzero(S) -> - integer(Rest, Out, [[S]|Stack], Opts); + integer(Rest, Out, [?new_seq(S)|Stack], Opts); value(<>, Out, Stack, Opts) -> ?event([start_object], object, Rest, Out, [key|Stack], Opts); value(<>, Out, Stack, Opts) -> @@ -335,7 +335,7 @@ escape(<<$r, Rest/binary>>, Out, [Acc|Stack], Opts) -> escape(<<$t, Rest/binary>>, Out, [Acc|Stack], Opts) -> string(Rest, Out, [?acc_seq(Acc, $\t)|Stack], Opts); escape(<<$u, Rest/binary>>, Out, Stack, Opts) -> - escaped_unicode(Rest, Out, [[]|Stack], Opts); + escaped_unicode(Rest, Out, [?new_seq()|Stack], Opts); escape(<>, Out, [Acc|Stack], Opts) when S =:= ?quote; S =:= ?solidus; S =:= ?rsolidus -> string(Rest, Out, [?acc_seq(Acc, S)|Stack], Opts); @@ -376,7 +376,7 @@ escaped_unicode(<>, Out, [[C,B,A], Acc|Stack], Opts) end; escaped_unicode(<>, Out, [Acc|Stack], Opts) when ?is_hex(S) -> - escaped_unicode(Rest, Out, [[S] ++ Acc|Stack], Opts); + escaped_unicode(Rest, Out, [?acc_seq(Acc, S)|Stack], Opts); escaped_unicode(<<>>, Out, Stack, Opts) -> ?incomplete(escaped_unicode, <<>>, Out, Stack, Opts); escaped_unicode(Bin, Out, Stack, Opts) -> @@ -401,7 +401,7 @@ low_surrogate(Bin, Out, Stack, Opts) -> low_surrogate_u(<<$u, Rest/binary>>, Out, Stack, Opts) -> - low_surrogate_v(Rest, Out, [[]|Stack], Opts); + low_surrogate_v(Rest, Out, [?new_seq()|Stack], Opts); low_surrogate_u(<<>>, Out, Stack, Opts) -> ?incomplete(low_surrogate_u, <<>>, Out, Stack, Opts); %% not a low surrogate, dispatch back to string to handle, including the @@ -441,7 +441,7 @@ low_surrogate_v(<>, Out, [[C,B,A], High, String|Stack], Opts) end; low_surrogate_v(<>, Out, [Acc|Stack], Opts) when ?is_hex(S) -> - low_surrogate_v(Rest, Out, [[S] ++ Acc|Stack], Opts); + low_surrogate_v(Rest, Out, [?acc_seq(Acc, S)|Stack], Opts); low_surrogate_v(<<>>, Out, Stack, Opts) -> ?incomplete(low_surrogate_v, <<>>, Out, Stack, Opts); low_surrogate_v(Bin, Out, Stack, Opts) ->