diff options
author | Björn Gustavsson <[email protected]> | 2010-03-18 08:45:03 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-03-26 08:09:26 +0100 |
commit | 0320836d1b58438ef4467832b00306672d22f8d6 (patch) | |
tree | 6953fb68c2c04e162ecb7e5cd9a568a43ceacddf /lib/observer/info | |
parent | e74235df989995f5bd2b66b7102857446ff10d11 (diff) | |
download | otp-0320836d1b58438ef4467832b00306672d22f8d6.tar.gz otp-0320836d1b58438ef4467832b00306672d22f8d6.tar.bz2 otp-0320836d1b58438ef4467832b00306672d22f8d6.zip |
Consistently rewrite an inlined function_clause exception to case_clause
A function_clause exception is generated by jumping to a func_info/3
instruction at the beginning of the function. The x registers are
assumed to contain the arguments for the function. That means
that a func_info/3 instruction copied from another function
(or even from the same function if not at the top level) will
not work, so it must be replaced with an instruction that
generates a case_clause exception.
In Core Erlang, a func_info/3 instruction is represented as
a the primop match_fail({function_clause,Arg1,...ArgN}).
The current mechanism that is supposed to replace the
primop match_fail(function_clause) with match_fail(case_clause)
will fail to do that in the following circumstances:
1. If the inliner has inlined a function into itself.
Fix that by having the inliner clear the function_name annotations
on all match_fail primops in functions that are inlined. (To simplify
doing that, the annotation is now on the primop node itself and not on
the 'function_clause' atom inside it.)
2. If the inliner has rewritten the tuple node in the primop node
to a literal (when inlining a function call with literal arguments),
v3_kernel would not recognize the match_fail(function_clause) primop
and would not rewrite it. Fix it by making v3_kernel smarter.
Also simplify the "old" inliner (sys_core_inline) to only clear
the function_name annotations instead of rewriting function_clause
execptions to case_clause execptions itself.
Diffstat (limited to 'lib/observer/info')
0 files changed, 0 insertions, 0 deletions