Mercurial > hg > xemacs-beta
view tests/reproduce-bugs.el @ 1268:fffe735e63ee
[xemacs-hg @ 2003-02-07 11:50:50 by ben]
fixes for menu crashes + better preemption behavior
This contains two related changes:
(1) Fix problems with reentrant calling of lwlib and associated
crashes when selecting menu items.
(2) Improve redisplay handling of preemption. Turn on lazy lock
and hold down page-down or page-up and you'll see what I mean.
They are related because they both touch on the code that retrieves
events and handles the internal queues.
console-msw.h, event-msw.c, event-stream.c, events.h, menubar-msw.c, menubar-x.c, menubar.h: mswindows_protect_modal_loop() has been generalized to
event_stream_protect_modal_loop(), and moved to event-stream.c.
mswindows_in_modal_loop ->in_modal_loop likewise. Changes in
event-msw.c and menubar-msw.c for the new names and calling format
(use structures instead of static variables in menubar-msw.c).
Delete former in_menu_callback and use in_modal_loop in its place.
Remove emacs_mswindows_quit_check_disallowed_p(), superseded by
in_modal_loop. Use event_stream_protect_modal_loop() in
pre_activate_callback() so that we get no lwlib reentrancy.
Rearrange some of the code in event-msw.c to be grouped better.
Make mswindows_drain_windows_queue() respect in_modal_loop and
do nothing if so.
cmdloop.c, event-stream.c: Don't conditionalize on LWLIB_MENUBARS_LUCID when giving error when
in_modal_loop, and give better error.
event-Xt.c, event-gtk.c: If in_modal_loop, only retrieve process and timeout events.
Don't retrieve any X events because processing them can lead
to reentrancy in lwlib -> death.
event-stream.c: Remove unused parameter to check_event_stream_ok() and change
all callers.
lisp.h, event-stream.c: Rearrange some functions for increased clarity -- in particular,
group all the input-pending/QUIT-related stuff together, and
put right next to next-event stuff, to which it's related.
Add the concept of "HOW_MANY" -- when asking whether user input
is pending, you can ask if at least HOW_MANY events are pending,
not just if any are. Add parameter to detect_input_pending()
for this. Change recursive_sit_for from a Lisp_Object (which
could only be Qt or Qnil) to an int, like it should be.
event-Xt.c, event-gtk.c, event-xlike-inc.c: New file.
Abstract out similar code in event_{Xt/gtk}_pending_p() and write
only once, using include-file tricks. Rewrite this function to
implement HOW_MANY and only process events when not in_modal_loop.
event-msw.c: Implement HOW_MANY and only process events when not in_modal_loop.
event-tty.c: Implement HOW_MANY.
redisplay.c: Add var `max-preempts' to control maximum number of preempts.
(#### perhaps not useful) Rewrite preemption check so that,
rather than preempting when any user events are available, only
preempt when a certain number (currently 4) of them are backed up.
This effectively allows redisplay to proceed to completion in the
presence of a fast auto-repeat (usually the auto-repeating is
generated dynamically as necessary), and you get much better
display behavior with lazy-lock active.
event-unixoid.c: Comment changes.
event-stream.c: Rewrite discard-input much more simply and safely using the
drain-queue functions. I think the old version might loop
forever if called when in_modal_loop.
SEMI-UNRELATED CHANGES:
-----------------------
event-stream.c: Turn QUIT-checking back on when running the pre-idle hook so it
can be quit out of.
indent.c: Document exact functioning of `vertical-motion' better, and its
differences from GNU Emacs.
author | ben |
---|---|
date | Fri, 07 Feb 2003 11:50:54 +0000 |
parents | 3ecd8885ac67 |
children | 98e54edf3ab2 |
line wrap: on
line source
;;; reproduce-bugs.el --- reproduce bugs in XEmacs; ;; Copyright (C) 1997 Free Software Foundation, Inc. ;; Copyright (C) 1997 Sun Microsystems, Inc. ;; Keywords: bugs, crash, burn, die, croak, munge ;; This file is part of XEmacs. ;; This file is free software; you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; XEmacs is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with XEmacs; see the file COPYING. If not, write to the Free ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. ;;; Synched up with: Not in FSF. ;;; Commentary: ;; Reproduce XEmacs bugs, so that they can get fixed. ;; Especially, make XEmacs crash. ;; You may need to use a debug version of XEmacs to reproduce some of these. ;; Several global keybindings are created, each of which exhibits a bug. ;; For XEmacs maintainers and other masochists. ;; It's a bad idea to rely on code in this file continuing to work in ;; the same way. :-) ;;; Code: (defvar bug-hashtable (make-hashtable 10)) (defmacro defbug (bug-number &rest body) `(puthash ,bug-number (lambda () ,@body) bug-hashtable)) (put 'defbug 'lisp-indent-function 'defun) (defconst bug-buffer (save-excursion (set-buffer (get-buffer-create "*Bug*")) (erase-buffer) (current-buffer))) ;;;####autoload (defun reproduce-bug (number) "Reproduce XEmacs bugs, so that they can get fixed. Especially, make XEmacs crash. See reproduce-bugs.el for bug descriptions and bug numbers. A debug version of XEmacs may be needed to reproduce some bugs." (interactive "nBug Number: ") (funcall (gethash number bug-hashtable))) ;;; Change this to your preferred key-binding (global-set-key [(control ?Z)] 'reproduce-bug) ;;;; Bugs follow: ;;; ------------------------------------------------------------------ ;;; Crash on trace-function ;;; Fatal error: assertion failed, file src/eval.c, line 1405, abort() (defbug 1 (trace-function 'record-buffer bug-buffer) (pop-to-buffer bug-buffer)) ;;; ------------------------------------------------------------------ ;;; Crashes with stack overflow ;;; Should give error via barf-if-buffer-read-only ;;; Fatal error: assertion failed, file src/eval.c, line 1874, abort() ;; This bug has been fixed. -sb (defbug 2 (switch-to-buffer bug-buffer) ;; The following line should contain a number of eight-bit characters (insert "²èÌÌËè¤Î°ÜÆ°¤Ï¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£º£Å٤ϡ¢²èÌ̤ÎÃæ¤Ç¡¢ÆÃÄê¤Î¾ì") (setq buffer-read-only t) (ignore-errors (encode-coding-region (point-min) (point-max) 'euc-japan)) (garbage-collect)) ;;; ------------------------------------------------------------------ ;;; Crashes in debug version only ;;; Fatal error: assertion failed, file src/objects.h, line 149, ;;; RECORD_TYPEP (_obj, lrecord_font_instance) || MARKED_RECORD_P (_obj) (defbug 3 (let (glyph ext) (make-face 'adobe-symbol-face) (set-face-font 'adobe-symbol-face "-adobe-symbol-medium-r-normal--*-140-*-*-p-*-adobe-fontspecific") (setq glyph (make-glyph (list (vector 'string :data (char-to-string ?\xD3))))) (set-glyph-face glyph 'adobe-symbol-face) (setq ext (make-extent 14 18)) (set-extent-property ext 'begin-glyph glyph))) ;;; ------------------------------------------------------------------ ;;; (maybe?) crash koi8 ;;; ACCL: Invalid command (c) ;;; With debugging on, crashes as follows: ;;; Fatal error: assertion failed, file src/lisp.h, line 1227, INTP (obj) (defbug 5 ;;(load "cyrillic") ;;(load "cyrillic-hooks") (princ (decode-coding-string "\xe1" 'koi8))) ;;; ------------------------------------------------------------------ ;;; Completely Uninterruptible hang in re-search-backward (Was: java-mode) (defbug 6 (switch-to-buffer bug-buffer) (insert "{ public static void main(String[] args) throws java.io.IOException { } } ") (goto-char (point-min)) (search-forward "{" nil nil 2) (backward-char) (re-search-backward "^\\s(\\|\\(^[ \t]*\\(\\(\\(public\\|protected\\|static\\)\\s-+\\)*\\(\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*[][_$.a-zA-Z0-9]+\\|[[a-zA-Z]\\)\\s-*\\)\\s-+\\)\\)?\\(\\([[a-zA-Z][][_$.a-zA-Z0-9]*\\s-+\\)\\s-*\\)?\\([_a-zA-Z][^][ \t:;.,{}()=]*\\|\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)\\)\\s-*\\(([^);{}]*)\\)?\\([] \t]*\\)\\(\\s-*\\<throws\\>\\s-*\\(\\([_$a-zA-Z][_$.a-zA-Z0-9]*\\)[, \t\n\r\f]*\\)+\\)?\\s-*\\)\\s(")) ;;; ------------------------------------------------------------------ ;;; regexp crash ;; This doesn't crash for me. -sb (defbug 7 (string-match "\\(\\s-\\|$\\)" "å")) ;;;; ------------------------------------------------------------------- ;;;; Bugs below this line have been fixed. ;;;; Keep these for regression testing ;;;; ------------------------------------------------------------------- ;;; ------------------------------------------------------------------ ;;; Infinite recursion crash - Segmentation Fault (defbug 4 (switch-to-buffer bug-buffer) (insert "abcdefg") (setq e (make-extent 1 4)) (set-extent-property e 'face 'bold) (set-extent-property e 'duplicable t) (set-extent-property e 'replicating t) (insert (buffer-string)) (delete-region 8 9)) (defbug 5 (interactive) (with-temp-buffer (insert "abc") (forward-char -1) (subst-char-in-region 1 4 ?b ?\344) (if (not (= (point) 3)) (message "Bug! point should equal 3 but is %d" (point))))) ;;; crash popup frames FIXED ;;(global-set-key ;; [(alt meta control f12)] ;; (lambda () ;; (interactive) ;; (let ((f (selected-frame))) ;; (make-frame `(popup ,(selected-frame))) ;; (make-frame) ;; (sit-for 0) ;; (delete-frame f) ;; (save-buffers-kill-emacs)))) ;;; crash on delete-frame-hook - FIXED! ;;(global-set-key ;; [(alt meta control f10)] ;; (lambda () ;; (interactive) ;; (setq delete-frame-hook ;; (lambda (frame) ;; (select-frame frame) ;; (kill-buffer (window-buffer (frame-selected-window frame))))))) ;;; reproduce-bugs.el ends here