diff --git a/.gitignore b/.gitignore index df53f7d..0bbc1b8 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ logs *.iml rebar3.crashdump *~ +doc diff --git a/README.md b/README.md index 85697a0..c1e6383 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ production yet. Primary features: - [x] High level implementation of ETF in pure Erlang - - [ ] Atoms protection and limitation + - [x] Atoms protection and limitation - [ ] Fine grained filtering based on type - [ ] Callback function or MFA - [ ] Fallback to `binary_to_term` function on demand @@ -45,6 +45,7 @@ Secondary features: - [ ] Custom parser subset based on behaviors - [ ] ETF as stream of data - [ ] Usage example with ETF, BERT and/or custom parser + - [ ] Low level optimization (optimized module with merl) ## Usage diff --git a/rebar.config b/rebar.config index 1e89372..1bb573c 100644 --- a/rebar.config +++ b/rebar.config @@ -14,6 +14,16 @@ ] }. +{edoc_opts, + [{preprocess, true} + ,{private, true} + ,{new, true} + ,{todo, true} + ,{report_missing_types, true} + ,{link_predefined_types, true} + ,{includes, ["include"]} +]}. + {shell, [ % {config, "config/sys.config"}, {apps, [berty]} diff --git a/src/berty_etf.erl b/src/berty_etf.erl index 01f3a78..ce482d7 100644 --- a/src/berty_etf.erl +++ b/src/berty_etf.erl @@ -225,12 +225,11 @@ decode(<> = Data, Opts, #state{ module = Mod end. %%-------------------------------------------------------------------- -%% @hidden %% @doc -%% @end %% %% depth => {Min, Max} %% size => {Min, Max} +%% @end %%-------------------------------------------------------------------- %--------------------------------------------------------------------- @@ -246,7 +245,7 @@ decode(small_integer_ext, < {error, [{reason, "small_integer_ext limits"}], State} end; -decode(small_integer_ext, <> +decode(small_integer_ext, <> , #{ small_integer_ext := disabled }, State) -> {error, [{reason, "small_integer_ext disabled"}], State}; decode(small_integer_ext, <> @@ -275,7 +274,7 @@ decode(integer_ext, <> , #{ integer_ext := cursed }, _State) -> Result = ?BINARY_TO_TERM(<<131, ?INTEGER_EXT, Integer:32/integer>>), {ok, Result, Rest}; -decode(integer_ext, <> +decode(integer_ext, <> , #{ integer_ext := disabled }, State) -> {error, [{reason, "integer_ext disabled"}], State}; decode(integer_ext, <> @@ -519,7 +518,20 @@ decode(pid_ext, <>, #{ pid_ext := cursed } = Opts, State) {ok, Pid, Rest3}; %--------------------------------------------------------------------- -% +% @todo to be tested +% fun_ext has been removed since R23, this implementation only returns +% the content of the fun, only in cursed mode. +%--------------------------------------------------------------------- +% decode(fun_ext, <>, #{ fun_ext := cursed } = Opts, State) -> +% {ok, Pid, RestPid} = decode(pid_ext, Rest, Opts#{ pid_ext => cursed }, #state{}), +% {ok, Module, RestModule} = decode(RestPid, Opts#{ atoms => create }, #state{}), +% {ok, Index, RestIndex} = decode(RestModule, Opts, #state{}), +% {ok, Uniq, RestUniq} = decode(RestIndex, Opts, #state{}), +% {ok, FreeVars, RestFreeVars} = decode(RestUniq, Opts#{ atoms => create }, #state{}), +% {ok, {fun_ext, {Pid, Module, Index, Uniq, FreeVars}, RestFreeVars}}; + +%--------------------------------------------------------------------- +% %--------------------------------------------------------------------- decode(new_pid_ext, <> ,#{ new_pid_ext := cursed } = Opts, State) -> @@ -545,49 +557,74 @@ decode(new_pid_ext, <> %--------------------------------------------------------------------- % @todo to be tested %--------------------------------------------------------------------- -decode(new_reference_ext, <> - ,#{ new_reference_ext := cursed } = Opts, State) -> - {ok, _Node, Rest2} = decode(atom_ext, Rest, Opts#{ atoms => create }, State), - <> = Rest2, - <> = Rest3, - IDSeq = lists:reverse([ ID || <> <= IDs ]), - Format = io_lib:format("#Ref<~B.~B.~B.~B>", [Creation|IDSeq]), - RefString = lists:flatten(Format), - {ok, list_to_ref(RefString), Rest4}; +% decode(new_reference_ext, <> +% ,#{ new_reference_ext := cursed } = Opts, State) -> +% {ok, _Node, Rest2} = decode(atom_ext, Rest, Opts#{ atoms => create }, State), +% <> = Rest2, +% <> = Rest3, +% IDSeq = lists:reverse([ ID || <> <= IDs ]), +% Format = io_lib:format("#Ref<~B.~B.~B.~B>", [Creation|IDSeq]), +% RefString = lists:flatten(Format), +% {ok, list_to_ref(RefString), Rest4}; %--------------------------------------------------------------------- % @todo to cleanup this mess %--------------------------------------------------------------------- -decode(newer_reference_ext, <> - ,#{ newer_reference_ext := cursed } = Opts, State) -> - {ok, _Node, Rest2} = decode(atom_ext, Rest, Opts#{ atoms => create }, State), - <> = Rest2, - <> = Rest3, - IDSeq = lists:reverse([ ID || <> <= IDs ]), - Format = io_lib:format("#Ref<~B.~B.~B.~B>", [Creation|IDSeq]), - RefString = lists:flatten(Format), - {ok, list_to_ref(RefString), Rest4}; +% decode(newer_reference_ext, <> +% ,#{ newer_reference_ext := cursed } = Opts, State) -> +% {ok, _Node, Rest2} = decode(atom_ext, Rest, Opts#{ atoms => create }, State), +% <> = Rest2, +% <> = Rest3, +% IDSeq = lists:reverse([ ID || <> <= IDs ]), +% Format = io_lib:format("#Ref<~B.~B.~B.~B>", [Creation|IDSeq]), +% RefString = lists:flatten(Format), +% {ok, list_to_ref(RefString), Rest4}; %--------------------------------------------------------------------- % %--------------------------------------------------------------------- decode(small_big_ext, <> - , #{ small_big_ext := cursed } = Opts, _State) -> + , #{ small_big_ext := cursed } = _Opts, _State) -> <> = Rest, - Bignum = binary_to_term(<<131, ?SMALL_BIG_EXT, Size:8/unsigned-integer - ,Sign:8/unsigned-integer, Value:Size/binary>>, []), + Bignum = ?BINARY_TO_TERM(<<131, ?SMALL_BIG_EXT, Size:8/unsigned-integer + ,Sign:8/unsigned-integer, Value:Size/binary>>), {ok, Bignum, Rest2}; %--------------------------------------------------------------------- % %--------------------------------------------------------------------- decode(large_big_ext, <> - , #{ large_big_ext := cursed } = Opts, _State) -> + , #{ large_big_ext := cursed } = _Opts, _State) -> <> = Rest, - Bignum = binary_to_term(<<131, ?LARGE_BIG_EXT, Size:32/unsigned-integer - ,Sign:8/unsigned-integer, Value:Size/binary>>, []), + Bignum = ?BINARY_TO_TERM(<<131, ?LARGE_BIG_EXT, Size:32/unsigned-integer + ,Sign:8/unsigned-integer, Value:Size/binary>>), {ok, Bignum, Rest2}; +%--------------------------------------------------------------------- +% +%--------------------------------------------------------------------- +decode(export_ext, <>, #{ export_ext := enabled } = Opts, _State) -> + ExportExtOpts = maps:get(export_ext_options, Opts, Opts), + {ok, Module, RestModule} = decode(atom_ext, Rest, ExportExtOpts, #state{}), + {ok, Function, RestFunction} = decode(atom_ext, RestModule, ExportExtOpts, #state{}), + {ok, Arity, RestArity} = decode(small_integer_ext, RestFunction, Opts, #state{}), + case {is_atom(Module), is_atom(Function)} of + {true, true} -> + {ok, fun Module:Function/Arity, RestArity}; + {_,_} -> + {ok, {export_ext, {Module, Function, Arity}, RestArity}} + end; + +%--------------------------------------------------------------------- +% +%--------------------------------------------------------------------- +decode(new_fun_ext, <> + , #{ new_fun_ext := cursed } = _Opts, _State) -> + RealSize = Size-4, + <> = Rest, + Fun = ?BINARY_TO_TERM(<<131, ?NEW_FUN_EXT, Size:32/unsigned-integer, Payload:RealSize/binary>>), + {ok, Fun, Rest2}; + %--------------------------------------------------------------------- % Wildcard Pattern %--------------------------------------------------------------------- @@ -688,7 +725,7 @@ decode_properties(map, Opts) -> Maps = map(Elements, Elements), Keys = union([integer(), string(), binary(), Tuples, Lists, Maps]), Values = union([integer(), string(), binary(), Tuples, Lists, Maps]), - proper:quickcheck(?FORALL( {Key, Value} = Map + proper:quickcheck(?FORALL( Map , {Keys, Values} , property_check(Map, Opts) ) diff --git a/src/berty_metrics.erl b/src/berty_metrics.erl new file mode 100644 index 0000000..a3d1a42 --- /dev/null +++ b/src/berty_metrics.erl @@ -0,0 +1,7 @@ +%%%=================================================================== +%%% @copyright Erlang Punch +%%% @author Mathieu Kerjouan +%%% @doc +%%% @end +%%%=================================================================== +-module(berty_metrics). diff --git a/src/berty_stream.erl b/src/berty_stream.erl new file mode 100644 index 0000000..bbb40fd --- /dev/null +++ b/src/berty_stream.erl @@ -0,0 +1,7 @@ +%%%=================================================================== +%%% @copyright Erlang Punch +%%% @author Mathieu Kerjouan +%%% @doc +%%% @end +%%%=================================================================== +-module(berty_stream).