annotate src/eval.c @ 793:e38acbeb1cae

[xemacs-hg @ 2002-03-29 04:46:17 by ben] lots o' fixes etc/ChangeLog: New file. Separated out all entries for etc/ into their own ChangeLog. Includes entries for the following files: etc/BABYL, etc/BETA, etc/CHARSETS, etc/DISTRIB, etc/Emacs.ad, etc/FTP, etc/GNUS-NEWS, etc/GOATS, etc/HELLO, etc/INSTALL, etc/MACHINES, etc/MAILINGLISTS, etc/MSDOS, etc/MYTHOLOGY, etc/NEWS, etc/OXYMORONS, etc/PACKAGES, etc/README, etc/TUTORIAL, etc/TUTORIAL.de, etc/TUTORIAL.ja, etc/TUTORIAL.ko, etc/TUTORIAL.se, etc/aliases.ksh, etc/altrasoft-logo.xpm, etc/check_cygwin_setup.sh, etc/custom/example-themes/europe-theme.el, etc/custom/example-themes/ex-custom-file, etc/custom/example-themes/example-theme.el, etc/e/eterm.ti, etc/edt-user.doc, etc/enriched.doc, etc/etags.1, etc/gnuserv.1, etc/gnuserv.README, etc/package-index.LATEST.gpg, etc/package-index.LATEST.pgp, etc/photos/jan.png, etc/recycle.xpm, etc/refcard.tex, etc/sample.Xdefaults, etc/sample.emacs, etc/sgml/CATALOG, etc/sgml/HTML32.dtd, etc/skk/SKK.tut.E, etc/smilies/Face_ase.xbm, etc/smilies/Face_ase2.xbm, etc/smilies/Face_ase3.xbm, etc/smilies/Face_smile.xbm, etc/smilies/Face_weep.xbm, etc/sounds, etc/toolbar, etc/toolbar/workshop-cap-up.xpm, etc/xemacs-ja.1, etc/xemacs.1, etc/yow.lines, etc\BETA, etc\NEWS, etc\README, etc\TUTORIAL, etc\TUTORIAL.de, etc\check_cygwin_setup.sh, etc\sample.init.el, etc\unicode\README, etc\unicode\mule-ucs\*, etc\unicode\other\* unicode/unicode-consortium/8859-16.TXT: New file. mule/english.el: Define this charset now, since a bug was fixed that formerly prevented it. mule/ethio-util.el: Fix compile errors involving Unicode `characters', which should be integers. Makefile.in.in: Always include gui.c, to fix compile error when TTY-only. EmacsFrame.c, abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, bytecode.h, callint.c, callproc.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.c, console-msw.h, console-tty.c, console-x.c, console-x.h, console.c, console.h, data.c, database.c, device-gtk.c, device-msw.c, device-x.c, device.c, device.h, dialog-msw.c, doc.c, doprnt.c, dumper.c, dynarr.c, editfns.c, eldap.c, eldap.h, elhash.c, elhash.h, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, events.h, extents.c, extents.h, faces.c, faces.h, file-coding.c, file-coding.h, fileio.c, filelock.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, free-hook.c, general-slots.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gpmevent.c, gtk-xemacs.c, gui-msw.c, gui-x.c, gui-x.h, gui.c, gui.h, gutter.c, gutter.h, indent.c, input-method-xlib.c, insdel.c, keymap.c, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-canna.c, mule-ccl.c, mule-charset.c, mule-wnnfns.c, native-gtk-toolbar.c, objects-msw.c, objects-tty.c, objects-x.c, objects.c, objects.h, opaque.c, opaque.h, postgresql.c, postgresql.h, print.c, process-unix.c, process.c, process.h, rangetab.c, rangetab.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, search.c, select-gtk.c, select-x.c, sound.c, specifier.c, specifier.h, strftime.c, symbols.c, symeval.h, syntax.h, text.c, text.h, toolbar-common.c, toolbar-msw.c, toolbar.c, toolbar.h, tooltalk.c, tooltalk.h, ui-gtk.c, ui-gtk.h, undo.c, vm-limit.c, window.c, window.h: Eliminate XSETFOO. Replace all usages with wrap_foo(). Make symbol->name a Lisp_Object, not Lisp_String *. Eliminate nearly all uses of Lisp_String * in favor of Lisp_Object, and correct macros so most of them favor Lisp_Object. Create new error-behavior ERROR_ME_DEBUG_WARN -- output warnings, but at level `debug' (usually ignored). Use it when instantiating specifiers, so problems can be debugged. Move log-warning-minimum-level into C so that we can optimize ERROR_ME_DEBUG_WARN. Fix warning levels consistent with new definitions. Add default_ and parent fields to char table; not yet implemented. New fun Dynarr_verify(); use for further error checking on Dynarrs. Rearrange code at top of lisp.h in conjunction with dynarr changes. Fix eifree(). Use Eistrings in various places (format_event_object(), where_is_to_char(), and callers thereof) to avoid fixed-size strings buffers. New fun write_eistring(). Reindent and fix GPM code to follow standards. Set default MS Windows font to Lucida Console (same size as Courier New but less interline spacing, so more lines fit). Increase default frame size on Windows to 50 lines. (If that's too big for the workspace, the frame will be shrunk as necessary.) Fix problem with text files with no newlines (). (Change `convert-eol' coding system to use `nil' for autodetect, consistent with make-coding-system.) Correct compile warnings in vm-limit.c. Fix handling of reverse-direction charsets to avoid errors when opening (e.g.) mule-ucs/lisp/reldata/uiso8859-6.el. Recode some object printing methods to use write_fmt_string() instead of a fixed buffer and sprintf. Turn on display of png comments as warnings (level `info'), now that they're unobtrusive. Revamped the sound documentation. Fixed bug in redisplay w.r.t. hscroll/truncation/continuation glyphs causing jumping up and down of the lines, since they're bigger than the line size. (It was seen most obviously when there's a horizontal scroll bar, e.g. do C-h a glyph or something like that.) The problem was that the glyph-contrib-p setting on glyphs was ignored even if it was set properly, which it wasn't until now.
author ben
date Fri, 29 Mar 2002 04:49:13 +0000
parents 943eaba38521
children a5954632b187
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Evaluator for XEmacs Lisp interpreter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985-1987, 1992-1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
4 Copyright (C) 2000, 2001, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: FSF 19.30 (except for Fsignal), Mule 2.0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #include "commands.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "backtrace.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "bytecode.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "console.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #ifdef ERROR_CHECK_GC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 int always_gc; /* Debugging hack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #define always_gc 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 struct backtrace *backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 /* Note: you must always fill in all of the fields in a backtrace structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 before pushing them on the backtrace_list. The profiling code depends
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 on this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #define PUSH_BACKTRACE(bt) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (bt).next = backtrace_list; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 backtrace_list = &(bt); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #define POP_BACKTRACE(bt) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 backtrace_list = (bt).next; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 /* Macros for calling subrs with an argument list whose length is only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 known at runtime. See EXFUN and DEFUN for similar hackery. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #define AV_0(av)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #define AV_1(av) av[0]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #define AV_2(av) AV_1(av), av[1]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #define AV_3(av) AV_2(av), av[2]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 #define AV_4(av) AV_3(av), av[3]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #define AV_5(av) AV_4(av), av[4]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #define AV_6(av) AV_5(av), av[5]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #define AV_7(av) AV_6(av), av[6]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #define AV_8(av) AV_7(av), av[7]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #define PRIMITIVE_FUNCALL_1(fn, av, ac) \
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
70 (((Lisp_Object (*)(EXFUN_##ac)) (fn)) (AV_##ac (av)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 /* If subrs take more than 8 arguments, more cases need to be added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 to this switch. (But wait - don't do it - if you really need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 a SUBR with more than 8 arguments, use max_args == MANY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 See the DEFUN macro in lisp.h) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #define PRIMITIVE_FUNCALL(rv, fn, av, ac) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 void (*PF_fn)(void) = (void (*)(void)) fn; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 Lisp_Object *PF_av = (av); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 switch (ac) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 { \
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
81 default:rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 0); break; \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 case 1: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 1); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 case 2: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 2); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 case 3: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 3); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 case 4: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 4); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 case 5: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 5); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 case 6: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 6); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 case 7: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 7); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 case 8: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 8); break; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #define FUNCALL_SUBR(rv, subr, av, ac) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 PRIMITIVE_FUNCALL (rv, subr_function (subr), av, ac);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 /* This is the list of current catches (and also condition-cases).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 This is a stack: the most recent catch is at the head of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 list. Catches are created by declaring a 'struct catchtag'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 locally, filling the .TAG field in with the tag, and doing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 a setjmp() on .JMP. Fthrow() will store the value passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 to it in .VAL and longjmp() back to .JMP, back to the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 that established the catch. This will always be either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 internal_catch() (catches established internally or through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 `catch') or condition_case_1 (condition-cases established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 internally or through `condition-case').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 The catchtag also records the current position in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 call stack (stored in BACKTRACE_LIST), the current position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 in the specpdl stack (used for variable bindings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 unwind-protects), the value of LISP_EVAL_DEPTH, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 current position in the GCPRO stack. All of these are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 restored by Fthrow().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 struct catchtag *catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 Lisp_Object Qautoload, Qmacro, Qexit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 Lisp_Object Qinteractive, Qcommandp, Qdefun, Qprogn, Qvalues;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 Lisp_Object Vquit_flag, Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 Lisp_Object Qand_rest, Qand_optional;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 Lisp_Object Qdebug_on_error, Qstack_trace_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 Lisp_Object Qdebug_on_signal, Qstack_trace_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 Lisp_Object Qdebugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Lisp_Object Qinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 Lisp_Object Qrun_hooks;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 Lisp_Object Qsetq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 Lisp_Object Qdisplay_warning;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 Lisp_Object Vpending_warnings, Vpending_warnings_tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Lisp_Object Qif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 /* Records whether we want errors to occur. This will be a boolean,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 nil (errors OK) or t (no errors). If t, an error will cause a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 throw to Qunbound_suspended_errors_tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 See call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Lisp_Object Vcurrent_error_state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 /* Current warning class when warnings occur, or nil for no warnings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Only meaningful when Vcurrent_error_state is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 See call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 Lisp_Object Vcurrent_warning_class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
144 /* Current warning level when warnings occur, or nil for no warnings.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
145 Only meaningful when Vcurrent_error_state is non-nil.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
146 See call_with_suspended_errors(). */
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
147 Lisp_Object Vcurrent_warning_level;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
148
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
149 /* Minimum level at which warnings are logged. Below this, they're ignored
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
150 entirely -- not even generated. */
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
151 Lisp_Object Vlog_warning_minimum_level;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
152
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 /* Special catch tag used in call_with_suspended_errors(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 Lisp_Object Qunbound_suspended_errors_tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 /* Non-nil means record all fset's and provide's, to be undone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 if the file being autoloaded is not fully loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 They are recorded by being consed onto the front of Vautoload_queue:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (FUN . ODEF) for a defun, (OFEATURES . nil) for a provide. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 Lisp_Object Vautoload_queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* Current number of specbindings allocated in specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 int specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* Pointer to beginning of specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 struct specbinding *specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 /* Pointer to first unused element in specpdl. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 struct specbinding *specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 /* specpdl_ptr - specpdl */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 int specpdl_depth_counter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 /* Maximum size allowed for specpdl allocation */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
175 Fixnum max_specpdl_size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 /* Depth in Lisp evaluations and function calls. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 static int lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 /* Maximum allowed depth in Lisp evaluations and function calls. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 452
diff changeset
181 Fixnum max_lisp_eval_depth;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 /* Nonzero means enter debugger before next function call */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 static int debug_on_next_call;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 /* List of conditions (non-nil atom means all) which cause a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 if an error is handled by the command loop's error handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 Lisp_Object Vstack_trace_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 /* List of conditions (non-nil atom means all) which enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 if an error is handled by the command loop's error handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 Lisp_Object Vdebug_on_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 /* List of conditions and regexps specifying error messages which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 do not enter the debugger even if Vdebug_on_error says they should. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 Lisp_Object Vdebug_ignored_errors;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 /* List of conditions (non-nil atom means all) which cause a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 if any error is signalled. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 Lisp_Object Vstack_trace_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 /* List of conditions (non-nil atom means all) which enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 if any error is signalled. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 Lisp_Object Vdebug_on_signal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 /* Nonzero means enter debugger if a quit signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 is handled by the command loop's error handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 From lisp, this is a boolean variable and may have the values 0 and 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 But, eval.c temporarily uses the second bit of this variable to indicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 that a critical_quit is in progress. The second bit is reset immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 after it is processed in signal_call_debugger(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 int debug_on_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 /* entering_debugger is basically equivalent */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* The value of num_nonmacro_input_chars as of the last time we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 started to enter the debugger. If we decide to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 again when this is still equal to num_nonmacro_input_chars, then we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 know that the debugger itself has an error, and we should just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 signal the error instead of entering an infinite loop of debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 invocations. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 int when_entered_debugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 /* Nonzero means we are trying to enter the debugger.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 This is to prevent recursive attempts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 Cleared by the debugger calling Fbacktrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 static int entering_debugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* Function to call to invoke the debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 Lisp_Object Vdebugger;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 /* Chain of condition handlers currently in effect.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 The elements of this chain are contained in the stack frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 of Fcondition_case and internal_condition_case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 When an error is signaled (by calling Fsignal, below),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 this chain is searched for an element that applies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 Each element of this list is one of the following:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 A list of a handler function and possibly args to pass to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 the function. This is a handler established with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 `call-with-condition-handler' (q.v.).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 A list whose car is Qunbound and whose cdr is Qt.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 This is a special condition-case handler established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 by C code with condition_case_1(). All errors are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 trapped; the debugger is not invoked even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 A list whose car is Qunbound and whose cdr is Qerror.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 This is a special condition-case handler established
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 by C code with condition_case_1(). It is like Qt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 except that the debugger is invoked normally if it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 called for.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 A list whose car is Qunbound and whose cdr is a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 of lists (CONDITION-NAME BODY ...) exactly as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 `condition-case'. This is a normal `condition-case'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 Note that in all cases *except* the first, there is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 corresponding catch, whose TAG is the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 Vcondition_handlers just after the handler data just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 described is pushed onto it. The reason is that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 `condition-case' handlers need to throw back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 place where the handler was installed before invoking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 it, while `call-with-condition-handler' handlers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 invoked in the environment that `signal' was invoked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 static Lisp_Object Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 #define DEFEND_AGAINST_THROW_RECURSION
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 /* Used for error catching purposes by throw_or_bomb_out */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 static int throw_level;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
281 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
282
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
283 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 void check_error_state_sanity (void);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
285 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 /* The subr object type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 print_subr (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 Lisp_Subr *subr = XSUBR (obj);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
296 const CIntbyte *header =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (subr->max_args == UNEVALLED) ? "#<special-form " : "#<subr ";
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
298 const CIntbyte *name = subr_name (subr);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
299 const CIntbyte *trailer = subr->prompt ? " (interactive)>" : ">";
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
302 printing_unreadable_object ("%s%s%s", header, name, trailer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 write_c_string (header, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 write_c_string (name, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 write_c_string (trailer, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 static const struct lrecord_description subr_description[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
310 { XD_DOC_STRING, offsetof (Lisp_Subr, doc) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("subr", subr,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
315 0, print_subr, 0, 0, 0,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 subr_description,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 Lisp_Subr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 /* Entering the debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /* unwind-protect used by call_debugger() to restore the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 entering_debugger. (We cannot use specbind() because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 variable is not Lisp-accessible.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 restore_entering_debugger (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 entering_debugger = ! NILP (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 return arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 /* Actually call the debugger. ARG is a list of args that will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 passed to the debugger function, as follows;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 If due to frame exit, args are `exit' and the value being returned;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 this function's value will be returned instead of that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 If due to error, args are `error' and a list of the args to `signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 If due to `apply' or `funcall' entry, one arg, `lambda'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 If due to `eval' entry, one arg, t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 call_debugger_259 (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 return apply1 (Vdebugger, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 /* Call the debugger, doing some encapsulation. We make sure we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 some room on the eval and specpdl stacks, and bind entering_debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 to 1 during this call. This is used to trap errors that may occur
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 when entering the debugger (e.g. the value of `debugger' is invalid),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 so that the debugger will not be recursively entered if debug-on-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 is set. (Otherwise, XEmacs would infinitely recurse, attempting to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 enter the debugger.) entering_debugger gets reset to 0 as soon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 as a backtrace is displayed, so that further errors can indeed be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 handled normally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 We also establish a catch for 'debugger. If the debugger function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 throws to this instead of returning a value, it means that the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 pressed 'c' (pretend like the debugger was never entered). The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 function then returns Qunbound. (If the user pressed 'r', for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 return a value, then the debugger function returns normally with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 this value.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 The difference between 'c' and 'r' is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 debug-on-call:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 No difference. The call proceeds as normal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 debug-on-exit:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 With 'r', the specified value is returned as the function's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 return value. With 'c', the value that would normally be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 returned is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 signal:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 With 'r', the specified value is returned as the return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 value of `signal'. (This is the only time that `signal'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 can return, instead of making a non-local exit.) With `c',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 `signal' will continue looking for handlers as if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 debugger was never entered, and will probably end up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 throwing to a handler or to top-level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 call_debugger (Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 int threw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 if (lisp_eval_depth + 20 > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 max_lisp_eval_depth = lisp_eval_depth + 20;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 if (specpdl_size + 40 > max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 max_specpdl_size = specpdl_size + 40;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 record_unwind_protect (restore_entering_debugger,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (entering_debugger ? Qt : Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 entering_debugger = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 val = internal_catch (Qdebugger, call_debugger_259, arg, &threw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
404 return unbind_to_1 (speccount, ((threw)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 ? Qunbound /* Not returning a value */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 : val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 /* Called when debug-on-exit behavior is called for. Enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 with the appropriate args for this. VAL is the exit value that is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 about to be returned. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 do_debug_on_exit (Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 /* This is falsified by call_debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 Lisp_Object v = call_debugger (list2 (Qexit, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 return !UNBOUNDP (v) ? v : val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 /* Called when debug-on-call behavior is called for. Enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 with the appropriate args for this. VAL is either t for a call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 through `eval' or 'lambda for a call through `funcall'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 #### The differentiation here between EVAL and FUNCALL is bogus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 FUNCALL can be defined as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (defmacro func (fun &rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 (cons (eval fun) args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 and should be treated as such.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 do_debug_on_call (Lisp_Object code)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 backtrace_list->debug_on_exit = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 call_debugger (list1 (code));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 /* LIST is the value of one of the variables `debug-on-error',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 `debug-on-signal', `stack-trace-on-error', or `stack-trace-on-signal',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 and CONDITIONS is the list of error conditions associated with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 the error being signalled. This returns non-nil if LIST
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 matches CONDITIONS. (A nil value for LIST does not match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 CONDITIONS. A non-list value for LIST does match CONDITIONS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 A list matches CONDITIONS when one of the symbols in LIST is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 same as one of the symbols in CONDITIONS.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 wants_debugger (Lisp_Object list, Lisp_Object conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 if (NILP (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 if (! CONSP (list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 while (CONSP (conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 Lisp_Object this, tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 this = XCAR (conditions);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 for (tail = list; CONSP (tail); tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 if (EQ (XCAR (tail), this))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 conditions = XCDR (conditions);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 /* Return 1 if an error with condition-symbols CONDITIONS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 and described by SIGNAL-DATA, should skip the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 according to debugger-ignore-errors. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 skip_debugger (Lisp_Object conditions, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 Lisp_Object tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 int first_string = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 Lisp_Object error_message = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 for (tail = Vdebug_ignored_errors; CONSP (tail); tail = XCDR (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 if (STRINGP (XCAR (tail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 if (first_string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 error_message = Ferror_message_string (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 first_string = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 if (fast_lisp_string_match (XCAR (tail), error_message) >= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 Lisp_Object contail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 for (contail = conditions; CONSP (contail); contail = XCDR (contail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 if (EQ (XCAR (tail), XCAR (contail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 /* Actually generate a backtrace on STREAM. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 backtrace_259 (Lisp_Object stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 return Fbacktrace (stream, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 /* An error was signaled. Maybe call the debugger, if the `debug-on-error'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 etc. variables call for this. CONDITIONS is the list of conditions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 associated with the error being signalled. SIG is the actual error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 being signalled, and DATA is the associated data (these are exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 the same as the arguments to `signal'). ACTIVE_HANDLERS is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 list of error handlers that are to be put in place while the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 is called. This is generally the remaining handlers that are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 outside of the innermost handler trapping this error. This way,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 if the same error occurs inside of the debugger, you usually don't get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 the debugger entered recursively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 This function returns Qunbound if it didn't call the debugger or if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 the user asked (through 'c') that XEmacs should pretend like the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 debugger was never entered. Otherwise, it returns the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 that the user specified with `r'. (Note that much of the time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 the user will abort with C-], and we will never have a chance to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 return anything at all.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 SIGNAL_VARS_ONLY means we should only look at debug-on-signal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 and stack-trace-on-signal to control whether we do anything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 This is so that debug-on-error doesn't make handled errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 cause the debugger to get invoked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 STACK_TRACE_DISPLAYED and DEBUGGER_ENTERED are used so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 those functions aren't done more than once in a single `signal'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 session. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 signal_call_debugger (Lisp_Object conditions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 Lisp_Object sig, Lisp_Object data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 Lisp_Object active_handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 int signal_vars_only,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 int *stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 int *debugger_entered)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 Lisp_Object val = Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 Lisp_Object all_handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 Lisp_Object temp_data = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 GCPRO2 (all_handlers, temp_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 Vcondition_handlers = active_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 temp_data = Fcons (sig, data); /* needed for skip_debugger */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 if (!entering_debugger && !*stack_trace_displayed && !signal_vars_only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 && wants_debugger (Vstack_trace_on_error, conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 && !skip_debugger (conditions, temp_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 if (!noninteractive)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 internal_with_output_to_temp_buffer (build_string ("*Backtrace*"),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
576 backtrace_259,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
578 Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
579 else /* in batch mode, we want this going to stderr. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
580 backtrace_259 (Qnil);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
581 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 *stack_trace_displayed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 if (!entering_debugger && !*debugger_entered && !signal_vars_only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 && (EQ (sig, Qquit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 ? debug_on_quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 : wants_debugger (Vdebug_on_error, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 && !skip_debugger (conditions, temp_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 debug_on_quit &= ~2; /* reset critical bit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 val = call_debugger (list2 (Qerror, (Fcons (sig, data))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 *debugger_entered = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 if (!entering_debugger && !*stack_trace_displayed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 && wants_debugger (Vstack_trace_on_signal, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 if (!noninteractive)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 internal_with_output_to_temp_buffer (build_string ("*Backtrace*"),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 backtrace_259,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612 Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 else /* in batch mode, we want this going to stderr. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 backtrace_259 (Qnil);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
616 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 *stack_trace_displayed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 if (!entering_debugger && !*debugger_entered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 && (EQ (sig, Qquit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 ? debug_on_quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 : wants_debugger (Vdebug_on_signal, conditions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 debug_on_quit &= ~2; /* reset critical bit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 specbind (Qdebug_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 specbind (Qstack_trace_on_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 specbind (Qdebug_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 specbind (Qstack_trace_on_signal, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 val = call_debugger (list2 (Qerror, (Fcons (sig, data))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 *debugger_entered = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 Vcondition_handlers = all_handlers;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
637 return unbind_to_1 (speccount, val);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 /* The basic special forms */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 /* Except for Fprogn(), the basic special forms below are only called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 from interpreted code. The byte compiler turns them into bytecodes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 DEFUN ("or", For, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 Eval args until one of them yields non-nil, then return that value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 The remaining args are not evalled at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 If all args return nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
656 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 LIST_LOOP_2 (arg, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 if (!NILP (val = Feval (arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 DEFUN ("and", Fand, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 Eval args until one of them yields nil, then return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 The remaining args are not evalled at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 If no arg yields nil, return the last arg's value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675 REGISTER Lisp_Object val = Qt;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 LIST_LOOP_2 (arg, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 if (NILP (val = Feval (arg)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 DEFUN ("if", Fif, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 \(if COND THEN ELSE...): if COND yields non-nil, do THEN, else do ELSE...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 Returns the value of THEN or the value of the last of the ELSE's.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 THEN must be one expression, but ELSE... can be zero or more expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 If COND yields nil, and there are no ELSE's, the value is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 Lisp_Object condition = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 Lisp_Object then_form = XCAR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 Lisp_Object else_forms = XCDR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 if (!NILP (Feval (condition)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 return Feval (then_form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 return Fprogn (else_forms);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 /* Macros `when' and `unless' are trivially defined in Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 but it helps for bootstrapping to have them ALWAYS defined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 DEFUN ("when", Fwhen, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 \(when COND BODY...): if COND yields non-nil, do BODY, else return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 BODY can be zero or more expressions. If BODY is nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 Lisp_Object cond = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 Lisp_Object body;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 switch (nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 case 1: body = Qnil; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 case 2: body = args[1]; break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 default: body = Fcons (Qprogn, Flist (nargs-1, args+1)); break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 return list3 (Qif, cond, body);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 DEFUN ("unless", Funless, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 \(unless COND BODY...): if COND yields nil, do BODY, else return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 BODY can be zero or more expressions. If BODY is nil, return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 Lisp_Object cond = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 Lisp_Object body = Flist (nargs-1, args+1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 return Fcons (Qif, Fcons (cond, Fcons (Qnil, body)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 DEFUN ("cond", Fcond, 0, UNEVALLED, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
739 \(cond CLAUSES...): try each clause until one succeeds.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 Each clause looks like (CONDITION BODY...). CONDITION is evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 and, if the value is non-nil, this clause succeeds:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 then the expressions in BODY are evaluated and the last one's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 value is the value of the cond-form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 If no clause succeeds, cond returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 If a clause has one element, as in (CONDITION),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 CONDITION's value if non-nil is returned from the cond-form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 LIST_LOOP_2 (clause, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 CHECK_CONS (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 if (!NILP (val = Feval (XCAR (clause))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 if (!NILP (clause = XCDR (clause)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 CHECK_TRUE_LIST (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 val = Fprogn (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 DEFUN ("progn", Fprogn, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 \(progn BODY...): eval BODY forms sequentially and return value of last one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 /* Caller must provide a true list in ARGS */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
777 REGISTER Lisp_Object val = Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 GCPRO1 (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 LIST_LOOP_2 (form, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 val = Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 /* Fprog1() is the canonical example of a function that must GCPRO a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 Lisp_Object across calls to Feval(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 DEFUN ("prog1", Fprog1, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 Similar to `progn', but the value of the first form is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 \(prog1 FIRST BODY...): All the arguments are evaluated sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 The value of FIRST is saved during evaluation of the remaining args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 whose values are discarded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
803 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 val = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 LIST_LOOP_2 (form, XCDR (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 DEFUN ("prog2", Fprog2, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 Similar to `progn', but the value of the second form is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 \(prog2 FIRST SECOND BODY...): All the arguments are evaluated sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 The value of SECOND is saved during evaluation of the remaining args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 whose values are discarded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
828 REGISTER Lisp_Object val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 args = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 val = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 args = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
838 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
839 LIST_LOOP_2 (form, args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
840 Feval (form);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
841 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 DEFUN ("let*", FletX, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 \(let* VARLIST BODY...): bind variables according to VARLIST then eval BODY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 The value of the last form in BODY is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 Each element of VARLIST is a symbol (which is bound to nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 Each VALUEFORM can refer to the symbols already bound by this VARLIST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 Lisp_Object varlist = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 EXTERNAL_LIST_LOOP_3 (var, varlist, tail)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 Lisp_Object symbol, value, tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 if (SYMBOLP (var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 symbol = var, value = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 CHECK_CONS (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 symbol = XCAR (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 tem = XCDR (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 value = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 CHECK_CONS (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 value = Feval (XCAR (tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 if (!NILP (XCDR (tem)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
878 sferror
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 ("`let' bindings can have only one value-form", var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 specbind (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
884 return unbind_to_1 (speccount, Fprogn (body));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 DEFUN ("let", Flet, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 \(let VARLIST BODY...): bind variables according to VARLIST then eval BODY.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 The value of the last form in BODY is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 Each element of VARLIST is a symbol (which is bound to nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 All the VALUEFORMs are evalled before any symbols are bound.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 Lisp_Object varlist = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 Lisp_Object *temps;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 int idx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 /* Make space to hold the values to give the bound variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 int varcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 GET_EXTERNAL_LIST_LENGTH (varlist, varcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 temps = alloca_array (Lisp_Object, varcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 /* Compute the values and store them in `temps' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 GCPRO1 (*temps);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 idx = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
916 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
917 LIST_LOOP_2 (var, varlist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 Lisp_Object *value = &temps[idx++];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
920 if (SYMBOLP (var))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
921 *value = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
922 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
923 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
924 Lisp_Object tem;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
925 CHECK_CONS (var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
926 tem = XCDR (var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
927 if (NILP (tem))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928 *value = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
929 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
930 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931 CHECK_CONS (tem);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
932 *value = Feval (XCAR (tem));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
933 gcpro1.nvars = idx;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
934
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
935 if (!NILP (XCDR (tem)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
936 sferror
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
937 ("`let' bindings can have only one value-form", var);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
938 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
939 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
940 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
941 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 idx = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
944 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
945 LIST_LOOP_2 (var, varlist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
946 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
947 specbind (SYMBOLP (var) ? var : XCAR (var), temps[idx++]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
948 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
949 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
953 return unbind_to_1 (speccount, Fprogn (body));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 DEFUN ("while", Fwhile, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 \(while TEST BODY...): if TEST yields non-nil, eval BODY... and repeat.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 The order of execution is thus TEST, BODY, TEST, BODY and so on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 until TEST returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 Lisp_Object test = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 while (!NILP (Feval (test)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 Fprogn (body);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 DEFUN ("setq", Fsetq, 0, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 \(setq SYM VAL SYM VAL ...): set each SYM to the value of its VAL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 The symbols SYM are variables; they are literal (not evaluated).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 The values VAL are expressions; they are evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 Thus, (setq x (1+ y)) sets `x' to the value of `(1+ y)'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 The second VAL is not computed until after the first SYM is set, and so on;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 each VAL can use the new value of variables set earlier in the `setq'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 The return value of the `setq' form is the value of the last VAL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 Lisp_Object symbol, tail, val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 int nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 GET_LIST_LENGTH (args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 if (nargs & 1) /* Odd number of arguments? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 Fsignal (Qwrong_number_of_arguments, list2 (Qsetq, make_int (nargs)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 PROPERTY_LIST_LOOP (tail, symbol, val, args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 val = Feval (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 Fset (symbol, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 DEFUN ("quote", Fquote, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 Return the argument, without evaluating it. `(quote x)' yields `x'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 return XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 DEFUN ("function", Ffunction, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 Like `quote', but preferred for objects which are functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 In byte compilation, `function' causes its argument to be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 `quote' cannot do that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 return XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 /* Defining functions/variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 define_function (Lisp_Object name, Lisp_Object defn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 Ffset (name, defn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 LOADHIST_ATTACH (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 return name;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 DEFUN ("defun", Fdefun, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 \(defun NAME ARGLIST [DOCSTRING] BODY...): define NAME as a function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 The definition is (lambda ARGLIST [DOCSTRING] BODY...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 See also the function `interactive'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 return define_function (XCAR (args),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 Fcons (Qlambda, XCDR (args)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 DEFUN ("defmacro", Fdefmacro, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 \(defmacro NAME ARGLIST [DOCSTRING] BODY...): define NAME as a macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 The definition is (macro lambda ARGLIST [DOCSTRING] BODY...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 When the macro is called, as in (NAME ARGS...),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 the function (lambda ARGLIST BODY...) is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 the list ARGS... as it appears in the expression,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 and the result should be a form to be evaluated instead of the original.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 return define_function (XCAR (args),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 Fcons (Qmacro, Fcons (Qlambda, XCDR (args))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 DEFUN ("defvar", Fdefvar, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 \(defvar SYMBOL INITVALUE DOCSTRING): define SYMBOL as a variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 You are not required to define a variable in order to use it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 but the definition can supply documentation and an initial value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 in a way that tags can recognize.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 INITVALUE is evaluated, and used to set SYMBOL, only if SYMBOL's value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 void. (However, when you evaluate a defvar interactively, it acts like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 defconst: SYMBOL's value is always set regardless of whether it's currently
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 void.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 If SYMBOL is buffer-local, its default value is what is set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 buffer-local values are not affected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 INITVALUE and DOCSTRING are optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 If DOCSTRING starts with *, this variable is identified as a user option.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1080 This means that M-x set-variable recognizes it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 If INITVALUE is missing, SYMBOL's value is not set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 In lisp-interaction-mode defvar is treated as defconst.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 Lisp_Object sym = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 Lisp_Object val = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 if (NILP (Fdefault_boundp (sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 val = Feval (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 Fset_default (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 Lisp_Object doc = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 Fput (sym, Qvariable_documentation, doc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 if (!NILP (args = XCDR (args)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1108 signal_error (Qwrong_number_of_arguments, "too many arguments", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 #ifdef I18N3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 if (!NILP (Vfile_domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 Fput (sym, Qvariable_domain, Vfile_domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 LOADHIST_ATTACH (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 return sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 DEFUN ("defconst", Fdefconst, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 \(defconst SYMBOL INITVALUE DOCSTRING): define SYMBOL as a constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 The intent is that programs do not change this value, but users may.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 Always sets the value of SYMBOL to the result of evalling INITVALUE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 If SYMBOL is buffer-local, its default value is what is set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 buffer-local values are not affected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 DOCSTRING is optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 If DOCSTRING starts with *, this variable is identified as a user option.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1130 This means that M-x set-variable recognizes it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 Note: do not use `defconst' for user options in libraries that are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 normally loaded, since it is useful for users to be able to specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 their own values for such variables before loading the library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 Since `defconst' unconditionally assigns the variable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 it would override the user's choice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 Lisp_Object sym = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 Lisp_Object val = Feval (XCAR (args = XCDR (args)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 GCPRO1 (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 Fset_default (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 if (!NILP (args = XCDR (args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 Lisp_Object doc = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 Fput (sym, Qvariable_documentation, doc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 if (!NILP (args = XCDR (args)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1156 signal_error (Qwrong_number_of_arguments, "too many arguments", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 #ifdef I18N3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 if (!NILP (Vfile_domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 Fput (sym, Qvariable_domain, Vfile_domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 LOADHIST_ATTACH (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 return sym;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 DEFUN ("user-variable-p", Fuser_variable_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 Return t if VARIABLE is intended to be set and modified by users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 \(The alternative is a variable used internally in a Lisp program.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 Determined by whether the first character of the documentation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 for the variable is `*'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 (variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 Lisp_Object documentation = Fget (variable, Qvariable_documentation, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 ((INTP (documentation) && XINT (documentation) < 0) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 (STRINGP (documentation) &&
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1182 (XSTRING_BYTE (documentation, 0) == '*')) ||
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 /* If (STRING . INTEGER), a negative integer means a user variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 (CONSP (documentation)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 && STRINGP (XCAR (documentation))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 && INTP (XCDR (documentation))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 && XINT (XCDR (documentation)) < 0)) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 DEFUN ("macroexpand-internal", Fmacroexpand_internal, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 Return result of expanding macros at top level of FORM.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 If FORM is not a macro call, it is returned unchanged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 Otherwise, the macro is expanded and the expansion is considered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 in place of FORM. When a non-macro-call results, it is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1198 The second optional arg ENVIRONMENT specifies an environment of macro
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 definitions to shadow the loaded ones for use in file byte-compilation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1201 (form, environment))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 /* With cleanups from Hallvard Furuseth. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 REGISTER Lisp_Object expander, sym, def, tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 /* Come back here each time we expand a macro call,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 in case it expands into another macro call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 if (!CONSP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 /* Set SYM, give DEF and TEM right values in case SYM is not a symbol. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 def = sym = XCAR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 tem = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 /* Trace symbols aliases to other symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 until we get a symbol that is not an alias. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 while (SYMBOLP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 sym = def;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1222 tem = Fassq (sym, environment);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 def = XSYMBOL (sym)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 if (!UNBOUNDP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231 /* Right now TEM is the result from SYM in ENVIRONMENT,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 and if TEM is nil then DEF is SYM's function definition. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 if (NILP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 /* SYM is not mentioned in ENVIRONMENT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 Look at its function definition. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 if (UNBOUNDP (def)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 || !CONSP (def))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 /* Not defined or definition not suitable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 if (EQ (XCAR (def), Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 /* Autoloading function: will it be a macro when loaded? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 tem = Felt (def, make_int (4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 if (EQ (tem, Qt) || EQ (tem, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 /* Yes, load it and try again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 do_autoload (def, sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 else if (!EQ (XCAR (def), Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 else expander = XCDR (def);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 expander = XCDR (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 if (NILP (expander))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 form = apply1 (expander, XCDR (form));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 return form;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 /* Non-local exits */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 DEFUN ("catch", Fcatch, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 \(catch TAG BODY...): eval BODY allowing nonlocal exits using `throw'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 TAG is evalled to get the tag to use. Then the BODY is executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 Within BODY, (throw TAG) with same tag exits BODY and exits this `catch'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 If no throw happens, `catch' returns the value of the last BODY form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 If a throw happens, it specifies the value to return from `catch'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 Lisp_Object tag = Feval (XCAR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 Lisp_Object body = XCDR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 return internal_catch (tag, Fprogn, body, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 /* Set up a catch, then call C function FUNC on argument ARG.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 FUNC should return a Lisp_Object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 This is how catches are done from within C code. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 internal_catch (Lisp_Object tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 Lisp_Object (*func) (Lisp_Object arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 Lisp_Object arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 int * volatile threw)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 /* This structure is made part of the chain `catchlist'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 struct catchtag c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 /* Fill in the components of c, and put it on the list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 c.next = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 c.tag = tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 c.val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 c.backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 c.handlerlist = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 c.lisp_eval_depth = lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 c.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 c.poll_suppress_count = async_timer_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 c.gcpro = gcprolist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 catchlist = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 /* Call FUNC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 if (SETJMP (c.jmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 /* Throw works by a longjmp that comes right here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 if (threw) *threw = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 return c.val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 c.val = (*func) (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 if (threw) *threw = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 catchlist = c.next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1329 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1330 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1331 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 return c.val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 /* Unwind the specbind, catch, and handler stacks back to CATCH, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 jump to that CATCH, returning VALUE as the value of that catch.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 This is the guts Fthrow and Fsignal; they differ only in the way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 they choose the catch tag to throw to. A catch tag for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 condition-case form has a TAG of Qnil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 Before each catch is discarded, unbind all special bindings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 execute all unwind-protect clauses made above that catch. Unwind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 the handler stack as we go, so that the proper handlers are in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 effect for each unwind-protect clause we run. At the end, restore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 some static info saved in CATCH, and longjmp to the location
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 specified in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 This is used for correct unwinding in Fthrow and Fsignal. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 unwind_to_catch (struct catchtag *c, Lisp_Object val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 REGISTER int last_time;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 /* Unwind the specbind, catch, and handler stacks back to CATCH
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 Before each catch is discarded, unbind all special bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 and execute all unwind-protect clauses made above that catch.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 At the end, restore some static info saved in CATCH,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 and longjmp to the location specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 /* Save the value somewhere it will be GC'ed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 (Can't overwrite tag slot because an unwind-protect may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 want to throw to this same tag, which isn't yet invalid.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 c->val = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 /* Restore the polling-suppression count. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 set_poll_suppress_count (catch->poll_suppress_count);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1374 #if 1
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 last_time = catchlist == c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 /* Unwind the specpdl stack, and then restore the proper set of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 handlers. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1381 unbind_to (catchlist->pdlcount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 catchlist = catchlist->next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1383 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1384 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1385 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 while (! last_time);
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1388 #else
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1389 /* Former XEmacs code. This is definitely not as correct because
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1390 there may be a number of catches we're unwinding, and a number
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1391 of unwind-protects in the process. By not undoing the catches till
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1392 the end, there may be invalid catches still current. (This would
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1393 be a particular problem with code like this:
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1394
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1395 (catch 'foo
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1396 (call-some-code-which-does...
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1397 (catch 'bar
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1398 (unwind-protect
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1399 (call-some-code-which-does...
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1400 (catch 'bar
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1401 (call-some-code-which-does...
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1402 (throw 'foo nil))))
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1403 (throw 'bar nil)))))
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1404
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1405 This would try to throw to the inner (catch 'bar)!
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1406
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1407 --ben
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1408 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 /* Unwind the specpdl stack */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1410 unbind_to (c->pdlcount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 catchlist = c->next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1412 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1413 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1414 #endif
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1415 #endif /* Former code */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 gcprolist = c->gcpro;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 backtrace_list = c->backlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 lisp_eval_depth = c->lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1421 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 throw_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 LONGJMP (c->jmp, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 static DOESNT_RETURN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 throw_or_bomb_out (Lisp_Object tag, Lisp_Object val, int bomb_out_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 Lisp_Object sig, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1431 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 /* die if we recurse more than is reasonable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 if (++throw_level > 20)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1434 abort ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 /* If bomb_out_p is t, this is being called from Fsignal as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 "last resort" when there is no handler for this error and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 the debugger couldn't be invoked, so we are throwing to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 'top-level. If this tag doesn't exist (happens during the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 initialization stages) we would get in an infinite recursive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 Fsignal/Fthrow loop, so instead we bomb out to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 really-early-error-handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 Note that in fact the only time that the "last resort"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 occurs is when there's no catch for 'top-level -- the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 'top-level catch and the catch-all error handler are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 established at the same time, in initial_command_loop/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 top_level_1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 #### Fix this horrifitude!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 REGISTER struct catchtag *c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 if (!NILP (tag)) /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 for (c = catchlist; c; c = c->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 if (EQ (c->tag, tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 unwind_to_catch (c, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 if (!bomb_out_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 tag = Fsignal (Qno_catch, list2 (tag, val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 call1 (Qreally_early_error_handler, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 /* can't happen. who cares? - (Sun's compiler does) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 /* throw_level--; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 /* getting tired of compilation warnings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 /* return Qnil; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 /* See above, where CATCHLIST is defined, for a description of how
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 Fthrow() works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 Fthrow() is also called by Fsignal(), to do a non-local jump
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 back to the appropriate condition-case handler after (maybe)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 the debugger is entered. In that case, TAG is the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 of Vcondition_handlers that was in place just after the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 condition-case handler was set up. The car of this will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 some data referring to the handler: Its car will be Qunbound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 (thus, this tag can never be generated by Lisp code), and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 its CDR will be the HANDLERS argument to condition_case_1()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 (either Qerror, Qt, or a list of handlers as in `condition-case').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 This works fine because Fthrow() does not care what TAG was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 passed to it: it just looks up the catch list for something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 that is EQ() to TAG. When it finds it, it will longjmp()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 back to the place that established the catch (in this case,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 condition_case_1). See below for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 DEFUN ("throw", Fthrow, 2, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1498 Throw to the catch for TAG and return VALUE from it.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 Both TAG and VALUE are evalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1501 (tag, value))
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1502 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1503 throw_or_bomb_out (tag, value, 0, Qnil, Qnil); /* Doesn't return */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 DEFUN ("unwind-protect", Funwind_protect, 1, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 Do BODYFORM, protecting with UNWINDFORMS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 Usage looks like (unwind-protect BODYFORM UNWINDFORMS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 If BODYFORM completes normally, its value is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 after executing the UNWINDFORMS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 record_unwind_protect (Fprogn, XCDR (args));
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1520 return unbind_to_1 (speccount, Feval (XCAR (args)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 /* Signalling and trapping errors */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 condition_bind_unwind (Lisp_Object loser)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 {
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1531 /* There is no problem freeing stuff here like there is in
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1532 condition_case_unwind(), because there are no outside pointers
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1533 (like the tag below in the catchlist) pointing to the objects. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1534 Lisp_Cons *victim;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 /* ((handler-fun . handler-args) ... other handlers) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 Lisp_Object tem = XCAR (loser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 while (CONSP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 victim = XCONS (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 tem = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 victim = XCONS (loser);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 if (EQ (loser, Vcondition_handlers)) /* may have been rebound to some tail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 Vcondition_handlers = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 condition_case_unwind (Lisp_Object loser)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 /* ((<unbound> . clauses) ... other handlers */
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1557 /* NO! Doing this now leaves the tag deleted in a still-active
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1558 catch. With the recent changes to unwind_to_catch(), the
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1559 evil situation might not happen any more; it certainly could
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1560 happen before because it did. But it's very precarious to rely
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1561 on something like this. #### Instead we should rewrite, adopting
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1562 the FSF's mechanism with a struct handler instead of
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1563 Vcondition_handlers; then we have NO Lisp-object structures used
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1564 to hold all of the values, and there's no possibility either of
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1565 crashes from freeing objects too quickly, or objects not getting
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1566 freed and hanging around till the next GC.
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1567
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1568 In practice, the extra consing here should not matter because
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1569 it only happens when we throw past the condition-case, which almost
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1570 always is the result of an error. Most of the time, there will be
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1571 no error, and we will free the objects below in the main function.
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1572
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1573 --ben
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1574
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1575 DO NOT DO: free_cons (XCAR (loser));
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1576 */
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1577
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 if (EQ (loser, Vcondition_handlers)) /* may have been rebound to some tail */
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1579 Vcondition_handlers = XCDR (loser);
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1580
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1581 /* DO NOT DO: free_cons (loser); */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 /* Split out from condition_case_3 so that primitive C callers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 don't have to cons up a lisp handler form to be evaluated. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 /* Call a function BFUN of one argument BARG, trapping errors as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 specified by HANDLERS. If no error occurs that is indicated by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 HANDLERS as something to be caught, the return value of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 function is the return value from BFUN. If such an error does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 occur, HFUN is called, and its return value becomes the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 return value of condition_case_1(). The second argument passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 to HFUN will always be HARG. The first argument depends on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 HANDLERS:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 If HANDLERS is Qt, all errors (this includes QUIT, but not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 non-local exits with `throw') cause HFUN to be invoked, and VAL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 (the first argument to HFUN) is a cons (SIG . DATA) of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 arguments passed to `signal'. The debugger is not invoked even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 A HANDLERS value of Qerror is the same as Qt except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 debugger is invoked if `debug-on-error' was set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 Otherwise, HANDLERS should be a list of lists (CONDITION-NAME BODY ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 exactly as in `condition-case', and errors will be trapped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 as indicated in HANDLERS. VAL (the first argument to HFUN) will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 be a cons whose car is the cons (SIG . DATA) and whose CDR is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 list (BODY ...) from the appropriate slot in HANDLERS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 This function pushes HANDLERS onto the front of Vcondition_handlers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 (actually with a Qunbound marker as well -- see Fthrow() above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 for why), establishes a catch whose tag is this new value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 Vcondition_handlers, and calls BFUN. When Fsignal() is called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 it calls Fthrow(), setting TAG to this same new value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 Vcondition_handlers and setting VAL to the same thing that will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 be passed to HFUN, as above. Fthrow() longjmp()s back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 jump point we just established, and we in turn just call the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 HFUN and return its value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 For a real condition-case, HFUN will always be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 run_condition_case_handlers() and HARG is the argument VAR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 to condition-case. That function just binds VAR to the cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 (SIG . DATA) that is the CAR of VAL, and calls the handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 (BODY ...) that is the CDR of VAL. Note that before calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 Fthrow(), Fsignal() restored Vcondition_handlers to the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 it had *before* condition_case_1() was called. This maintains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 consistency (so that the state of things at exit of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 condition_case_1() is the same as at entry), and implies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 that the handler can signal the same error again (possibly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 after processing of its own), without getting in an infinite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 condition_case_1 (Lisp_Object handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 Lisp_Object (*bfun) (Lisp_Object barg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 Lisp_Object barg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 Lisp_Object (*hfun) (Lisp_Object val, Lisp_Object harg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 Lisp_Object harg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 struct catchtag c;
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1644 struct gcpro gcpro1, gcpro2, gcpro3;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 c.tag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 /* Do consing now so out-of-memory error happens up front */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 /* (unbound . stuff) is a special condition-case kludge marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 which is known specially by Fsignal.
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1652 [[ This is an abomination, but to fix it would require either
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 making condition_case cons (a union of the conditions of the clauses)
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1654 or changing the byte-compiler output (no thanks).]]
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1655
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1656 The above comment is clearly wrong. FSF does not do it this way
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1657 and did not change the byte-compiler output. Instead they use a
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1658 `struct handler' to hold the various values (in place of our
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1659 Vcondition_handlers) and chain them together, with pointers from
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1660 the `struct catchtag' to the `struct handler'. We should perhaps
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1661 consider moving to something similar, but not before I merge my
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1662 stderr-proc workspace, which contains changes to these
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1663 functions. --ben */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 c.tag = noseeum_cons (noseeum_cons (Qunbound, handlers),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 c.val = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 c.backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 /* #### */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 c.handlerlist = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 c.lisp_eval_depth = lisp_eval_depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 c.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 c.poll_suppress_count = async_timer_suppress_count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 c.gcpro = gcprolist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 /* #### FSFmacs does the following statement *after* the setjmp(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 c.next = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 if (SETJMP (c.jmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 /* throw does ungcpro, etc */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 return (*hfun) (c.val, harg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 record_unwind_protect (condition_case_unwind, c.tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 catchlist = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 h.handler = handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 h.var = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 h.next = handlerlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 h.tag = &c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 handlerlist = &h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 Vcondition_handlers = c.tag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 GCPRO1 (harg); /* Somebody has to gc-protect */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 c.val = ((*bfun) (barg));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 UNGCPRO;
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1703
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1704 /* Once we change `catchlist' below, the stuff in c will not be GCPRO'd. */
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1705 GCPRO3 (harg, c.val, c.tag);
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1706
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 catchlist = c.next;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1708 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1709 check_error_state_sanity ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1710 #endif
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1711 /* Note: The unbind also resets Vcondition_handlers. Maybe we should
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1712 delete this here. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 Vcondition_handlers = XCDR (c.tag);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1714 unbind_to (speccount);
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1715
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1716 UNGCPRO;
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1717 /* free the conses *after* the unbind, because the unbind will run
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1718 condition_case_unwind above. */
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1719 free_cons (XCONS (XCAR (c.tag)));
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1720 free_cons (XCONS (c.tag));
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
1721 return c.val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 run_condition_case_handlers (Lisp_Object val, Lisp_Object var)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 if (!NILP (h.var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 specbind (h.var, c.val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 val = Fprogn (Fcdr (h.chosen_clause));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 /* Note that this just undoes the binding of h.var; whoever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 longjmp()ed to us unwound the stack to c.pdlcount before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 throwing. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1736 unbind_to (c.pdlcount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 CHECK_TRUE_LIST (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 if (NILP (var))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 return Fprogn (Fcdr (val)); /* tail call */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 specbind (var, Fcar (val));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 val = Fprogn (Fcdr (val));
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1748 return unbind_to_1 (speccount, val);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 /* Here for bytecode to call non-consfully. This is exactly like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 condition-case except that it takes three arguments rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 than a single list of arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 condition_case_3 (Lisp_Object bodyform, Lisp_Object var, Lisp_Object handlers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 EXTERNAL_LIST_LOOP_2 (handler, handlers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 if (NILP (handler))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 else if (CONSP (handler))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 Lisp_Object conditions = XCAR (handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 /* CONDITIONS must a condition name or a list of condition names */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 if (SYMBOLP (conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 EXTERNAL_LIST_LOOP_2 (condition, conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 if (!SYMBOLP (condition))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 goto invalid_condition_handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 invalid_condition_handler:
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1779 sferror ("Invalid condition handler", handler);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 CHECK_SYMBOL (var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 return condition_case_1 (handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 Feval, bodyform,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 run_condition_case_handlers,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 var);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 DEFUN ("condition-case", Fcondition_case, 2, UNEVALLED, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 Regain control when an error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 Usage looks like (condition-case VAR BODYFORM HANDLERS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 Executes BODYFORM and returns its value if no error happens.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 Each element of HANDLERS looks like (CONDITION-NAME BODY...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 where the BODY is made of Lisp expressions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1798 A typical usage of `condition-case' looks like this:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1799
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1800 (condition-case nil
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1801 ;; you need a progn here if you want more than one statement ...
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1802 (progn
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1803 (do-something)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1804 (do-something-else))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1805 (error
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1806 (issue-warning-or)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1807 ;; but strangely, you don't need one here.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1808 (return-a-value-etc)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1809 ))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1810
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 A handler is applicable to an error if CONDITION-NAME is one of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 error's condition names. If an error happens, the first applicable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 handler is run. As a special case, a CONDITION-NAME of t matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 all errors, even those without the `error' condition name on them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 \(e.g. `quit').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 The car of a handler may be a list of condition names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 instead of a single condition name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 When a handler handles an error,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 control returns to the condition-case and the handler BODY... is executed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 VAR may be nil; then you do not get access to the signal information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 The value of the last BODY form is returned from the condition-case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 See also the function `signal' for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 Note that at the time the condition handler is invoked, the Lisp stack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 and the current catches, condition-cases, and bindings have all been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 popped back to the state they were in just before the call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 `condition-case'. This means that resignalling the error from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 within the handler will not result in an infinite loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 If you want to establish an error handler that is called with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 Lisp stack, bindings, etc. as they were when `signal' was called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 rather than when the handler was set, use `call-with-condition-handler'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 (args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 Lisp_Object var = XCAR (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 Lisp_Object bodyform = XCAR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 Lisp_Object handlers = XCDR (XCDR (args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 return condition_case_3 (bodyform, var, handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 DEFUN ("call-with-condition-handler", Fcall_with_condition_handler, 2, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 Regain control when an error is signalled, without popping the stack.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 Usage looks like (call-with-condition-handler HANDLER FUNCTION &rest ARGS).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 This function is similar to `condition-case', but the handler is invoked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 with the same environment (Lisp stack, bindings, catches, condition-cases)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 that was current when `signal' was called, rather than when the handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 was established.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 HANDLER should be a function of one argument, which is a cons of the args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 \(SIG . DATA) that were passed to `signal'. It is invoked whenever
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 `signal' is called (this differs from `condition-case', which allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 you to specify which errors are trapped). If the handler function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 returns, `signal' continues as if the handler were never invoked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 \(It continues to look for handlers established earlier than this one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 and invokes the standard error-handler if none is found.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 (int nargs, Lisp_Object *args)) /* Note! Args side-effected! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 /* #### If there were a way to check that args[0] were a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 which accepted one arg, that should be done here ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 /* (handler-fun . handler-args) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 tem = noseeum_cons (list1 (args[0]), Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 record_unwind_protect (condition_bind_unwind, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 Vcondition_handlers = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 /* Caller should have GC-protected args */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1878 return unbind_to_1 (speccount, Ffuncall (nargs - 1, args + 1));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 condition_type_p (Lisp_Object type, Lisp_Object conditions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 if (EQ (type, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 /* (condition-case c # (t c)) catches -all- signals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 * Use with caution! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 if (SYMBOLP (type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 return !NILP (Fmemq (type, conditions));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 for (; CONSP (type); type = XCDR (type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 if (!NILP (Fmemq (XCAR (type), conditions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 return_from_signal (Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 /* Most callers are not prepared to handle gc if this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 returns. So, since this feature is not very useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 take it out. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 /* Have called debugger; return value to signaller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 return value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 #else /* But the reality is that that stinks, because: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 /* GACK!!! Really want some way for debug-on-quit errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 to be continuable!! */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1911 signal_error (Qunimplemented,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1912 "Returning a value from an error is no longer supported",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
1913 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 extern int in_display;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 /* the workhorse error-signaling function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 /* #### This function has not been synched with FSF. It diverges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 significantly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 signal_1 (Lisp_Object sig, Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 Lisp_Object conditions;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 Lisp_Object handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 /* signal_call_debugger() could get called more than once
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 (once when a call-with-condition-handler is about to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 be dealt with, and another when a condition-case handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 is about to be invoked). So make sure the debugger and/or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 stack trace aren't done more than once. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 int stack_trace_displayed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 int debugger_entered = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 GCPRO2 (conditions, handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 if (!initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 /* who knows how much has been initialized? Safest bet is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 just to bomb out immediately. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
1947 stderr_out ("Error before initialization is complete!\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 if (gc_in_progress || in_display)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 /* This is one of many reasons why you can't run lisp code from redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 There is no sensible way to handle errors there. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 conditions = Fget (sig, Qerror_conditions, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 for (handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 CONSP (handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 handlers = XCDR (handlers))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 Lisp_Object handler_fun = XCAR (XCAR (handlers));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 Lisp_Object handler_data = XCDR (XCAR (handlers));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 Lisp_Object outer_handlers = XCDR (handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 if (!UNBOUNDP (handler_fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 /* call-with-condition-handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 Lisp_Object all_handlers = Vcondition_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 struct gcpro ngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 NGCPRO1 (all_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 Vcondition_handlers = outer_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 outer_handlers, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 RETURN_NUNGCPRO (return_from_signal (tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 tem = Fcons (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 if (NILP (handler_data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 tem = call1 (handler_fun, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 /* (This code won't be used (for now?).) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 struct gcpro nngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 NNGCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 nngcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 args[0] = handler_fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 args[1] = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 args[2] = handler_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 nngcpro1.var = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 tem = Fapply (3, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 NNUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 if (!EQ (tem, Qsignal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 /* If handler didn't throw, try another handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 Vcondition_handlers = all_handlers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 /* It's a condition-case handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 /* t is used by handlers for all conditions, set up by C code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 * debugger is not called even if debug_on_error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 else if (EQ (handler_data, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 return Fthrow (handlers, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 /* `error' is used similarly to the way `t' is used, but in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 addition it invokes the debugger if debug_on_error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 This is normally used for the outer command-loop error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 else if (EQ (handler_data, Qerror))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 Lisp_Object tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 outer_handlers, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 tem = Fcons (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 return Fthrow (handlers, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 /* handler established by real (Lisp) condition-case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 Lisp_Object h;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 for (h = handler_data; CONSP (h); h = Fcdr (h))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 Lisp_Object clause = Fcar (h);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 Lisp_Object tem = Fcar (clause);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 if (condition_type_p (tem, conditions))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 tem = signal_call_debugger (conditions, sig, data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 outer_handlers, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 if (!UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 return return_from_signal (tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 /* Doesn't return */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 tem = Fcons (Fcons (sig, data), Fcdr (clause));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 return Fthrow (handlers, tem);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 /* If no handler is present now, try to run the debugger,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 and if that fails, throw to top level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 #### The only time that no handler is present is during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 temacs or perhaps very early in XEmacs. In both cases,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 there is no 'top-level catch. (That's why the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 "bomb-out" hack was added.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 #### Fix this horrifitude!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 signal_call_debugger (conditions, sig, data, Qnil, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 &stack_trace_displayed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 &debugger_entered);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 throw_or_bomb_out (Qtop_level, Qt, 1, sig, data); /* Doesn't return */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 /****************** Error functions class 1 ******************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 /* Class 1: General functions that signal an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 These functions take an error type and a list of associated error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 /* The simplest external error function: it would be called
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2089 signal_continuable_error_1() in the terminology below, but it's
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 Lisp-callable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 DEFUN ("signal", Fsignal, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 Signal a continuable error. Args are ERROR-SYMBOL, and associated DATA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 An error symbol is a symbol defined using `define-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 DATA should be a list. Its elements are printed as part of the error message.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 If the signal is handled, DATA is made available to the handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 See also the function `signal-error', and the functions to handle errors:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 `condition-case' and `call-with-condition-handler'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 Note that this function can return, if the debugger is invoked and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 user invokes the "return from signal" option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 (error_symbol, data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 /* Fsignal() is one of these functions that's called all the time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 with newly-created Lisp objects. We allow this; but we must GC-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 protect the objects because all sorts of weird stuff could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 happen. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 GCPRO1 (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 if (!NILP (Vcurrent_error_state))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2115 if (!NILP (Vcurrent_warning_class) && !NILP (Vcurrent_warning_level))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2116 warn_when_safe_lispobj (Vcurrent_warning_class, Vcurrent_warning_level,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 Fcons (error_symbol, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 Fthrow (Qunbound_suspended_errors_tag, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 abort (); /* Better not get here! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 RETURN_UNGCPRO (signal_1 (error_symbol, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 /* Signal a non-continuable error. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 DOESNT_RETURN
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2127 signal_error_1 (Lisp_Object sig, Lisp_Object data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2132 #ifdef ERROR_CHECK_TYPECHECK
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2133 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2134 check_error_state_sanity (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2135 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2136 struct catchtag *c;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2137 int found_error_tag = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2138
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2139 for (c = catchlist; c; c = c->next)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2140 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2141 if (EQ (c->tag, Qunbound_suspended_errors_tag))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2142 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2143 found_error_tag = 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2144 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2145 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2146 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2147
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2148 assert (found_error_tag || NILP (Vcurrent_error_state));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2149 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2150 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 restore_current_warning_class (Lisp_Object warning_class)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 Vcurrent_warning_class = warning_class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 static Lisp_Object
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2160 restore_current_warning_level (Lisp_Object warning_level)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2161 {
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2162 Vcurrent_warning_level = warning_level;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2163 return Qnil;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2164 }
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2165
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2166 static Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 restore_current_error_state (Lisp_Object error_state)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 Vcurrent_error_state = error_state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2173 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2174 call_with_suspended_errors_1 (Lisp_Object opaque_arg)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2175 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2176 Lisp_Object val;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2177 Lisp_Object *kludgy_args = (Lisp_Object *) get_opaque_ptr (opaque_arg);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2178 int speccount = specpdl_depth ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2179
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2180 if (NILP (Vcurrent_error_state))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2181 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2182 record_unwind_protect (restore_current_error_state,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2183 Vcurrent_error_state);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2184 Vcurrent_error_state = Qt;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2185 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2186 PRIMITIVE_FUNCALL (val, get_opaque_ptr (kludgy_args[0]),
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2187 kludgy_args + 2, XINT (kludgy_args[1]));
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2188 return unbind_to_1 (speccount, val);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2189 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2190
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 /* Many functions would like to do one of three things if an error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 occurs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 (1) signal the error, as usual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 (2) silently fail and return some error value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 (3) do as (2) but issue a warning in the process.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2198 Currently there's lots of stuff that passes an Error_Behavior
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 value and calls maybe_signal_error() and other such functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 This approach is inherently error-prone and broken. A much
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 more robust and easier approach is to use call_with_suspended_errors().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 Wrap this around any function in which you might want errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 to not be errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 call_with_suspended_errors (lisp_fn_t fun, volatile Lisp_Object retval,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2208 Lisp_Object class, Error_Behavior errb,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 int speccount;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2213 Lisp_Object kludgy_args[22];
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2214 Lisp_Object *args = kludgy_args + 2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 assert (SYMBOLP (class)); /* sanity-check */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 assert (!NILP (class));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 assert (nargs >= 0 && nargs < 20);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 args[i] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2226 /* ERROR_ME means don't trap errors. (However, if errors are
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2227 already trapped, we leave them trapped.)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2228
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2229 Otherwise, we trap errors, and display as warnings if ERROR_ME_WARN.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2230
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2231 If ERROR_ME_NOT, we silently fail.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2232
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2233 If ERROR_ME_DEBUG_WARN, we display a warning, but at warning level to
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2234 `debug'. Normally these disappear, but can be seen if we changed
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2235 log-warning-minimum-level.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2236 */
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2237
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 /* If error-checking is not disabled, just call the function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 It's important not to override disabled error-checking with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 enabled error-checking. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 PRIMITIVE_FUNCALL (val, fun, args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2249 speccount = specpdl_depth ();
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2250 if (NILP (Vcurrent_warning_class))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2252 /* Don't change the existing class.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2253 #### Should we be consing the two together? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 record_unwind_protect (restore_current_warning_class,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 Vcurrent_warning_class);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 Vcurrent_warning_class = class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2259 record_unwind_protect (restore_current_warning_level,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2260 Vcurrent_warning_level);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2261 Vcurrent_warning_level =
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2262 (ERRB_EQ (errb, ERROR_ME_NOT) ? Qnil :
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2263 ERRB_EQ (errb, ERROR_ME_DEBUG_WARN) ? Qdebug :
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2264 Qwarning);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2265
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2266
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 int threw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 Lisp_Object the_retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 Lisp_Object opaque1 = make_opaque_ptr (kludgy_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 Lisp_Object opaque2 = make_opaque_ptr ((void *) fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 GCPRO2 (opaque1, opaque2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 kludgy_args[0] = opaque2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 kludgy_args[1] = make_int (nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 the_retval = internal_catch (Qunbound_suspended_errors_tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 call_with_suspended_errors_1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 opaque1, &threw);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 free_opaque_ptr (opaque1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 free_opaque_ptr (opaque2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 /* Use the returned value except in non-local exit, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 RETVAL applies. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 /* Some perverse compilers require the perverse cast below. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2286 return unbind_to_1 (speccount,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 threw ? *((Lisp_Object*) &(retval)) : the_retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 /* Signal a non-continuable error or display a warning or do nothing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 according to ERRB. CLASS is the class of warning and should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 refer to what sort of operation is being done (e.g. Qtoolbar,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 Qresource, etc.). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 void
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2297 maybe_signal_error_1 (Lisp_Object sig, Lisp_Object data, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2298 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 return;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2302 else if (ERRB_EQ (errb, ERROR_ME_DEBUG_WARN))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2303 warn_when_safe_lispobj (class, Qdebug, Fcons (sig, data));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 else if (ERRB_EQ (errb, ERROR_ME_WARN))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 warn_when_safe_lispobj (class, Qwarning, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 /* Signal a continuable error or display a warning or do nothing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 according to ERRB. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2315 maybe_signal_continuable_error_1 (Lisp_Object sig, Lisp_Object data,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2316 Lisp_Object class, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 return Qnil;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2320 else if (ERRB_EQ (errb, ERROR_ME_DEBUG_WARN))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2321 {
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2322 warn_when_safe_lispobj (class, Qdebug, Fcons (sig, data));
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2323 return Qnil;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2324 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 else if (ERRB_EQ (errb, ERROR_ME_WARN))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 warn_when_safe_lispobj (class, Qwarning, Fcons (sig, data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 return Fsignal (sig, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 /****************** Error functions class 2 ******************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2337 /* Class 2: Signal an error with a string and an associated object.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2338 Normally these functions are used to attach one associated object,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2339 but to attach no objects, specify Qunbound for FROB, and for more
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2340 than one object, make a list of the objects with Qunbound as the
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2341 first element. (If you have specifically two objects to attach,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2342 consider using the function in class 3 below.) These functions
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2343 signal an error of a specified type, whose data is one or more
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2344 objects (usually two), a string the related Lisp object(s)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2345 specified as FROB. */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2346
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2347 /* Out of REASON and FROB, return a list of elements suitable for passing
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2348 to signal_error_1(). */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2349
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2350 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2351 build_error_data (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2352 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2353 if (EQ (frob, Qunbound))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2354 frob = Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2355 else if (CONSP (frob) && EQ (XCAR (frob), Qunbound))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2356 frob = XCDR (frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2357 else
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2358 frob = list1 (frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2359 if (!reason)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2360 return frob;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2361 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2362 return Fcons (build_msg_string (reason), frob);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2363 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2364
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2365 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2366 signal_error (Lisp_Object type, const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2367 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2368 signal_error_1 (type, build_error_data (reason, frob));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2369 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2370
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2371 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2372 maybe_signal_error (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2373 Lisp_Object frob, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2374 Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2375 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2376 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2377 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2378 return;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2379 maybe_signal_error_1 (type, build_error_data (reason, frob), class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2380 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2381
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2382 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2383 signal_continuable_error (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2384 Lisp_Object frob)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2385 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2386 return Fsignal (type, build_error_data (reason, frob));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2387 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2388
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2389 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2390 maybe_signal_continuable_error (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2391 Lisp_Object frob, Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2392 Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2393 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2394 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2395 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2396 return Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2397 return maybe_signal_continuable_error_1 (type,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2398 build_error_data (reason, frob),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2399 class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2400 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2401
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2402
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2403 /****************** Error functions class 3 ******************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2404
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2405 /* Class 3: Signal an error with a string and two associated objects.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2406 These functions signal an error of a specified type, whose data
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2407 is three objects, a string and two related Lisp objects.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2408 (The equivalent could be accomplished using the class 2 functions,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2409 but these are more convenient in this particular case.) */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2410
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2411 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2412 signal_error_2 (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2413 Lisp_Object frob0, Lisp_Object frob1)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2414 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2415 signal_error_1 (type, list3 (build_msg_string (reason), frob0,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2416 frob1));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2417 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2418
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2419 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2420 maybe_signal_error_2 (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2421 Lisp_Object frob0, Lisp_Object frob1,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2422 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2423 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2424 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2425 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2426 return;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2427 maybe_signal_error_1 (type, list3 (build_msg_string (reason), frob0,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2428 frob1), class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2429 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2430
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2431 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2432 signal_continuable_error_2 (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2433 Lisp_Object frob0, Lisp_Object frob1)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2434 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2435 return Fsignal (type, list3 (build_msg_string (reason), frob0,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2436 frob1));
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2437 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2438
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2439 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2440 maybe_signal_continuable_error_2 (Lisp_Object type, const CIntbyte *reason,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2441 Lisp_Object frob0, Lisp_Object frob1,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2442 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2443 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2444 /* Optimization: */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2445 if (ERRB_EQ (errb, ERROR_ME_NOT))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2446 return Qnil;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2447 return maybe_signal_continuable_error_1
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2448 (type, list3 (build_msg_string (reason), frob0, frob1),
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2449 class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2450 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2451
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2452
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2453 /****************** Error functions class 4 ******************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2454
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2455 /* Class 4: Printf-like functions that signal an error.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2456 These functions signal an error of a specified type, whose data
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 is a single string, created using the arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2460 signal_ferror (Lisp_Object type, const CIntbyte *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2461 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2462 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2463 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2464
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2465 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2466 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2467 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2468
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2469 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2470 signal_error (type, 0, obj);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2471 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2472
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2473 void
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2474 maybe_signal_ferror (Lisp_Object type, Lisp_Object class, Error_Behavior errb,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2475 const CIntbyte *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2476 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2477 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2478 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2479
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2480 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2481 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2482 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2483
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2484 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2485 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2486 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2487
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2488 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2489 maybe_signal_error (type, 0, obj, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2490 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2491
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2492 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2493 signal_continuable_ferror (Lisp_Object type, const CIntbyte *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2499 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2500 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2501
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2502 /* Fsignal GC-protects its args */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2503 return Fsignal (type, list1 (obj));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2504 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2505
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2506 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2507 maybe_signal_continuable_ferror (Lisp_Object type, Lisp_Object class,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2508 Error_Behavior errb, const CIntbyte *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2509 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2510 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2511 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2512
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2513 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2514 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2515 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2516
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2517 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2518 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2519 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2520
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2521 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2522 return maybe_signal_continuable_error (type, 0, obj, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2523 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2524
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2525
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2526 /****************** Error functions class 5 ******************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2527
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2528 /* Class 5: Printf-like functions that signal an error.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2529 These functions signal an error of a specified type, whose data
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2530 is a one or more objects, a string (created using the arguments)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2531 and additional Lisp objects specified in FROB. (The syntax of FROB
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2532 is the same as for class 2.)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2533
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2534 There is no need for a class 6 because you can always attach 2
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2535 objects using class 5 (for FROB, specify a list with three
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2536 elements, the first of which is Qunbound), and these functions are
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2537 not commonly used.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2538 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2539
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2540 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2541 signal_ferror_with_frob (Lisp_Object type, Lisp_Object frob, const CIntbyte *fmt,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2542 ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2543 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2544 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2545 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2546
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2547 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2548 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2549 va_end (args);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2550
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2551 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2552 signal_error_1 (type, Fcons (obj, build_error_data (0, frob)));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2553 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2554
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2555 void
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2556 maybe_signal_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2557 Lisp_Object class, Error_Behavior errb,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2558 const CIntbyte *fmt, ...)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2559 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2560 Lisp_Object obj;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2561 va_list args;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2562
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2563 /* Optimization: */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2564 if (ERRB_EQ (errb, ERROR_ME_NOT))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2565 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2566
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2567 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2568 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2572 maybe_signal_error_1 (type, Fcons (obj, build_error_data (0, frob)), class,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2573 errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2577 signal_continuable_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2578 const CIntbyte *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2584 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2588 return Fsignal (type, Fcons (obj, build_error_data (0, frob)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 Lisp_Object
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2592 maybe_signal_continuable_ferror_with_frob (Lisp_Object type, Lisp_Object frob,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2593 Lisp_Object class,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2594 Error_Behavior errb,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2595 const CIntbyte *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 /* Optimization: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 if (ERRB_EQ (errb, ERROR_ME_NOT))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2605 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 /* Fsignal GC-protects its args */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2609 return maybe_signal_continuable_error_1 (type,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2610 Fcons (obj,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2611 build_error_data (0, frob)),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2612 class, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 /* This is what the QUIT macro calls to signal a quit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 signal_quit (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 if (EQ (Vquit_flag, Qcritical))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 debug_on_quit |= 2; /* set critical bit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 /* note that this is continuable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 Fsignal (Qquit, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2629 /************************ convenience error functions ***********************/
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2630
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2631 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 signal_void_function_error (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2634 return Fsignal (Qvoid_function, list1 (function));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2637 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 signal_invalid_function_error (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2640 return Fsignal (Qinvalid_function, list1 (function));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2643 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 signal_wrong_number_of_arguments_error (Lisp_Object function, int nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2646 return Fsignal (Qwrong_number_of_arguments,
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2647 list2 (function, make_int (nargs)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 /* Used in list traversal macros for efficiency. */
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2651 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 signal_malformed_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2654 signal_error (Qmalformed_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2657 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 signal_malformed_property_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2660 signal_error (Qmalformed_property_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2663 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 signal_circular_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2666 signal_error (Qcircular_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
2669 DOESNT_RETURN
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 signal_circular_property_list_error (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2672 signal_error (Qcircular_property_list, 0, list);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2674
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2675 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2676 syntax_error (const CIntbyte *reason, Lisp_Object frob)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2677 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2678 signal_error (Qsyntax_error, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2679 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2680
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2681 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2682 syntax_error_2 (const CIntbyte *reason, Lisp_Object frob1, Lisp_Object frob2)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2683 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2684 signal_error_2 (Qsyntax_error, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2685 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2686
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2687 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2688 maybe_syntax_error (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2689 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2690 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2691 maybe_signal_error (Qsyntax_error, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2692 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2693
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2694 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2695 sferror (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2696 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2697 signal_error (Qstructure_formation_error, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2698 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2699
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2700 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2701 sferror_2 (const CIntbyte *reason, Lisp_Object frob1, Lisp_Object frob2)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2702 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2703 signal_error_2 (Qstructure_formation_error, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2704 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2705
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2706 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2707 maybe_sferror (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2708 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2709 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2710 maybe_signal_error (Qstructure_formation_error, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2711 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2712
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2713 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2714 invalid_argument (const CIntbyte *reason, Lisp_Object frob)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2715 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2716 signal_error (Qinvalid_argument, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2717 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2718
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2719 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2720 invalid_argument_2 (const CIntbyte *reason, Lisp_Object frob1,
609
13e3d7ae7155 [xemacs-hg @ 2001-06-06 12:34:42 by ben]
ben
parents: 578
diff changeset
2721 Lisp_Object frob2)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2722 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2723 signal_error_2 (Qinvalid_argument, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2724 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2725
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2726 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2727 maybe_invalid_argument (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2728 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2729 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2730 maybe_signal_error (Qinvalid_argument, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2731 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2732
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2733 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2734 invalid_constant (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2735 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2736 signal_error (Qinvalid_constant, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2737 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2738
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2739 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2740 invalid_constant_2 (const CIntbyte *reason, Lisp_Object frob1,
609
13e3d7ae7155 [xemacs-hg @ 2001-06-06 12:34:42 by ben]
ben
parents: 578
diff changeset
2741 Lisp_Object frob2)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2742 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2743 signal_error_2 (Qinvalid_constant, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2744 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2745
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2746 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2747 maybe_invalid_constant (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2748 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2749 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2750 maybe_signal_error (Qinvalid_constant, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2751 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2752
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2753 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2754 invalid_operation (const CIntbyte *reason, Lisp_Object frob)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2755 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2756 signal_error (Qinvalid_operation, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2757 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2758
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2759 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2760 invalid_operation_2 (const CIntbyte *reason, Lisp_Object frob1,
609
13e3d7ae7155 [xemacs-hg @ 2001-06-06 12:34:42 by ben]
ben
parents: 578
diff changeset
2761 Lisp_Object frob2)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2762 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2763 signal_error_2 (Qinvalid_operation, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2764 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2765
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2766 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2767 maybe_invalid_operation (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2768 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2769 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2770 maybe_signal_error (Qinvalid_operation, reason, frob, class, errb);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2771 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2772
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2773 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2774 invalid_change (const CIntbyte *reason, Lisp_Object frob)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2775 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2776 signal_error (Qinvalid_change, reason, frob);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2777 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2778
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2779 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2780 invalid_change_2 (const CIntbyte *reason, Lisp_Object frob1, Lisp_Object frob2)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2781 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2782 signal_error_2 (Qinvalid_change, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2783 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2784
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2785 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2786 maybe_invalid_change (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2787 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2788 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2789 maybe_signal_error (Qinvalid_change, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2790 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2791
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2792 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2793 invalid_state (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2794 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2795 signal_error (Qinvalid_state, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2796 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2797
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2798 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2799 invalid_state_2 (const CIntbyte *reason, Lisp_Object frob1, Lisp_Object frob2)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2800 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2801 signal_error_2 (Qinvalid_state, reason, frob1, frob2);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2802 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2803
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2804 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2805 maybe_invalid_state (const CIntbyte *reason, Lisp_Object frob,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2806 Lisp_Object class, Error_Behavior errb)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2807 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2808 maybe_signal_error (Qinvalid_state, reason, frob, class, errb);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2809 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2810
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2811 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2812 wtaerror (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2813 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2814 signal_error (Qwrong_type_argument, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2815 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2816
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2817 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2818 stack_overflow (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2819 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2820 signal_error (Qstack_overflow, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2821 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2822
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2823 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2824 out_of_memory (const CIntbyte *reason, Lisp_Object frob)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2825 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2826 signal_error (Qout_of_memory, reason, frob);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2827 }
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2828
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2829 DOESNT_RETURN
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
2830 printing_unreadable_object (const CIntbyte *fmt, ...)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2831 {
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2832 Lisp_Object obj;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2833 va_list args;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2834
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2835 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
2836 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2837 va_end (args);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2838
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2839 /* Fsignal GC-protects its args */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
2840 signal_error (Qprinting_unreadable_object, 0, obj);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2841 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2842
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 /* User commands */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 DEFUN ("commandp", Fcommandp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 Return t if FUNCTION makes provisions for interactive calling.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 This means it contains a description for how to read arguments to give it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 The value is nil for an invalid function or a symbol with no function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 definition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 Interactively callable functions include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 -- strings and vectors (treated as keyboard macros)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 -- lambda-expressions that contain a top-level call to `interactive'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 -- autoload definitions made by `autoload' with non-nil fourth argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 (i.e. the interactive flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 -- compiled-function objects with a non-nil `compiled-function-interactive'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 -- subrs (built-in functions) that are interactively callable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 Also, a symbol satisfies `commandp' if its function definition does so.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 Lisp_Object fun = indirect_function (function, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 return XCOMPILED_FUNCTION (fun)->flags.interactivep ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 /* Lists may represent commands. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 return Fassq (Qinteractive, Fcdr (Fcdr (fun)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 return Fcar (Fcdr (Fcdr (Fcdr (fun))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 /* Emacs primitives are interactive if their DEFUN specifies an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 interactive spec. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 return XSUBR (fun)->prompt ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 /* Strings and vectors are keyboard macros. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 if (VECTORP (fun) || STRINGP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 /* Everything else (including Qunbound) is not a command. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 DEFUN ("command-execute", Fcommand_execute, 1, 3, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 Execute CMD as an editor command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 CMD must be an object that satisfies the `commandp' predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 Optional second arg RECORD-FLAG is as in `call-interactively'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 The argument KEYS specifies the value to use instead of (this-command-keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 when reading the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2905 (cmd, record_flag, keys))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 Lisp_Object prefixarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 Lisp_Object final = cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 struct console *con = XCONSOLE (Vselected_console);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 prefixarg = con->prefix_arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 con->prefix_arg = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 Vcurrent_prefix_arg = prefixarg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 debug_on_next_call = 0; /* #### from FSFmacs; correct? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 if (SYMBOLP (cmd) && !NILP (Fget (cmd, Qdisabled, Qnil)))
733
b1f74adcc1ff [xemacs-hg @ 2002-01-22 20:40:00 by janv]
janv
parents: 665
diff changeset
2919 return run_hook (Qdisabled_command_hook);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 final = indirect_function (cmd, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 if (CONSP (final) && EQ (Fcar (final), Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 do_autoload (final, cmd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 if (CONSP (final) || SUBRP (final) || COMPILED_FUNCTIONP (final))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 backtrace.function = &Qcall_interactively;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 backtrace.args = &cmd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 backtrace.nargs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2940 final = Fcall_interactively (cmd, record_flag, keys);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 return final;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 else if (STRINGP (final) || VECTORP (final))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 return Fexecute_kbd_macro (final, prefixarg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 Fsignal (Qwrong_type_argument,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 Fcons (Qcommandp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 (EQ (cmd, final)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 ? list1 (cmd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 : list2 (cmd, final))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 DEFUN ("interactive-p", Finteractive_p, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 Return t if function in which this appears was called interactively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 This means that the function was called with call-interactively (which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 includes being called as the binding of a key)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 and input is currently coming from the keyboard (not in keyboard macro).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 REGISTER struct backtrace *btp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 REGISTER Lisp_Object fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 if (!INTERACTIVE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 /* Unless the object was compiled, skip the frame of interactive-p itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 (if interpreted) or the frame of byte-code (if called from a compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 function). Note that *btp->function may be a symbol pointing at a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 compiled function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 btp = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 /* #### FSFmacs does the following instead. I can't figure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 out which one is more correct. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 /* If this isn't a byte-compiled function, there may be a frame at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 the top for Finteractive_p itself. If so, skip it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 fun = Findirect_function (*btp->function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 if (SUBRP (fun) && XSUBR (fun) == &Sinteractive_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 /* If we're running an Emacs 18-style byte-compiled function, there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 may be a frame for Fbyte_code. Now, given the strictest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 definition, this function isn't really being called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 interactively, but because that's the way Emacs 18 always builds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 byte-compiled functions, we'll accept it for now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 if (EQ (*btp->function, Qbyte_code))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 /* If this isn't a byte-compiled function, then we may now be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 looking at several frames for special forms. Skip past them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 while (btp &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 btp->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 if (! (COMPILED_FUNCTIONP (Findirect_function (*btp->function))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 btp = btp->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 btp && (btp->nargs == UNEVALLED
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 || EQ (*btp->function, Qbyte_code));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 btp = btp->next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 {}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 /* btp now points at the frame of the innermost function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 that DOES eval its args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 If it is a built-in function (such as load or eval-region)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 return nil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 /* Beats me why this is necessary, but it is */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 if (btp && EQ (*btp->function, Qcall_interactively))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 fun = Findirect_function (*btp->function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 /* btp points to the frame of a Lisp function that called interactive-p.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 Return t if that function was called interactively. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 /* Autoloading */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 DEFUN ("autoload", Fautoload, 2, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3039 Define FUNCTION to autoload from FILENAME.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3040 FUNCTION is a symbol; FILENAME is a file name string to pass to `load'.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3041 The remaining optional arguments provide additional info about the
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3042 real definition.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3043 DOCSTRING is documentation for FUNCTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3044 INTERACTIVE, if non-nil, says FUNCTION can be called interactively.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3045 TYPE indicates the type of the object:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 nil or omitted says FUNCTION is a function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 `keymap' says FUNCTION is really a keymap, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 `macro' or t says FUNCTION is really a macro.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3049 If FUNCTION already has a non-void function definition that is not an
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3050 autoload object, this function does nothing and returns nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3052 (function, filename, docstring, interactive, type))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 CHECK_SYMBOL (function);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3056 CHECK_STRING (filename);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 /* If function is defined and not as an autoload, don't override */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 Lisp_Object f = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 if (!UNBOUNDP (f) && !(CONSP (f) && EQ (XCAR (f), Qautoload)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 if (purify_flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 /* Attempt to avoid consing identical (string=) pure strings. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3068 filename = Fsymbol_name (Fintern (filename, Qnil));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
3070
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3071 return Ffset (function, Fcons (Qautoload, list4 (filename,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 docstring,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 interactive,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 type)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 un_autoload (Lisp_Object oldqueue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 REGISTER Lisp_Object queue, first, second;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 /* Queue to unwind is current value of Vautoload_queue.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 oldqueue is the shadowed value to leave in Vautoload_queue. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 queue = Vautoload_queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 Vautoload_queue = oldqueue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 while (CONSP (queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 first = XCAR (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 second = Fcdr (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 first = Fcar (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 if (NILP (second))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 Vfeatures = first;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 Ffset (first, second);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 queue = Fcdr (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 do_autoload (Lisp_Object fundef,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 Lisp_Object funname)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 Lisp_Object fun = funname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 CHECK_SYMBOL (funname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 GCPRO2 (fun, funname);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 /* Value saved here is to be restored into Vautoload_queue */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 record_unwind_protect (un_autoload, Vautoload_queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 Vautoload_queue = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 call4 (Qload, Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 Lisp_Object queue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 /* Save the old autoloads, in case we ever do an unload. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 for (queue = Vautoload_queue; CONSP (queue); queue = XCDR (queue))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 Lisp_Object first = XCAR (queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 Lisp_Object second = Fcdr (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 first = Fcar (first);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 /* Note: This test is subtle. The cdr of an autoload-queue entry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 may be an atom if the autoload entry was generated by a defalias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 or fset. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 if (CONSP (second))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 Fput (first, Qautoload, (XCDR (second)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 /* Once loading finishes, don't undo it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 Vautoload_queue = Qt;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
3139 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 fun = indirect_function (fun, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 #if 0 /* FSFmacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 if (!NILP (Fequal (fun, fundef)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 if (UNBOUNDP (fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 || (CONSP (fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 && EQ (XCAR (fun), Qautoload)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 #endif
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3150 invalid_state ("Autoloading failed to define function", funname);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 /* eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 static Lisp_Object funcall_lambda (Lisp_Object fun,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3160 int nargs, Lisp_Object args[]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 static int in_warnings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 in_warnings_restore (Lisp_Object minimus)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 in_warnings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 DEFUN ("eval", Feval, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 Evaluate FORM and return its value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 Lisp_Object fun, val, original_fun, original_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 int nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 /* I think this is a pretty safe place to call Lisp code, don't you? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 while (!in_warnings && !NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 Lisp_Object this_warning_cons, this_warning, class, level, messij;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 record_unwind_protect (in_warnings_restore, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 in_warnings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 this_warning_cons = Vpending_warnings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 this_warning = XCAR (this_warning_cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 /* in case an error occurs in the warn function, at least
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 it won't happen infinitely */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 Vpending_warnings = XCDR (Vpending_warnings);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 free_cons (XCONS (this_warning_cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 class = XCAR (this_warning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 level = XCAR (XCDR (this_warning));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 messij = XCAR (XCDR (XCDR (this_warning)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 free_list (this_warning);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 if (NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 Vpending_warnings_tail = Qnil; /* perhaps not strictly necessary,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 but safer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 GCPRO4 (form, class, level, messij);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 if (!STRINGP (messij))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 messij = Fprin1_to_string (messij, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 call3 (Qdisplay_warning, class, messij, level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 UNGCPRO;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
3209 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 if (!CONSP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 if (SYMBOLP (form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 return Fsymbol_value (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 return form;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 if ((consing_since_gc > gc_cons_threshold) || always_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 GCPRO1 (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 garbage_collect_1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 if (++lisp_eval_depth > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 if (max_lisp_eval_depth < 100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 max_lisp_eval_depth = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 if (lisp_eval_depth > max_lisp_eval_depth)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3234 stack_overflow ("Lisp nesting exceeds `max-lisp-eval-depth'",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3235 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 /* We guaranteed CONSP (form) above */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 original_fun = XCAR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 original_args = XCDR (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 GET_EXTERNAL_LIST_LENGTH (original_args, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 backtrace.function = &original_fun; /* This also protects them from gc */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 backtrace.args = &original_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 backtrace.nargs = UNEVALLED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 backtrace.evalargs = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 if (debug_on_next_call)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 do_debug_on_call (Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 if (profiling_active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 profile_increase_call_count (original_fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 /* At this point, only original_fun and original_args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 have values that will be used below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 fun = indirect_function (original_fun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 if (nargs < subr->min_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 if (max_args == UNEVALLED) /* Optimize for the common case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 val = (((Lisp_Object (*) (Lisp_Object)) subr_function (subr))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 (original_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 else if (nargs <= max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 Lisp_Object args[SUBR_MAX_ARGS];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 /* &optional args default to nil. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 while (p - args < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 *p++ = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 FUNCALL_SUBR (val, subr, args, max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 else if (max_args == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 /* Pass a vector of evaluated arguments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 val = (((Lisp_Object (*) (int, Lisp_Object *)) subr_function (subr))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 (nargs, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 wrong_number_of_arguments:
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
3334 val = signal_wrong_number_of_arguments_error (original_fun, nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337 else if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3338 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 backtrace.args = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 val = funcall_compiled_function (fun, nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 /* Do the debug-on-exit now, while args is still GCPROed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 /* Don't do it again when we return to eval. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 else if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 do_autoload (fun, original_fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 else if (EQ (funcar, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 val = Feval (apply1 (XCDR (fun), original_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 else if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 Lisp_Object *args = alloca_array (Lisp_Object, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 REGISTER Lisp_Object *p = args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 gcpro1.nvars = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 LIST_LOOP_2 (arg, original_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 *p++ = Feval (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 gcpro1.nvars++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 backtrace.args = args; /* this also GCPROs `args' */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 backtrace.nargs = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 val = funcall_lambda (fun, nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 /* Do the debug-on-exit now, while args is still GCPROed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 /* Don't do it again when we return to eval. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 else /* ! (SUBRP (fun) || COMPILED_FUNCTIONP (fun) || CONSP (fun)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3420 val = signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423 lisp_eval_depth--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 DEFUN ("funcall", Ffuncall, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 Call first argument as a function, passing the remaining arguments to it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 Thus, (funcall 'cons 'x 'y) returns (x . y).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 Lisp_Object fun;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 struct backtrace backtrace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 int fun_nargs = nargs - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 Lisp_Object *fun_args = args + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 if ((consing_since_gc > gc_cons_threshold) || always_gc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 /* Callers should gcpro lexpr args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 garbage_collect_1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 if (++lisp_eval_depth > max_lisp_eval_depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 if (max_lisp_eval_depth < 100)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 max_lisp_eval_depth = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 if (lisp_eval_depth > max_lisp_eval_depth)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3454 stack_overflow ("Lisp nesting exceeds `max-lisp-eval-depth'",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
3455 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 backtrace.pdlcount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 backtrace.function = &args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 backtrace.args = fun_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 backtrace.nargs = fun_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 backtrace.evalargs = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 backtrace.debug_on_exit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 PUSH_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 if (debug_on_next_call)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 do_debug_on_call (Qlambda);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 /* It might be useful to place this *after* all the checks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 if (profiling_active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 profile_increase_call_count (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 /* We could call indirect_function directly, but profiling shows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 this is worth optimizing by partially unrolling the loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 fun = XSYMBOL (fun)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 fun = XSYMBOL (fun)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 fun = indirect_function (fun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 Lisp_Object spacious_args[SUBR_MAX_ARGS];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 if (fun_nargs == max_args) /* Optimize for the common case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 funcall_subr:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 FUNCALL_SUBR (val, subr, fun_args, max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 }
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3501 else if (fun_nargs < subr->min_args)
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3502 {
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3503 goto wrong_number_of_arguments;
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3504 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 else if (fun_nargs < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 Lisp_Object *p = spacious_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 /* Default optionals to nil */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 while (fun_nargs--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 *p++ = *fun_args++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 while (p - spacious_args < max_args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 *p++ = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 fun_args = spacious_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 goto funcall_subr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 else if (max_args == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3520 val = SUBR_FUNCTION (subr, MANY) (fun_nargs, fun_args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 else if (max_args == UNEVALLED) /* Can't funcall a special form */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 wrong_number_of_arguments:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3529 val = signal_wrong_number_of_arguments_error (fun, fun_nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532 else if (COMPILED_FUNCTIONP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 val = funcall_compiled_function (fun, fun_nargs, fun_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 else if (CONSP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 Lisp_Object funcar = XCAR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 val = funcall_lambda (fun, fun_nargs, fun_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 else if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 do_autoload (fun, args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 else /* Can't funcall a macro */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 else if (UNBOUNDP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 {
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3556 val = signal_void_function_error (args[0]);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3561 val = signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 lisp_eval_depth--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 if (backtrace.debug_on_exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 val = do_debug_on_exit (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 POP_BACKTRACE (backtrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571 DEFUN ("functionp", Ffunctionp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 Return t if OBJECT can be called as a function, else nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 A function is an object that can be applied to arguments,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 using for example `funcall' or `apply'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 if (SYMBOLP (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 object = indirect_function (object, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 (SUBRP (object) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 COMPILED_FUNCTIONP (object) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 (CONSP (object) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 (EQ (XCAR (object), Qlambda) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 EQ (XCAR (object), Qautoload))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591 function_argcount (Lisp_Object function, int function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 Lisp_Object orig_function = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 Lisp_Object arglist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 retry:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 function = indirect_function (function, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 if (SUBRP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3603 /* Using return with the ?: operator tickles a DEC CC compiler bug. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3604 if (function_min_args_p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3605 return Fsubr_min_args (function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3606 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3607 return Fsubr_max_args (function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 else if (COMPILED_FUNCTIONP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 arglist = compiled_function_arglist (XCOMPILED_FUNCTION (function));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 else if (CONSP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 Lisp_Object funcar = XCAR (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 if (EQ (funcar, Qmacro))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 function = XCDR (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 else if (EQ (funcar, Qautoload))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3624 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3625
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3626 GCPRO1 (function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 do_autoload (function, orig_function);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3628 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3629 function = orig_function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 else if (EQ (funcar, Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 arglist = Fcar (XCDR (function));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 invalid_function:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3644 return signal_invalid_function_error (orig_function);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648 int argcount = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 EXTERNAL_LIST_LOOP_2 (arg, arglist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 if (EQ (arg, Qand_optional))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 if (function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 else if (EQ (arg, Qand_rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 if (function_min_args_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 argcount++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 return make_int (argcount);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 DEFUN ("function-min-args", Ffunction_min_args, 1, 1, 0, /*
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
3675 Return the minimum number of arguments a function may be called with.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 The function may be any form that can be passed to `funcall',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 any special form, or any macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 return function_argcount (function, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 DEFUN ("function-max-args", Ffunction_max_args, 1, 1, 0, /*
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 609
diff changeset
3685 Return the maximum number of arguments a function may be called with.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 The function may be any form that can be passed to `funcall',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 any special form, or any macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 If the function takes an arbitrary number of arguments or is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 a built-in special form, nil is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691 (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 return function_argcount (function, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 DEFUN ("apply", Fapply, 2, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 Call FUNCTION with the remaining args, using the last arg as a list of args.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 Thus, (apply '+ 1 2 '(3 4)) returns 10.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 Lisp_Object fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 Lisp_Object spread_arg = args [nargs - 1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 int numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 int funcall_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 GET_EXTERNAL_LIST_LENGTH (spread_arg, numargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 if (numargs == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 /* (apply foo 0 1 '()) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 return Ffuncall (nargs - 1, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714 else if (numargs == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 /* (apply foo 0 1 '(2)) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 args [nargs - 1] = XCAR (spread_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 return Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 /* -1 for function, -1 for spread arg */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 numargs = nargs - 2 + numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 /* +1 for function */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 funcall_nargs = 1 + numargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726 if (SYMBOLP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 fun = indirect_function (fun, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729 if (SUBRP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 Lisp_Subr *subr = XSUBR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 int max_args = subr->max_args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 if (numargs < subr->min_args
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 || (max_args >= 0 && max_args < numargs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 /* Let funcall get the error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 else if (max_args > numargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741 /* Avoid having funcall cons up yet another new vector of arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742 by explicitly supplying nil's for optional values */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 funcall_nargs += (max_args - numargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746 else if (UNBOUNDP (fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 /* Let funcall get the error */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749 fun = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 Lisp_Object *funcall_args = alloca_array (Lisp_Object, funcall_nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3758 gcpro1.nvars = funcall_nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760 /* Copy in the unspread args */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 memcpy (funcall_args, args, (nargs - 1) * sizeof (Lisp_Object));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 /* Spread the last arg we got. Its first element goes in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 the slot that it used to occupy, hence this value of I. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 for (i = nargs - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765 !NILP (spread_arg); /* i < 1 + numargs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 i++, spread_arg = XCDR (spread_arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 funcall_args [i] = XCAR (spread_arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 /* Supply nil for optional args (to subrs) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 for (; i < funcall_nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 funcall_args[i] = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 RETURN_UNGCPRO (Ffuncall (funcall_nargs, funcall_args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 /* Apply lambda list FUN to the NARGS evaluated arguments in ARGS and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 return the result of evaluation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 funcall_lambda (Lisp_Object fun, int nargs, Lisp_Object args[])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3787 Lisp_Object arglist, body, tail;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 REGISTER int i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 tail = XCDR (fun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 if (!CONSP (tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 arglist = XCAR (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 body = XCDR (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 int optional = 0, rest = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3802 EXTERNAL_LIST_LOOP_2 (symbol, arglist)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 if (!SYMBOLP (symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 goto invalid_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 if (EQ (symbol, Qand_rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 rest = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 else if (EQ (symbol, Qand_optional))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 optional = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 else if (rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 specbind (symbol, Flist (nargs - i, &args[i]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 i = nargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 else if (i < nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 specbind (symbol, args[i++]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 else if (!optional)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 specbind (symbol, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 if (i < nargs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 goto wrong_number_of_arguments;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
3827 return unbind_to_1 (speccount, Fprogn (body));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 wrong_number_of_arguments:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3830 return signal_wrong_number_of_arguments_error (fun, nargs);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 invalid_function:
436
080151679be2 Import from CVS: tag r21-2-26
cvs
parents: 428
diff changeset
3833 return signal_invalid_function_error (fun);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 /* Run hook variables in various ways. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 DEFUN ("run-hooks", Frun_hooks, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 Run each hook in HOOKS. Major mode functions use this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 Each argument should be a symbol, a hook variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 These symbols are processed in the order specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 If a hook symbol has a non-nil value, that value may be a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 or a list of functions to be called to run the hook.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 If the value is a function, it is called with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 If it is a list, the elements are called, in order, with no arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 run_hook_with_args (1, args + i, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 DEFUN ("run-hook-with-args", Frun_hook_with_args, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 HOOK should be a symbol, a hook variable. If HOOK has a non-nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 value, that value may be a function or a list of functions to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 called to run the hook. If the value is a function, it is called with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3868 the given arguments and its return value is returned. If it is a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 of functions, those functions are called, in order,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 with the given arguments ARGS.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
3871 It is best not to depend on the value returned by `run-hook-with-args',
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872 as that may change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 return run_hook_with_args (nargs, args, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 DEFUN ("run-hook-with-args-until-success", Frun_hook_with_args_until_success, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 HOOK should be a symbol, a hook variable. Its value should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 be a list of functions. We call those functions, one by one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 passing arguments ARGS to each of them, until one of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 returns a non-nil value. Then we return that value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 If all the functions return nil, we return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 return run_hook_with_args (nargs, args, RUN_HOOKS_UNTIL_SUCCESS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 DEFUN ("run-hook-with-args-until-failure", Frun_hook_with_args_until_failure, 1, MANY, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 Run HOOK with the specified arguments ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 HOOK should be a symbol, a hook variable. Its value should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901 be a list of functions. We call those functions, one by one,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 passing arguments ARGS to each of them, until one of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 returns nil. Then we return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904 If all the functions return non-nil, we return non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 To make a hook variable buffer-local, use `make-local-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 (int nargs, Lisp_Object *args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 return run_hook_with_args (nargs, args, RUN_HOOKS_UNTIL_FAILURE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914 /* ARGS[0] should be a hook symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 Call each of the functions in the hook value, passing each of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 as arguments all the rest of ARGS (all NARGS - 1 elements).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 COND specifies a condition to test after each call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 to decide whether to stop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 The caller (or its caller, etc) must gcpro all of ARGS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 except that it isn't necessary to gcpro ARGS[0]. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 run_hook_with_args_in_buffer (struct buffer *buf, int nargs, Lisp_Object *args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 enum run_hooks_condition cond)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 Lisp_Object sym, val, ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 /* We need to bail out of here pronto. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 /* Whenever gc_in_progress is true, preparing_for_armageddon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 will also be true unless something is really hosed. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 assert (!gc_in_progress);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936 sym = args[0];
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
3937 val = symbol_value_in_buffer (sym, wrap_buffer (buf));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3938 ret = (cond == RUN_HOOKS_UNTIL_FAILURE ? Qt : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940 if (UNBOUNDP (val) || NILP (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 return ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942 else if (!CONSP (val) || EQ (XCAR (val), Qlambda))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 args[0] = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945 return Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 struct gcpro gcpro1, gcpro2, gcpro3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950 Lisp_Object globals = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951 GCPRO3 (sym, val, globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954 CONSP (val) && ((cond == RUN_HOOKS_TO_COMPLETION)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955 || (cond == RUN_HOOKS_UNTIL_SUCCESS ? NILP (ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 : !NILP (ret)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 val = XCDR (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 if (EQ (XCAR (val), Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961 /* t indicates this hook has a local binding;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962 it means to run the global binding too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 globals = Fdefault_value (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 if ((! CONSP (globals) || EQ (XCAR (globals), Qlambda)) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966 ! NILP (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968 args[0] = globals;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3970 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3971 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3972 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973 for (;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974 CONSP (globals) && ((cond == RUN_HOOKS_TO_COMPLETION)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 || (cond == RUN_HOOKS_UNTIL_SUCCESS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976 ? NILP (ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 : !NILP (ret)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 globals = XCDR (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 args[0] = XCAR (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 /* In a global value, t should not occur. If it does, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 must ignore it to avoid an endless loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983 if (!EQ (args[0], Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 args[0] = XCAR (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 ret = Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 return ret;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 run_hook_with_args (int nargs, Lisp_Object *args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 enum run_hooks_condition cond)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 return run_hook_with_args_in_buffer (current_buffer, nargs, args, cond);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 /* From FSF 19.30, not currently used */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 /* Run a hook symbol ARGS[0], but use FUNLIST instead of the actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 present value of that symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 Call each element of FUNLIST,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 passing each of them the rest of ARGS.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 The caller (or its caller, etc) must gcpro all of ARGS,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 except that it isn't necessary to gcpro ARGS[0]. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 run_hook_list_with_args (Lisp_Object funlist, int nargs, Lisp_Object *args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 Lisp_Object sym = args[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 GCPRO2 (sym, val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 for (val = funlist; CONSP (val); val = XCDR (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 if (EQ (XCAR (val), Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 /* t indicates this hook has a local binding;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 it means to run the global binding too. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 Lisp_Object globals;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 for (globals = Fdefault_value (sym);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 CONSP (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037 globals = XCDR (globals))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039 args[0] = XCAR (globals);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040 /* In a global value, t should not occur. If it does, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041 must ignore it to avoid an endless loop. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 if (!EQ (args[0], Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 args[0] = XCAR (val);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 Ffuncall (nargs, args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 va_run_hook_with_args (Lisp_Object hook_var, int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 Lisp_Object *funcall_args = alloca_array (Lisp_Object, 1 + nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 funcall_args[0] = hook_var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 funcall_args[i + 1] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 gcpro1.nvars = nargs + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 run_hook_with_args (nargs + 1, funcall_args, RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 va_run_hook_with_args_in_buffer (struct buffer *buf, Lisp_Object hook_var,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4081 int nargs, ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087 Lisp_Object *funcall_args = alloca_array (Lisp_Object, 1 + nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089 va_start (vargs, nargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 funcall_args[0] = hook_var;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 for (i = 0; i < nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 funcall_args[i + 1] = va_arg (vargs, Lisp_Object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 GCPRO1 (*funcall_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 gcpro1.nvars = nargs + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 run_hook_with_args_in_buffer (buf, nargs + 1, funcall_args,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 RUN_HOOKS_TO_COMPLETION);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 run_hook (Lisp_Object hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 Frun_hooks (1, &hook);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 /* Front-ends to eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114 /* Apply fn to arg */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 apply1 (Lisp_Object fn, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 if (NILP (arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 return Ffuncall (1, &fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 args[1] = arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 RETURN_UNGCPRO (Fapply (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 /* Call function fn on no arguments */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 call0 (Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 GCPRO1 (fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 RETURN_UNGCPRO (Ffuncall (1, &fn));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 /* Call function fn with argument arg0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 call1 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 RETURN_UNGCPRO (Ffuncall (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 /* Call function fn with arguments arg0, arg1 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 call2 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 Lisp_Object arg0, Lisp_Object arg1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4165 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 gcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 RETURN_UNGCPRO (Ffuncall (3, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173 /* Call function fn with arguments arg0, arg1, arg2 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 call3 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 Lisp_Object args[4];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 gcpro1.nvars = 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 RETURN_UNGCPRO (Ffuncall (4, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 /* Call function fn with arguments arg0, arg1, arg2, arg3 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 call4 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 Lisp_Object arg3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 Lisp_Object args[5];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 gcpro1.nvars = 5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 RETURN_UNGCPRO (Ffuncall (5, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 /* Call function fn with arguments arg0, arg1, arg2, arg3, arg4 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 call5 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 Lisp_Object arg3, Lisp_Object arg4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 Lisp_Object args[6];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 gcpro1.nvars = 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 RETURN_UNGCPRO (Ffuncall (6, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 call6 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 Lisp_Object args[7];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245 gcpro1.nvars = 7;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 RETURN_UNGCPRO (Ffuncall (7, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4250 call7 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 Lisp_Object arg6)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 Lisp_Object args[8];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 args[7] = arg6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 gcpro1.nvars = 8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 RETURN_UNGCPRO (Ffuncall (8, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 call8 (Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 Lisp_Object arg3, Lisp_Object arg4, Lisp_Object arg5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 Lisp_Object arg6, Lisp_Object arg7)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 Lisp_Object args[9];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 args[0] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 args[1] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 args[2] = arg1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 args[3] = arg2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 args[4] = arg3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 args[5] = arg4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 args[6] = arg5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 args[7] = arg6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 args[8] = arg7;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 gcpro1.nvars = 9;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 RETURN_UNGCPRO (Ffuncall (9, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 call0_in_buffer (struct buffer *buf, Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 return call0 (fn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 val = call0 (fn);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4306 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 call1_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 return call1 (fn, arg0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 val = call1 (fn, arg0);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4324 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330 call2_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 Lisp_Object arg0, Lisp_Object arg1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 return call2 (fn, arg0, arg1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 val = call2 (fn, arg0, arg1);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4342 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 call3_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 return call3 (fn, arg0, arg1, arg2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 val = call3 (fn, arg0, arg1, arg2);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4360 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366 call4_in_buffer (struct buffer *buf, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367 Lisp_Object arg0, Lisp_Object arg1, Lisp_Object arg2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 Lisp_Object arg3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 return call4 (fn, arg0, arg1, arg2, arg3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378 val = call4 (fn, arg0, arg1, arg2, arg3);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4379 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385 eval_in_buffer (struct buffer *buf, Lisp_Object form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 if (current_buffer == buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 return Feval (form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394 set_buffer_internal (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 val = Feval (form);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4396 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 /* Error-catching front-ends to eval, funcall, apply */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 /* Call function fn on no arguments, with condition handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 call0_with_handler (Lisp_Object handler, Lisp_Object fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 args[0] = handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 args[1] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416 gcpro1.nvars = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417 RETURN_UNGCPRO (Fcall_with_condition_handler (2, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 /* Call function fn with argument arg0, with condition handler */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422 call1_with_handler (Lisp_Object handler, Lisp_Object fn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423 Lisp_Object arg0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4424 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4425 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427 Lisp_Object args[3];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 args[0] = handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 args[1] = fn;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 args[2] = arg0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 GCPRO1 (args[0]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 gcpro1.nvars = 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 RETURN_UNGCPRO (Fcall_with_condition_handler (3, args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437 /* The following functions provide you with error-trapping versions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 of the various front-ends above. They take an additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 "warning_string" argument; if non-zero, a warning with this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 string and the actual error that occurred will be displayed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441 in the *Warnings* buffer if an error occurs. In all cases,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4442 QUIT is inhibited while these functions are running, and if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 an error occurs, Qunbound is returned instead of the normal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 return value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447 /* #### This stuff needs to catch throws as well. We need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 improve internal_catch() so it can take a "catch anything"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4449 argument similar to Qt or Qerror for condition_case_1(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452 caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4454 /* #### should be rewritten to work with emacs_sprintf_string_lisp(); but this
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4455 whole stuff is getting junked and replaced from my stderr-proc ws */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456 if (!NILP (errordata))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458 Lisp_Object args[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 if (!NILP (arg))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4462 Intbyte *str = (Intbyte *) get_opaque_ptr (arg);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4463 args[0] = build_intstring (str);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 else
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4466 args[0] = build_msg_string ("error");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 /* #### This should call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 (with-output-to-string (display-error errordata))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 but that stuff is all in Lisp currently. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 args[1] = errordata;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 warn_when_safe_lispobj
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 (Qerror, Qwarning,
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4473 emacs_vsprintf_string_lisp ("%s: %s", Qnil, 2, args));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 allow_quit_caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 if (CONSP (errordata) && EQ (XCAR (errordata), Qquit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 return Fsignal (Qquit, XCDR (errordata));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483 return caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 safe_run_hook_caught_a_squirmer (Lisp_Object errordata, Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 Lisp_Object hook = Fcar (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 arg = Fcdr (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 /* Clear out the hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492 Fset (hook, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 return caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497 allow_quit_safe_run_hook_caught_a_squirmer (Lisp_Object errordata,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 Lisp_Object hook = Fcar (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 arg = Fcdr (arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 if (!CONSP (errordata) || !EQ (XCAR (errordata), Qquit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 /* Clear out the hook. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504 Fset (hook, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 return allow_quit_caught_a_squirmer (errordata, arg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509 catch_them_squirmers_eval_in_buffer (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 return eval_in_buffer (XBUFFER (XCAR (cons)), XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4515 eval_in_buffer_trapping_errors (const CIntbyte *warning_string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 struct buffer *buf, Lisp_Object form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520 Lisp_Object buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 Lisp_Object cons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 Lisp_Object opaque;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
4525 buffer = wrap_buffer (buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527 specbind (Qinhibit_quit, Qt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4528 /* begin_gc_forbidden(); Currently no reason to do this; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 cons = noseeum_cons (buffer, form);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 GCPRO2 (cons, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 catch_them_squirmers_eval_in_buffer, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4542 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4545 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546 catch_them_squirmers_run_hook (Lisp_Object hook_symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549 run_hook (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4554 run_hook_trapping_errors (const CIntbyte *warning_string,
609
13e3d7ae7155 [xemacs-hg @ 2001-06-06 12:34:42 by ben]
ben
parents: 578
diff changeset
4555 Lisp_Object hook_symbol)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559 Lisp_Object opaque;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4562 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4563 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564 tem = find_symbol_value (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4565 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4566 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 GCPRO1 (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 catch_them_squirmers_run_hook, hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4578 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4579 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4580
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4581 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4584 /* Same as run_hook_trapping_errors() but also set the hook to nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 if an error occurs. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4588 safe_run_hook_trapping_errors (const CIntbyte *warning_string,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 Lisp_Object hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590 int allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 if (!initialized || preparing_for_armageddon)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599 tem = find_symbol_value (hook_symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603 if (!allow_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606 cons = noseeum_cons (hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 warning_string ? make_opaque_ptr ((void *)warning_string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4608 : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609 GCPRO1 (cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4610 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4611 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 catch_them_squirmers_run_hook,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613 hook_symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 allow_quit ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 allow_quit_safe_run_hook_caught_a_squirmer :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 safe_run_hook_caught_a_squirmer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617 cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 if (OPAQUE_PTRP (XCDR (cons)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 free_opaque_ptr (XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4621 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4622
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4623 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4624 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4626 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4627 catch_them_squirmers_call0 (Lisp_Object function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4628 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4630 return call0 (function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4633 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4634 call0_trapping_errors (const CIntbyte *warning_string, Lisp_Object function)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 int speccount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4638 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 GCPRO2 (opaque, function);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 specbind (Qinhibit_quit, Qt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4651 /* begin_gc_forbidden(); Currently no reason to do this; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 catch_them_squirmers_call0, function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4662 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 catch_them_squirmers_call1 (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 return call1 (XCAR (cons), XCDR (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673 catch_them_squirmers_call2 (Lisp_Object cons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 return call2 (XCAR (cons), XCAR (XCDR (cons)), XCAR (XCDR (XCDR (cons))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4680 call1_trapping_errors (const CIntbyte *warning_string, Lisp_Object function,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681 Lisp_Object object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 GCPRO4 (cons, opaque, function, object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 specbind (Qinhibit_quit, Qt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4699 /* begin_gc_forbidden(); Currently no reason to do this; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 cons = noseeum_cons (function, object);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705 catch_them_squirmers_call1, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 free_cons (XCONS (cons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4712 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 Lisp_Object
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
4716 call2_trapping_errors (const CIntbyte *warning_string, Lisp_Object function,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 Lisp_Object object1, Lisp_Object object2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 Lisp_Object cons = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 Lisp_Object opaque = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 if (SYMBOLP (function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 tem = XSYMBOL (function)->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 if (NILP (tem) || UNBOUNDP (tem))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 GCPRO5 (cons, opaque, function, object1, object2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 specbind (Qinhibit_quit, Qt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4734 /* begin_gc_forbidden(); Currently no reason to do this; */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 cons = list3 (function, object1, object2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 opaque = (warning_string ? make_opaque_ptr ((void *)warning_string) : Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 /* Qerror not Qt, so you can get a backtrace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 tem = condition_case_1 (Qerror,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 catch_them_squirmers_call2, cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741 caught_a_squirmer, opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 if (OPAQUE_PTRP (opaque))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 free_list (cons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4747 return unbind_to_1 (speccount, tem);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 /* The special binding stack */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4753 /* Most C code should simply use specbind() and unbind_to_1(). */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 /* When performance is critical, use the macros in backtrace.h. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 #define min_max_specpdl_size 400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 void
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
4760 grow_specpdl (EMACS_INT reserved)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
4761 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
4762 EMACS_INT size_needed = specpdl_depth() + reserved;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 if (size_needed >= max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 if (max_specpdl_size < min_max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 max_specpdl_size = min_max_specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 if (size_needed >= max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 if (!NILP (Vdebug_on_error) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 !NILP (Vdebug_on_signal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 /* Leave room for some specpdl in the debugger. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 max_specpdl_size = size_needed + 100;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4773 signal_continuable_error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4774 (Qstack_overflow,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
4775 "Variable binding depth exceeds max-specpdl-size", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 while (specpdl_size < size_needed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 specpdl_size *= 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 if (specpdl_size > max_specpdl_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 specpdl_size = max_specpdl_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 XREALLOC_ARRAY (specpdl, struct specbinding, specpdl_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 specpdl_ptr = specpdl + specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 /* Handle unbinding buffer-local variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 specbind_unwind_local (Lisp_Object ovalue)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 Lisp_Object current = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 Lisp_Object symbol = specpdl_ptr->symbol;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
4795 Lisp_Cons *victim = XCONS (ovalue);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 Lisp_Object buf = get_buffer (victim->car, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 ovalue = victim->cdr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 free_cons (victim);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 if (NILP (buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 /* Deleted buffer -- do nothing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 else if (symbol_value_buffer_local_info (symbol, XBUFFER (buf)) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 /* Was buffer-local when binding was made, now no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 * (kill-local-variable can do this.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 * Do nothing in this case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 else if (EQ (buf, current))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 Fset (symbol, ovalue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 /* Urk! Somebody switched buffers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818 GCPRO1 (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 Fset_buffer (buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 Fset (symbol, ovalue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 Fset_buffer (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 return symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 specbind_unwind_wasnt_local (Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 Lisp_Object current = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 Lisp_Object symbol = specpdl_ptr->symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 buffer = get_buffer (buffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 if (NILP (buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 /* Deleted buffer -- do nothing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 else if (symbol_value_buffer_local_info (symbol, XBUFFER (buffer)) == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 /* Was buffer-local when binding was made, now no longer is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 * (kill-local-variable can do this.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 * Do nothing in this case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 else if (EQ (buffer, current))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 Fkill_local_variable (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 /* Urk! Somebody switched buffers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 GCPRO1 (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 Fset_buffer (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 Fkill_local_variable (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 Fset_buffer (current);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 return symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 specbind (Lisp_Object symbol, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4864 SPECBIND (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 specbind_magic (Lisp_Object symbol, Lisp_Object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870 int buffer_local =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 symbol_value_buffer_local_info (symbol, current_buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 if (buffer_local == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 specpdl_ptr->old_value = find_symbol_value (symbol);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4876 specpdl_ptr->func = 0; /* Handled specially by unbind_to_1 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878 else if (buffer_local > 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 /* Already buffer-local */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 specpdl_ptr->old_value = noseeum_cons (Fcurrent_buffer (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 find_symbol_value (symbol));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 specpdl_ptr->func = specbind_unwind_local;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 /* About to become buffer-local */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 specpdl_ptr->old_value = Fcurrent_buffer ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4889 specpdl_ptr->func = specbind_unwind_wasnt_local;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 specpdl_ptr->symbol = symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 specpdl_ptr++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 specpdl_depth_counter++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896 Fset (symbol, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4899 /* Record an unwind-protect -- FUNCTION will be called with ARG no matter
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4900 whether a normal or non-local exit occurs. (You need to call unbind_to_1()
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4901 before your function returns normally, passing in the integer returned
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4902 by this function.) Note: As long as the unwind-protect exists, ARG is
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4903 automatically GCPRO'd. The return value from FUNCTION is completely
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4904 ignored. #### We should eliminate it entirely. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4905
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4906 int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 record_unwind_protect (Lisp_Object (*function) (Lisp_Object arg),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 Lisp_Object arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 SPECPDL_RESERVE (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 specpdl_ptr->func = function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 specpdl_ptr->symbol = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 specpdl_ptr->old_value = arg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914 specpdl_ptr++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915 specpdl_depth_counter++;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4916 return specpdl_depth_counter - 1;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4917 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4918
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4919 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4920 free_pointer (Lisp_Object opaque)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4921 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4922 xfree (get_opaque_ptr (opaque));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4923 free_opaque_ptr (opaque);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4924 return Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4925 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4926
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4927 /* Establish an unwind-protect which will free the specified block.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4928 */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4929 int
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4930 record_unwind_protect_freeing (void *ptr)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4931 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4932 Lisp_Object opaque = make_opaque_ptr (ptr);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4933 return record_unwind_protect (free_pointer, opaque);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4934 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4935
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4936 static Lisp_Object
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4937 free_dynarr (Lisp_Object opaque)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4938 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4939 Dynarr_free (get_opaque_ptr (opaque));
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4940 free_opaque_ptr (opaque);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4941 return Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4942 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4943
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4944 int
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4945 record_unwind_protect_freeing_dynarr (void *ptr)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4946 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4947 Lisp_Object opaque = make_opaque_ptr (ptr);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4948 return record_unwind_protect (free_dynarr, opaque);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4949 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 /* Unwind the stack till specpdl_depth() == COUNT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952 VALUE is not used, except that, purely as a convenience to the
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4953 caller, it is protected from garbage-protection and returned. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954 Lisp_Object
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4955 unbind_to_1 (int count, Lisp_Object value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957 UNBIND_TO_GCPRO (count, value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4958 return value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961 /* Don't call this directly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 Only for use by UNBIND_TO* macros in backtrace.h */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4963 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964 unbind_to_hairy (int count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4966 Lisp_Object oquit;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4968 ++specpdl_ptr;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4969 ++specpdl_depth_counter;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4970
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4971 /* Allow QUIT within unwind-protect routines, but defer any existing QUIT
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4972 until afterwards. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 check_quit (); /* make Vquit_flag accurate */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
4974 oquit = Vquit_flag;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 while (specpdl_depth_counter != count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 --specpdl_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 --specpdl_depth_counter;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 if (specpdl_ptr->func != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 /* An unwind-protect */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 (*specpdl_ptr->func) (specpdl_ptr->old_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987 /* We checked symbol for validity when we specbound it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 so only need to call Fset if symbol has magic value. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
4989 Lisp_Symbol *sym = XSYMBOL (specpdl_ptr->symbol);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 if (!SYMBOL_VALUE_MAGIC_P (sym->value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 sym->value = specpdl_ptr->old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 Fset (specpdl_ptr->symbol, specpdl_ptr->old_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 #if 0 /* martin */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 #ifndef EXCEEDINGLY_QUESTIONABLE_CODE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 /* There should never be anything here for us to remove.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 If so, it indicates a logic error in Emacs. Catches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 should get removed when a throw or signal occurs, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001 when a catch or condition-case exits normally. But
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002 it's too dangerous to just remove this code. --ben */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 /* Furthermore, this code is not in FSFmacs!!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005 Braino on mly's part? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 /* If we're unwound past the pdlcount of a catch frame,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 that catch can't possibly still be valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5008 while (catchlist && catchlist->pdlcount > specpdl_depth_counter)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5009 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5010 catchlist = catchlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011 /* Don't mess with gcprolist, backtrace_list here */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5012 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5014 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5016 Vquit_flag = oquit;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 /* Get the value of symbol's global binding, even if that binding is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022 not now dynamically visible. May return Qunbound or magic values. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5024 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5025 top_level_value (Lisp_Object symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5026 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5027 REGISTER struct specbinding *ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029 CHECK_SYMBOL (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030 for (; ptr != specpdl_ptr; ptr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032 if (EQ (ptr->symbol, symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 return ptr->old_value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035 return XSYMBOL (symbol)->value;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5038 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041 top_level_set (Lisp_Object symbol, Lisp_Object newval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5042 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 REGISTER struct specbinding *ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 CHECK_SYMBOL (symbol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 for (; ptr != specpdl_ptr; ptr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 if (EQ (ptr->symbol, symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 ptr->old_value = newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 return newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 return Fset (symbol, newval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 /* Backtraces */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 DEFUN ("backtrace-debug", Fbacktrace_debug, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 The debugger is entered when that frame exits, if the flag is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 (level, flag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 REGISTER struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 CHECK_INT (level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 for (i = 0; backlist && i < XINT (level); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080 if (backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081 backlist->debug_on_exit = !NILP (flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 return flag;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5084 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 backtrace_specials (int speccount, int speclimit, Lisp_Object stream)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 int printing_bindings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 for (; speccount > speclimit; speccount--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 if (specpdl[speccount - 1].func == 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 || specpdl[speccount - 1].func == specbind_unwind_local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095 || specpdl[speccount - 1].func == specbind_unwind_wasnt_local)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 write_c_string (((!printing_bindings) ? " # bind (" : " "),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099 Fprin1 (specpdl[speccount - 1].symbol, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100 printing_bindings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5103 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5104 if (printing_bindings) write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105 write_c_string (" # (unwind-protect ...)\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106 printing_bindings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5107 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5108 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109 if (printing_bindings) write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5112 DEFUN ("backtrace", Fbacktrace, 0, 2, "", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113 Print a trace of Lisp function calls currently active.
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5114 Optional arg STREAM specifies the output stream to send the backtrace to,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5115 and defaults to the value of `standard-output'.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5116 Optional second arg DETAILED non-nil means show places where currently
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5117 active variable bindings, catches, condition-cases, and
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5118 unwind-protects, as well as function calls, were made.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 (stream, detailed))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5122 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5123 struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5124 struct catchtag *catches = catchlist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5125 int speccount = specpdl_depth();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 int old_nl = print_escape_newlines;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 int old_pr = print_readably;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 Lisp_Object old_level = Vprint_level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 Lisp_Object oiq = Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 /* We can't allow quits in here because that could cause the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 of print_readably and print_escape_newlines to get screwed up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135 Normally we would use a record_unwind_protect but that would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136 screw up the functioning of this function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5137 Vinhibit_quit = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 entering_debugger = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 Vprint_level = make_int (3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 print_readably = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143 print_escape_newlines = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 GCPRO2 (stream, old_level);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 if (NILP (stream))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148 stream = Vstandard_output;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149 if (!noninteractive && (NILP (stream) || EQ (stream, Qt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150 stream = Fselected_frame (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154 if (!NILP (detailed) && catches && catches->backlist == backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 int catchpdl = catches->pdlcount;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5157 if (speccount > catchpdl
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 436
diff changeset
5158 && specpdl[catchpdl].func == condition_case_unwind)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159 /* This is a condition-case catchpoint */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 catchpdl = catchpdl + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162 backtrace_specials (speccount, catchpdl, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164 speccount = catches->pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165 if (catchpdl == speccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 write_c_string (" # (catch ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168 Fprin1 (catches->tag, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 write_c_string (" ...)\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 write_c_string (" # (condition-case ... . ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174 Fprin1 (Fcdr (Fcar (catches->tag)), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175 write_c_string (")\n", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177 catches = catches->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179 else if (!backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183 if (!NILP (detailed) && backlist->pdlcount < speccount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185 backtrace_specials (speccount, backlist->pdlcount, stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186 speccount = backlist->pdlcount;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 write_c_string (((backlist->debug_on_exit) ? "* " : " "),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190 if (backlist->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 Fprin1 (Fcons (*backlist->function, *backlist->args), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193 write_c_string ("\n", stream); /* from FSFmacs 19.30 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197 Lisp_Object tem = *backlist->function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 Fprin1 (tem, stream); /* This can QUIT */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 write_c_string ("(", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200 if (backlist->nargs == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5202 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5203 Lisp_Object tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204 struct gcpro ngcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206 NGCPRO1 (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 for (tail = *backlist->args, i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5208 !NILP (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5209 tail = Fcdr (tail), i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211 if (i != 0) write_c_string (" ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 Fprin1 (Fcar (tail), stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5218 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219 for (i = 0; i < backlist->nargs; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221 if (!i && EQ(tem, Qbyte_code)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5222 write_c_string("\"...\"", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5224 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5225 if (i != 0) write_c_string (" ", stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5226 Fprin1 (backlist->args[i], stream);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5227 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5229 write_c_string (")\n", stream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5230 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 Vprint_level = old_level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 print_readably = old_pr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236 print_escape_newlines = old_nl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 Vinhibit_quit = oiq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5239 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5243 DEFUN ("backtrace-frame", Fbacktrace_frame, 1, 1, 0, /*
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5244 Return the function and arguments NFRAMES up from current execution point.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5245 If that frame has not evaluated the arguments yet (or is a special form),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 the value is (nil FUNCTION ARG-FORMS...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247 If that frame has evaluated its arguments and called its function already,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248 the value is (t FUNCTION ARG-VALUES...).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249 A &rest arg is represented as the tail of the list ARG-VALUES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5250 FUNCTION is whatever was supplied as car of evaluated list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 or a lambda expression for macro calls.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
5252 If NFRAMES is more than the number of frames, the value is nil.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254 (nframes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 REGISTER struct backtrace *backlist = backtrace_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 REGISTER int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 Lisp_Object tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260 CHECK_NATNUM (nframes);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 /* Find the frame requested. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 for (i = XINT (nframes); backlist && (i-- > 0);)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 backlist = backlist->next;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 if (!backlist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5268 if (backlist->nargs == UNEVALLED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 return Fcons (Qnil, Fcons (*backlist->function, *backlist->args));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 if (backlist->nargs == MANY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273 tem = *backlist->args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 tem = Flist (backlist->nargs, backlist->args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 return Fcons (Qt, Fcons (*backlist->function, tem));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 /* Warnings */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5287 warn_when_safe_lispobj (Lisp_Object class, Lisp_Object level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 {
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5290 /* Don't even generate debug warnings if they're going to be discarded,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5291 to avoid excessive consing. */
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5292 if (EQ (level, Qdebug) && !NILP (Vlog_warning_minimum_level) &&
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5293 !EQ (Vlog_warning_minimum_level, Qdebug))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5294 return;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5295
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 obj = list1 (list3 (class, level, obj));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 if (NILP (Vpending_warnings))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 Vpending_warnings = Vpending_warnings_tail = obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 Fsetcdr (Vpending_warnings_tail, obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 Vpending_warnings_tail = obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 /* #### This should probably accept Lisp objects; but then we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5307 to make sure that Feval() isn't called, since it might not be safe.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309 An alternative approach is to just pass some non-string type of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310 Lisp_Object to warn_when_safe_lispobj(); `prin1-to-string' will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 automatically be called when it is safe to do so. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
5314 warn_when_safe (Lisp_Object class, Lisp_Object level, const CIntbyte *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316 Lisp_Object obj;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 va_list args;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5318
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5319 /* Don't even generate debug warnings if they're going to be discarded,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5320 to avoid excessive consing. */
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5321 if (EQ (level, Qdebug) && !NILP (Vlog_warning_minimum_level) &&
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5322 !EQ (Vlog_warning_minimum_level, Qdebug))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5323 return;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5324
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 va_start (args, fmt);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5326 obj = emacs_vsprintf_string (CGETTEXT (fmt), args);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 va_end (args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329 warn_when_safe_lispobj (class, level, obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5335 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 /* Initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5339 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340 syms_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5341 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5342 INIT_LRECORD_IMPLEMENTATION (subr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5343
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5344 DEFSYMBOL (Qinhibit_quit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5345 DEFSYMBOL (Qautoload);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5346 DEFSYMBOL (Qdebug_on_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5347 DEFSYMBOL (Qstack_trace_on_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5348 DEFSYMBOL (Qdebug_on_signal);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5349 DEFSYMBOL (Qstack_trace_on_signal);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5350 DEFSYMBOL (Qdebugger);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5351 DEFSYMBOL (Qmacro);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5352 defsymbol (&Qand_rest, "&rest");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 defsymbol (&Qand_optional, "&optional");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 /* Note that the process code also uses Qexit */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5355 DEFSYMBOL (Qexit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5356 DEFSYMBOL (Qsetq);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5357 DEFSYMBOL (Qinteractive);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5358 DEFSYMBOL (Qcommandp);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5359 DEFSYMBOL (Qdefun);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5360 DEFSYMBOL (Qprogn);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5361 DEFSYMBOL (Qvalues);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5362 DEFSYMBOL (Qdisplay_warning);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5363 DEFSYMBOL (Qrun_hooks);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 546
diff changeset
5364 DEFSYMBOL (Qif);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5366 DEFSUBR (For);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5367 DEFSUBR (Fand);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5368 DEFSUBR (Fif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5369 DEFSUBR_MACRO (Fwhen);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5370 DEFSUBR_MACRO (Funless);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5371 DEFSUBR (Fcond);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372 DEFSUBR (Fprogn);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5373 DEFSUBR (Fprog1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374 DEFSUBR (Fprog2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375 DEFSUBR (Fsetq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5376 DEFSUBR (Fquote);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5377 DEFSUBR (Ffunction);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 DEFSUBR (Fdefun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379 DEFSUBR (Fdefmacro);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 DEFSUBR (Fdefvar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 DEFSUBR (Fdefconst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382 DEFSUBR (Fuser_variable_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5383 DEFSUBR (Flet);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 DEFSUBR (FletX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 DEFSUBR (Fwhile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 DEFSUBR (Fmacroexpand_internal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387 DEFSUBR (Fcatch);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5388 DEFSUBR (Fthrow);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5389 DEFSUBR (Funwind_protect);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390 DEFSUBR (Fcondition_case);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 DEFSUBR (Fcall_with_condition_handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 DEFSUBR (Fsignal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 DEFSUBR (Finteractive_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 DEFSUBR (Fcommandp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5395 DEFSUBR (Fcommand_execute);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396 DEFSUBR (Fautoload);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397 DEFSUBR (Feval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 DEFSUBR (Fapply);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399 DEFSUBR (Ffuncall);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400 DEFSUBR (Ffunctionp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 DEFSUBR (Ffunction_min_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5402 DEFSUBR (Ffunction_max_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403 DEFSUBR (Frun_hooks);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 DEFSUBR (Frun_hook_with_args);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 DEFSUBR (Frun_hook_with_args_until_success);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 DEFSUBR (Frun_hook_with_args_until_failure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 DEFSUBR (Fbacktrace_debug);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 DEFSUBR (Fbacktrace);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 DEFSUBR (Fbacktrace_frame);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412 void
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5413 init_eval_early (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 specpdl_ptr = specpdl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 specpdl_depth_counter = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417 catchlist = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 Vcondition_handlers = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 backtrace_list = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 debug_on_next_call = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 lisp_eval_depth = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423 entering_debugger = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 reinit_vars_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 preparing_for_armageddon = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 in_warnings = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 Qunbound_suspended_errors_tag = make_opaque_ptr (&Qunbound_suspended_errors_tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432 staticpro_nodump (&Qunbound_suspended_errors_tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5434 specpdl_size = 50;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5435 specpdl = xnew_array (struct specbinding, specpdl_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 /* XEmacs change: increase these values. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437 max_specpdl_size = 3000;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5438 max_lisp_eval_depth = 1000;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5439 #ifdef DEFEND_AGAINST_THROW_RECURSION
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440 throw_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5445 vars_of_eval (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 reinit_vars_of_eval ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5449 DEFVAR_INT ("max-specpdl-size", &max_specpdl_size /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5450 Limit on number of Lisp variable bindings & unwind-protects before error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5451 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5453 DEFVAR_INT ("max-lisp-eval-depth", &max_lisp_eval_depth /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5454 Limit on depth in `eval', `apply' and `funcall' before error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5455 This limit is to catch infinite recursions for you before they cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5456 actual stack overflow in C, which would be fatal for Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5457 You can safely make it considerably larger than its default value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458 if that proves inconveniently small.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5459 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 DEFVAR_LISP ("quit-flag", &Vquit_flag /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 Non-nil causes `eval' to abort, unless `inhibit-quit' is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5463 Typing C-G sets `quit-flag' non-nil, regardless of `inhibit-quit'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5464 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5465 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5467 DEFVAR_LISP ("inhibit-quit", &Vinhibit_quit /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5468 Non-nil inhibits C-g quitting from happening immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 Note that `quit-flag' will still be set by typing C-g,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 so a quit will be signalled as soon as `inhibit-quit' is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 To prevent this happening, set `quit-flag' to nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 before making `inhibit-quit' nil. The value of `inhibit-quit' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473 ignored if a critical quit is requested by typing control-shift-G in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5474 an X frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476 Vinhibit_quit = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478 DEFVAR_LISP ("stack-trace-on-error", &Vstack_trace_on_error /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 *Non-nil means automatically display a backtrace buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 after any error that is not handled by a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481 If the value is a list, an error only means to display a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 See also variable `stack-trace-on-signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485 Vstack_trace_on_error = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5487 DEFVAR_LISP ("stack-trace-on-signal", &Vstack_trace_on_signal /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 *Non-nil means automatically display a backtrace buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 after any error that is signalled, whether or not it is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 If the value is a list, an error only means to display a backtrace
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 See also variable `stack-trace-on-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5494 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495 Vstack_trace_on_signal = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5497 DEFVAR_LISP ("debug-ignored-errors", &Vdebug_ignored_errors /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 *List of errors for which the debugger should not be called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499 Each element may be a condition-name or a regexp that matches error messages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 If any element applies to a given error, that error skips the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5501 and just returns to top level.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 This overrides the variable `debug-on-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 It does not apply to errors handled by `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 Vdebug_ignored_errors = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507 DEFVAR_LISP ("debug-on-error", &Vdebug_on_error /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 *Non-nil means enter debugger if an unhandled error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 The debugger will not be entered if the error is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511 If the value is a list, an error only means to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513 This variable is overridden by `debug-ignored-errors'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5514 See also variables `debug-on-quit' and `debug-on-signal'.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5515 If this variable is set while XEmacs is running noninteractively,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5516 an unhandled error will cause a backtrace to be output and the C
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5517 debugger entered using `force-debugging-signal'. This can be very
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5518 useful when debugging noninteractive errors in tricky situations,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5519 e.g. makefiles, since you can set this variable using an environment
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5520 variable, like this:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5521
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5522 \(using csh) setenv XEMACSDEBUG '(setq debug-on-error t)'
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5523 \(using bash) export XEMACSDEBUG='(setq debug-on-error t)'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 Vdebug_on_error = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5527 DEFVAR_LISP ("debug-on-signal", &Vdebug_on_signal /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528 *Non-nil means enter debugger if an error is signalled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 The debugger will be entered whether or not the error is handled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5530 a `condition-case'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 If the value is a list, an error only means to enter the debugger
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532 if one of its condition symbols appears in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533 See also variable `debug-on-quit'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535 Vdebug_on_signal = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537 DEFVAR_BOOL ("debug-on-quit", &debug_on_quit /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5538 *Non-nil means enter debugger if quit is signalled (C-G, for example).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 Does not apply if quit is handled by a `condition-case'. Entering the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 debugger can also be achieved at any time (for X11 console) by typing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541 control-shift-G to signal a critical quit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 debug_on_quit = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 DEFVAR_BOOL ("debug-on-next-call", &debug_on_next_call /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 Non-nil means enter debugger before next `eval', `apply' or `funcall'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 DEFVAR_LISP ("debugger", &Vdebugger /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5550 Function to call to invoke debugger.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5551 If due to frame exit, args are `exit' and the value being returned;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 this function's value will be returned instead of that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553 If due to error, args are `error' and a list of the args to `signal'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5554 If due to `apply' or `funcall' entry, one arg, `lambda'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5555 If due to `eval' entry, one arg, t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5557 Vdebugger = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5559 staticpro (&Vpending_warnings);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560 Vpending_warnings = Qnil;
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
5561 dump_add_root_object (&Vpending_warnings_tail);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 Vpending_warnings_tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5564 DEFVAR_LISP ("log-warning-minimum-level", &Vlog_warning_minimum_level);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5565 Vlog_warning_minimum_level = Qinfo;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5566
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 staticpro (&Vautoload_queue);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 Vautoload_queue = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570 staticpro (&Vcondition_handlers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 staticpro (&Vcurrent_warning_class);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 Vcurrent_warning_class = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5574
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5575 staticpro (&Vcurrent_warning_level);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5576 Vcurrent_warning_level = Qnil;
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
5577
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578 staticpro (&Vcurrent_error_state);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 Vcurrent_error_state = Qnil; /* errors as normal */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
5580 }