diff options
author | John Högberg <[email protected]> | 2019-08-06 15:52:16 +0200 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-08-07 08:24:49 +0200 |
commit | 6a9db8b37b8f5a587ffc7622a097bf9c2f6af3e0 (patch) | |
tree | 14a4877008e5ce5fa0633c650be58fc820b602c5 /erts/emulator/beam/erl_printf_term.c | |
parent | 381ff386961aa28abaf2b43572303bd394121a7d (diff) | |
download | otp-6a9db8b37b8f5a587ffc7622a097bf9c2f6af3e0.tar.gz otp-6a9db8b37b8f5a587ffc7622a097bf9c2f6af3e0.tar.bz2 otp-6a9db8b37b8f5a587ffc7622a097bf9c2f6af3e0.zip |
erts: Escape atoms in erlang:fun_to_list/1
Diffstat (limited to 'erts/emulator/beam/erl_printf_term.c')
-rw-r--r-- | erts/emulator/beam/erl_printf_term.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_printf_term.c b/erts/emulator/beam/erl_printf_term.c index 2e33a8a782..67c486a0db 100644 --- a/erts/emulator/beam/erl_printf_term.c +++ b/erts/emulator/beam/erl_printf_term.c @@ -533,13 +533,34 @@ print_term(fmtfn_t fn, void* arg, Eterm obj, long *dcount) { case EXPORT_DEF: { Export* ep = *((Export **) (export_val(wobj) + 1)); - Atom* module = atom_tab(atom_val(ep->info.mfa.module)); - Atom* name = atom_tab(atom_val(ep->info.mfa.function)); + long tdcount; + int tres; PRINT_STRING(res, fn, arg, "fun "); - PRINT_BUF(res, fn, arg, module->name, module->len); + + /* We pass a temporary 'dcount' and adjust the real one later to ensure + * that the fun doesn't get split up between the module and function + * name. */ + tdcount = MAX_ATOM_SZ_LIMIT; + tres = print_atom_name(fn, arg, ep->info.mfa.module, &tdcount); + if (tres < 0) { + res = tres; + goto L_done; + } + *dcount -= (MAX_ATOM_SZ_LIMIT - tdcount); + res += tres; + PRINT_CHAR(res, fn, arg, ':'); - PRINT_BUF(res, fn, arg, name->name, name->len); + + tdcount = MAX_ATOM_SZ_LIMIT; + tres = print_atom_name(fn, arg, ep->info.mfa.function, &tdcount); + if (tres < 0) { + res = tres; + goto L_done; + } + *dcount -= (MAX_ATOM_SZ_LIMIT - tdcount); + res += tres; + PRINT_CHAR(res, fn, arg, '/'); PRINT_SWORD(res, fn, arg, 'd', 0, 1, (ErlPfSWord) ep->info.mfa.arity); |