diff options
author | Björn Gustavsson <[email protected]> | 2019-01-21 07:04:46 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-01-21 12:57:54 +0100 |
commit | 990976907841dd3122c82992ba9965ee313e988c (patch) | |
tree | 8ccc4c8a103c6ed5a206912ff2eb3df707ccf674 /erts/emulator/beam/beam_emu.c | |
parent | a11ddd5862fa06a3242e548fbd232a4c294ca7a8 (diff) | |
download | otp-990976907841dd3122c82992ba9965ee313e988c.tar.gz otp-990976907841dd3122c82992ba9965ee313e988c.tar.bz2 otp-990976907841dd3122c82992ba9965ee313e988c.zip |
Optimize the is_function/2 guard test
The is_function2 instruction is executed surprisingly
frequently when running dialyzer or the compiler. It
cannot hurt to optimize it a little.
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 6b34024a5a..4ef06464f4 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -404,6 +404,7 @@ static BeamInstr* apply_fun(Process* p, Eterm fun, Eterm args, Eterm* reg) NOINLINE; static Eterm new_fun(Process* p, Eterm* reg, ErlFunEntry* fe, int num_free) NOINLINE; +static int is_function2(Eterm Term, Uint arity); static Eterm erts_gc_new_map(Process* p, Eterm* reg, Uint live, Uint n, BeamInstr* ptr) NOINLINE; static Eterm erts_gc_new_small_map_lit(Process* p, Eterm* reg, Eterm keys_literal, @@ -2662,6 +2663,19 @@ new_fun(Process* p, Eterm* reg, ErlFunEntry* fe, int num_free) return make_fun(funp); } +static int +is_function2(Eterm Term, Uint arity) +{ + if (is_fun(Term)) { + ErlFunThing* funp = (ErlFunThing *) fun_val(Term); + return funp->arity == arity; + } else if (is_export(Term)) { + Export* exp = (Export *) (export_val(Term)[1]); + return exp->info.mfa.arity == arity; + } + return 0; +} + static Eterm get_map_element(Eterm map, Eterm key) { Uint32 hx; |