aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/cerl_clauses.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2018-10-30 06:25:40 +0100
committerBjörn Gustavsson <[email protected]>2018-10-30 09:40:37 +0100
commitd9470c07acc8d9b5f18676d852a0ff1707788e9e (patch)
tree9f64e1c12a8ae77537600904ea587ce08ba9c0e2 /lib/compiler/src/cerl_clauses.erl
parentb36b359d4cb9988c0c24130023cf89e92b6577a4 (diff)
downloadotp-d9470c07acc8d9b5f18676d852a0ff1707788e9e.tar.gz
otp-d9470c07acc8d9b5f18676d852a0ff1707788e9e.tar.bz2
otp-d9470c07acc8d9b5f18676d852a0ff1707788e9e.zip
beam_except: Generalize translation to func_info instructions
The `beam_except` pass replaces some calls to `erlang:error/1` or `erlang:error/2` with specialized instructions in order to reduce the size of the BEAM code. In functions that do binary matching, `beam_except` would fail to translate the instructions that generate a `function_clause` exception. Here is an example: bsum(<<H:16,T/binary>>, Acc) -> bsum(T, Acc+H); bsum(<<>>, Acc) -> Acc. The BEAM code that generates the `function_clause` exception looks like this: {label,4}. {test_heap,2,3}. {put_list,{x,1},nil,{x,1}}. %% The following two instructions prevents the translation. {bs_set_position,{x,2},{x,0}}. {bs_get_tail,{x,2},{x,0},3}. {test_heap,2,2}. {put_list,{x,0},{x,1},{x,1}}. {move,{atom,function_clause},{x,0}}. {line,...}. {call_ext,2,{extfunc,erlang,error,2}}. Make the translation of `function_clause` exceptions smarter, so that the following code will be produced: {label,4}. {bs_set_position,{x,2},{x,0}}. {bs_get_tail,{x,2},{x,0},3}. {jump,{f,1}}. %Jump to `func_info` instruction. (This issue was noticed when looking at the code generated by https://github.com/tomas-abrahamsson/gpb.)
Diffstat (limited to 'lib/compiler/src/cerl_clauses.erl')
0 files changed, 0 insertions, 0 deletions