binary optimization changes
This commit is contained in:
parent
9e8361e10a
commit
ac0c8dee25
1 changed files with 18 additions and 32 deletions
|
@ -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]).
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue