binary optimization changes

This commit is contained in:
alisdair sullivan 2011-09-02 02:33:06 -05:00
parent 9e8361e10a
commit ac0c8dee25

View file

@ -228,20 +228,13 @@ key(Bin, T, Stack, Opts) ->
%% insufficient. this incredibly anal function should detect all badly formed %% insufficient. this incredibly anal function should detect all badly formed
%% utf sequences %% utf sequences
partial_utf(<<>>) -> true; partial_utf(<<>>) -> true;
partial_utf(<<X>>) when X >= 16#c2, X =< 16#df -> true; partial_utf(<<X>>) when X >= 16#c2, X =< 16#f4 -> true;
partial_utf(<<X, Rest/binary>>) when X >= 16#e0, X =< 16#ef -> partial_utf(<<X, Y>>) when X >= 16#e0, X =< 16#f4, Y >= 16#80, Y =< 16#bf -> true;
case Rest of partial_utf(<<X, Y, Z>>)
<<>> -> true when X >= 16#f0, X =< 16#f4,
; <<Y>> when Y >= 16#80, Y =< 16#bf -> true Y >= 16#80, Y =< 16#bf,
; _ -> false Z >= 16#80, Z =< 16#bf ->
end; true;
partial_utf(<<X, Rest/binary>>) when X >= 16#f0, X =< 16#f4 ->
case Rest of
<<>> -> true
; <<Y>> when Y >= 16#80, Y =< 16#bf -> true
; <<Y, Z>> when Y >= 16#80, Y =< 16#bf, Z >= 16#80, Z =< 16#bf -> true
; _ -> false
end;
partial_utf(_) -> false. partial_utf(_) -> false.
@ -387,24 +380,17 @@ low_surrogate(Bin, T, Stack, Opts, Acc) ->
low_surrogate_u(<<$u, Rest/binary>>, T, Stack, Opts, {High, String}) -> low_surrogate_u(<<$u, Rest/binary>>, T, Stack, Opts, {High, String}) ->
low_surrogate_v(Rest, T, Stack, Opts, {[], High, String}); low_surrogate_v(Rest, T, Stack, Opts, {[], High, String});
%% not a low surrogate, dispatch back to string to handle, including the
%% rsolidus we parsed previously
low_surrogate_u(<<S, Rest/binary>> = Bin, T, Stack, Opts, {High, String}) ->
case Opts#opts.loose_unicode of
true ->
string(<<?rsolidus, Bin/binary>>,
T,
Stack,
Opts,
[16#fffd] ++ String
)
; false ->
?error([<<S, Rest/binary>>, T, Stack, Opts, {High, String}])
end;
low_surrogate_u(<<>>, T, Stack, Opts, Acc) -> low_surrogate_u(<<>>, T, Stack, Opts, Acc) ->
?incomplete(low_surrogate_u, <<>>, T, Stack, Opts, Acc); ?incomplete(low_surrogate_u, <<>>, T, Stack, Opts, Acc);
low_surrogate_u(Bin, T, Stack, Opts, Acc) -> %% not a low surrogate, dispatch back to string to handle, including the
?error([Bin, T, Stack, Opts, Acc]). %% rsolidus we parsed previously
low_surrogate_u(Bin, T, Stack, Opts, {High, String}) ->
case Opts#opts.loose_unicode of
true ->
string(<<?rsolidus, Bin/binary>>, T, Stack, Opts, [16#fffd] ++ String)
; false ->
?error([Bin, T, Stack, Opts, {High, String}])
end.
low_surrogate_v(<<D, Rest/binary>>, T, Stack, Opts, {[C, B, A], High, String}) low_surrogate_v(<<D, Rest/binary>>, T, Stack, Opts, {[C, B, A], High, String})
@ -670,10 +656,10 @@ maybe_done(<<?comma, Rest/binary>>, T, [array|_] = Stack, Opts) ->
value(Rest, T, Stack, Opts); value(Rest, T, Stack, Opts);
maybe_done(<<S, Rest/binary>>, T, Stack, Opts) when ?is_whitespace(S) -> maybe_done(<<S, Rest/binary>>, T, Stack, Opts) when ?is_whitespace(S) ->
maybe_done(Rest, T, Stack, Opts); maybe_done(Rest, T, Stack, Opts);
maybe_done(<<>>, T, Stack, Opts) when length(Stack) > 0 ->
?incomplete(maybe_done, <<>>, T, Stack, Opts);
maybe_done(Rest, T, [], Opts) -> maybe_done(Rest, T, [], Opts) ->
?event([end_json], done, Rest, T, [], Opts); ?event([end_json], done, Rest, T, [], Opts);
maybe_done(<<>>, T, Stack, Opts) ->
?incomplete(maybe_done, <<>>, T, Stack, Opts);
maybe_done(Bin, T, Stack, Opts) -> maybe_done(Bin, T, Stack, Opts) ->
?error([Bin, T, Stack, Opts]). ?error([Bin, T, Stack, Opts]).