[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/zach-soc-bytecode-in-traceback 11b403c 1/3: Print byte offset of
From: |
Rocky Bernstein |
Subject: |
feature/zach-soc-bytecode-in-traceback 11b403c 1/3: Print byte offset of error in backtrace |
Date: |
Fri, 26 Jun 2020 11:40:19 -0400 (EDT) |
branch: feature/zach-soc-bytecode-in-traceback
commit 11b403cb230f7f447fa7b988412b9f07b89ac3b6
Author: Zach Shaftel <zshaftel@gmail.com>
Commit: Zach Shaftel <zshaftel@gmail.com>
Print byte offset of error in backtrace
---
lisp/emacs-lisp/debug.el | 6 ++++--
src/bytecode.c | 5 +++--
src/eval.c | 14 +++++++++++++-
src/lisp.h | 1 +
4 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index ed28997..db2943b 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -335,8 +335,10 @@ That buffer should be current already and in
debugger-mode."
nil))
(setq backtrace-view (plist-put backtrace-view :show-flags t)
- backtrace-insert-header-function (lambda ()
- (debugger--insert-header args))
+ backtrace-insert-header-function
+ (lambda ()
+ (insert (format "Byte-code offset of error: %d\n" (car (last args))))
+ (debugger--insert-header args))
backtrace-print-function debugger-print-function)
(backtrace-print)
;; Place point on "stack frame 0" (bug#15101).
diff --git a/src/bytecode.c b/src/bytecode.c
index 8ef8468..1c98a51 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -424,13 +424,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector,
Lisp_Object maxdepth,
Threading provides a performance boost. These macros are how
we allow the code to be compiled both ways. */
#ifdef BYTE_CODE_THREADED
+#define UPDATE_OFFSET (backtrace_byte_offset = pc - bytestr_data);
/* The CASE macro introduces an instruction's body. It is
either a label or a case label. */
#define CASE(OP) insn_ ## OP
/* NEXT is invoked at the end of an instruction to go to the
next instruction. It is either a computed goto, or a
plain break. */
-#define NEXT goto *(targets[op = FETCH])
+#define NEXT UPDATE_OFFSET goto *(targets[op = FETCH])
/* FIRST is like NEXT, but is only used at the start of the
interpreter body. In the switch-based interpreter it is the
switch, so the threaded definition must include a semicolon. */
@@ -1448,7 +1449,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector,
Lisp_Object maxdepth,
unbind_to (count, Qnil);
error ("binding stack not balanced (serious byte compiler bug)");
}
-
+ backtrace_byte_offset = -1;
Lisp_Object result = TOP;
SAFE_FREE ();
return result;
diff --git a/src/eval.c b/src/eval.c
index 4251c3e..82463c4 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -56,6 +56,8 @@ Lisp_Object Vrun_hooks;
/* FIXME: We should probably get rid of this! */
Lisp_Object Vsignaling_function;
+int backtrace_byte_offset = -1;
+
/* These would ordinarily be static, but they need to be visible to GDB. */
bool backtrace_p (union specbinding *) EXTERNALLY_VISIBLE;
Lisp_Object *backtrace_args (union specbinding *) EXTERNALLY_VISIBLE;
@@ -335,7 +337,10 @@ call_debugger (Lisp_Object arg)
redisplay, which necessarily leads to display problems. */
specbind (Qinhibit_eval_during_redisplay, Qt);
#endif
-
+ if (backtrace_byte_offset >= 0) {
+ arg = CALLN(Fappend, arg, list1(make_fixnum(backtrace_byte_offset)));
+ backtrace_byte_offset = -1;
+ }
val = apply1 (Vdebugger, arg);
/* Interrupting redisplay and resuming it later is not safe under
@@ -1696,6 +1701,13 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object
data, bool keyboard_quit)
/* Like xsignal, but takes 0, 1, 2, or 3 args instead of a list. */
void
+xsignal_with_offset (Lisp_Object error_symbol, Lisp_Object data, int
bytecode_offset)
+{
+ backtrace_byte_offset = bytecode_offset;
+ xsignal(error_symbol, data);
+}
+
+void
xsignal0 (Lisp_Object error_symbol)
{
xsignal (error_symbol, Qnil);
diff --git a/src/lisp.h b/src/lisp.h
index c9b069b..ff60dfa 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4089,6 +4089,7 @@ extern Lisp_Object Vautoload_queue;
extern Lisp_Object Vrun_hooks;
extern Lisp_Object Vsignaling_function;
extern Lisp_Object inhibit_lisp_code;
+extern int backtrace_byte_offset;
/* To run a normal hook, use the appropriate function from the list below.
The calling convention: