diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2014-05-27 12:32:39 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2014-05-27 12:32:39 +0100 |
commit | e4d45b7632794149f5b7cbb3386295633a937244 (patch) | |
tree | c5da2e4585346e11de12b6a67e7e43e33182de92 | |
parent | a657998d91000a17b0263aa560bfae4fcd1e8eb5 (diff) | |
download | rabbitmq-server-e4d45b7632794149f5b7cbb3386295633a937244.tar.gz |
Avoid tuple_to_list/1.
-rw-r--r-- | src/truncate.erl | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/truncate.erl b/src/truncate.erl index 360d3dd2..072da1bf 100644 --- a/src/truncate.erl +++ b/src/truncate.erl @@ -104,7 +104,7 @@ term_size(A, M) when is_atom(A) -> lim(M - 2); term_size(N, M) when is_number(N) -> lim(M - 2); term_size(F, M) when is_function(F) -> lim(M - erts_debug:flat_size(F)); term_size(P, M) when is_pid(P) -> lim(M - erts_debug:flat_size(P)); -term_size(T, M) when is_tuple(T) -> term_size(tuple_to_list(T), M); +term_size(T, M) when is_tuple(T) -> tuple_term_size(T, M, 1); term_size([], M) -> M; @@ -120,6 +120,18 @@ term_size([H|T], M) -> lim(S) when S > 0 -> S; lim(_) -> limit_exceeded. +tuple_term_size(_T, limit_exceeded, _I) -> + limit_exceeded; +tuple_term_size(T, M, I) -> + case term_size(element(I, T), M) of + limit_exceeded -> limit_exceeded; + M2 -> M3 = lim(M2 - 2), + case tuple_size(T) of + I -> M3; + _ -> tuple_term_size(T, M3, I + 1) + end + end. + %%---------------------------------------------------------------------------- test() -> |