From 079aa7ccf617b6527ec58e4ac0bafea81509dd22 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Mon, 24 May 2010 16:49:20 -0700 Subject: [PATCH] fixed a nasty performance regression caused by a misordered clause --- src/jsx_decoder.erl | 12 ++++++------ test/jsx_test.erl | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/jsx_decoder.erl b/src/jsx_decoder.erl index bc9d7ef..734d86e 100644 --- a/src/jsx_decoder.erl +++ b/src/jsx_decoder.erl @@ -38,8 +38,8 @@ start(<>, Stack, Callbacks, Opts) when ?is_whitespace(S) -> start(<<>>, Stack, Callbacks, Opts) -> fun(Stream) -> start(Stream, Stack, Callbacks, Opts) end. -maybe_done(<<16#FF8F>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == true -> - {callback(eof, Callbacks), <<>>}; +maybe_done(<<16#F8FF/utf8, Rest/binary>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == true -> + {callback(eof, Callbacks), Rest}; maybe_done(<>, [], Callbacks, Opts) when Opts#opts.explicit_termination == false -> {callback(eof, Callbacks), Rest}; maybe_done(<>, [object|Stack], Callbacks, Opts) -> @@ -240,7 +240,7 @@ zero(<>, Stack, Callbacks, Opts, Acc) when Opts#opts zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end; zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> - fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} + fun(<<16#F8FF/utf8>>) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} ;(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end. @@ -270,7 +270,7 @@ integer(<>, Stack, Callbacks, Opts, Acc) when Opts#o integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end; integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> - fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} + fun(<<16#F8FF/utf8>>) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} ;(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end. @@ -298,7 +298,7 @@ fraction(<>, Stack, Callbacks, Opts, Acc) when Opts# fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end; fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> - fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} + fun(<<16#F8FF/utf8>>) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} ;(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end. @@ -336,7 +336,7 @@ exp(<>, Stack, Callbacks, Opts, Acc) when Opts#opts. exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end; exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> - fun(eof) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} + fun(<<16#F8FF/utf8>>) -> {callback(eof, callback({number, lists:reverse(Acc)}, Callbacks)), <<>>} ;(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end. diff --git a/test/jsx_test.erl b/test/jsx_test.erl index 6a16e40..7edd933 100644 --- a/test/jsx_test.erl +++ b/test/jsx_test.erl @@ -35,7 +35,7 @@ test_body(TestSpec, Dir) -> end. decode(F, <<>>) -> - {Result, _} = F(eof), + {Result, _} = F(<<16#F8FF/utf8>>), Result; decode(F, <>) -> case F(<>) of