Skip to content

Commit 2f0768e

Browse files
committed
change default spec of unpack_ext
1 parent 2eb122e commit 2f0768e

7 files changed

Lines changed: 63 additions & 46 deletions

File tree

Makefile

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,30 @@ xref: compile
2222
@$(REBAR) xref
2323

2424
test: compile xref
25-
@./rebar skip_deps=true eunit
25+
@./rebar eunit
2626

2727
clean:
2828
@$(REBAR) clean
2929

3030
doc:
3131
@$(REBAR) doc
3232

33-
bench: compile
34-
@$(REBAR) eunit skip_deps=true suites=bench_tests
35-
36-
APPS = kernel stdlib sasl erts ssl tools os_mon runtime_tools crypto inets \
37-
xmerl webtool snmp public_key mnesia eunit syntax_tools compiler
33+
APPS = kernel stdlib runtime_tools
3834
COMBO_PLT = $(HOME)/.msgpack_dialyzer_plt
3935

4036
check_plt: xref
41-
dialyzer --check_plt --plt $(COMBO_PLT) --apps $(APPS) \
42-
deps/*/ebin
37+
dialyzer --check_plt --plt $(COMBO_PLT) --apps $(APPS)
4338

4439
build_plt: xref
45-
dialyzer --build_plt --output_plt $(COMBO_PLT) --apps $(APPS) \
46-
deps/*/ebin
40+
dialyzer --build_plt --output_plt $(COMBO_PLT) --apps $(APPS)
4741

