bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#12326: (24.2.50; js2-mode freezes on current trunk)


From: Dmitry Gutov
Subject: bug#12326: (24.2.50; js2-mode freezes on current trunk)
Date: Sun, 02 Sep 2012 05:41:58 +0400
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120824 Thunderbird/15.0

Some further analysis showed that the freeze is caused by the infinite mutual loop between `js2-do-parse' and `js2-mode-reset-timer'.
Looks like it goes like this:

1. I enter some input.
2. js2-mode-edit is called; it calls js2-mode-reset-timer
3. js2-mode-reset-timer schedules js2-mode-idle-reparse to run
4. js2-mode-idle-reparse calls js2-do-parse
5. If I manage to press a button while js2-do-parse is still running, and it reaches an (input-pending-p), it stops parsing and calls js2-mode-reset-timer. 6. Apparently, at this point the timer code still thinks we're idle, because it immediately calls js2-mode-idle-reparse. So goto 4. While (input-pending-p) still returns true.

If I manually inline `run-with-idle-timer' into `js2-mode-reset-timer' and change the DONT-WAIT `timer-activate-when-idle' argument to nil, it fixes the problem. Like this:

(defun js2-mode-reset-timer ()
  "Cancel any existing parse timer and schedule a new one."
  (if js2-mode-parse-timer
      (cancel-timer js2-mode-parse-timer))
  (setq js2-mode-parsing nil)
  (let ((timer (timer-create)))
    (setq js2-mode-parse-timer timer)
(timer-set-function timer 'js2-mode-idle-reparse (list (current-buffer)))
    (timer-set-idle-time timer js2-idle-timer-delay)
    (timer-activate-when-idle timer)))

Is this a problem in Emacs or consumer code?





reply via email to

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