diff options
author | Michał Muskała <[email protected]> | 2018-02-25 14:19:48 +0100 |
---|---|---|
committer | Michał Muskała <[email protected]> | 2018-03-26 12:07:10 +0200 |
commit | 63e1c58d27ab695a19897423fc75e607f69ff51b (patch) | |
tree | 5965bba7175e8cb29596d3cdabb2db8cd86d6cd3 /lib/stdlib/src/erl_parse.yrl | |
parent | 0217dbfee505ed8c88164c7a4ea5e1834e6ce8cd (diff) | |
download | otp-63e1c58d27ab695a19897423fc75e607f69ff51b.tar.gz otp-63e1c58d27ab695a19897423fc75e607f69ff51b.tar.bz2 otp-63e1c58d27ab695a19897423fc75e607f69ff51b.zip |
Compile external fun expressions to literals
The expressions fun M:F/A, when all elements are literals are also
treated as a literal. Since they have consistent representation and
don't depend on the code currently loaded in the VM, this is safe.
This can provide significant performance improvements in code using such
functions extensively - a full function call to erlang:make_fun/3 is
replaced by a single move instruction and no register shuffling or
saving registers to stack is necessary. Additionally, compound data
types that contain such external functions as elements can be treated as
literals too.
The commit also changes the representation of external funs to be a
valid Erlang syntax and adds support for literal external funs to core
Erlang.
Diffstat (limited to 'lib/stdlib/src/erl_parse.yrl')
-rw-r--r-- | lib/stdlib/src/erl_parse.yrl | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 14ca24362e..0c338b5952 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -1377,6 +1377,8 @@ normalise({map,_,Pairs}=M) -> ({map_field_assoc,_,K,V}) -> {normalise(K),normalise(V)}; (_) -> erlang:error({badarg,M}) end, Pairs)); +normalise({'fun',_,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}) -> + fun M:F/A; %% Special case for unary +/-. normalise({op,_,'+',{char,_,I}}) -> I; normalise({op,_,'+',{integer,_,I}}) -> I; |