From bfc99364d98004ce7d128f4d126d5af03f9c1b81 Mon Sep 17 00:00:00 2001 From: Dmitry Dzhus Date: Tue, 14 Jul 2009 08:40:58 +0000 Subject: [PATCH] (json-partial-output): Fix broken GDB/MI output in -break-info command (Emacs bug #3794). --- lisp/ChangeLog | 5 +++++ lisp/progmodes/gdb-mi.el | 34 ++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3a7a2546673..6b1755cc6a2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2009-07-14 Dmitry Dzhus + + * progmodes/gdb-mi.el (json-partial-output): Fix broken GDB/MI + output in -break-info command (Emacs bug #3794). + 2009-07-14 Glenn Morris * emacs-lisp/edebug.el (edebug-setup-hook, edebug-all-forms) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 17916b60b4c..1b61820fd01 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -1436,7 +1436,7 @@ static char *magick[] = { (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer) (erase-buffer))) -(defun json-partial-output (&optional fix-key) +(defun json-partial-output (&optional fix-key fix-list) "Parse gdb-partial-output-buffer with `json-read'. If FIX-KEY is non-nil, strip all \"FIX-KEY=\" occurences from @@ -1445,15 +1445,37 @@ in MI messages, e.g.: [key=.., key=..]. -stack-list-frames and -break-info are examples of MI commands which issue such responses. +If FIX-LIST is non-nil, \"FIX-LIST={..}\" is replaced with +\"FIX-LIST=[..]\" prior to parsing. This is used to fix broken +-break-info output when it contains breakpoint script field +incompatible with GDB/MI output syntax. + Note that GDB/MI output syntax is different from JSON both cosmetically and (in some cases) structurally, so correct results are not guaranteed." (with-current-buffer (gdb-get-buffer-create 'gdb-partial-output-buffer) (goto-char (point-min)) - (while (re-search-forward (concat "[\\[,]\\(" fix-key "=\\)") nil t) - (replace-match "" nil nil nil 1)) - (goto-char (point-min)) - (insert "{") + (when fix-key + (save-excursion + (while (re-search-forward (concat "[\\[,]\\(" fix-key "=\\)") nil t) + (replace-match "" nil nil nil 1)))) + (when fix-list + (save-excursion + ;; Find positions of brackets which enclose broken list + (while (re-search-forward (concat fix-list "={\"") nil t) + (let ((p1 (goto-char (- (point) 2))) + (p2 (progn (forward-sexp) + (1- (point))))) + ;; Replace braces with brackets + (save-excursion + (goto-char p1) + (delete-char 1) + (insert "[") + (goto-char p2) + (delete-char 1) + (insert "]")))))) + (goto-char (point-min)) + (insert "{") ;; Wrap field names in double quotes and replace equal sign with ;; semicolon. ;; TODO: This breaks badly with foo= inside constants @@ -1542,7 +1564,7 @@ OUTPUT-HANDLER-NAME handler uses customization of CUSTOM-DEFUN." (setq gdb-pending-triggers (delq 'gdb-invalidate-breakpoints gdb-pending-triggers)) (let ((breakpoints-list (gdb-get-field - (json-partial-output "bkpt") + (json-partial-output "bkpt" "script") 'BreakpointTable 'body))) (setq gdb-breakpoints-list breakpoints-list) (insert "Num\tType\t\tDisp\tEnb\tHits\tAddr What\n") -- 2.39.2