fixed a nasty performance regression caused by a misordered clause

This commit is contained in:
alisdair sullivan 2010-05-24 16:49:20 -07:00
parent d42acf4411
commit 079aa7ccf6
2 changed files with 7 additions and 7 deletions

View file

@ -38,8 +38,8 @@ start(<<S/utf8, Rest/binary>>, Stack, Callbacks, Opts) when ?is_whitespace(S) ->
start(<<>>, Stack, Callbacks, Opts) -> start(<<>>, Stack, Callbacks, Opts) ->
fun(Stream) -> start(Stream, Stack, Callbacks, Opts) end. fun(Stream) -> start(Stream, Stack, Callbacks, Opts) end.
maybe_done(<<16#FF8F>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == true -> maybe_done(<<16#F8FF/utf8, Rest/binary>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == true ->
{callback(eof, Callbacks), <<>>}; {callback(eof, Callbacks), Rest};
maybe_done(<<Rest/binary>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == false -> maybe_done(<<Rest/binary>>, [], Callbacks, Opts) when Opts#opts.explicit_termination == false ->
{callback(eof, Callbacks), Rest}; {callback(eof, Callbacks), Rest};
maybe_done(<<?end_object/utf8, Rest/binary>>, [object|Stack], Callbacks, Opts) -> maybe_done(<<?end_object/utf8, Rest/binary>>, [object|Stack], Callbacks, Opts) ->
@ -240,7 +240,7 @@ zero(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts
zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end; fun(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc) end;
zero(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> 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) ;(Stream) -> zero(Stream, Stack, Callbacks, Opts, Acc)
end. end.
@ -270,7 +270,7 @@ integer(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#o
integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end; fun(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc) end;
integer(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> 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) ;(Stream) -> integer(Stream, Stack, Callbacks, Opts, Acc)
end. end.
@ -298,7 +298,7 @@ fraction(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#
fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end; fun(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc) end;
fraction(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> 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) ;(Stream) -> fraction(Stream, Stack, Callbacks, Opts, Acc)
end. end.
@ -336,7 +336,7 @@ exp(<<?solidus/utf8, Rest/binary>>, Stack, Callbacks, Opts, Acc) when Opts#opts.
exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false -> exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == false ->
fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end; fun(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc) end;
exp(<<>>, Stack, Callbacks, Opts, Acc) when Opts#opts.explicit_termination == true -> 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) ;(Stream) -> exp(Stream, Stack, Callbacks, Opts, Acc)
end. end.

View file

@ -35,7 +35,7 @@ test_body(TestSpec, Dir) ->
end. end.
decode(F, <<>>) -> decode(F, <<>>) ->
{Result, _} = F(eof), {Result, _} = F(<<16#F8FF/utf8>>),
Result; Result;
decode(F, <<A/utf8, Rest/binary>>) -> decode(F, <<A/utf8, Rest/binary>>) ->
case F(<<A/utf8>>) of case F(<<A/utf8>>) of