aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorPaul Eggert2015-01-05 09:07:45 -0800
committerPaul Eggert2015-01-05 10:14:58 -0800
commit58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c (patch)
treed6d79ad7b7cceafc78c5a9c54f5be1ac441a8ed7 /src/eval.c
parentd2cf05d1bac19d8564d0806f515b9f40fe57f4df (diff)
downloademacs-58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c.tar.gz
emacs-58f2d6ef32b28a787fcc4e0d98b3f331ceb2a68c.zip
Compute C decls for DEFSYMs automatically
Fixes Bug#15880. This patch also makes Q constants (e.g., Qnil) constant addresses from the C point of view. * make-docfile.c: Revamp to generate table of symbols, too. Include <stdbool.h>. (xstrdup): New function. (main): Don't process the same file twice. (SYMBOL): New constant in enum global_type. (struct symbol): Turn 'value' member into a union, either v.value for int or v.svalue for string. All uses changed. (add_global): New arg svalue, which overrides value, so that globals can have a string value. (close_emacs_global): New arg num_symbols; all uses changed. Output lispsym decl. (write_globals): Output symbol globals too. Output more ATTRIBUTE_CONST, now that Qnil etc. are C constants. Output defsym_name table. (scan_c_file): Move most of guts into ... (scan_c_stream): ... new function. Scan for DEFSYMs and record symbols found. Don't read past EOF if file doesn't end in newline. * alloc.c, bidi.c, buffer.c, bytecode.c, callint.c, casefiddle: * casetab.c, category.c, ccl.c, charset.c, chartab.c, cmds.c, coding.c: * composite.c, data.c, dbusbind.c, decompress.c, dired.c, dispnew.c: * doc.c, editfns.c, emacs.c, eval.c, fileio.c, fns.c, font.c, fontset.c: * frame.c, fringe.c, ftfont.c, ftxfont.c, gfilenotify.c, gnutls.c: * image.c, inotify.c, insdel.c, keyboard.c, keymap.c, lread.c: * macfont.m, macros.c, minibuf.c, nsfns.m, nsfont.m, nsimage.m: * nsmenu.m, nsselect.m, nsterm.m, print.c, process.c, profiler.c: * search.c, sound.c, syntax.c, term.c, terminal.c, textprop.c, undo.c: * window.c, xdisp.c, xfaces.c, xfns.c, xftfont.c, xmenu.c, xml.c: * xselect.c, xsettings.c, xterm.c: Remove Q vars that represent symbols (e.g., Qnil, Qt, Qemacs). These names are now defined automatically by make-docfile. * alloc.c (init_symbol): New function. (Fmake_symbol): Use it. (c_symbol_p): New function. (valid_lisp_object_p, purecopy): Use it. * alloc.c (marked_pinned_symbols): Use make_lisp_symbol instead of make_lisp_ptr. (garbage_collect_1): Mark lispsym symbols. (CHECK_ALLOCATED_AND_LIVE_SYMBOL): New macro. (mark_object): Use it. (sweep_symbols): Sweep lispsym symbols. (symbol_uses_obj): New function. (which_symbols): Use it. Work for lispsym symbols, too. (init_alloc_once): Initialize Vpurify_flag here; no need to wait, since Qt's address is already known now. (syms_of_alloc): Add lispsym count to symbols_consed. * buffer.c (init_buffer_once): Compare to Qnil, not to make_number (0), when testing whether storage is all bits zero. * dispextern (struct image_type): * font.c (font_property_table): * frame.c (struct frame_parm_table, frame_parms): * keyboard.c (scroll_bar_parts, struct event_head): * xdisp.c (struct props): Use XSYMBOL_INIT (Qfoo) and struct Lisp_Symbol * rather than &Qfoo and Lisp_Object *, since Qfoo is no longer an object whose address can be taken. All uses changed. * eval.c (run_hook): New function. Most uses of Frun_hooks changed to use it, so that they no longer need to take the address of a Lisp sym. (syms_of_eval): Don't use DEFSYM on Vrun_hooks, as it's a variable. * frame.c (syms_of_frame): Add defsyms for the frame_parms table. * keyboard.c (syms_of_keyboard): Don't DEFSYM Qmenu_bar here. DEFSYM Qdeactivate_mark before the corresponding var. * keymap.c (syms_of_keymap): Use DEFSYM for Qmenu_bar and Qmode_line instead of interning their symbols; this avoids duplicates. (LISP_INITIALLY, TAG_PTR) (DEFINE_LISP_SYMBOL_BEGIN, DEFINE_LISP_SYMBOL_END, XSYMBOL_INIT): New macros. (LISP_INITIALLY_ZERO): Use it. (enum symbol_interned, enum symbol_redirect, struct Lisp_Symbol) (EXFUN, DEFUN_ARGS_MANY, DEFUN_ARGS_UNEVALLED, DEFUN_ARGS_*): Move decls up, to avoid forward uses. Include globals.h earlier, too. (make_lisp_symbol): New function. (XSETSYMBOL): Use it. (DEFSYM): Now just a placeholder for make-docfile. * lread.c (DEFINE_SYMBOLS): Define, for globals.h. (intern_sym): New function, with body taken from old intern_driver. (intern_driver): Use it. Last arg is now Lisp integer, not ptrdiff_t. All uses changed. (define_symbol): New function. (init_obarray): Define the C symbols taken from lispsym. Use plain DEFSYM for Qt and Qnil. * syntax.c (init_syntax_once): No need to worry about Qchar_table_extra_slots.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/src/eval.c b/src/eval.c
index 4748712708f..7e4b016b236 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -38,22 +38,6 @@ struct handler *handlerlist;
38int gcpro_level; 38int gcpro_level;
39#endif 39#endif
40 40
41Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp;
42Lisp_Object Qinhibit_quit;
43Lisp_Object Qand_rest;
44static Lisp_Object Qand_optional;
45static Lisp_Object Qinhibit_debugger;
46static Lisp_Object Qdeclare;
47Lisp_Object Qinternal_interpreter_environment, Qclosure;
48
49static Lisp_Object Qdebug;
50
51/* This holds either the symbol `run-hooks' or nil.
52 It is nil at an early stage of startup, and when Emacs
53 is shutting down. */
54
55Lisp_Object Vrun_hooks;
56
57/* Non-nil means record all fset's and provide's, to be undone 41/* Non-nil means record all fset's and provide's, to be undone
58 if the file being autoloaded is not fully loaded. 42 if the file being autoloaded is not fully loaded.
59 They are recorded by being consed onto the front of Vautoload_queue: 43 They are recorded by being consed onto the front of Vautoload_queue:
@@ -61,6 +45,11 @@ Lisp_Object Vrun_hooks;
61 45
62Lisp_Object Vautoload_queue; 46Lisp_Object Vautoload_queue;
63 47
48/* This holds either the symbol `run-hooks' or nil.
49 It is nil at an early stage of startup, and when Emacs
50 is shutting down. */
51Lisp_Object Vrun_hooks;
52
64/* Current number of specbindings allocated in specpdl, not counting 53/* Current number of specbindings allocated in specpdl, not counting
65 the dummy entry specpdl[-1]. */ 54 the dummy entry specpdl[-1]. */
66 55
@@ -2363,14 +2352,10 @@ Instead, use `add-hook' and specify t for the LOCAL argument.
2363usage: (run-hooks &rest HOOKS) */) 2352usage: (run-hooks &rest HOOKS) */)
2364 (ptrdiff_t nargs, Lisp_Object *args) 2353 (ptrdiff_t nargs, Lisp_Object *args)
2365{ 2354{
2366 Lisp_Object hook[1];
2367 ptrdiff_t i; 2355 ptrdiff_t i;
2368 2356
2369 for (i = 0; i < nargs; i++) 2357 for (i = 0; i < nargs; i++)
2370 { 2358 run_hook (args[i]);
2371 hook[0] = args[i];
2372 run_hook_with_args (1, hook, funcall_nil);
2373 }
2374 2359
2375 return Qnil; 2360 return Qnil;
2376} 2361}
@@ -2536,6 +2521,14 @@ run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
2536 } 2521 }
2537} 2522}
2538 2523
2524/* Run the hook HOOK, giving each function no args. */
2525
2526void
2527run_hook (Lisp_Object hook)
2528{
2529 Frun_hook_with_args (1, &hook);
2530}
2531
2539/* Run the hook HOOK, giving each function the two args ARG1 and ARG2. */ 2532/* Run the hook HOOK, giving each function the two args ARG1 and ARG2. */
2540 2533
2541void 2534void
@@ -3762,7 +3755,8 @@ alist of active lexical bindings. */);
3762 (Just imagine if someone makes it buffer-local). */ 3755 (Just imagine if someone makes it buffer-local). */
3763 Funintern (Qinternal_interpreter_environment, Qnil); 3756 Funintern (Qinternal_interpreter_environment, Qnil);
3764 3757
3765 DEFSYM (Vrun_hooks, "run-hooks"); 3758 Vrun_hooks = intern_c_string ("run-hooks");
3759 staticpro (&Vrun_hooks);
3766 3760
3767 staticpro (&Vautoload_queue); 3761 staticpro (&Vautoload_queue);
3768 Vautoload_queue = Qnil; 3762 Vautoload_queue = Qnil;