aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/progmodes/python.el34
2 files changed, 24 insertions, 15 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index c295150db7..fceef2353d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-31 Paul Pogonyshev <[email protected]>
+
+ * progmodes/python.el (python-current-defun): Adjust to never fall
+ into infinite loop.
+
2007-07-31 Stefan Monnier <[email protected]>
* pcvs.el (cvs-vc-command-advice): Handle the new fileset case.
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index c3caa7e397..9bef41a087 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1005,7 +1005,7 @@ don't move and return nil. Otherwise return t."
(set-text-properties 0 (length function-name) nil function-name)
function-name))
-
+
;;;; Imenu.
(defvar python-recursing)
@@ -1828,21 +1828,25 @@ of current line."
(save-excursion
;; Move up the tree of nested `class' and `def' blocks until we
;; get to zero indentation, accumulating the defined names.
- (let ((start t)
- (accum)
+ (let ((accum)
(length -1))
- (while (and (or start (> (current-indentation) 0))
- (or (null length-limit)
- (null (cdr accum))
- (< length length-limit)))
- (setq start nil)
- (python-beginning-of-block)
- (end-of-line)
- (beginning-of-defun)
- (when (looking-at (rx (0+ space) (or "def" "class") (1+ space)
- (group (1+ (or word (syntax symbol))))))
- (push (match-string 1) accum)
- (setq length (+ length 1 (length (car accum))))))
+ (catch 'done
+ (while (or (null length-limit)
+ (null (cdr accum))
+ (< length length-limit))
+ (setq start nil)
+ (let ((started-from (point)))
+ (python-beginning-of-block)
+ (end-of-line)
+ (beginning-of-defun)
+ (when (= (point) started-from)
+ (throw 'done nil)))
+ (when (looking-at (rx (0+ space) (or "def" "class") (1+ space)
+ (group (1+ (or word (syntax symbol))))))
+ (push (match-string 1) accum)
+ (setq length (+ length 1 (length (car accum)))))
+ (when (= (current-indentation) 0)
+ (throw 'done nil))))
(when accum
(when (and length-limit (> length length-limit))
(setcar accum ".."))