emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r115133: * lisp/progmodes/gdb-mi.el: Avoid backtrack


From: Stefan Monnier
Subject: [Emacs-diffs] trunk r115133: * lisp/progmodes/gdb-mi.el: Avoid backtracking in regexp matcher.
Date: Sun, 17 Nov 2013 23:01:30 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 115133
revision-id: address@hidden
parent: address@hidden
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Sun 2013-11-17 18:01:23 -0500
message:
  * lisp/progmodes/gdb-mi.el: Avoid backtracking in regexp matcher.
  (gdb--string-regexp): New constant.
  (gdb-tooltip-print, gdb-var-evaluate-expression-handler)
  (gdbmi-bnf-stream-record, gdb-jsonify-buffer): Use it.
  (gdb-source-file-regexp, gdb-prompt-name-regexp): Use it and change
  submatch 1.
  (gdb-get-source-file-list, gdb-get-prompt, gdb-get-source-file):
  Adjust use accordingly.
  (gdb-breakpoints-list-handler-custom): Pre-build the y/n string.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/progmodes/gdb-mi.el       gdbmi.el-20100327132052-973a0aspo2g2bze8-1
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2013-11-17 21:39:13 +0000
+++ b/lisp/ChangeLog    2013-11-17 23:01:23 +0000
@@ -1,3 +1,15 @@
+2013-11-17  Stefan Monnier  <address@hidden>
+
+       * progmodes/gdb-mi.el: Avoid backtracking in regexp matcher.
+       (gdb--string-regexp): New constant.
+       (gdb-tooltip-print, gdb-var-evaluate-expression-handler)
+       (gdbmi-bnf-stream-record, gdb-jsonify-buffer): Use it.
+       (gdb-source-file-regexp, gdb-prompt-name-regexp): Use it and change
+       submatch 1.
+       (gdb-get-source-file-list, gdb-get-prompt, gdb-get-source-file):
+       Adjust use accordingly.
+       (gdb-breakpoints-list-handler-custom): Pre-build the y/n string.
+
 2013-11-17  Adam Sokolnicki  <address@hidden>  (tiny change)
 
        * progmodes/ruby-mode.el (ruby-toggle-block): Don't stop at

=== modified file 'lisp/progmodes/gdb-mi.el'
--- a/lisp/progmodes/gdb-mi.el  2013-09-13 06:56:35 +0000
+++ b/lisp/progmodes/gdb-mi.el  2013-11-17 23:01:23 +0000
@@ -1016,11 +1016,15 @@
 
 (declare-function tooltip-show "tooltip" (text &optional use-echo-area))
 