4842
dialyzer: xref
4943
@echo
5044
@echo Use "'make check_plt'" to check PLT prior to using this target.
5145
@echo Use "'make build_plt'" to build PLT prior to using this target.
5246
@echo
5347
@sleep 1
54-
dialyzer -Wno_return --plt $(COMBO_PLT) deps/*/ebin | \
55-
fgrep -v -f ./dialyzer.ignore-warnings
48+
dialyzer -Wno_return --plt $(COMBO_PLT) | fgrep -v -f ./dialyzer.ignore-warnings
5649

5750

5851

include/msgpack.hrl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@
3535
-type msgpack_ext_packer() :: fun((tuple(), msgpack:options()) ->
3636
{ok, {Type::byte(), Data::binary()}} |
3737
{error, any()}).
38-
-type msgpack_ext_unpacker() :: fun((byte(), binary()) ->
39-
{ok, msgpack_term()} | {error, any()}).
38+
-type msgpack_ext_unpacker() ::
39+
fun((byte(), binary(), msgpack:options()) ->
40+
{ok, msgpack_term()} | {error, any()})
41+
| fun((byte(), binary()) ->
42+
{ok, msgpack_term()} | {error, any()}).
4043

4144
-type msgpack_list_options() :: [
4245
jsx | jiffy | %% nif |

src/msgpack.erl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
-export([pack/1, unpack/1, unpack_stream/1,
4040
pack/2, unpack/2, unpack_stream/2,
41-
term_to_binary/1, binary_to_term/1
41+
term_to_binary/1, binary_to_term/1, binary_to_term/2
4242
]).
4343

4444
-include("msgpack.hrl").
@@ -54,7 +54,11 @@ term_to_binary(Term) ->
5454

5555
-spec binary_to_term(binary()) -> term().
5656
binary_to_term(Bin) ->
57-
msgpack_term:from_binary(Bin).
57+
msgpack_term:from_binary(Bin, []).
58+
59+
-spec binary_to_term(binary(), [safe]) -> term().
60+
binary_to_term(Bin, Opt) ->
61+
msgpack_term:from_binary(Bin, Opt).
5862

5963
%% @doc Encode an erlang term into an msgpack binary.
6064
%% Returns {error, {badarg, term()}} if the input is illegal.
@@ -132,10 +136,11 @@ parse_options([{enable_str,Bool}|TL], Opt0) ->
132136
parse_options(TL, Opt);
133137
parse_options([{ext, Module}|TL], Opt0) when is_atom(Module) ->
134138
Opt = Opt0?OPTION{ext_packer=fun Module:pack_ext/2,
135-
ext_unpacker=fun Module:unpack_ext/2},
139+
ext_unpacker=fun Module:unpack_ext/3},
136140
parse_options(TL, Opt);
137141
parse_options([{ext, {Packer,Unpacker}}|TL], Opt0) when
138-
is_function(Packer, 2) andalso is_function(Unpacker, 2) ->
142+
is_function(Packer, 2) andalso
143+
(is_function(Unpacker, 3) orelse is_function(Unpacker, 2)) ->
139144
Opt = Opt0?OPTION{ext_packer=Packer, ext_unpacker=Unpacker},
140145
parse_options(TL, Opt).
141146

src/msgpack_ext.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@
2626
{ok, {Type::byte(), Data::binary()}} |
2727
{error, any()}.
2828

29-
-callback unpack_ext(Type::byte(), Data::binary()) ->
29+
-callback unpack_ext(Type::byte(), Data::binary(), msgpack:options()) ->
3030
{ok, any()} | {error, any()}.

src/msgpack_term.erl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
%%
1818
-module(msgpack_term).
1919

20-
-export([to_binary/1, from_binary/1,
21-
pack_ext/2, unpack_ext/2]).
20+
-export([to_binary/1, from_binary/2,
21+
pack_ext/2, unpack_ext/3]).
2222
-behabiour(msgpack_ext).
2323

2424
-define(ERLANG_TERM, 131).
@@ -30,9 +30,9 @@ to_binary(Term) ->
3030
msgpack:pack(Term, ?TERM_OPTION).
3131

3232
%% @doc experimental
33-
-spec from_binary(binary()) -> term().
34-
from_binary(Bin) ->
35-
{ok, Term} = msgpack:unpack(Bin, ?TERM_OPTION),
33+
-spec from_binary(binary(), []|[safe]) -> term().
34+
from_binary(Bin, Opt) ->
35+
{ok, Term} = msgpack:unpack(Bin, Opt ++ ?TERM_OPTION),
3636
Term.
3737

3838
-spec pack_ext(tuple(), msgpack:options()) ->
@@ -50,10 +50,15 @@ pack_ext(Term, _Options) ->
5050
%% coded as single byte indicating its length.
5151
{ok, {?ERLANG_TERM, erlang:term_to_binary(Term)}}.
5252

53-
-spec unpack_ext(Type::byte(), Data::binary()) ->
53+
-spec unpack_ext(Type::byte(), Data::binary(), msgpack:options()) ->
5454
{ok, any()} | {error, any()}.
55-
unpack_ext(?ERLANG_TERM, Bin) ->
56-
{ok, erlang:binary_to_term(Bin)}.
55+
unpack_ext(?ERLANG_TERM, Bin, Opt) ->
56+
case proplists:get_value(safe, Opt) of
57+
true ->
58+
{ok, erlang:binary_to_term(Bin, [safe])};
59+
undefined ->
60+
{ok, erlang:binary_to_term(Bin)}
61+
end.
5762

5863
-ifdef(TEST).
5964
-include_lib("eunit/include/eunit.hrl").

src/msgpack_unpacker.erl

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,39 +117,44 @@ unpack_stream(<<16#C1, _R/binary>>, _) -> throw({badarg, 16#C1});
117117
%% for extention types
118118

119119
%% fixext 1 stores an integer and a byte array whose length is 1 byte
120-
unpack_stream(<<16#D4, T:8, Data:1/binary, Rest/binary>>, ?OPTION{ext_unpacker=Unpack} = _Opt) ->
121-
maybe_unpack_ext(16#D4, Unpack, T, Data, Rest);
120+
unpack_stream(<<16#D4, T:8, Data:1/binary, Rest/binary>>,
121+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
122+
maybe_unpack_ext(16#D4, Unpack, T, Data, Rest, Orig);
122123

123124
%% fixext 2 stores an integer and a byte array whose length is 2 bytes
124-
unpack_stream(<<16#D5, T:8, Data:2/binary, Rest/binary>>, ?OPTION{ext_unpacker=Unpack} = _Opt) ->
125-
maybe_unpack_ext(16#D5, Unpack, T, Data, Rest);
125+
unpack_stream(<<16#D5, T:8, Data:2/binary, Rest/binary>>,
126+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
127+
maybe_unpack_ext(16#D5, Unpack, T, Data, Rest, Orig);
126128

127129
%% fixext 4 stores an integer and a byte array whose length is 4 bytes
128-
unpack_stream(<<16#D6, T:8, Data:4/binary, Rest/binary>>, ?OPTION{ext_unpacker=Unpack} = _Opt) ->
129-
maybe_unpack_ext(16#D6, Unpack, T, Data, Rest);
130+
unpack_stream(<<16#D6, T:8, Data:4/binary, Rest/binary>>,
131+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
132+
maybe_unpack_ext(16#D6, Unpack, T, Data, Rest, Orig);
130133

131134
%% fixext 8 stores an integer and a byte array whose length is 8 bytes
132-
unpack_stream(<<16#D7, T:8, Data:8/binary, Rest/binary>>, ?OPTION{ext_unpacker=Unpack} = _Opt) ->
133-
maybe_unpack_ext(16#D7, Unpack, T, Data, Rest);
135+
unpack_stream(<<16#D7, T:8, Data:8/binary, Rest/binary>>,
136+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
137+
maybe_unpack_ext(16#D7, Unpack, T, Data, Rest, Orig);
134138

135139
%% fixext 16 stores an integer and a byte array whose length is 16 bytes
136-
unpack_stream(<<16#D8, T:8, Data:16/binary, Rest/binary>>, ?OPTION{ext_unpacker=Unpack} = _Opt) ->
137-
maybe_unpack_ext(16#D8, Unpack, T, Data, Rest);
140+
unpack_stream(<<16#D8, T:8, Data:16/binary, Rest/binary>>,
141+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
142+
maybe_unpack_ext(16#D8, Unpack, T, Data, Rest, Orig);
138143

139144
%% ext 8 stores an integer and a byte array whose length is upto (2^8)-1 bytes:
140145
unpack_stream(<<16#C7, Len:8, Type:8, Data:Len/binary, Rest/binary>>,
141-
?OPTION{ext_unpacker=Unpack} = _Opt) ->
142-
maybe_unpack_ext(16#C7, Unpack, Type, Data, Rest);
146+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
147+
maybe_unpack_ext(16#C7, Unpack, Type, Data, Rest, Orig);
143148

144149
%% ext 16 stores an integer and a byte array whose length is upto (2^16)-1 bytes:
145150
unpack_stream(<<16#C8, Len:16, Type:8, Data:Len/binary, Rest/binary>>,
146-
?OPTION{ext_unpacker=Unpack} = _Opt) ->
147-
maybe_unpack_ext(16#C8, Unpack, Type, Data, Rest);
151+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
152+
maybe_unpack_ext(16#C8, Unpack, Type, Data, Rest, Orig);
148153

149154
%% ext 32 stores an integer and a byte array whose length is upto (2^32)-1 bytes:
150155
unpack_stream(<<16#C9, Len:32, Type:8, Data:Len/binary, Rest/binary>>,
151-
?OPTION{ext_unpacker=Unpack} = _Opt) ->
152-
maybe_unpack_ext(16#C9, Unpack, Type, Data, Rest);
156+
?OPTION{ext_unpacker=Unpack, original_list=Orig} = _Opt) ->
157+
maybe_unpack_ext(16#C9, Unpack, Type, Data, Rest, Orig);
153158

154159
unpack_stream(_Bin, _) -> throw(incomplete).
155160

@@ -203,9 +208,15 @@ unpack_string(Binary) ->
203208
String -> String
204209
end.
205210

206-
maybe_unpack_ext(F, undefined, _, _, _Rest) -> throw({badarg, {bad_ext, F}});
207-
maybe_unpack_ext(_, Unpack, Type, Data, Rest) when is_function(Unpack) ->
211+
maybe_unpack_ext(F, undefined, _, _, _Rest, _) -> throw({badarg, {bad_ext, F}});
212+
maybe_unpack_ext(_, Unpack, Type, Data, Rest, Orig) when is_function(Unpack, 3) ->
213+
case Unpack(Type, Data, Orig) of
214+
{ok, Term} -> {Term, Rest};
215+
{error, E} -> {error, E}
216+
end;
217+
maybe_unpack_ext(_, Unpack, Type, Data, Rest, _) when is_function(Unpack, 2) ->
208218
case Unpack(Type, Data) of
209219
{ok, Term} -> {Term, Rest};
210220
{error, E} -> {error, E}
211221
end.
222+

test/msgpack_ext_example_tests.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ native_test() ->
6464
{ok, Term} = msgpack:unpack(msgpack:pack(Term, Opt), Opt).
6565

6666
pack_ext(T, O) -> pack_native(T, O).
67-
unpack_ext(I, B) -> unpack_native(I, B).
67+
unpack_ext(I, B, _) -> unpack_native(I, B).
6868

6969
behaviour_test() ->
7070
Opt = [{ext, ?MODULE}],

0 commit comments

Comments
 (0)