diff options
author | Björn Gustavsson <[email protected]> | 2018-03-26 13:22:15 +0200 |
---|---|---|
committer | GitHub <[email protected]> | 2018-03-26 13:22:15 +0200 |
commit | bebf113ecd2d6a27808fc952e1f14db78515efb3 (patch) | |
tree | 9764083293c4a758f33a930b57d7268ce448b569 /lib/compiler/src/sys_core_fold.erl | |
parent | 4137ef162e23307d40616f70206dd2195c453576 (diff) | |
parent | a5e80861faedc84d373ccda95ae6f8c7aff11bcf (diff) | |
download | otp-bebf113ecd2d6a27808fc952e1f14db78515efb3.tar.gz otp-bebf113ecd2d6a27808fc952e1f14db78515efb3.tar.bz2 otp-bebf113ecd2d6a27808fc952e1f14db78515efb3.zip |
Merge pull request #1761 from bjorng/bjorn/compiler/fix-atom-leak/ERL-563/OTP-14968
Stop the compiler from overflowing the atom table
Diffstat (limited to 'lib/compiler/src/sys_core_fold.erl')
-rw-r--r-- | lib/compiler/src/sys_core_fold.erl | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl index a9bd363ee1..395b6bd677 100644 --- a/lib/compiler/src/sys_core_fold.erl +++ b/lib/compiler/src/sys_core_fold.erl @@ -108,17 +108,29 @@ module(#c_module{defs=Ds0}=Mod, Opts) -> put(no_inline_list_funcs, not member(inline_list_funcs, Opts)), - case get(new_var_num) of - undefined -> put(new_var_num, 0); - _ -> ok - end, init_warnings(), Ds1 = [function_1(D) || D <- Ds0], + erase(new_var_num), erase(no_inline_list_funcs), {ok,Mod#c_module{defs=Ds1},get_warnings()}. function_1({#c_var{name={F,Arity}}=Name,B0}) -> + %% Find a suitable starting value for the variable counter. Note + %% that this pass assumes that new_var_name/1 returns a variable + %% name distinct from any variable used in the entire body of + %% the function. We use integers as variable names to avoid + %% filling up the atom table when compiling huge functions. + Count = cerl_trees:next_free_variable_name(B0), + put(new_var_num, Count), try + %% Find a suitable starting value for the variable + %% counter. Note that this pass assumes that new_var_name/1 + %% returns a variable name distinct from any variable used in + %% the entire body of the function. We use integers as + %% variable names to avoid filling up the atom table when + %% compiling huge functions. + Count = cerl_trees:next_free_variable_name(B0), + put(new_var_num, Count), B = find_fixpoint(fun(Core) -> %% This must be a fun! expr(Core, value, sub_new()) @@ -2154,7 +2166,7 @@ make_var(A) -> make_var_name() -> N = get(new_var_num), put(new_var_num, N+1), - list_to_atom("@f"++integer_to_list(N)). + N. letify(Bs, Body) -> Ann = cerl:get_ann(Body), |