+(defconst gdb--string-regexp "\"\\(?:[^\\\"]\\|\\\\.\\)*\"")
+
 (defun gdb-tooltip-print (expr)
   (with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
     (goto-char (point-min))
     (cond
-     ((re-search-forward ".*value=\\(\".*\"\\)" nil t)
+     ((re-search-forward (concat ".*value=\\(" gdb--string-regexp
+                                 "\\)")
+                         nil t)
       (tooltip-show
        (concat expr " = " (read (match-string 1)))
        (or gud-tooltip-echo-area
@@ -1198,7 +1202,8 @@
 
 (defun gdb-var-evaluate-expression-handler (varnum changed)
   (goto-char (point-min))
-  (re-search-forward ".*value=\\(\".*\"\\)" nil t)
+  (re-search-forward (concat ".*value=\\(" gdb--string-regexp "\\)")
+                     nil t)
   (let ((var (assoc varnum gdb-var-list)))
     (when var
       (if changed (setcar (nthcdr 5 var) 'changed))
@@ -2124,7 +2129,8 @@
        '&' c-string"
   (when (< gdbmi-bnf-offset (length gud-marker-acc))
     (if (and (member (aref gud-marker-acc gdbmi-bnf-offset) '(?~ ?@ ?&))
-             (string-match "\\([~@&]\\)\\(\".*?\"\\)\n" gud-marker-acc
+             (string-match (concat "\\([~@&]\\)\\(" gdb--string-regexp "\\)\n")
+                           gud-marker-acc
                            gdbmi-bnf-offset))
         (let ((prefix (match-string 1 gud-marker-acc))
               (c-string (match-string 2 gud-marker-acc)))
@@ -2586,9 +2592,10 @@
               (insert "]"))))))
     (goto-char (point-min))
     (insert "{")
-    (while (re-search-forward
-           "\\([[:alnum:]-_]+\\)=\\({\\|\\[\\|\"\"\\|\".*?[^\\]\"\\)" nil t)
-      (replace-match "\"\\1\":\\2" nil nil))
+    (let ((re (concat "\\([[:alnum:]-_]+\\)=\\({\\|\\[\\|\"\"\\|"
+                      gdb--string-regexp "\\)")))
+      (while (re-search-forward re nil t)
+        (replace-match "\"\\1\":\\2" nil nil)))
     (goto-char (point-max))
     (insert "}")))
 
@@ -2812,8 +2819,12 @@
                             (or (bindat-get-field breakpoint 'disp) "")
                             (let ((flag (bindat-get-field breakpoint 
'enabled)))
                               (if (string-equal flag "y")
-                                  (propertize "y" 'font-lock-face  
font-lock-warning-face)
-                                (propertize "n" 'font-lock-face  
font-lock-comment-face)))
+                                  (eval-when-compile
+                                    (propertize "y" 'font-lock-face
+                                                font-lock-warning-face))
+                                (eval-when-compile
+                                  (propertize "n" 'font-lock-face
+                                              font-lock-comment-face))))
                             (bindat-get-field breakpoint 'addr)
                             (or (bindat-get-field breakpoint 'times) "")
                             (if (and type (string-match ".*watchpoint" type))
@@ -2865,7 +2876,8 @@
              (gdb-put-breakpoint-icon (string-equal flag "y") bptno
                                       (string-to-number line)))))))))
 
-(defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"")
+(defconst gdb-source-file-regexp
+  (concat "fullname=\\(" gdb--string-regexp "\\)"))
 
 (defun gdb-get-location (bptno line flag)
   "Find the directory containing the relevant source file.
@@ -2874,6 +2886,7 @@
   (catch 'file-not-found
     (if (re-search-forward gdb-source-file-regexp nil t)
        (delete (cons bptno "File not found") gdb-location-alist)
+      ;; FIXME: Why/how do we use (match-string 1) when the search failed?
       (push (cons bptno (match-string 1)) gdb-location-alist)
       (gdb-resync)
       (unless (assoc bptno gdb-location-alist)
@@ -4214,7 +4227,7 @@
 is set in them."
   (goto-char (point-min))
   (while (re-search-forward gdb-source-file-regexp nil t)
-    (push (match-string 1) gdb-source-file-list))
+    (push (read (match-string 1)) gdb-source-file-list))
   (dolist (buffer (buffer-list))
     (with-current-buffer buffer
       (when (member buffer-file-name gdb-source-file-list)
@@ -4253,14 +4266,15 @@
                 (setq gud-overlay-arrow-position (make-marker))
                 (set-marker gud-overlay-arrow-position position))))))))
 
-(defvar gdb-prompt-name-regexp "value=\"\\(.*?\\)\"")
+(defconst gdb-prompt-name-regexp
+  (concat "value=\\(" gdb--string-regexp "\\)"))
 
 (defun gdb-get-prompt ()
   "Find prompt for GDB session."
   (goto-char (point-min))
   (setq gdb-prompt-name nil)
   (re-search-forward gdb-prompt-name-regexp nil t)
-  (setq gdb-prompt-name (match-string 1))
+  (setq gdb-prompt-name (read (match-string 1)))
   ;; Insert first prompt.
   (setq gdb-filter-output (concat gdb-filter-output gdb-prompt-name)))
 
@@ -4541,7 +4555,7 @@
 buffers, if required."
   (goto-char (point-min))
   (if (re-search-forward gdb-source-file-regexp nil t)
-      (setq gdb-main-file (match-string 1)))
+      (setq gdb-main-file (read (match-string 1))))
   (if gdb-many-windows
       (gdb-setup-windows)
     (gdb-get-buffer-create 'gdb-breakpoints-buffer)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]