diff options
author | John Högberg <john@erlang.org> | 2019-09-10 16:42:49 +0200 |
---|---|---|
committer | John Högberg <john@erlang.org> | 2019-09-16 14:21:25 +0200 |
commit | 1c49fba50b7536865a340664f4004f501c3a2109 (patch) | |
tree | bcc9885ba74af299627dcf6eb45ec8f0b9aa6228 | |
parent | c42be1bb5540ed0ffafdc46b506a1bbe0cbaa2df (diff) | |
download | erlang-1c49fba50b7536865a340664f4004f501c3a2109.tar.gz |
erts: Share printable_return_address with erl_bif_info
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 20 | ||||
-rw-r--r-- | erts/emulator/beam/bif_instrs.tab | 2 | ||||
-rw-r--r-- | erts/emulator/beam/erl_bif_info.c | 23 | ||||
-rw-r--r-- | erts/emulator/beam/global.h | 1 |
4 files changed, 9 insertions, 37 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index 20c4f83a81..e8a0c666e3 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -295,7 +295,6 @@ do { \ */ static void init_emulator_finish(void) ERTS_NOINLINE; static ErtsCodeMFA *ubif2mfa(void* uf) ERTS_NOINLINE; -static BeamInstr *printable_return_address(Process* p, Eterm *E) ERTS_NOINLINE; static BeamInstr* handle_error(Process* c_p, BeamInstr* pc, Eterm* reg, ErtsCodeMFA* bif_mfa) ERTS_NOINLINE; static BeamInstr* call_error_handler(Process* p, ErtsCodeMFA* mfa, @@ -1259,7 +1258,7 @@ Eterm error_atom[NUMBER_EXIT_CODES] = { * * This is needed to generate correct stacktraces when throwing errors from * instructions that return like an ordinary function, such as call_nif. */ -static BeamInstr *printable_return_address(Process* p, Eterm *E) { +BeamInstr *erts_printable_return_address(Process* p, Eterm *E) { Eterm *ptr = E; ASSERT(is_CP(*ptr)); @@ -1576,9 +1575,6 @@ expand_error_value(Process* c_p, Uint freason, Eterm Value) { static void gather_stacktrace(Process* p, struct StackTrace* s, int depth) { - BeamInstr i_return_time_trace; - BeamInstr i_return_to_trace; - BeamInstr i_return_trace; BeamInstr *prev; Eterm *ptr; @@ -1586,11 +1582,7 @@ gather_stacktrace(Process* p, struct StackTrace* s, int depth) return; } - i_return_time_trace = beam_return_time_trace[0]; - i_return_to_trace = beam_return_to_trace[0]; - i_return_trace = beam_return_trace[0]; - - prev = s->depth ? s->trace[s->depth-1] : s->pc; + prev = s->depth ? s->trace[s->depth - 1] : s->pc; ptr = p->stop; /* @@ -1606,12 +1598,12 @@ gather_stacktrace(Process* p, struct StackTrace* s, int depth) if (is_CP(*ptr)) { BeamInstr *cp = cp_val(*ptr); - if (*cp == i_return_time_trace) { + if (cp == beam_exception_trace || cp == beam_return_trace) { + ptr += 3; + } else if (cp == beam_return_time_trace) { ptr += 2; - } else if (*cp == i_return_to_trace) { + } else if (cp == beam_return_to_trace) { ptr += 1; - } else if (*cp == i_return_trace) { - ptr += 3; } else { if (cp != prev) { /* Record non-duplicates only */ diff --git a/erts/emulator/beam/bif_instrs.tab b/erts/emulator/beam/bif_instrs.tab index 42abd4b6c6..de5305bde4 100644 --- a/erts/emulator/beam/bif_instrs.tab +++ b/erts/emulator/beam/bif_instrs.tab @@ -606,7 +606,7 @@ nif_bif.epilogue() { $DISPATCH(); } { - BeamInstr *cp = printable_return_address(c_p, E); + BeamInstr *cp = erts_printable_return_address(c_p, E); ASSERT(VALID_INSTR(*cp)); I = handle_error(c_p, cp, reg, c_p->current); } diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 946fefa14f..21e8585e83 100644 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -2024,7 +2024,6 @@ current_function(Process *c_p, ErtsHeapFactory *hfact, Process* rp, if (c_p == rp && !(flags & ERTS_PI_FLAG_REQUEST_FOR_OTHER)) { BeamInstr* return_address; FunctionInfo caller_fi; - Eterm *ptr; /* * The current function is erlang:process_info/{1,2}, and we've @@ -2033,27 +2032,7 @@ current_function(Process *c_p, ErtsHeapFactory *hfact, Process* rp, * stack instead, which is safe since process_info is a "heavy" BIF * that is only called through its export entry. */ - - return_address = NULL; - ptr = STACK_TOP(rp); - ASSERT(is_CP(*ptr)); - - while (ptr < STACK_START(rp)) { - BeamInstr *cp = cp_val(*ptr); - - if (*cp == BeamOpCodeAddr(op_return_trace)) { - ptr += 3; - } else if (*cp == BeamOpCodeAddr(op_i_return_time_trace)) { - ptr += 2; - } else if (*cp == BeamOpCodeAddr(op_i_return_to_trace)) { - ptr += 1; - } else { - return_address = cp; - break; - } - } - - ASSERT(return_address != NULL); + return_address = erts_printable_return_address(rp, STACK_TOP(rp)); erts_lookup_function_info(&caller_fi, return_address, full_info); if (caller_fi.mfa) { diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h index 5bd0882834..b86709b093 100644 --- a/erts/emulator/beam/global.h +++ b/erts/emulator/beam/global.h @@ -1156,6 +1156,7 @@ void erts_dirty_process_main(ErtsSchedulerData *); Eterm build_stacktrace(Process* c_p, Eterm exc); Eterm expand_error_value(Process* c_p, Uint freason, Eterm Value); void erts_save_stacktrace(Process* p, struct StackTrace* s, int depth); +BeamInstr *erts_printable_return_address(Process* p, Eterm *E) ERTS_NOINLINE; /* erl_init.c */ |