From ce6fe3c77b31e6c0fcb13d347c3fcbbedfd544e7 Mon Sep 17 00:00:00 2001 From: Hans Bolinder Date: Tue, 14 Mar 2017 10:46:38 +0100 Subject: dialyzer: Improve compression of an ETS table --- lib/dialyzer/src/dialyzer_utils.erl | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'lib/dialyzer/src/dialyzer_utils.erl') diff --git a/lib/dialyzer/src/dialyzer_utils.erl b/lib/dialyzer/src/dialyzer_utils.erl index 7eaa03ec30..0dbb2bcf0a 100644 --- a/lib/dialyzer/src/dialyzer_utils.erl +++ b/lib/dialyzer/src/dialyzer_utils.erl @@ -39,6 +39,7 @@ sets_filter/2, src_compiler_opts/0, refold_pattern/1, + ets_tab2list/1, parallelism/0, family/1 ]). @@ -989,6 +990,27 @@ label(Tree) -> %%------------------------------------------------------------------------------ +-spec ets_tab2list(ets:tid()) -> list(). + +%% Deletes the contents of the table. Use: +%% ets_tab2list(T), ets:delete(T) +%% instead of: +%% ets:tab2list(T), ets:delete(T) +%% to save some memory at the expense of somewhat longer execution time. +ets_tab2list(T) -> + tab2list(ets:first(T), T, []). + +tab2list('$end_of_table', T, A) -> + case ets:first(T) of % no safe_fixtable()... + '$end_of_table' -> A; + Key -> tab2list(Key, T, A) + end; +tab2list(Key, T, A) -> + Vs = ets:lookup(T, Key), + Key1 = ets:next(T, Key), + ets:delete(T, Key), + tab2list(Key1, T, Vs ++ A). + -spec parallelism() -> integer(). parallelism() -> -- cgit v1.2.3