summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2014-05-27 12:32:39 +0100
committerSimon MacMullen <simon@rabbitmq.com>2014-05-27 12:32:39 +0100
commite4d45b7632794149f5b7cbb3386295633a937244 (patch)
treec5da2e4585346e11de12b6a67e7e43e33182de92
parenta657998d91000a17b0263aa560bfae4fcd1e8eb5 (diff)
downloadrabbitmq-server-e4d45b7632794149f5b7cbb3386295633a937244.tar.gz
Avoid tuple_to_list/1.
-rw-r--r--src/truncate.erl14
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() ->