XEmacs 21.2.41 "Polyhymnia".
[chise/xemacs-chise.git.1] / src / symbols.c
1 /* "intern" and friends -- moved here from lread.c and data.c
2    Copyright (C) 1985-1989, 1992-1994 Free Software Foundation, Inc.
3    Copyright (C) 1995, 2000 Ben Wing.
4
5 This file is part of XEmacs.
6
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING.  If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* Synched up with: FSF 19.30. */
23
24 /* This file has been Mule-ized. */
25
26 /* NOTE:
27
28    The value cell of a symbol can contain a simple value or one of
29    various symbol-value-magic objects.  Some of these objects can
30    chain into other kinds of objects.  Here is a table of possibilities:
31
32    1a) simple value
33    1b) Qunbound
34    1c) symbol-value-forward, excluding Qunbound
35    2) symbol-value-buffer-local -> 1a or 1b or 1c
36    3) symbol-value-lisp-magic -> 1a or 1b or 1c
37    4) symbol-value-lisp-magic -> symbol-value-buffer-local -> 1a or 1b or 1c
38    5) symbol-value-varalias
39    6) symbol-value-lisp-magic -> symbol-value-varalias
40
41    The "chain" of a symbol-value-buffer-local is its current_value slot.
42
43    The "chain" of a symbol-value-lisp-magic is its shadowed slot, which
44    applies for handler types without associated handlers.
45
46    All other fields in all the structures (including the "shadowed" slot
47    in a symbol-value-varalias) can *only* contain a simple value or Qunbound.
48
49 */
50
51 /* #### Ugh, though, this file does awful things with symbol-value-magic
52    objects.  This ought to be cleaned up. */
53
54 #include <config.h>
55 #include "lisp.h"
56
57 #include "buffer.h"             /* for Vbuffer_defaults */
58 #include "console.h"
59 #include "elhash.h"
60
61 Lisp_Object Qad_advice_info, Qad_activate;
62
63 Lisp_Object Qget_value, Qset_value, Qbound_predicate, Qmake_unbound;
64 Lisp_Object Qlocal_predicate, Qmake_local;
65
66 Lisp_Object Qboundp, Qglobally_boundp, Qmakunbound;
67 Lisp_Object Qsymbol_value, Qset, Qdefault_boundp, Qdefault_value;
68 Lisp_Object Qset_default, Qsetq_default;
69 Lisp_Object Qmake_variable_buffer_local, Qmake_local_variable;
70 Lisp_Object Qkill_local_variable, Qkill_console_local_variable;
71 Lisp_Object Qsymbol_value_in_buffer, Qsymbol_value_in_console;
72 Lisp_Object Qlocal_variable_p;
73
74 Lisp_Object Qconst_integer, Qconst_boolean, Qconst_object;
75 Lisp_Object Qconst_specifier;
76 Lisp_Object Qdefault_buffer, Qcurrent_buffer, Qconst_current_buffer;
77 Lisp_Object Qdefault_console, Qselected_console, Qconst_selected_console;
78
79 static Lisp_Object maybe_call_magic_handler (Lisp_Object sym,
80                                              Lisp_Object funsym,
81                                              int nargs, ...);
82 static Lisp_Object fetch_value_maybe_past_magic (Lisp_Object sym,
83                                                  Lisp_Object follow_past_lisp_magic);
84 static Lisp_Object *value_slot_past_magic (Lisp_Object sym);
85 static Lisp_Object follow_varalias_pointers (Lisp_Object symbol,
86                                              Lisp_Object follow_past_lisp_magic);
87
88 \f
89 static Lisp_Object
90 mark_symbol (Lisp_Object obj)
91 {
92   Lisp_Symbol *sym = XSYMBOL (obj);
93   Lisp_Object pname;
94
95   mark_object (sym->value);
96   mark_object (sym->function);
97   XSETSTRING (pname, sym->name);
98   mark_object (pname);
99   if (!symbol_next (sym))
100     return sym->plist;
101   else
102   {
103     mark_object (sym->plist);
104     /* Mark the rest of the symbols in the obarray hash-chain */
105     sym = symbol_next (sym);
106     XSETSYMBOL (obj, sym);
107     return obj;
108   }
109 }
110
111 static const struct lrecord_description symbol_description[] = {
112   { XD_LISP_OBJECT, offsetof (Lisp_Symbol, next) },
113   { XD_LISP_OBJECT, offsetof (Lisp_Symbol, name) },
114   { XD_LISP_OBJECT, offsetof (Lisp_Symbol, value) },
115   { XD_LISP_OBJECT, offsetof (Lisp_Symbol, function) },
116   { XD_LISP_OBJECT, offsetof (Lisp_Symbol, plist) },
117   { XD_END }
118 };
119
120 /* Symbol plists are directly accessible, so we need to protect against
121    invalid property list structure */
122
123 static Lisp_Object
124 symbol_getprop (Lisp_Object symbol, Lisp_Object property)
125 {
126   return external_plist_get (&XSYMBOL (symbol)->plist, property, 0, ERROR_ME);
127 }
128
129 static int
130 symbol_putprop (Lisp_Object symbol, Lisp_Object property, Lisp_Object value)
131 {
132   external_plist_put (&XSYMBOL (symbol)->plist, property, value, 0, ERROR_ME);
133   return 1;
134 }
135
136 static int
137 symbol_remprop (Lisp_Object symbol, Lisp_Object property)
138 {
139   return external_remprop (&XSYMBOL (symbol)->plist, property, 0, ERROR_ME);
140 }
141
142 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS ("symbol", symbol,
143                                                 mark_symbol, print_symbol,
144                                                 0, 0, 0, symbol_description,
145                                                 symbol_getprop,
146                                                 symbol_putprop,
147                                                 symbol_remprop,
148                                                 Fsymbol_plist,
149                                                 Lisp_Symbol);
150
151 \f
152 /**********************************************************************/
153 /*                              Intern                                */
154 /**********************************************************************/
155
156 /* #### using a vector here is way bogus.  Use a hash table instead. */
157
158 Lisp_Object Vobarray;
159
160 static Lisp_Object initial_obarray;
161
162 /* oblookup stores the bucket number here, for the sake of Funintern.  */
163
164 static int oblookup_last_bucket_number;
165
166 static Lisp_Object
167 check_obarray (Lisp_Object obarray)
168 {
169   while (!VECTORP (obarray) || XVECTOR_LENGTH (obarray) == 0)
170     {
171       /* If Vobarray is now invalid, force it to be valid.  */
172       if (EQ (Vobarray, obarray)) Vobarray = initial_obarray;
173
174       obarray = wrong_type_argument (Qvectorp, obarray);
175     }
176   return obarray;
177 }
178
179 Lisp_Object
180 intern (const char *str)
181 {
182   Bytecount len = strlen (str);
183   const Bufbyte *buf = (const Bufbyte *) str;
184   Lisp_Object obarray = Vobarray;
185
186   if (!VECTORP (obarray) || XVECTOR_LENGTH (obarray) == 0)
187     obarray = check_obarray (obarray);
188
189   {
190     Lisp_Object tem = oblookup (obarray, buf, len);
191     if (SYMBOLP (tem))
192       return tem;
193   }
194
195   return Fintern (make_string (buf, len), obarray);
196 }
197
198 DEFUN ("intern", Fintern, 1, 2, 0, /*
199 Return the canonical symbol whose name is STRING.
200 If there is none, one is created by this function and returned.
201 Optional second argument OBARRAY specifies the obarray to use;
202 it defaults to the value of the variable `obarray'.
203 */
204        (string, obarray))
205 {
206   Lisp_Object object, *ptr;
207   Lisp_Symbol *symbol;
208   Bytecount len;
209
210   if (NILP (obarray)) obarray = Vobarray;
211   obarray = check_obarray (obarray);
212
213   CHECK_STRING (string);
214
215   len = XSTRING_LENGTH (string);
216   object = oblookup (obarray, XSTRING_DATA (string), len);
217   if (!INTP (object))
218     /* Found it */
219     return object;
220
221   ptr = &XVECTOR_DATA (obarray)[XINT (object)];
222
223   object = Fmake_symbol (string);
224   symbol = XSYMBOL (object);
225
226   if (SYMBOLP (*ptr))
227     symbol_next (symbol) = XSYMBOL (*ptr);
228   else
229     symbol_next (symbol) = 0;
230   *ptr = object;
231
232   if (string_byte (symbol_name (symbol), 0) == ':' && EQ (obarray, Vobarray))
233     {
234       /* The LISP way is to put keywords in their own package, but we
235          don't have packages, so we do something simpler.  Someday,
236          maybe we'll have packages and then this will be reworked.
237          --Stig. */
238       symbol_value (symbol) = object;
239     }
240
241   return object;
242 }
243
244 DEFUN ("intern-soft", Fintern_soft, 1, 2, 0, /*
245 Return the canonical symbol named NAME, or nil if none exists.
246 NAME may be a string or a symbol.  If it is a symbol, that exact
247 symbol is searched for.
248 Optional second argument OBARRAY specifies the obarray to use;
249 it defaults to the value of the variable `obarray'.
250 */
251        (name, obarray))
252 {
253   /* #### Bug!  (intern-soft "nil") returns nil.  Perhaps we should
254      add a DEFAULT-IF-NOT-FOUND arg, like in get.  */
255   Lisp_Object tem;
256   Lisp_String *string;
257
258   if (NILP (obarray)) obarray = Vobarray;
259   obarray = check_obarray (obarray);
260
261   if (!SYMBOLP (name))
262     {
263       CHECK_STRING (name);
264       string = XSTRING (name);
265     }
266   else
267     string = symbol_name (XSYMBOL (name));
268
269   tem = oblookup (obarray, string_data (string), string_length (string));
270   if (INTP (tem) || (SYMBOLP (name) && !EQ (name, tem)))
271     return Qnil;
272   else
273     return tem;
274 }
275 \f
276 DEFUN ("unintern", Funintern, 1, 2, 0, /*
277 Delete the symbol named NAME, if any, from OBARRAY.
278 The value is t if a symbol was found and deleted, nil otherwise.
279 NAME may be a string or a symbol.  If it is a symbol, that symbol
280 is deleted, if it belongs to OBARRAY--no other symbol is deleted.
281 OBARRAY defaults to the value of the variable `obarray'.
282 */
283        (name, obarray))
284 {
285   Lisp_Object tem;
286   Lisp_String *string;
287   int hash;
288
289   if (NILP (obarray)) obarray = Vobarray;
290   obarray = check_obarray (obarray);
291
292   if (SYMBOLP (name))
293     string = symbol_name (XSYMBOL (name));
294   else
295     {
296       CHECK_STRING (name);
297       string = XSTRING (name);
298     }
299
300   tem = oblookup (obarray, string_data (string), string_length (string));
301   if (INTP (tem))
302     return Qnil;
303   /* If arg was a symbol, don't delete anything but that symbol itself.  */
304   if (SYMBOLP (name) && !EQ (name, tem))
305     return Qnil;
306
307   hash = oblookup_last_bucket_number;
308
309   if (EQ (XVECTOR_DATA (obarray)[hash], tem))
310     {
311       if (XSYMBOL (tem)->next)
312         XSETSYMBOL (XVECTOR_DATA (obarray)[hash], XSYMBOL (tem)->next);
313       else
314         XVECTOR_DATA (obarray)[hash] = Qzero;
315     }
316   else
317     {
318       Lisp_Object tail, following;
319
320       for (tail = XVECTOR_DATA (obarray)[hash];
321            XSYMBOL (tail)->next;
322            tail = following)
323         {
324           XSETSYMBOL (following, XSYMBOL (tail)->next);
325           if (EQ (following, tem))
326             {
327               XSYMBOL (tail)->next = XSYMBOL (following)->next;
328               break;
329             }
330         }
331     }
332   return Qt;
333 }
334 \f
335 /* Return the symbol in OBARRAY whose names matches the string
336    of SIZE characters at PTR.  If there is no such symbol in OBARRAY,
337    return the index into OBARRAY that the string hashes to.
338
339    Also store the bucket number in oblookup_last_bucket_number.  */
340
341 Lisp_Object
342 oblookup (Lisp_Object obarray, const Bufbyte *ptr, Bytecount size)
343 {
344   int hash, obsize;
345   Lisp_Symbol *tail;
346   Lisp_Object bucket;
347
348   if (!VECTORP (obarray) ||
349       (obsize = XVECTOR_LENGTH (obarray)) == 0)
350     {
351       obarray = check_obarray (obarray);
352       obsize = XVECTOR_LENGTH (obarray);
353     }
354   hash = hash_string (ptr, size) % obsize;
355   oblookup_last_bucket_number = hash;
356   bucket = XVECTOR_DATA (obarray)[hash];
357   if (ZEROP (bucket))
358     ;
359   else if (!SYMBOLP (bucket))
360     error ("Bad data in guts of obarray"); /* Like CADR error message */
361   else
362     for (tail = XSYMBOL (bucket); ;)
363       {
364         if (string_length (tail->name) == size &&
365             !memcmp (string_data (tail->name), ptr, size))
366           {
367             XSETSYMBOL (bucket, tail);
368             return bucket;
369           }
370         tail = symbol_next (tail);
371         if (!tail)
372           break;
373       }
374   return make_int (hash);
375 }
376
377 #if 0 /* Emacs 19.34 */
378 int
379 hash_string (const Bufbyte *ptr, Bytecount len)
380 {
381   const Bufbyte *p = ptr;
382   const Bufbyte *end = p + len;
383   Bufbyte c;
384   int hash = 0;
385
386   while (p != end)
387     {
388       c = *p++;
389       if (c >= 0140) c -= 40;
390       hash = ((hash<<3) + (hash>>28) + c);
391     }
392   return hash & 07777777777;
393 }
394 #endif
395
396 /* derived from hashpjw, Dragon Book P436. */
397 int
398 hash_string (const Bufbyte *ptr, Bytecount len)
399 {
400   int hash = 0;
401
402   while (len-- > 0)
403     {
404       int g;
405       hash = (hash << 4) + *ptr++;
406       g = hash & 0xf0000000;
407       if (g)
408         hash = (hash ^ (g >> 24)) ^ g;
409     }
410   return hash & 07777777777;
411 }
412
413 /* Map FN over OBARRAY.  The mapping is stopped when FN returns a
414    non-zero value.  */
415 void
416 map_obarray (Lisp_Object obarray,
417              int (*fn) (Lisp_Object, void *), void *arg)
418 {
419   REGISTER int i;
420
421   CHECK_VECTOR (obarray);
422   for (i = XVECTOR_LENGTH (obarray) - 1; i >= 0; i--)
423     {
424       Lisp_Object tail = XVECTOR_DATA (obarray)[i];
425       if (SYMBOLP (tail))
426         while (1)
427           {
428             Lisp_Symbol *next;
429             if ((*fn) (tail, arg))
430               return;
431             next = symbol_next (XSYMBOL (tail));
432             if (!next)
433               break;
434             XSETSYMBOL (tail, next);
435           }
436     }
437 }
438
439 static int
440 mapatoms_1 (Lisp_Object sym, void *arg)
441 {
442   call1 (*(Lisp_Object *)arg, sym);
443   return 0;
444 }
445
446 DEFUN ("mapatoms", Fmapatoms, 1, 2, 0, /*
447 Call FUNCTION on every symbol in OBARRAY.
448 OBARRAY defaults to the value of `obarray'.
449 */
450        (function, obarray))
451 {
452   struct gcpro gcpro1;
453
454   if (NILP (obarray))
455     obarray = Vobarray;
456   obarray = check_obarray (obarray);
457
458   GCPRO1 (obarray);
459   map_obarray (obarray, mapatoms_1, &function);
460   UNGCPRO;
461   return Qnil;
462 }
463
464 \f
465 /**********************************************************************/
466 /*                              Apropos                               */
467 /**********************************************************************/
468
469 struct appropos_mapper_closure
470 {
471   Lisp_Object regexp;
472   Lisp_Object predicate;
473   Lisp_Object accumulation;
474 };
475
476 static int
477 apropos_mapper (Lisp_Object symbol, void *arg)
478 {
479   struct appropos_mapper_closure *closure =
480     (struct appropos_mapper_closure *) arg;
481   Bytecount match = fast_lisp_string_match (closure->regexp,
482                                             Fsymbol_name (symbol));
483
484   if (match >= 0 &&
485       (NILP (closure->predicate) ||
486        !NILP (call1 (closure->predicate, symbol))))
487     closure->accumulation = Fcons (symbol, closure->accumulation);
488
489   return 0;
490 }
491
492 DEFUN ("apropos-internal", Fapropos_internal, 1, 2, 0, /*
493 Return a list of all symbols whose names contain match for REGEXP.
494 If optional 2nd arg PREDICATE is non-nil, only symbols for which
495 \(funcall PREDICATE SYMBOL) returns non-nil are returned.
496 */
497        (regexp, predicate))
498 {
499   struct appropos_mapper_closure closure;
500   struct gcpro gcpro1;
501
502   CHECK_STRING (regexp);
503
504   closure.regexp = regexp;
505   closure.predicate = predicate;
506   closure.accumulation = Qnil;
507   GCPRO1 (closure.accumulation);
508   map_obarray (Vobarray, apropos_mapper, &closure);
509   closure.accumulation = Fsort (closure.accumulation, Qstring_lessp);
510   UNGCPRO;
511   return closure.accumulation;
512 }
513
514 \f
515 /* Extract and set components of symbols */
516
517 static void set_up_buffer_local_cache (Lisp_Object sym,
518                                        struct symbol_value_buffer_local *bfwd,
519                                        struct buffer *buf,
520                                        Lisp_Object new_alist_el,
521                                        int set_it_p);
522
523 DEFUN ("boundp", Fboundp, 1, 1, 0, /*
524 Return t if SYMBOL's value is not void.
525 */
526        (symbol))
527 {
528   CHECK_SYMBOL (symbol);
529   return UNBOUNDP (find_symbol_value (symbol)) ? Qnil : Qt;
530 }
531
532 DEFUN ("globally-boundp", Fglobally_boundp, 1, 1, 0, /*
533 Return t if SYMBOL has a global (non-bound) value.
534 This is for the byte-compiler; you really shouldn't be using this.
535 */
536        (symbol))
537 {
538   CHECK_SYMBOL (symbol);
539   return UNBOUNDP (top_level_value (symbol)) ? Qnil : Qt;
540 }
541
542 DEFUN ("fboundp", Ffboundp, 1, 1, 0, /*
543 Return t if SYMBOL's function definition is not void.
544 */
545        (symbol))
546 {
547   CHECK_SYMBOL (symbol);
548   return UNBOUNDP (XSYMBOL (symbol)->function) ? Qnil : Qt;
549 }
550
551 /* Return non-zero if SYM's value or function (the current contents of
552    which should be passed in as VAL) is constant, i.e. unsettable. */
553
554 static int
555 symbol_is_constant (Lisp_Object sym, Lisp_Object val)
556 {
557   /* #### - I wonder if it would be better to just have a new magic value
558      type and make nil, t, and all keywords have that same magic
559      constant_symbol value.  This test is awfully specific about what is
560      constant and what isn't.  --Stig */
561   if (EQ (sym, Qnil) ||
562       EQ (sym, Qt))
563     return 1;
564
565   if (SYMBOL_VALUE_MAGIC_P (val))
566     switch (XSYMBOL_VALUE_MAGIC_TYPE (val))
567       {
568       case SYMVAL_CONST_OBJECT_FORWARD:
569       case SYMVAL_CONST_SPECIFIER_FORWARD:
570       case SYMVAL_CONST_FIXNUM_FORWARD:
571       case SYMVAL_CONST_BOOLEAN_FORWARD:
572       case SYMVAL_CONST_CURRENT_BUFFER_FORWARD:
573       case SYMVAL_CONST_SELECTED_CONSOLE_FORWARD:
574         return 1;
575       default: break; /* Warning suppression */
576       }
577
578   /* We don't return true for keywords here because they are handled
579      specially by reject_constant_symbols().  */
580   return 0;
581 }
582
583 /* We are setting SYM's value slot (or function slot, if FUNCTION_P is
584    non-zero) to NEWVAL.  Make sure this is allowed.
585    FOLLOW_PAST_LISP_MAGIC specifies whether we delve past
586    symbol-value-lisp-magic objects.  */
587
588 void
589 reject_constant_symbols (Lisp_Object sym, Lisp_Object newval, int function_p,
590                          Lisp_Object follow_past_lisp_magic)
591 {
592   Lisp_Object val =
593     (function_p ? XSYMBOL (sym)->function
594      : fetch_value_maybe_past_magic (sym, follow_past_lisp_magic));
595
596   if (SYMBOL_VALUE_MAGIC_P (val) &&
597       XSYMBOL_VALUE_MAGIC_TYPE (val) == SYMVAL_CONST_SPECIFIER_FORWARD)
598     signal_simple_error ("Use `set-specifier' to change a specifier's value",
599                          sym);
600
601   if (symbol_is_constant (sym, val)
602       || (SYMBOL_IS_KEYWORD (sym) && !EQ (newval, sym)))
603     signal_error (Qsetting_constant,
604                   UNBOUNDP (newval) ? list1 (sym) : list2 (sym, newval));
605 }
606
607 /* Verify that it's ok to make SYM buffer-local.  This rejects
608    constants and default-buffer-local variables.  FOLLOW_PAST_LISP_MAGIC
609    specifies whether we delve into symbol-value-lisp-magic objects.
610    (Should be a symbol indicating what action is being taken; that way,
611    we don't delve if there's a handler for that action, but do otherwise.) */
612
613 static void
614 verify_ok_for_buffer_local (Lisp_Object sym,
615                             Lisp_Object follow_past_lisp_magic)
616 {
617   Lisp_Object val = fetch_value_maybe_past_magic (sym, follow_past_lisp_magic);
618
619   if (symbol_is_constant (sym, val))
620     goto not_ok;
621   if (SYMBOL_VALUE_MAGIC_P (val))
622     switch (XSYMBOL_VALUE_MAGIC_TYPE (val))
623       {
624         case SYMVAL_DEFAULT_BUFFER_FORWARD:
625         case SYMVAL_DEFAULT_CONSOLE_FORWARD:
626           /* #### It's theoretically possible for it to be reasonable
627              to have both console-local and buffer-local variables,
628              but I don't want to consider that right now. */
629         case SYMVAL_SELECTED_CONSOLE_FORWARD:
630           goto not_ok;
631       default: break; /* Warning suppression */
632       }
633
634   return;
635
636   not_ok:
637   signal_error (Qerror,
638                 list2 (build_string ("Symbol may not be buffer-local"), sym));
639 }
640
641 DEFUN ("makunbound", Fmakunbound, 1, 1, 0, /*
642 Make SYMBOL's value be void.
643 */
644        (symbol))
645 {
646   Fset (symbol, Qunbound);
647   return symbol;
648 }
649
650 DEFUN ("fmakunbound", Ffmakunbound, 1, 1, 0, /*
651 Make SYMBOL's function definition be void.
652 */
653        (symbol))
654 {
655   CHECK_SYMBOL (symbol);
656   reject_constant_symbols (symbol, Qunbound, 1, Qt);
657   XSYMBOL (symbol)->function = Qunbound;
658   return symbol;
659 }
660
661 DEFUN ("symbol-function", Fsymbol_function, 1, 1, 0, /*
662 Return SYMBOL's function definition.  Error if that is void.
663 */
664        (symbol))
665 {
666   CHECK_SYMBOL (symbol);
667   if (UNBOUNDP (XSYMBOL (symbol)->function))
668     signal_void_function_error (symbol);
669   return XSYMBOL (symbol)->function;
670 }
671
672 DEFUN ("symbol-plist", Fsymbol_plist, 1, 1, 0, /*
673 Return SYMBOL's property list.
674 */
675        (symbol))
676 {
677   CHECK_SYMBOL (symbol);
678   return XSYMBOL (symbol)->plist;
679 }
680
681 DEFUN ("symbol-name", Fsymbol_name, 1, 1, 0, /*
682 Return SYMBOL's name, a string.
683 */
684        (symbol))
685 {
686   Lisp_Object name;
687
688   CHECK_SYMBOL (symbol);
689   XSETSTRING (name, XSYMBOL (symbol)->name);
690   return name;
691 }
692
693 DEFUN ("fset", Ffset, 2, 2, 0, /*
694 Set SYMBOL's function definition to NEWDEF, and return NEWDEF.
695 */
696        (symbol, newdef))
697 {
698   /* This function can GC */
699   CHECK_SYMBOL (symbol);
700   reject_constant_symbols (symbol, newdef, 1, Qt);
701   if (!NILP (Vautoload_queue) && !UNBOUNDP (XSYMBOL (symbol)->function))
702     Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
703                              Vautoload_queue);
704   XSYMBOL (symbol)->function = newdef;
705   /* Handle automatic advice activation */
706   if (CONSP (XSYMBOL (symbol)->plist) &&
707       !NILP (Fget (symbol, Qad_advice_info, Qnil)))
708     {
709       call2 (Qad_activate, symbol, Qnil);
710       newdef = XSYMBOL (symbol)->function;
711     }
712   return newdef;
713 }
714
715 /* FSFmacs */
716 DEFUN ("define-function", Fdefine_function, 2, 2, 0, /*
717 Set SYMBOL's function definition to NEWDEF, and return NEWDEF.
718 Associates the function with the current load file, if any.
719 */
720        (symbol, newdef))
721 {
722   /* This function can GC */
723   Ffset (symbol, newdef);
724   LOADHIST_ATTACH (symbol);
725   return newdef;
726 }
727
728
729 DEFUN ("setplist", Fsetplist, 2, 2, 0, /*
730 Set SYMBOL's property list to NEWPLIST, and return NEWPLIST.
731 */
732        (symbol, newplist))
733 {
734   CHECK_SYMBOL (symbol);
735 #if 0 /* Inserted for debugging 6/28/1997 -slb */
736   /* Somebody is setting a property list of integer 0, who? */
737   /* Not this way apparently. */
738   if (EQ(newplist, Qzero)) abort();
739 #endif
740
741   XSYMBOL (symbol)->plist = newplist;
742   return newplist;
743 }
744
745 \f
746 /**********************************************************************/
747 /*                           symbol-value                             */
748 /**********************************************************************/
749
750 /* If the contents of the value cell of a symbol is one of the following
751    three types of objects, then the symbol is "magic" in that setting
752    and retrieving its value doesn't just set or retrieve the raw
753    contents of the value cell.  None of these objects can escape to
754    the user level, so there is no loss of generality.
755
756    If a symbol is "unbound", then the contents of its value cell is
757    Qunbound.  Despite appearances, this is *not* a symbol, but is a
758    symbol-value-forward object.  This is so that printing it results
759    in "INTERNAL OBJECT (XEmacs bug?)", in case it leaks to Lisp, somehow.
760
761    Logically all of the following objects are "symbol-value-magic"
762    objects, and there are some games played w.r.t. this (#### this
763    should be cleaned up).  SYMBOL_VALUE_MAGIC_P is true for all of
764    the object types.  XSYMBOL_VALUE_MAGIC_TYPE returns the type of
765    symbol-value-magic object.  There are more than three types
766    returned by this macro: in particular, symbol-value-forward
767    has eight subtypes, and symbol-value-buffer-local has two.  See
768    symeval.h.
769
770    1. symbol-value-forward
771
772    symbol-value-forward is used for variables whose actual contents
773    are stored in a C variable of some sort, and for Qunbound.  The
774    lcheader.next field (which is only used to chain together free
775    lcrecords) holds a pointer to the actual C variable.  Included
776    in this type are "buffer-local" variables that are actually
777    stored in the buffer object itself; in this case, the "pointer"
778    is an offset into the struct buffer structure.
779
780    The subtypes are as follows:
781
782    SYMVAL_OBJECT_FORWARD:
783       (declare with DEFVAR_LISP)
784       The value of this variable is stored in a C variable of type
785       "Lisp_Object".  Setting this variable sets the C variable.
786       Accessing this variable retrieves a value from the C variable.
787       These variables can be buffer-local -- in this case, the
788       raw symbol-value field gets converted into a
789       symbol-value-buffer-local, whose "current_value" slot contains
790       the symbol-value-forward. (See below.)
791
792    SYMVAL_FIXNUM_FORWARD:
793    SYMVAL_BOOLEAN_FORWARD:
794       (declare with DEFVAR_INT or DEFVAR_BOOL)
795       Similar to SYMVAL_OBJECT_FORWARD except that the C variable
796       is of type "int" and is an integer or boolean, respectively.
797
798    SYMVAL_CONST_OBJECT_FORWARD:
799    SYMVAL_CONST_FIXNUM_FORWARD:
800    SYMVAL_CONST_BOOLEAN_FORWARD:
801       (declare with DEFVAR_CONST_LISP, DEFVAR_CONST_INT, or
802        DEFVAR_CONST_BOOL)
803       Similar to SYMVAL_OBJECT_FORWARD, SYMVAL_FIXNUM_FORWARD, or
804       SYMVAL_BOOLEAN_FORWARD, respectively, except that the value cannot
805       be changed.
806
807    SYMVAL_CONST_SPECIFIER_FORWARD:
808       (declare with DEFVAR_SPECIFIER)
809       Exactly like SYMVAL_CONST_OBJECT_FORWARD except that the error
810       message you get when attempting to set the value says to use
811       `set-specifier' instead.
812
813    SYMVAL_CURRENT_BUFFER_FORWARD:
814       (declare with DEFVAR_BUFFER_LOCAL)
815       This is used for built-in buffer-local variables -- i.e.
816       Lisp variables whose value is stored in the "struct buffer".
817       Variables of this sort always forward into C "Lisp_Object"
818       fields (although there's no reason in principle that other
819       types for ints and booleans couldn't be added).  Note that
820       some of these variables are automatically local in each
821       buffer, while some are only local when they become set
822       (similar to `make-variable-buffer-local').  In these latter
823       cases, of course, the default value shows through in all
824       buffers in which the variable doesn't have a local value.
825       This is implemented by making sure the "struct buffer" field
826       always contains the correct value (whether it's local or
827       a default) and maintaining a mask in the "struct buffer"
828       indicating which fields are local.  When `set-default' is
829       called on a variable that's not always local to all buffers,
830       it loops through each buffer and sets the corresponding
831       field in each buffer without a local value for the field,
832       according to the mask.
833
834       Calling `make-local-variable' on a variable of this sort
835       only has the effect of maybe changing the current buffer's mask.
836       Calling `make-variable-buffer-local' on a variable of this
837       sort has no effect at all.
838
839    SYMVAL_CONST_CURRENT_BUFFER_FORWARD:
840       (declare with DEFVAR_CONST_BUFFER_LOCAL)
841       Same as SYMVAL_CURRENT_BUFFER_FORWARD except that the
842       value cannot be set.
843
844    SYMVAL_DEFAULT_BUFFER_FORWARD:
845       (declare with DEFVAR_BUFFER_DEFAULTS)
846       This is used for the Lisp variables that contain the
847       default values of built-in buffer-local variables.  Setting
848       or referencing one of these variables forwards into a slot
849       in the special struct buffer Vbuffer_defaults.
850
851    SYMVAL_UNBOUND_MARKER:
852       This is used for only one object, Qunbound.
853
854    SYMVAL_SELECTED_CONSOLE_FORWARD:
855       (declare with DEFVAR_CONSOLE_LOCAL)
856       This is used for built-in console-local variables -- i.e.
857       Lisp variables whose value is stored in the "struct console".
858       These work just like built-in buffer-local variables.
859       However, calling `make-local-variable' or
860       `make-variable-buffer-local' on one of these variables
861       is currently disallowed because that would entail having
862       both console-local and buffer-local variables, which is
863       trickier to implement.
864
865    SYMVAL_CONST_SELECTED_CONSOLE_FORWARD:
866       (declare with DEFVAR_CONST_CONSOLE_LOCAL)
867       Same as SYMVAL_SELECTED_CONSOLE_FORWARD except that the
868       value cannot be set.
869
870    SYMVAL_DEFAULT_CONSOLE_FORWARD:
871       (declare with DEFVAR_CONSOLE_DEFAULTS)
872       This is used for the Lisp variables that contain the
873       default values of built-in console-local variables.  Setting
874       or referencing one of these variables forwards into a slot
875       in the special struct console Vconsole_defaults.
876
877
878    2. symbol-value-buffer-local
879
880    symbol-value-buffer-local is used for variables that have had
881    `make-local-variable' or `make-variable-buffer-local' applied
882    to them.  This object contains an alist mapping buffers to
883    values.  In addition, the object contains a "current value",
884    which is the value in some buffer.  Whenever you access the
885    variable with `symbol-value' or set it with `set' or `setq',
886    things are switched around so that the "current value"
887    refers to the current buffer, if it wasn't already.  This
888    way, repeated references to a variable in the same buffer
889    are almost as efficient as if the variable weren't buffer
890    local.  Note that the alist may not be up-to-date w.r.t.
891    the buffer whose value is current, as the "current value"
892    cache is normally only flushed into the alist when the
893    buffer it refers to changes.
894
895    Note also that it is possible for `make-local-variable'
896    or `make-variable-buffer-local' to be called on a variable
897    that forwards into a C variable (i.e. a variable whose
898    value cell is a symbol-value-forward).  In this case,
899    the value cell becomes a symbol-value-buffer-local (as
900    always), and the symbol-value-forward moves into
901    the "current value" cell in this object.  Also, in
902    this case the "current value" *always* refers to the
903    current buffer, so that the values of the C variable
904    always is the correct value for the current buffer.
905    set_buffer_internal() automatically updates the current-value
906    cells of all buffer-local variables that forward into C
907    variables. (There is a list of all buffer-local variables
908    that is maintained for this and other purposes.)
909
910    Note that only certain types of `symbol-value-forward' objects
911    can find their way into the "current value" cell of a
912    `symbol-value-buffer-local' object: SYMVAL_OBJECT_FORWARD,
913    SYMVAL_FIXNUM_FORWARD, SYMVAL_BOOLEAN_FORWARD, and
914    SYMVAL_UNBOUND_MARKER.  The SYMVAL_CONST_*_FORWARD cannot
915    be buffer-local because they are unsettable;
916    SYMVAL_DEFAULT_*_FORWARD cannot be buffer-local because that
917    makes no sense; making SYMVAL_CURRENT_BUFFER_FORWARD buffer-local
918    does not have much of an effect (it's already buffer-local); and
919    SYMVAL_SELECTED_CONSOLE_FORWARD cannot be buffer-local because
920    that's not currently implemented.
921
922
923    3. symbol-value-varalias
924
925    A symbol-value-varalias object is used for variables that
926    are aliases for other variables.  This object contains
927    the symbol that this variable is aliased to.
928    symbol-value-varalias objects cannot occur anywhere within
929    a symbol-value-buffer-local object, and most of the
930    low-level functions below do not accept them; you need
931    to call follow_varalias_pointers to get the actual
932    symbol to operate on.  */
933
934 static Lisp_Object
935 mark_symbol_value_buffer_local (Lisp_Object obj)
936 {
937   struct symbol_value_buffer_local *bfwd;
938
939 #ifdef ERROR_CHECK_TYPECHECK
940   assert (XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_BUFFER_LOCAL ||
941           XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_SOME_BUFFER_LOCAL);
942 #endif
943
944   bfwd = XSYMBOL_VALUE_BUFFER_LOCAL (obj);
945   mark_object (bfwd->default_value);
946   mark_object (bfwd->current_value);
947   mark_object (bfwd->current_buffer);
948   return bfwd->current_alist_element;
949 }
950
951 static Lisp_Object
952 mark_symbol_value_lisp_magic (Lisp_Object obj)
953 {
954   struct symbol_value_lisp_magic *bfwd;
955   int i;
956
957   assert (XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_LISP_MAGIC);
958
959   bfwd = XSYMBOL_VALUE_LISP_MAGIC (obj);
960   for (i = 0; i < MAGIC_HANDLER_MAX; i++)
961     {
962       mark_object (bfwd->handler[i]);
963       mark_object (bfwd->harg[i]);
964     }
965   return bfwd->shadowed;
966 }
967
968 static Lisp_Object
969 mark_symbol_value_varalias (Lisp_Object obj)
970 {
971   struct symbol_value_varalias *bfwd;
972
973   assert (XSYMBOL_VALUE_MAGIC_TYPE (obj) == SYMVAL_VARALIAS);
974
975   bfwd = XSYMBOL_VALUE_VARALIAS (obj);
976   mark_object (bfwd->shadowed);
977   return bfwd->aliasee;
978 }
979
980 /* Should never, ever be called. (except by an external debugger) */
981 void
982 print_symbol_value_magic (Lisp_Object obj,
983                           Lisp_Object printcharfun, int escapeflag)
984 {
985   char buf[200];
986   sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (%s type %d) 0x%lx>",
987            XRECORD_LHEADER_IMPLEMENTATION (obj)->name,
988            XSYMBOL_VALUE_MAGIC_TYPE (obj),
989            (long) XPNTR (obj));
990   write_c_string (buf, printcharfun);
991 }
992
993 static const struct lrecord_description symbol_value_forward_description[] = {
994   { XD_END }
995 };
996
997 static const struct lrecord_description symbol_value_buffer_local_description[] = {
998   { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, default_value) },
999   { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_value) },
1000   { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_buffer) },
1001   { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_alist_element) },
1002   { XD_END }
1003 };
1004
1005 static const struct lrecord_description symbol_value_lisp_magic_description[] = {
1006   { XD_LISP_OBJECT_ARRAY, offsetof (struct symbol_value_lisp_magic, handler), 2*MAGIC_HANDLER_MAX+1 },
1007   { XD_END }
1008 };
1009
1010 static const struct lrecord_description symbol_value_varalias_description[] = {
1011   { XD_LISP_OBJECT, offsetof (struct symbol_value_varalias, aliasee) },
1012   { XD_LISP_OBJECT, offsetof (struct symbol_value_varalias, shadowed) },
1013   { XD_END }
1014 };
1015
1016 DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-forward",
1017                                symbol_value_forward,
1018                                0,
1019                                print_symbol_value_magic, 0, 0, 0,
1020                                symbol_value_forward_description,
1021                                struct symbol_value_forward);
1022
1023 DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-buffer-local",
1024                                symbol_value_buffer_local,
1025                                mark_symbol_value_buffer_local,
1026                                print_symbol_value_magic, 0, 0, 0,
1027                                symbol_value_buffer_local_description,
1028                                struct symbol_value_buffer_local);
1029
1030 DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-lisp-magic",
1031                                symbol_value_lisp_magic,
1032                                mark_symbol_value_lisp_magic,
1033                                print_symbol_value_magic, 0, 0, 0,
1034                                symbol_value_lisp_magic_description,
1035                                struct symbol_value_lisp_magic);
1036
1037 DEFINE_LRECORD_IMPLEMENTATION ("symbol-value-varalias",
1038                                symbol_value_varalias,
1039                                mark_symbol_value_varalias,
1040                                print_symbol_value_magic, 0, 0, 0,
1041                                symbol_value_varalias_description,
1042                                struct symbol_value_varalias);
1043
1044 \f
1045 /* Getting and setting values of symbols */
1046
1047 /* Given the raw contents of a symbol value cell, return the Lisp value of
1048    the symbol.  However, VALCONTENTS cannot be a symbol-value-buffer-local,
1049    symbol-value-lisp-magic, or symbol-value-varalias.
1050
1051    BUFFER specifies a buffer, and is used for built-in buffer-local
1052    variables, which are of type SYMVAL_CURRENT_BUFFER_FORWARD.
1053    Note that such variables are never encapsulated in a
1054    symbol-value-buffer-local structure.
1055
1056    CONSOLE specifies a console, and is used for built-in console-local
1057    variables, which are of type SYMVAL_SELECTED_CONSOLE_FORWARD.
1058    Note that such variables are (currently) never encapsulated in a
1059    symbol-value-buffer-local structure.
1060  */
1061
1062 static Lisp_Object
1063 do_symval_forwarding (Lisp_Object valcontents, struct buffer *buffer,
1064                       struct console *console)
1065 {
1066   const struct symbol_value_forward *fwd;
1067
1068   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
1069     return valcontents;
1070
1071   fwd = XSYMBOL_VALUE_FORWARD (valcontents);
1072   switch (fwd->magic.type)
1073     {
1074     case SYMVAL_FIXNUM_FORWARD:
1075     case SYMVAL_CONST_FIXNUM_FORWARD:
1076       return make_int (*((int *)symbol_value_forward_forward (fwd)));
1077
1078     case SYMVAL_BOOLEAN_FORWARD:
1079     case SYMVAL_CONST_BOOLEAN_FORWARD:
1080       return *((int *)symbol_value_forward_forward (fwd)) ? Qt : Qnil;
1081
1082     case SYMVAL_OBJECT_FORWARD:
1083     case SYMVAL_CONST_OBJECT_FORWARD:
1084     case SYMVAL_CONST_SPECIFIER_FORWARD:
1085       return *((Lisp_Object *)symbol_value_forward_forward (fwd));
1086
1087     case SYMVAL_DEFAULT_BUFFER_FORWARD:
1088       return (*((Lisp_Object *)((char *) XBUFFER (Vbuffer_defaults)
1089                                 + ((char *)symbol_value_forward_forward (fwd)
1090                                    - (char *)&buffer_local_flags))));
1091
1092
1093     case SYMVAL_CURRENT_BUFFER_FORWARD:
1094     case SYMVAL_CONST_CURRENT_BUFFER_FORWARD:
1095       assert (buffer);
1096       return (*((Lisp_Object *)((char *)buffer
1097                                 + ((char *)symbol_value_forward_forward (fwd)
1098                                    - (char *)&buffer_local_flags))));
1099
1100     case SYMVAL_DEFAULT_CONSOLE_FORWARD:
1101       return (*((Lisp_Object *)((char *) XCONSOLE (Vconsole_defaults)
1102                                 + ((char *)symbol_value_forward_forward (fwd)
1103                                    - (char *)&console_local_flags))));
1104
1105     case SYMVAL_SELECTED_CONSOLE_FORWARD:
1106     case SYMVAL_CONST_SELECTED_CONSOLE_FORWARD:
1107       assert (console);
1108       return (*((Lisp_Object *)((char *)console
1109                                 + ((char *)symbol_value_forward_forward (fwd)
1110                                    - (char *)&console_local_flags))));
1111
1112     case SYMVAL_UNBOUND_MARKER:
1113       return valcontents;
1114
1115     default:
1116       abort ();
1117     }
1118   return Qnil;  /* suppress compiler warning */
1119 }
1120
1121 /* Set the value of default-buffer-local variable SYM to VALUE. */
1122
1123 static void
1124 set_default_buffer_slot_variable (Lisp_Object sym,
1125                                   Lisp_Object value)
1126 {
1127   /* Handle variables like case-fold-search that have special slots in
1128      the buffer. Make them work apparently like buffer_local variables.
1129      */
1130   /* At this point, the value cell may not contain a symbol-value-varalias
1131      or symbol-value-buffer-local, and if there's a handler, we should
1132      have already called it. */
1133   Lisp_Object valcontents = fetch_value_maybe_past_magic (sym, Qt);
1134   const struct symbol_value_forward *fwd
1135     = XSYMBOL_VALUE_FORWARD (valcontents);
1136   int offset = ((char *) symbol_value_forward_forward (fwd)
1137                 - (char *) &buffer_local_flags);
1138   int mask = XINT (*((Lisp_Object *) symbol_value_forward_forward (fwd)));
1139   int (*magicfun) (Lisp_Object simm, Lisp_Object *val, Lisp_Object in_object,
1140                    int flags) = symbol_value_forward_magicfun (fwd);
1141
1142   *((Lisp_Object *) (offset + (char *) XBUFFER (Vbuffer_defaults)))
1143     = value;
1144
1145   if (mask > 0)         /* Not always per-buffer */
1146     {
1147       /* Set value in each buffer which hasn't shadowed the default */
1148       LIST_LOOP_2 (elt, Vbuffer_alist)
1149         {
1150           struct buffer *b = XBUFFER (XCDR (elt));
1151           if (!(b->local_var_flags & mask))
1152             {
1153               if (magicfun)
1154                 magicfun (sym, &value, make_buffer (b), 0);
1155               *((Lisp_Object *) (offset + (char *) b)) = value;
1156             }
1157         }
1158     }
1159 }
1160
1161 /* Set the value of default-console-local variable SYM to VALUE. */
1162
1163 static void
1164 set_default_console_slot_variable (Lisp_Object sym,
1165                                    Lisp_Object value)
1166 {
1167   /* Handle variables like case-fold-search that have special slots in
1168      the console. Make them work apparently like console_local variables.
1169      */
1170   /* At this point, the value cell may not contain a symbol-value-varalias
1171      or symbol-value-buffer-local, and if there's a handler, we should
1172      have already called it. */
1173   Lisp_Object valcontents = fetch_value_maybe_past_magic (sym, Qt);
1174   const struct symbol_value_forward *fwd
1175     = XSYMBOL_VALUE_FORWARD (valcontents);
1176   int offset = ((char *) symbol_value_forward_forward (fwd)
1177                 - (char *) &console_local_flags);
1178   int mask = XINT (*((Lisp_Object *) symbol_value_forward_forward (fwd)));
1179   int (*magicfun) (Lisp_Object simm, Lisp_Object *val, Lisp_Object in_object,
1180                    int flags) = symbol_value_forward_magicfun (fwd);
1181
1182   *((Lisp_Object *) (offset + (char *) XCONSOLE (Vconsole_defaults)))
1183     = value;
1184
1185   if (mask > 0)         /* Not always per-console */
1186     {
1187       /* Set value in each console which hasn't shadowed the default */
1188       LIST_LOOP_2 (console, Vconsole_list)
1189         {
1190           struct console *d = XCONSOLE (console);
1191           if (!(d->local_var_flags & mask))
1192             {
1193               if (magicfun)
1194                 magicfun (sym, &value, console, 0);
1195               *((Lisp_Object *) (offset + (char *) d)) = value;
1196             }
1197         }
1198     }
1199 }
1200
1201 /* Store NEWVAL into SYM.
1202
1203    SYM's value slot may *not* be types (5) or (6) above,
1204    i.e. no symbol-value-varalias objects. (You should have
1205    forwarded past all of these.)
1206
1207    SYM should not be an unsettable symbol or a symbol with
1208    a magic `set-value' handler (unless you want to explicitly
1209    ignore this handler).
1210
1211    OVALUE is the current value of SYM, but forwarded past any
1212    symbol-value-buffer-local and symbol-value-lisp-magic objects.
1213    (i.e. if SYM is a symbol-value-buffer-local, OVALUE should be
1214    the contents of its current-value cell.) NEWVAL may only be
1215    a simple value or Qunbound.  If SYM is a symbol-value-buffer-local,
1216    this function will only modify its current-value cell, which should
1217    already be set up to point to the current buffer.
1218   */
1219
1220 static void
1221 store_symval_forwarding (Lisp_Object sym, Lisp_Object ovalue,
1222                          Lisp_Object newval)
1223 {
1224   if (!SYMBOL_VALUE_MAGIC_P (ovalue) || UNBOUNDP (ovalue))
1225     {
1226       Lisp_Object *store_pointer = value_slot_past_magic (sym);
1227
1228       if (SYMBOL_VALUE_BUFFER_LOCAL_P (*store_pointer))
1229         store_pointer =
1230           &XSYMBOL_VALUE_BUFFER_LOCAL (*store_pointer)->current_value;
1231
1232       assert (UNBOUNDP (*store_pointer)
1233               || !SYMBOL_VALUE_MAGIC_P (*store_pointer));
1234       *store_pointer = newval;
1235     }
1236   else
1237     {
1238       const struct symbol_value_forward *fwd = XSYMBOL_VALUE_FORWARD (ovalue);
1239       int (*magicfun) (Lisp_Object simm, Lisp_Object *val,
1240                        Lisp_Object in_object, int flags)
1241         = symbol_value_forward_magicfun (fwd);
1242
1243       switch (XSYMBOL_VALUE_MAGIC_TYPE (ovalue))
1244         {
1245         case SYMVAL_FIXNUM_FORWARD:
1246           CHECK_INT (newval);
1247           if (magicfun)
1248             magicfun (sym, &newval, Qnil, 0);
1249           *((int *) symbol_value_forward_forward (fwd)) = XINT (newval);
1250           return;
1251
1252         case SYMVAL_BOOLEAN_FORWARD:
1253           if (magicfun)
1254             magicfun (sym, &newval, Qnil, 0);
1255           *((int *) symbol_value_forward_forward (fwd))
1256             = !NILP (newval);
1257           return;
1258
1259         case SYMVAL_OBJECT_FORWARD:
1260           if (magicfun)
1261             magicfun (sym, &newval, Qnil, 0);
1262           *((Lisp_Object *) symbol_value_forward_forward (fwd)) = newval;
1263           return;
1264
1265         case SYMVAL_DEFAULT_BUFFER_FORWARD:
1266           set_default_buffer_slot_variable (sym, newval);
1267           return;
1268
1269         case SYMVAL_CURRENT_BUFFER_FORWARD:
1270           if (magicfun)
1271             magicfun (sym, &newval, make_buffer (current_buffer), 0);
1272           *((Lisp_Object *) ((char *) current_buffer
1273                              + ((char *) symbol_value_forward_forward (fwd)
1274                                 - (char *) &buffer_local_flags)))
1275             = newval;
1276           return;
1277
1278         case SYMVAL_DEFAULT_CONSOLE_FORWARD:
1279           set_default_console_slot_variable (sym, newval);
1280           return;
1281
1282         case SYMVAL_SELECTED_CONSOLE_FORWARD:
1283           if (magicfun)
1284             magicfun (sym, &newval, Vselected_console, 0);
1285           *((Lisp_Object *) ((char *) XCONSOLE (Vselected_console)
1286                              + ((char *) symbol_value_forward_forward (fwd)
1287                                 - (char *) &console_local_flags)))
1288             = newval;
1289           return;
1290
1291         default:
1292           abort ();
1293         }
1294     }
1295 }
1296
1297 /* Given a per-buffer variable SYMBOL and its raw value-cell contents
1298    BFWD, locate and return a pointer to the element in BUFFER's
1299    local_var_alist for SYMBOL.  The return value will be Qnil if
1300    BUFFER does not have its own value for SYMBOL (i.e. the default
1301    value is seen in that buffer).
1302    */
1303
1304 static Lisp_Object
1305 buffer_local_alist_element (struct buffer *buffer, Lisp_Object symbol,
1306                             struct symbol_value_buffer_local *bfwd)
1307 {
1308   if (!NILP (bfwd->current_buffer) &&
1309       XBUFFER (bfwd->current_buffer) == buffer)
1310     /* This is just an optimization of the below. */
1311     return bfwd->current_alist_element;
1312   else
1313     return assq_no_quit (symbol, buffer->local_var_alist);
1314 }
1315
1316 /* [Remember that the slot that mirrors CURRENT-VALUE in the
1317    symbol-value-buffer-local of a per-buffer variable -- i.e. the
1318    slot in CURRENT-BUFFER's local_var_alist, or the DEFAULT-VALUE
1319    slot -- may be out of date.]
1320
1321    Write out any cached value in buffer-local variable SYMBOL's
1322    buffer-local structure, which is passed in as BFWD.
1323 */
1324
1325 static void
1326 write_out_buffer_local_cache (Lisp_Object symbol,
1327                               struct symbol_value_buffer_local *bfwd)
1328 {
1329   if (!NILP (bfwd->current_buffer))
1330     {
1331       /* We pass 0 for BUFFER because only SYMVAL_CURRENT_BUFFER_FORWARD
1332          uses it, and that type cannot be inside a symbol-value-buffer-local */
1333       Lisp_Object cval = do_symval_forwarding (bfwd->current_value, 0, 0);
1334       if (NILP (bfwd->current_alist_element))
1335         /* current_value may be updated more recently than default_value */
1336         bfwd->default_value = cval;
1337       else
1338         Fsetcdr (bfwd->current_alist_element, cval);
1339     }
1340 }
1341
1342 /* SYM is a buffer-local variable, and BFWD is its buffer-local structure.
1343    Set up BFWD's cache for validity in buffer BUF.  This assumes that
1344    the cache is currently in a consistent state (this can include
1345    not having any value cached, if BFWD->CURRENT_BUFFER is nil).
1346
1347    If the cache is already set up for BUF, this function does nothing
1348    at all.
1349
1350    Otherwise, if SYM forwards out to a C variable, this also forwards
1351    SYM's value in BUF out to the variable.  Therefore, you generally
1352    only want to call this when BUF is, or is about to become, the
1353    current buffer.
1354
1355    (Otherwise, you can just retrieve the value without changing the
1356    cache, at the expense of slower retrieval.)
1357 */
1358
1359 static void
1360 set_up_buffer_local_cache (Lisp_Object sym,
1361                            struct symbol_value_buffer_local *bfwd,
1362                            struct buffer *buf,
1363                            Lisp_Object new_alist_el,
1364                            int set_it_p)
1365 {
1366   Lisp_Object new_val;
1367
1368   if (!NILP (bfwd->current_buffer)
1369       && buf == XBUFFER (bfwd->current_buffer))
1370     /* Cache is already set up. */
1371     return;
1372
1373   /* Flush out the old cache. */
1374   write_out_buffer_local_cache (sym, bfwd);
1375
1376   /* Retrieve the new alist element and new value. */
1377   if (NILP (new_alist_el)
1378       && set_it_p)
1379     new_alist_el = buffer_local_alist_element (buf, sym, bfwd);
1380
1381   if (NILP (new_alist_el))
1382     new_val = bfwd->default_value;
1383   else
1384     new_val = Fcdr (new_alist_el);
1385
1386   bfwd->current_alist_element = new_alist_el;
1387   XSETBUFFER (bfwd->current_buffer, buf);
1388
1389   /* Now store the value into the current-value slot.
1390      We don't simply write it there, because the current-value
1391      slot might be a forwarding pointer, in which case we need
1392      to instead write the value into the C variable.
1393
1394      We might also want to call a magic function.
1395
1396      So instead, we call this function. */
1397   store_symval_forwarding (sym, bfwd->current_value, new_val);
1398 }
1399
1400
1401 /* SYM is a buffer-local variable, and BFWD is its buffer-local structure.
1402    Flush the cache.  BFWD->CURRENT_BUFFER will be nil after this operation.
1403 */
1404
1405 static void
1406 flush_buffer_local_cache (Lisp_Object sym,
1407                           struct symbol_value_buffer_local *bfwd)
1408 {
1409   if (NILP (bfwd->current_buffer))
1410     /* Cache is already flushed. */
1411     return;
1412
1413   /* Flush out the old cache. */
1414   write_out_buffer_local_cache (sym, bfwd);
1415
1416   bfwd->current_alist_element = Qnil;
1417   bfwd->current_buffer = Qnil;
1418
1419   /* Now store default the value into the current-value slot.
1420      We don't simply write it there, because the current-value
1421      slot might be a forwarding pointer, in which case we need
1422      to instead write the value into the C variable.
1423
1424      We might also want to call a magic function.
1425
1426      So instead, we call this function. */
1427   store_symval_forwarding (sym, bfwd->current_value, bfwd->default_value);
1428 }
1429
1430 /* Flush all the buffer-local variable caches.  Whoever has a
1431    non-interned buffer-local variable will be spanked.  Whoever has a
1432    magic variable that interns or uninterns symbols... I don't even
1433    want to think about it.
1434 */
1435
1436 void
1437 flush_all_buffer_local_cache (void)
1438 {
1439   Lisp_Object *syms = XVECTOR_DATA (Vobarray);
1440   long count = XVECTOR_LENGTH (Vobarray);
1441   long i;
1442
1443   for (i=0; i<count; i++)
1444     {
1445       Lisp_Object sym = syms[i];
1446       Lisp_Object value;
1447
1448       if (!ZEROP (sym))
1449         for(;;)
1450           {
1451             Lisp_Symbol *next;
1452             assert (SYMBOLP (sym));
1453             value = fetch_value_maybe_past_magic (sym, Qt);
1454             if (SYMBOL_VALUE_BUFFER_LOCAL_P (value))
1455               flush_buffer_local_cache (sym, XSYMBOL_VALUE_BUFFER_LOCAL (value));
1456
1457             next = symbol_next (XSYMBOL (sym));
1458             if (!next)
1459               break;
1460             XSETSYMBOL (sym, next);
1461           }
1462     }
1463 }
1464
1465 \f
1466 void
1467 kill_buffer_local_variables (struct buffer *buf)
1468 {
1469   Lisp_Object prev = Qnil;
1470   Lisp_Object alist;
1471
1472   /* Any which are supposed to be permanent,
1473      make local again, with the same values they had.  */
1474
1475   for (alist = buf->local_var_alist; !NILP (alist); alist = XCDR (alist))
1476     {
1477       Lisp_Object sym = XCAR (XCAR (alist));
1478       struct symbol_value_buffer_local *bfwd;
1479       /* Variables with a symbol-value-varalias should not be here
1480          (we should have forwarded past them) and there must be a
1481          symbol-value-buffer-local.  If there's a symbol-value-lisp-magic,
1482          just forward past it; if the variable has a handler, it was
1483          already called. */
1484       Lisp_Object value = fetch_value_maybe_past_magic (sym, Qt);
1485
1486       assert (SYMBOL_VALUE_BUFFER_LOCAL_P (value));
1487       bfwd = XSYMBOL_VALUE_BUFFER_LOCAL (value);
1488
1489       if (!NILP (Fget (sym, Qpermanent_local, Qnil)))
1490         /* prev points to the last alist element that is still
1491            staying around, so *only* update it now.  This didn't
1492            used to be the case; this bug has been around since
1493            mly's rewrite two years ago! */
1494         prev = alist;
1495       else
1496         {
1497           /* Really truly kill it. */
1498           if (!NILP (prev))
1499             XCDR (prev) = XCDR (alist);
1500           else
1501             buf->local_var_alist = XCDR (alist);
1502
1503           /* We just effectively changed the value for this variable
1504              in BUF. So: */
1505
1506           /* (1) If the cache is caching BUF, invalidate the cache. */
1507           if (!NILP (bfwd->current_buffer) &&
1508               buf == XBUFFER (bfwd->current_buffer))
1509             bfwd->current_buffer = Qnil;
1510
1511           /* (2) If we changed the value in current_buffer and this
1512              variable forwards to a C variable, we need to change the
1513              value of the C variable.  set_up_buffer_local_cache()
1514              will do this.  It doesn't hurt to do it whenever
1515              BUF == current_buffer, so just go ahead and do that. */
1516           if (buf == current_buffer)
1517             set_up_buffer_local_cache (sym, bfwd, buf, Qnil, 0);
1518         }
1519     }
1520 }
1521 \f
1522 static Lisp_Object
1523 find_symbol_value_1 (Lisp_Object sym, struct buffer *buf,
1524                      struct console *con, int swap_it_in,
1525                      Lisp_Object symcons, int set_it_p)
1526 {
1527   Lisp_Object valcontents;
1528
1529  retry:
1530   valcontents = XSYMBOL (sym)->value;
1531
1532  retry_2:
1533   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
1534     return valcontents;
1535
1536   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
1537     {
1538     case SYMVAL_LISP_MAGIC:
1539       /* #### kludge */
1540       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
1541       /* semi-change-o */
1542       goto retry_2;
1543
1544     case SYMVAL_VARALIAS:
1545       sym = follow_varalias_pointers (sym, Qt /* #### kludge */);
1546       symcons = Qnil;
1547       /* presto change-o! */
1548       goto retry;
1549
1550     case SYMVAL_BUFFER_LOCAL:
1551     case SYMVAL_SOME_BUFFER_LOCAL:
1552       {
1553         struct symbol_value_buffer_local *bfwd
1554           = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
1555
1556         if (swap_it_in)
1557           {
1558             set_up_buffer_local_cache (sym, bfwd, buf, symcons, set_it_p);
1559             valcontents = bfwd->current_value;
1560           }
1561         else
1562           {
1563             if (!NILP (bfwd->current_buffer) &&
1564                 buf == XBUFFER (bfwd->current_buffer))
1565               valcontents = bfwd->current_value;
1566             else if (NILP (symcons))
1567               {
1568                 if (set_it_p)
1569                   valcontents = assq_no_quit (sym, buf->local_var_alist);
1570                 if (NILP (valcontents))
1571                   valcontents = bfwd->default_value;
1572                 else
1573                   valcontents = XCDR (valcontents);
1574               }
1575             else
1576               valcontents = XCDR (symcons);
1577           }
1578         break;
1579       }
1580
1581     default:
1582       break;
1583     }
1584   return do_symval_forwarding (valcontents, buf, con);
1585 }
1586
1587
1588 /* Find the value of a symbol in BUFFER, returning Qunbound if it's not
1589    bound.  Note that it must not be possible to QUIT within this
1590    function. */
1591
1592 Lisp_Object
1593 symbol_value_in_buffer (Lisp_Object sym, Lisp_Object buffer)
1594 {
1595   struct buffer *buf;
1596
1597   CHECK_SYMBOL (sym);
1598
1599   if (NILP (buffer))
1600     buf = current_buffer;
1601   else
1602     {
1603       CHECK_BUFFER (buffer);
1604       buf = XBUFFER (buffer);
1605     }
1606
1607   return find_symbol_value_1 (sym, buf,
1608                               /* If it bombs out at startup due to a
1609                                  Lisp error, this may be nil. */
1610                               CONSOLEP (Vselected_console)
1611                               ? XCONSOLE (Vselected_console) : 0, 0, Qnil, 1);
1612 }
1613
1614 static Lisp_Object
1615 symbol_value_in_console (Lisp_Object sym, Lisp_Object console)
1616 {
1617   CHECK_SYMBOL (sym);
1618
1619   if (NILP (console))
1620     console = Vselected_console;
1621   else
1622     CHECK_CONSOLE (console);
1623
1624   return find_symbol_value_1 (sym, current_buffer, XCONSOLE (console), 0,
1625                               Qnil, 1);
1626 }
1627
1628 /* Return the current value of SYM.  The difference between this function
1629    and calling symbol_value_in_buffer with a BUFFER of Qnil is that
1630    this updates the CURRENT_VALUE slot of buffer-local variables to
1631    point to the current buffer, while symbol_value_in_buffer doesn't. */
1632
1633 Lisp_Object
1634 find_symbol_value (Lisp_Object sym)
1635 {
1636   /* WARNING: This function can be called when current_buffer is 0
1637      and Vselected_console is Qnil, early in initialization. */
1638   struct console *con;
1639   Lisp_Object valcontents;
1640
1641   CHECK_SYMBOL (sym);
1642
1643   valcontents = XSYMBOL (sym)->value;
1644   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
1645     return valcontents;
1646
1647   if (CONSOLEP (Vselected_console))
1648     con = XCONSOLE (Vselected_console);
1649   else
1650     {
1651       /* This can also get called while we're preparing to shutdown.
1652          #### What should really happen in that case?  Should we
1653          actually fix things so we can't get here in that case? */
1654 #ifndef PDUMP
1655       assert (!initialized || preparing_for_armageddon);
1656 #endif
1657       con = 0;
1658     }
1659
1660   return find_symbol_value_1 (sym, current_buffer, con, 1, Qnil, 1);
1661 }
1662
1663 /* This is an optimized function for quick lookup of buffer local symbols
1664    by avoiding O(n) search.  This will work when either:
1665      a) We have already found the symbol e.g. by traversing local_var_alist.
1666    or
1667      b) We know that the symbol will not be found in the current buffer's
1668         list of local variables.
1669    In the former case, find_it_p is 1 and symbol_cons is the element from
1670    local_var_alist.  In the latter case, find_it_p is 0 and symbol_cons
1671    is the symbol.
1672
1673    This function is called from set_buffer_internal which does both of these
1674    things. */
1675
1676 Lisp_Object
1677 find_symbol_value_quickly (Lisp_Object symbol_cons, int find_it_p)
1678 {
1679   /* WARNING: This function can be called when current_buffer is 0
1680      and Vselected_console is Qnil, early in initialization. */
1681   struct console *con;
1682   Lisp_Object sym = find_it_p ? XCAR (symbol_cons) : symbol_cons;
1683
1684   CHECK_SYMBOL (sym);
1685   if (CONSOLEP (Vselected_console))
1686     con = XCONSOLE (Vselected_console);
1687   else
1688     {
1689       /* This can also get called while we're preparing to shutdown.
1690          #### What should really happen in that case?  Should we
1691          actually fix things so we can't get here in that case? */
1692 #ifndef PDUMP
1693       assert (!initialized || preparing_for_armageddon);
1694 #endif
1695       con = 0;
1696     }
1697
1698   return find_symbol_value_1 (sym, current_buffer, con, 1,
1699                               find_it_p ? symbol_cons : Qnil,
1700                               find_it_p);
1701 }
1702
1703 DEFUN ("symbol-value", Fsymbol_value, 1, 1, 0, /*
1704 Return SYMBOL's value.  Error if that is void.
1705 */
1706        (symbol))
1707 {
1708   Lisp_Object val = find_symbol_value (symbol);
1709
1710   if (UNBOUNDP (val))
1711     return Fsignal (Qvoid_variable, list1 (symbol));
1712   else
1713     return val;
1714 }
1715
1716 DEFUN ("set", Fset, 2, 2, 0, /*
1717 Set SYMBOL's value to NEWVAL, and return NEWVAL.
1718 */
1719        (symbol, newval))
1720 {
1721   REGISTER Lisp_Object valcontents;
1722   Lisp_Symbol *sym;
1723   /* remember, we're called by Fmakunbound() as well */
1724
1725   CHECK_SYMBOL (symbol);
1726
1727  retry:
1728   sym = XSYMBOL (symbol);
1729   valcontents = sym->value;
1730
1731   if (EQ (symbol, Qnil) ||
1732       EQ (symbol, Qt)   ||
1733       SYMBOL_IS_KEYWORD (symbol))
1734     reject_constant_symbols (symbol, newval, 0,
1735                              UNBOUNDP (newval) ? Qmakunbound : Qset);
1736
1737   if (!SYMBOL_VALUE_MAGIC_P (valcontents) || UNBOUNDP (valcontents))
1738     {
1739       sym->value = newval;
1740       return newval;
1741     }
1742
1743   reject_constant_symbols (symbol, newval, 0,
1744                            UNBOUNDP (newval) ? Qmakunbound : Qset);
1745
1746   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
1747     {
1748     case SYMVAL_LISP_MAGIC:
1749       {
1750         if (UNBOUNDP (newval))
1751           {
1752             maybe_call_magic_handler (symbol, Qmakunbound, 0);
1753             return XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed = Qunbound;
1754           }
1755         else
1756           {
1757             maybe_call_magic_handler (symbol, Qset, 1, newval);
1758             return XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed = newval;
1759           }
1760       }
1761
1762     case SYMVAL_VARALIAS:
1763       symbol = follow_varalias_pointers (symbol,
1764                                          UNBOUNDP (newval)
1765                                          ? Qmakunbound : Qset);
1766       /* presto change-o! */
1767       goto retry;
1768
1769     case SYMVAL_FIXNUM_FORWARD:
1770     case SYMVAL_BOOLEAN_FORWARD:
1771     case SYMVAL_OBJECT_FORWARD:
1772     case SYMVAL_DEFAULT_BUFFER_FORWARD:
1773     case SYMVAL_DEFAULT_CONSOLE_FORWARD:
1774       if (UNBOUNDP (newval))
1775         signal_error (Qerror,
1776                       list2 (build_string ("Cannot makunbound"), symbol));
1777       break;
1778
1779       /* case SYMVAL_UNBOUND_MARKER: break; */
1780
1781     case SYMVAL_CURRENT_BUFFER_FORWARD:
1782       {
1783         const struct symbol_value_forward *fwd
1784           = XSYMBOL_VALUE_FORWARD (valcontents);
1785         int mask = XINT (*((Lisp_Object *)
1786                            symbol_value_forward_forward (fwd)));
1787         if (mask > 0)
1788           /* Setting this variable makes it buffer-local */
1789           current_buffer->local_var_flags |= mask;
1790         break;
1791       }
1792
1793     case SYMVAL_SELECTED_CONSOLE_FORWARD:
1794       {
1795         const struct symbol_value_forward *fwd
1796           = XSYMBOL_VALUE_FORWARD (valcontents);
1797         int mask = XINT (*((Lisp_Object *)
1798                            symbol_value_forward_forward (fwd)));
1799         if (mask > 0)
1800           /* Setting this variable makes it console-local */
1801           XCONSOLE (Vselected_console)->local_var_flags |= mask;
1802         break;
1803       }
1804
1805     case SYMVAL_BUFFER_LOCAL:
1806     case SYMVAL_SOME_BUFFER_LOCAL:
1807       {
1808         /* If we want to examine or set the value and
1809            CURRENT-BUFFER is current, we just examine or set
1810            CURRENT-VALUE. If CURRENT-BUFFER is not current, we
1811            store the current CURRENT-VALUE value into
1812            CURRENT-ALIST- ELEMENT, then find the appropriate alist
1813            element for the buffer now current and set up
1814            CURRENT-ALIST-ELEMENT.  Then we set CURRENT-VALUE out
1815            of that element, and store into CURRENT-BUFFER.
1816
1817            If we are setting the variable and the current buffer does
1818            not have an alist entry for this variable, an alist entry is
1819            created.
1820
1821            Note that CURRENT-VALUE can be a forwarding pointer.
1822            Each time it is examined or set, forwarding must be
1823            done. */
1824         struct symbol_value_buffer_local *bfwd
1825           = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
1826         int some_buffer_local_p =
1827           (bfwd->magic.type == SYMVAL_SOME_BUFFER_LOCAL);
1828         /* What value are we caching right now?  */
1829         Lisp_Object aelt = bfwd->current_alist_element;
1830
1831         if (!NILP (bfwd->current_buffer) &&
1832             current_buffer == XBUFFER (bfwd->current_buffer)
1833             && ((some_buffer_local_p)
1834                 ? 1                /* doesn't automatically become local */
1835                 : !NILP (aelt) /* already local */
1836                 ))
1837           {
1838             /* Cache is valid */
1839             valcontents = bfwd->current_value;
1840           }
1841         else
1842           {
1843             /* If the current buffer is not the buffer whose binding is
1844                currently cached, or if it's a SYMVAL_BUFFER_LOCAL and
1845                we're looking at the default value, the cache is invalid; we
1846                need to write it out, and find the new CURRENT-ALIST-ELEMENT
1847             */
1848
1849             /* Write out the cached value for the old buffer; copy it
1850                back to its alist element.  This works if the current
1851                buffer only sees the default value, too.  */
1852             write_out_buffer_local_cache (symbol, bfwd);
1853
1854             /* Find the new value for CURRENT-ALIST-ELEMENT.  */
1855             aelt = buffer_local_alist_element (current_buffer, symbol, bfwd);
1856             if (NILP (aelt))
1857               {
1858                 /* This buffer is still seeing the default value.  */
1859                 if (!some_buffer_local_p)
1860                   {
1861                     /* If it's a SYMVAL_BUFFER_LOCAL, give this buffer a
1862                        new assoc for a local value and set
1863                        CURRENT-ALIST-ELEMENT to point to that.  */
1864                     aelt =
1865                       do_symval_forwarding (bfwd->current_value,
1866                                             current_buffer,
1867                                             XCONSOLE (Vselected_console));
1868                     aelt = Fcons (symbol, aelt);
1869                     current_buffer->local_var_alist
1870                       = Fcons (aelt, current_buffer->local_var_alist);
1871                   }
1872                 else
1873                   {
1874                     /* If the variable is a SYMVAL_SOME_BUFFER_LOCAL,
1875                        we're currently seeing the default value. */
1876                     ;
1877                   }
1878               }
1879             /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT.  */
1880             bfwd->current_alist_element = aelt;
1881             /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate.  */
1882             XSETBUFFER (bfwd->current_buffer, current_buffer);
1883             valcontents = bfwd->current_value;
1884           }
1885         break;
1886       }
1887     default:
1888       abort ();
1889     }
1890   store_symval_forwarding (symbol, valcontents, newval);
1891
1892   return newval;
1893 }
1894
1895 \f
1896 /* Access or set a buffer-local symbol's default value.  */
1897
1898 /* Return the default value of SYM, but don't check for voidness.
1899    Return Qunbound if it is void.  */
1900
1901 static Lisp_Object
1902 default_value (Lisp_Object sym)
1903 {
1904   Lisp_Object valcontents;
1905
1906   CHECK_SYMBOL (sym);
1907
1908  retry:
1909   valcontents = XSYMBOL (sym)->value;
1910
1911  retry_2:
1912   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
1913     return valcontents;
1914
1915   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
1916     {
1917     case SYMVAL_LISP_MAGIC:
1918       /* #### kludge */
1919       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
1920       /* semi-change-o */
1921       goto retry_2;
1922
1923     case SYMVAL_VARALIAS:
1924       sym = follow_varalias_pointers (sym, Qt /* #### kludge */);
1925       /* presto change-o! */
1926       goto retry;
1927
1928     case SYMVAL_UNBOUND_MARKER:
1929       return valcontents;
1930
1931     case SYMVAL_CURRENT_BUFFER_FORWARD:
1932       {
1933         const struct symbol_value_forward *fwd
1934           = XSYMBOL_VALUE_FORWARD (valcontents);
1935         return (*((Lisp_Object *)((char *) XBUFFER (Vbuffer_defaults)
1936                                   + ((char *)symbol_value_forward_forward (fwd)
1937                                      - (char *)&buffer_local_flags))));
1938       }
1939
1940     case SYMVAL_SELECTED_CONSOLE_FORWARD:
1941       {
1942         const struct symbol_value_forward *fwd
1943           = XSYMBOL_VALUE_FORWARD (valcontents);
1944         return (*((Lisp_Object *)((char *) XCONSOLE (Vconsole_defaults)
1945                                   + ((char *)symbol_value_forward_forward (fwd)
1946                                      - (char *)&console_local_flags))));
1947       }
1948
1949     case SYMVAL_BUFFER_LOCAL:
1950     case SYMVAL_SOME_BUFFER_LOCAL:
1951       {
1952         struct symbol_value_buffer_local *bfwd =
1953           XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
1954
1955         /* Handle user-created local variables.  */
1956         /* If var is set up for a buffer that lacks a local value for it,
1957            the current value is nominally the default value.
1958            But the current value slot may be more up to date, since
1959            ordinary setq stores just that slot.  So use that.  */
1960         if (NILP (bfwd->current_alist_element))
1961           return do_symval_forwarding (bfwd->current_value, current_buffer,
1962                                        XCONSOLE (Vselected_console));
1963         else
1964           return bfwd->default_value;
1965       }
1966     default:
1967       /* For other variables, get the current value.    */
1968       return do_symval_forwarding (valcontents, current_buffer,
1969                                    XCONSOLE (Vselected_console));
1970     }
1971
1972   RETURN_NOT_REACHED (Qnil)     /* suppress compiler warning */
1973 }
1974
1975 DEFUN ("default-boundp", Fdefault_boundp, 1, 1, 0, /*
1976 Return t if SYMBOL has a non-void default value.
1977 This is the value that is seen in buffers that do not have their own values
1978 for this variable.
1979 */
1980        (symbol))
1981 {
1982   return UNBOUNDP (default_value (symbol)) ? Qnil : Qt;
1983 }
1984
1985 DEFUN ("default-value", Fdefault_value, 1, 1, 0, /*
1986 Return SYMBOL's default value.
1987 This is the value that is seen in buffers that do not have their own values
1988 for this variable.  The default value is meaningful for variables with
1989 local bindings in certain buffers.
1990 */
1991        (symbol))
1992 {
1993   Lisp_Object value = default_value (symbol);
1994
1995   return UNBOUNDP (value) ? Fsignal (Qvoid_variable, list1 (symbol)) : value;
1996 }
1997
1998 DEFUN ("set-default", Fset_default, 2, 2, 0, /*
1999 Set SYMBOL's default value to VALUE.  SYMBOL and VALUE are evaluated.
2000 The default value is seen in buffers that do not have their own values
2001 for this variable.
2002 */
2003        (symbol, value))
2004 {
2005   Lisp_Object valcontents;
2006
2007   CHECK_SYMBOL (symbol);
2008
2009  retry:
2010   valcontents = XSYMBOL (symbol)->value;
2011
2012  retry_2:
2013   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
2014     return Fset (symbol, value);
2015
2016   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2017     {
2018     case SYMVAL_LISP_MAGIC:
2019       RETURN_IF_NOT_UNBOUND (maybe_call_magic_handler (symbol, Qset_default, 1,
2020                                                        value));
2021       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2022       /* semi-change-o */
2023       goto retry_2;
2024
2025     case SYMVAL_VARALIAS:
2026       symbol = follow_varalias_pointers (symbol, Qset_default);
2027       /* presto change-o! */
2028       goto retry;
2029
2030     case SYMVAL_CURRENT_BUFFER_FORWARD:
2031       set_default_buffer_slot_variable (symbol, value);
2032       return value;
2033
2034     case SYMVAL_SELECTED_CONSOLE_FORWARD:
2035       set_default_console_slot_variable (symbol, value);
2036       return value;
2037
2038     case SYMVAL_BUFFER_LOCAL:
2039     case SYMVAL_SOME_BUFFER_LOCAL:
2040       {
2041         /* Store new value into the DEFAULT-VALUE slot */
2042         struct symbol_value_buffer_local *bfwd
2043           = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
2044
2045         bfwd->default_value = value;
2046         /* If current-buffer doesn't shadow default_value,
2047          *  we must set the CURRENT-VALUE slot too */
2048         if (NILP (bfwd->current_alist_element))
2049           store_symval_forwarding (symbol, bfwd->current_value, value);
2050         return value;
2051       }
2052
2053     default:
2054       return Fset (symbol, value);
2055     }
2056 }
2057
2058 DEFUN ("setq-default", Fsetq_default, 0, UNEVALLED, 0, /*
2059 Set the default value of variable SYMBOL to VALUE.
2060 SYMBOL, the variable name, is literal (not evaluated);
2061 VALUE is an expression and it is evaluated.
2062 The default value of a variable is seen in buffers
2063 that do not have their own values for the variable.
2064
2065 More generally, you can use multiple variables and values, as in
2066   (setq-default SYMBOL VALUE SYMBOL VALUE...)
2067 This sets each SYMBOL's default value to the corresponding VALUE.
2068 The VALUE for the Nth SYMBOL can refer to the new default values
2069 of previous SYMBOLs.
2070 */
2071        (args))
2072 {
2073   /* This function can GC */
2074   Lisp_Object symbol, tail, val = Qnil;
2075   int nargs;
2076   struct gcpro gcpro1;
2077
2078   GET_LIST_LENGTH (args, nargs);
2079
2080   if (nargs & 1)                /* Odd number of arguments? */
2081     Fsignal (Qwrong_number_of_arguments,
2082              list2 (Qsetq_default, make_int (nargs)));
2083
2084   GCPRO1 (val);
2085
2086   PROPERTY_LIST_LOOP (tail, symbol, val, args)
2087     {
2088       val = Feval (val);
2089       Fset_default (symbol, val);
2090     }
2091
2092   UNGCPRO;
2093   return val;
2094 }
2095 \f
2096 /* Lisp functions for creating and removing buffer-local variables.  */
2097
2098 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, 1, 1,
2099        "vMake Variable Buffer Local: ", /*
2100 Make VARIABLE have a separate value for each buffer.
2101 At any time, the value for the current buffer is in effect.
2102 There is also a default value which is seen in any buffer which has not yet
2103 set its own value.
2104 Using `set' or `setq' to set the variable causes it to have a separate value
2105 for the current buffer if it was previously using the default value.
2106 The function `default-value' gets the default value and `set-default'
2107 sets it.
2108 */
2109        (variable))
2110 {
2111   Lisp_Object valcontents;
2112
2113   CHECK_SYMBOL (variable);
2114
2115  retry:
2116   verify_ok_for_buffer_local (variable, Qmake_variable_buffer_local);
2117
2118   valcontents = XSYMBOL (variable)->value;
2119
2120  retry_2:
2121   if (SYMBOL_VALUE_MAGIC_P (valcontents))
2122     {
2123       switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2124         {
2125         case SYMVAL_LISP_MAGIC:
2126           if (!UNBOUNDP (maybe_call_magic_handler
2127                          (variable, Qmake_variable_buffer_local, 0)))
2128             return variable;
2129           valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2130           /* semi-change-o */
2131           goto retry_2;
2132
2133         case SYMVAL_VARALIAS:
2134           variable = follow_varalias_pointers (variable,
2135                                                Qmake_variable_buffer_local);
2136           /* presto change-o! */
2137           goto retry;
2138
2139         case SYMVAL_FIXNUM_FORWARD:
2140         case SYMVAL_BOOLEAN_FORWARD:
2141         case SYMVAL_OBJECT_FORWARD:
2142         case SYMVAL_UNBOUND_MARKER:
2143           break;
2144
2145         case SYMVAL_CURRENT_BUFFER_FORWARD:
2146         case SYMVAL_BUFFER_LOCAL:
2147           /* Already per-each-buffer */
2148           return variable;
2149
2150         case SYMVAL_SOME_BUFFER_LOCAL:
2151           /* Transmogrify */
2152           XSYMBOL_VALUE_BUFFER_LOCAL (valcontents)->magic.type =
2153             SYMVAL_BUFFER_LOCAL;
2154           return variable;
2155
2156         default:
2157           abort ();
2158         }
2159     }
2160
2161   {
2162     struct symbol_value_buffer_local *bfwd
2163       = alloc_lcrecord_type (struct symbol_value_buffer_local,
2164                              &lrecord_symbol_value_buffer_local);
2165     Lisp_Object foo;
2166     zero_lcrecord (&bfwd->magic);
2167     bfwd->magic.type = SYMVAL_BUFFER_LOCAL;
2168
2169     bfwd->default_value = find_symbol_value (variable);
2170     bfwd->current_value = valcontents;
2171     bfwd->current_alist_element = Qnil;
2172     bfwd->current_buffer = Fcurrent_buffer ();
2173     XSETSYMBOL_VALUE_MAGIC (foo, bfwd);
2174     *value_slot_past_magic (variable) = foo;
2175 #if 1                           /* #### Yuck!   FSFmacs bug-compatibility*/
2176     /* This sets the default-value of any make-variable-buffer-local to nil.
2177        That just sucks.  User can just use setq-default to effect that,
2178        but there's no way to do makunbound-default to undo this lossage. */
2179     if (UNBOUNDP (valcontents))
2180       bfwd->default_value = Qnil;
2181 #endif
2182 #if 0                           /* #### Yuck! */
2183     /* This sets the value to nil in this buffer.
2184        User could use (setq variable nil) to do this.
2185        It isn't as egregious to do this automatically
2186        as it is to do so to the default-value, but it's
2187        still really dubious. */
2188     if (UNBOUNDP (valcontents))
2189       Fset (variable, Qnil);
2190 #endif
2191     return variable;
2192   }
2193 }
2194
2195 DEFUN ("make-local-variable", Fmake_local_variable, 1, 1,
2196        "vMake Local Variable: ", /*
2197 Make VARIABLE have a separate value in the current buffer.
2198 Other buffers will continue to share a common default value.
2199 \(The buffer-local value of VARIABLE starts out as the same value
2200 VARIABLE previously had.  If VARIABLE was void, it remains void.)
2201 See also `make-variable-buffer-local'.
2202
2203 If the variable is already arranged to become local when set,
2204 this function causes a local value to exist for this buffer,
2205 just as setting the variable would do.
2206
2207 Do not use `make-local-variable' to make a hook variable buffer-local.
2208 Use `make-local-hook' instead.
2209 */
2210        (variable))
2211 {
2212   Lisp_Object valcontents;
2213   struct symbol_value_buffer_local *bfwd;
2214
2215   CHECK_SYMBOL (variable);
2216
2217  retry:
2218   verify_ok_for_buffer_local (variable, Qmake_local_variable);
2219
2220   valcontents = XSYMBOL (variable)->value;
2221
2222  retry_2:
2223   if (SYMBOL_VALUE_MAGIC_P (valcontents))
2224     {
2225       switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2226         {
2227         case SYMVAL_LISP_MAGIC:
2228           if (!UNBOUNDP (maybe_call_magic_handler
2229                          (variable, Qmake_local_variable, 0)))
2230             return variable;
2231           valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2232           /* semi-change-o */
2233           goto retry_2;
2234
2235         case SYMVAL_VARALIAS:
2236           variable = follow_varalias_pointers (variable, Qmake_local_variable);
2237           /* presto change-o! */
2238           goto retry;
2239
2240         case SYMVAL_FIXNUM_FORWARD:
2241         case SYMVAL_BOOLEAN_FORWARD:
2242         case SYMVAL_OBJECT_FORWARD:
2243         case SYMVAL_UNBOUND_MARKER:
2244           break;
2245
2246         case SYMVAL_BUFFER_LOCAL:
2247         case SYMVAL_CURRENT_BUFFER_FORWARD:
2248           {
2249             /* Make sure the symbol has a local value in this particular
2250                buffer, by setting it to the same value it already has.  */
2251             Fset (variable, find_symbol_value (variable));
2252             return variable;
2253           }
2254
2255         case SYMVAL_SOME_BUFFER_LOCAL:
2256           {
2257             if (!NILP (buffer_local_alist_element (current_buffer,
2258                                                    variable,
2259                                                    (XSYMBOL_VALUE_BUFFER_LOCAL
2260                                                     (valcontents)))))
2261               goto already_local_to_current_buffer;
2262             else
2263               goto already_local_to_some_other_buffer;
2264           }
2265
2266         default:
2267           abort ();
2268         }
2269     }
2270
2271   /* Make sure variable is set up to hold per-buffer values */
2272   bfwd = alloc_lcrecord_type (struct symbol_value_buffer_local,
2273                               &lrecord_symbol_value_buffer_local);
2274   zero_lcrecord (&bfwd->magic);
2275   bfwd->magic.type = SYMVAL_SOME_BUFFER_LOCAL;
2276
2277   bfwd->current_buffer = Qnil;
2278   bfwd->current_alist_element = Qnil;
2279   bfwd->current_value = valcontents;
2280   /* passing 0 is OK because this should never be a
2281      SYMVAL_CURRENT_BUFFER_FORWARD or SYMVAL_SELECTED_CONSOLE_FORWARD
2282      variable. */
2283   bfwd->default_value = do_symval_forwarding (valcontents, 0, 0);
2284
2285 #if 0
2286   if (UNBOUNDP (bfwd->default_value))
2287     bfwd->default_value = Qnil; /* Yuck! */
2288 #endif
2289
2290   XSETSYMBOL_VALUE_MAGIC (valcontents, bfwd);
2291   *value_slot_past_magic (variable) = valcontents;
2292
2293  already_local_to_some_other_buffer:
2294
2295   /* Make sure this buffer has its own value of variable */
2296   bfwd = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
2297
2298   if (UNBOUNDP (bfwd->default_value))
2299     {
2300       /* If default value is unbound, set local value to nil. */
2301       XSETBUFFER (bfwd->current_buffer, current_buffer);
2302       bfwd->current_alist_element = Fcons (variable, Qnil);
2303       current_buffer->local_var_alist =
2304         Fcons (bfwd->current_alist_element, current_buffer->local_var_alist);
2305       store_symval_forwarding (variable, bfwd->current_value, Qnil);
2306       return variable;
2307     }
2308
2309   current_buffer->local_var_alist
2310     = Fcons (Fcons (variable, bfwd->default_value),
2311              current_buffer->local_var_alist);
2312
2313   /* Make sure symbol does not think it is set up for this buffer;
2314      force it to look once again for this buffer's value */
2315   if (!NILP (bfwd->current_buffer) &&
2316       current_buffer == XBUFFER (bfwd->current_buffer))
2317     bfwd->current_buffer = Qnil;
2318
2319  already_local_to_current_buffer:
2320
2321   /* If the symbol forwards into a C variable, then swap in the
2322      variable for this buffer immediately.  If C code modifies the
2323      variable before we swap in, then that new value will clobber the
2324      default value the next time we swap.  */
2325   bfwd = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
2326   if (SYMBOL_VALUE_MAGIC_P (bfwd->current_value))
2327     {
2328       switch (XSYMBOL_VALUE_MAGIC_TYPE (bfwd->current_value))
2329         {
2330         case SYMVAL_FIXNUM_FORWARD:
2331         case SYMVAL_BOOLEAN_FORWARD:
2332         case SYMVAL_OBJECT_FORWARD:
2333         case SYMVAL_DEFAULT_BUFFER_FORWARD:
2334           set_up_buffer_local_cache (variable, bfwd, current_buffer, Qnil, 1);
2335           break;
2336
2337         case SYMVAL_UNBOUND_MARKER:
2338         case SYMVAL_CURRENT_BUFFER_FORWARD:
2339           break;
2340
2341         default:
2342           abort ();
2343         }
2344     }
2345
2346   return variable;
2347 }
2348
2349 DEFUN ("kill-local-variable", Fkill_local_variable, 1, 1,
2350        "vKill Local Variable: ", /*
2351 Make VARIABLE no longer have a separate value in the current buffer.
2352 From now on the default value will apply in this buffer.
2353 */
2354        (variable))
2355 {
2356   Lisp_Object valcontents;
2357
2358   CHECK_SYMBOL (variable);
2359
2360  retry:
2361   valcontents = XSYMBOL (variable)->value;
2362
2363  retry_2:
2364   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
2365     return variable;
2366
2367   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2368     {
2369     case SYMVAL_LISP_MAGIC:
2370       if (!UNBOUNDP (maybe_call_magic_handler
2371                      (variable, Qkill_local_variable, 0)))
2372         return variable;
2373       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2374       /* semi-change-o */
2375       goto retry_2;
2376
2377     case SYMVAL_VARALIAS:
2378       variable = follow_varalias_pointers (variable, Qkill_local_variable);
2379       /* presto change-o! */
2380       goto retry;
2381
2382     case SYMVAL_CURRENT_BUFFER_FORWARD:
2383       {
2384         const struct symbol_value_forward *fwd
2385           = XSYMBOL_VALUE_FORWARD (valcontents);
2386         int offset = ((char *) symbol_value_forward_forward (fwd)
2387                                - (char *) &buffer_local_flags);
2388         int mask =
2389           XINT (*((Lisp_Object *) symbol_value_forward_forward (fwd)));
2390
2391         if (mask > 0)
2392           {
2393             int (*magicfun) (Lisp_Object sym, Lisp_Object *val,
2394                              Lisp_Object in_object, int flags) =
2395                                symbol_value_forward_magicfun (fwd);
2396             Lisp_Object oldval = * (Lisp_Object *)
2397               (offset + (char *) XBUFFER (Vbuffer_defaults));
2398             if (magicfun)
2399               (magicfun) (variable, &oldval, make_buffer (current_buffer), 0);
2400             *(Lisp_Object *) (offset + (char *) current_buffer)
2401               = oldval;
2402             current_buffer->local_var_flags &= ~mask;
2403           }
2404         return variable;
2405       }
2406
2407     case SYMVAL_BUFFER_LOCAL:
2408     case SYMVAL_SOME_BUFFER_LOCAL:
2409       {
2410         /* Get rid of this buffer's alist element, if any */
2411         struct symbol_value_buffer_local *bfwd
2412           = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
2413         Lisp_Object alist = current_buffer->local_var_alist;
2414         Lisp_Object alist_element
2415           = buffer_local_alist_element (current_buffer, variable, bfwd);
2416
2417         if (!NILP (alist_element))
2418           current_buffer->local_var_alist = Fdelq (alist_element, alist);
2419
2420         /* Make sure symbol does not think it is set up for this buffer;
2421            force it to look once again for this buffer's value */
2422         if (!NILP (bfwd->current_buffer) &&
2423             current_buffer == XBUFFER (bfwd->current_buffer))
2424           bfwd->current_buffer = Qnil;
2425
2426         /* We just changed the value in the current_buffer.  If this
2427            variable forwards to a C variable, we need to change the
2428            value of the C variable.  set_up_buffer_local_cache()
2429            will do this.  It doesn't hurt to do it always,
2430            so just go ahead and do that. */
2431         set_up_buffer_local_cache (variable, bfwd, current_buffer, Qnil, 1);
2432       }
2433       return variable;
2434
2435     default:
2436       return variable;
2437     }
2438   RETURN_NOT_REACHED(Qnil)      /* suppress compiler warning */
2439 }
2440
2441
2442 DEFUN ("kill-console-local-variable", Fkill_console_local_variable, 1, 1,
2443        "vKill Console Local Variable: ", /*
2444 Make VARIABLE no longer have a separate value in the selected console.
2445 From now on the default value will apply in this console.
2446 */
2447        (variable))
2448 {
2449   Lisp_Object valcontents;
2450
2451   CHECK_SYMBOL (variable);
2452
2453  retry:
2454   valcontents = XSYMBOL (variable)->value;
2455
2456  retry_2:
2457   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
2458     return variable;
2459
2460   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2461     {
2462     case SYMVAL_LISP_MAGIC:
2463       if (!UNBOUNDP (maybe_call_magic_handler
2464                      (variable, Qkill_console_local_variable, 0)))
2465         return variable;
2466       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2467       /* semi-change-o */
2468       goto retry_2;
2469
2470     case SYMVAL_VARALIAS:
2471       variable = follow_varalias_pointers (variable,
2472                                            Qkill_console_local_variable);
2473       /* presto change-o! */
2474       goto retry;
2475
2476     case SYMVAL_SELECTED_CONSOLE_FORWARD:
2477       {
2478         const struct symbol_value_forward *fwd
2479           = XSYMBOL_VALUE_FORWARD (valcontents);
2480         int offset = ((char *) symbol_value_forward_forward (fwd)
2481                                - (char *) &console_local_flags);
2482         int mask =
2483           XINT (*((Lisp_Object *) symbol_value_forward_forward (fwd)));
2484
2485         if (mask > 0)
2486           {
2487             int (*magicfun) (Lisp_Object sym, Lisp_Object *val,
2488                              Lisp_Object in_object, int flags) =
2489                                symbol_value_forward_magicfun (fwd);
2490             Lisp_Object oldval = * (Lisp_Object *)
2491               (offset + (char *) XCONSOLE (Vconsole_defaults));
2492             if (magicfun)
2493               magicfun (variable, &oldval, Vselected_console, 0);
2494             *(Lisp_Object *) (offset + (char *) XCONSOLE (Vselected_console))
2495               = oldval;
2496             XCONSOLE (Vselected_console)->local_var_flags &= ~mask;
2497           }
2498         return variable;
2499       }
2500
2501     default:
2502       return variable;
2503     }
2504 }
2505
2506 /* Used by specbind to determine what effects it might have.  Returns:
2507  *   0 if symbol isn't buffer-local, and wouldn't be after it is set
2508  *  <0 if symbol isn't presently buffer-local, but set would make it so
2509  *  >0 if symbol is presently buffer-local
2510  */
2511 int
2512 symbol_value_buffer_local_info (Lisp_Object symbol, struct buffer *buffer)
2513 {
2514   Lisp_Object valcontents;
2515
2516  retry:
2517   valcontents = XSYMBOL (symbol)->value;
2518
2519  retry_2:
2520   if (SYMBOL_VALUE_MAGIC_P (valcontents))
2521     {
2522       switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2523         {
2524         case SYMVAL_LISP_MAGIC:
2525           /* #### kludge */
2526           valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2527           /* semi-change-o */
2528           goto retry_2;
2529
2530         case SYMVAL_VARALIAS:
2531           symbol = follow_varalias_pointers (symbol, Qt /* #### kludge */);
2532           /* presto change-o! */
2533           goto retry;
2534
2535         case SYMVAL_CURRENT_BUFFER_FORWARD:
2536           {
2537             const struct symbol_value_forward *fwd
2538               = XSYMBOL_VALUE_FORWARD (valcontents);
2539             int mask = XINT (*((Lisp_Object *)
2540                                symbol_value_forward_forward (fwd)));
2541             if ((mask <= 0) || (buffer && (buffer->local_var_flags & mask)))
2542               /* Already buffer-local */
2543               return 1;
2544             else
2545               /* Would be buffer-local after set */
2546               return -1;
2547           }
2548         case SYMVAL_BUFFER_LOCAL:
2549         case SYMVAL_SOME_BUFFER_LOCAL:
2550           {
2551             struct symbol_value_buffer_local *bfwd
2552               = XSYMBOL_VALUE_BUFFER_LOCAL (valcontents);
2553             if (buffer
2554                 && !NILP (buffer_local_alist_element (buffer, symbol, bfwd)))
2555               return 1;
2556             else
2557               /* Automatically becomes local when set */
2558               return bfwd->magic.type == SYMVAL_BUFFER_LOCAL ? -1 : 0;
2559           }
2560         default:
2561           return 0;
2562         }
2563     }
2564   return 0;
2565 }
2566
2567
2568 DEFUN ("symbol-value-in-buffer", Fsymbol_value_in_buffer, 2, 3, 0, /*
2569 Return the value of SYMBOL in BUFFER, or UNBOUND-VALUE if it is unbound.
2570 */
2571        (symbol, buffer, unbound_value))
2572 {
2573   Lisp_Object value;
2574   CHECK_SYMBOL (symbol);
2575   CHECK_BUFFER (buffer);
2576   value = symbol_value_in_buffer (symbol, buffer);
2577   return UNBOUNDP (value) ? unbound_value : value;
2578 }
2579
2580 DEFUN ("symbol-value-in-console", Fsymbol_value_in_console, 2, 3, 0, /*
2581 Return the value of SYMBOL in CONSOLE, or UNBOUND-VALUE if it is unbound.
2582 */
2583        (symbol, console, unbound_value))
2584 {
2585   Lisp_Object value;
2586   CHECK_SYMBOL (symbol);
2587   CHECK_CONSOLE (console);
2588   value = symbol_value_in_console (symbol, console);
2589   return UNBOUNDP (value) ? unbound_value : value;
2590 }
2591
2592 DEFUN ("built-in-variable-type", Fbuilt_in_variable_type, 1, 1, 0, /*
2593 If SYMBOL is a built-in variable, return info about this; else return nil.
2594 The returned info will be a symbol, one of
2595
2596 `object'                A simple built-in variable.
2597 `const-object'          Same, but cannot be set.
2598 `integer'               A built-in integer variable.
2599 `const-integer'         Same, but cannot be set.
2600 `boolean'               A built-in boolean variable.
2601 `const-boolean'         Same, but cannot be set.
2602 `const-specifier'       Always contains a specifier; e.g. `has-modeline-p'.
2603 `current-buffer'        A built-in buffer-local variable.
2604 `const-current-buffer'  Same, but cannot be set.
2605 `default-buffer'        Forwards to the default value of a built-in
2606                         buffer-local variable.
2607 `selected-console'      A built-in console-local variable.
2608 `const-selected-console' Same, but cannot be set.
2609 `default-console'       Forwards to the default value of a built-in
2610                         console-local variable.
2611 */
2612        (symbol))
2613 {
2614   REGISTER Lisp_Object valcontents;
2615
2616   CHECK_SYMBOL (symbol);
2617
2618  retry:
2619   valcontents = XSYMBOL (symbol)->value;
2620
2621  retry_2:
2622   if (!SYMBOL_VALUE_MAGIC_P (valcontents))
2623     return Qnil;
2624
2625   switch (XSYMBOL_VALUE_MAGIC_TYPE (valcontents))
2626     {
2627     case SYMVAL_LISP_MAGIC:
2628       valcontents = XSYMBOL_VALUE_LISP_MAGIC (valcontents)->shadowed;
2629       /* semi-change-o */
2630       goto retry_2;
2631
2632     case SYMVAL_VARALIAS:
2633       symbol = follow_varalias_pointers (symbol, Qt);
2634       /* presto change-o! */
2635       goto retry;
2636
2637     case SYMVAL_BUFFER_LOCAL:
2638     case SYMVAL_SOME_BUFFER_LOCAL:
2639       valcontents =
2640         XSYMBOL_VALUE_BUFFER_LOCAL (valcontents)->current_value;
2641       /* semi-change-o */
2642       goto retry_2;
2643
2644     case SYMVAL_FIXNUM_FORWARD:                 return Qinteger;
2645     case SYMVAL_CONST_FIXNUM_FORWARD:           return Qconst_integer;
2646     case SYMVAL_BOOLEAN_FORWARD:                return Qboolean;
2647     case SYMVAL_CONST_BOOLEAN_FORWARD:          return Qconst_boolean;
2648     case SYMVAL_OBJECT_FORWARD:                 return Qobject;
2649     case SYMVAL_CONST_OBJECT_FORWARD:           return Qconst_object;
2650     case SYMVAL_CONST_SPECIFIER_FORWARD:        return Qconst_specifier;
2651     case SYMVAL_DEFAULT_BUFFER_FORWARD:         return Qdefault_buffer;
2652     case SYMVAL_CURRENT_BUFFER_FORWARD:         return Qcurrent_buffer;
2653     case SYMVAL_CONST_CURRENT_BUFFER_FORWARD:   return Qconst_current_buffer;
2654     case SYMVAL_DEFAULT_CONSOLE_FORWARD:        return Qdefault_console;
2655     case SYMVAL_SELECTED_CONSOLE_FORWARD:       return Qselected_console;
2656     case SYMVAL_CONST_SELECTED_CONSOLE_FORWARD: return Qconst_selected_console;
2657     case SYMVAL_UNBOUND_MARKER:                 return Qnil;
2658
2659     default:
2660       abort (); return Qnil;
2661     }
2662 }
2663
2664
2665 DEFUN ("local-variable-p", Flocal_variable_p, 2, 3, 0, /*
2666 Return t if SYMBOL's value is local to BUFFER.
2667 If optional third arg AFTER-SET is non-nil, return t if SYMBOL would be
2668 buffer-local after it is set, regardless of whether it is so presently.
2669 A nil value for BUFFER is *not* the same as (current-buffer), but means
2670 "no buffer".  Specifically:
2671
2672 -- If BUFFER is nil and AFTER-SET is nil, a return value of t indicates that
2673    the variable is one of the special built-in variables that is always
2674    buffer-local. (This includes `buffer-file-name', `buffer-read-only',
2675    `buffer-undo-list', and others.)
2676
2677 -- If BUFFER is nil and AFTER-SET is t, a return value of t indicates that
2678    the variable has had `make-variable-buffer-local' applied to it.
2679 */
2680        (symbol, buffer, after_set))
2681 {
2682   int local_info;
2683
2684   CHECK_SYMBOL (symbol);
2685   if (!NILP (buffer))
2686     {
2687       buffer = get_buffer (buffer, 1);
2688       local_info = symbol_value_buffer_local_info (symbol, XBUFFER (buffer));
2689     }
2690   else
2691     {
2692       local_info = symbol_value_buffer_local_info (symbol, 0);
2693     }
2694
2695   if (NILP (after_set))
2696     return local_info > 0 ? Qt : Qnil;
2697   else
2698     return local_info != 0 ? Qt : Qnil;
2699 }
2700 \f
2701
2702 /*
2703 I've gone ahead and partially implemented this because it's
2704 super-useful for dealing with the compatibility problems in supporting
2705 the old pointer-shape variables, and preventing people from `setq'ing
2706 the new variables.  Any other way of handling this problem is way
2707 ugly, likely to be slow, and generally not something I want to waste
2708 my time worrying about.
2709
2710 The interface and/or function name is sure to change before this
2711 gets into its final form.  I currently like the way everything is
2712 set up and it has all the features I want it to have, except for
2713 one: I really want to be able to have multiple nested handlers,
2714 to implement an `advice'-like capability.  This would allow,
2715 for example, a clean way of implementing `debug-if-set' or
2716 `debug-if-referenced' and such.
2717
2718 NOTE NOTE NOTE NOTE NOTE NOTE NOTE:
2719 ************************************************************
2720 **Only** the `set-value', `make-unbound', and `make-local'
2721 handler types are currently implemented.  Implementing the
2722 get-value and bound-predicate handlers is somewhat tricky
2723 because there are lots of subfunctions (e.g. find_symbol_value()).
2724 find_symbol_value(), in fact, is called from outside of
2725 this module.  You'd have to have it do this:
2726
2727 -- check for a `bound-predicate' handler, call that if so;
2728    if it returns nil, return Qunbound
2729 -- check for a `get-value' handler and call it and return
2730    that value
2731
2732 It gets even trickier when you have to deal with
2733 sub-subfunctions like find_symbol_value_1(), and esp.
2734 when you have to properly handle variable aliases, which
2735 can lead to lots of tricky situations.  So I've just
2736 punted on this, since the interface isn't officially
2737 exported and we can get by with just a `set-value'
2738 handler.
2739
2740 Actions in unimplemented handler types will correctly
2741 ignore any handlers, and will not fuck anything up or
2742 go awry.
2743
2744 WARNING WARNING: If you do go and implement another
2745 type of handler, make *sure* to change
2746 would_be_magic_handled() so it knows about this,
2747 or dire things could result.
2748 ************************************************************
2749 NOTE NOTE NOTE NOTE NOTE NOTE NOTE
2750
2751 Real documentation is as follows.
2752
2753 Set a magic handler for VARIABLE.
2754 This allows you to specify arbitrary behavior that results from
2755 accessing or setting a variable.  For example, retrieving the
2756 variable's value might actually retrieve the first element off of
2757 a list stored in another variable, and setting the variable's value
2758 might add an element to the front of that list. (This is how the
2759 obsolete variable `unread-command-event' is implemented.)
2760
2761 In general it is NOT good programming practice to use magic variables
2762 in a new package that you are designing.  If you feel the need to
2763 do this, it's almost certainly a sign that you should be using a
2764 function instead of a variable.  This facility is provided to allow
2765 a package to support obsolete variables and provide compatibility
2766 with similar packages with different variable names and semantics.
2767 By using magic handlers, you can cleanly provide obsoleteness and
2768 compatibility support and separate this support from the core
2769 routines in a package.
2770
2771 VARIABLE should be a symbol naming the variable for which the
2772 magic behavior is provided.  HANDLER-TYPE is a symbol specifying
2773 which behavior is being controlled, and HANDLER is the function
2774 that will be called to control this behavior.  HARG is a
2775 value that will be passed to HANDLER but is otherwise
2776 uninterpreted.  KEEP-EXISTING specifies what to do with existing
2777 handlers of the same type; nil means "erase them all", t means
2778 "keep them but insert at the beginning", the list (t) means
2779 "keep them but insert at the end", a function means "keep
2780 them but insert before the specified function", a list containing
2781 a function means "keep them but insert after the specified
2782 function".
2783
2784 You can specify magic behavior for any type of variable at all,
2785 and for any handler types that are unspecified, the standard
2786 behavior applies.  This allows you, for example, to use
2787 `defvaralias' in conjunction with this function. (For that
2788 matter, `defvaralias' could be implemented using this function.)
2789
2790 The behaviors that can be specified in HANDLER-TYPE are
2791
2792 get-value               (SYM ARGS FUN HARG HANDLERS)
2793     This means that one of the functions `symbol-value',
2794     `default-value', `symbol-value-in-buffer', or
2795     `symbol-value-in-console' was called on SYM.
2796
2797 set-value               (SYM ARGS FUN HARG HANDLERS)
2798     This means that one of the functions `set' or `set-default'
2799     was called on SYM.
2800
2801 bound-predicate         (SYM ARGS FUN HARG HANDLERS)
2802     This means that one of the functions `boundp', `globally-boundp',
2803     or `default-boundp' was called on SYM.
2804
2805 make-unbound            (SYM ARGS FUN HARG HANDLERS)
2806     This means that the function `makunbound' was called on SYM.
2807
2808 local-predicate         (SYM ARGS FUN HARG HANDLERS)
2809     This means that the function `local-variable-p' was called
2810     on SYM.
2811
2812 make-local              (SYM ARGS FUN HARG HANDLERS)
2813     This means that one of the functions `make-local-variable',
2814     `make-variable-buffer-local', `kill-local-variable',
2815     or `kill-console-local-variable' was called on SYM.
2816
2817 The meanings of the arguments are as follows:
2818
2819    SYM is the symbol on which the function was called, and is always
2820    the first argument to the function.
2821
2822    ARGS are the remaining arguments in the original call (i.e. all
2823    but the first).  In the case of `set-value' in particular,
2824    the first element of ARGS is the value to which the variable
2825    is being set.  In some cases, ARGS is sanitized from what was
2826    actually given.  For example, whenever `nil' is passed to an
2827    argument and it means `current-buffer', the current buffer is
2828    substituted instead.
2829
2830    FUN is a symbol indicating which function is being called.
2831    For many of the functions, you can determine the corresponding
2832    function of a different class using
2833    `symbol-function-corresponding-function'.
2834
2835    HARG is the argument that was given in the call
2836    to `set-symbol-value-handler' for SYM and HANDLER-TYPE.
2837
2838    HANDLERS is a structure containing the remaining handlers
2839    for the variable; to call one of them, use
2840    `chain-to-symbol-value-handler'.
2841
2842 NOTE: You may *not* modify the list in ARGS, and if you want to
2843 keep it around after the handler function exits, you must make
2844 a copy using `copy-sequence'. (Same caveats for HANDLERS also.)
2845 */
2846
2847 static enum lisp_magic_handler
2848 decode_magic_handler_type (Lisp_Object symbol)
2849 {
2850   if (EQ (symbol, Qget_value))       return MAGIC_HANDLER_GET_VALUE;
2851   if (EQ (symbol, Qset_value))       return MAGIC_HANDLER_SET_VALUE;
2852   if (EQ (symbol, Qbound_predicate)) return MAGIC_HANDLER_BOUND_PREDICATE;
2853   if (EQ (symbol, Qmake_unbound))    return MAGIC_HANDLER_MAKE_UNBOUND;
2854   if (EQ (symbol, Qlocal_predicate)) return MAGIC_HANDLER_LOCAL_PREDICATE;
2855   if (EQ (symbol, Qmake_local))      return MAGIC_HANDLER_MAKE_LOCAL;
2856
2857   signal_simple_error ("Unrecognized symbol value handler type", symbol);
2858   abort ();
2859   return MAGIC_HANDLER_MAX;
2860 }
2861
2862 static enum lisp_magic_handler
2863 handler_type_from_function_symbol (Lisp_Object funsym, int abort_if_not_found)
2864 {
2865   if (EQ (funsym, Qsymbol_value)
2866       || EQ (funsym, Qdefault_value)
2867       || EQ (funsym, Qsymbol_value_in_buffer)
2868       || EQ (funsym, Qsymbol_value_in_console))
2869     return MAGIC_HANDLER_GET_VALUE;
2870
2871   if (EQ (funsym, Qset)
2872       || EQ (funsym, Qset_default))
2873     return MAGIC_HANDLER_SET_VALUE;
2874
2875   if (EQ (funsym, Qboundp)
2876       || EQ (funsym, Qglobally_boundp)
2877       || EQ (funsym, Qdefault_boundp))
2878     return MAGIC_HANDLER_BOUND_PREDICATE;
2879
2880   if (EQ (funsym, Qmakunbound))
2881     return MAGIC_HANDLER_MAKE_UNBOUND;
2882
2883   if (EQ (funsym, Qlocal_variable_p))
2884     return MAGIC_HANDLER_LOCAL_PREDICATE;
2885
2886   if (EQ (funsym, Qmake_variable_buffer_local)
2887       || EQ (funsym, Qmake_local_variable))
2888     return MAGIC_HANDLER_MAKE_LOCAL;
2889
2890   if (abort_if_not_found)
2891     abort ();
2892   signal_simple_error ("Unrecognized symbol-value function", funsym);
2893   return MAGIC_HANDLER_MAX;
2894 }
2895
2896 static int
2897 would_be_magic_handled (Lisp_Object sym, Lisp_Object funsym)
2898 {
2899   /* does not take into account variable aliasing. */
2900   Lisp_Object valcontents = XSYMBOL (sym)->value;
2901   enum lisp_magic_handler slot;
2902
2903   if (!SYMBOL_VALUE_LISP_MAGIC_P (valcontents))
2904     return 0;
2905   slot = handler_type_from_function_symbol (funsym, 1);
2906   if (slot != MAGIC_HANDLER_SET_VALUE && slot != MAGIC_HANDLER_MAKE_UNBOUND
2907       && slot != MAGIC_HANDLER_MAKE_LOCAL)
2908     /* #### temporary kludge because we haven't implemented
2909        lisp-magic variables completely */
2910     return 0;
2911   return !NILP (XSYMBOL_VALUE_LISP_MAGIC (valcontents)->handler[slot]);
2912 }
2913
2914 static Lisp_Object
2915 fetch_value_maybe_past_magic (Lisp_Object sym,
2916                               Lisp_Object follow_past_lisp_magic)
2917 {
2918   Lisp_Object value = XSYMBOL (sym)->value;
2919   if (SYMBOL_VALUE_LISP_MAGIC_P (value)
2920       && (EQ (follow_past_lisp_magic, Qt)
2921           || (!NILP (follow_past_lisp_magic)
2922               && !would_be_magic_handled (sym, follow_past_lisp_magic))))
2923     value = XSYMBOL_VALUE_LISP_MAGIC (value)->shadowed;
2924   return value;
2925 }
2926
2927 static Lisp_Object *
2928 value_slot_past_magic (Lisp_Object sym)
2929 {
2930   Lisp_Object *store_pointer = &XSYMBOL (sym)->value;
2931
2932   if (SYMBOL_VALUE_LISP_MAGIC_P (*store_pointer))
2933     store_pointer = &XSYMBOL_VALUE_LISP_MAGIC (sym)->shadowed;
2934   return store_pointer;
2935 }
2936
2937 static Lisp_Object
2938 maybe_call_magic_handler (Lisp_Object sym, Lisp_Object funsym, int nargs, ...)
2939 {
2940   va_list vargs;
2941   Lisp_Object args[20]; /* should be enough ... */
2942   int i;
2943   enum lisp_magic_handler htype;
2944   Lisp_Object legerdemain;
2945   struct symbol_value_lisp_magic *bfwd;
2946
2947   assert (nargs >= 0 && nargs < countof (args));
2948   legerdemain = XSYMBOL (sym)->value;
2949   assert (SYMBOL_VALUE_LISP_MAGIC_P (legerdemain));
2950   bfwd = XSYMBOL_VALUE_LISP_MAGIC (legerdemain);
2951
2952   va_start (vargs, nargs);
2953   for (i = 0; i < nargs; i++)
2954     args[i] = va_arg (vargs, Lisp_Object);
2955   va_end (vargs);
2956
2957   htype = handler_type_from_function_symbol (funsym, 1);
2958   if (NILP (bfwd->handler[htype]))
2959     return Qunbound;
2960   /* #### should be reusing the arglist, not always consing anew.
2961      Repeated handler invocations should not cause repeated consing.
2962      Doesn't matter for now, because this is just a quick implementation
2963      for obsolescence support. */
2964   return call5 (bfwd->handler[htype], sym, Flist (nargs, args), funsym,
2965                 bfwd->harg[htype], Qnil);
2966 }
2967
2968 DEFUN ("dontusethis-set-symbol-value-handler", Fdontusethis_set_symbol_value_handler,
2969        3, 5, 0, /*
2970 Don't you dare use this.
2971 If you do, suffer the wrath of Ben, who is likely to rename
2972 this function (or change the semantics of its arguments) without
2973 pity, thereby invalidating your code.
2974 */
2975        (variable, handler_type, handler, harg, keep_existing))
2976 {
2977   Lisp_Object valcontents;
2978   struct symbol_value_lisp_magic *bfwd;
2979   enum lisp_magic_handler htype;
2980   int i;
2981
2982   /* #### WARNING, only some handler types are implemented.  See above.
2983      Actions of other types will ignore a handler if it's there.
2984
2985      #### Also, `chain-to-symbol-value-handler' and
2986      `symbol-function-corresponding-function' are not implemented. */
2987   CHECK_SYMBOL (variable);
2988   CHECK_SYMBOL (handler_type);
2989   htype = decode_magic_handler_type (handler_type);
2990   valcontents = XSYMBOL (variable)->value;
2991   if (!SYMBOL_VALUE_LISP_MAGIC_P (valcontents))
2992     {
2993       bfwd = alloc_lcrecord_type (struct symbol_value_lisp_magic,
2994                                   &lrecord_symbol_value_lisp_magic);
2995       zero_lcrecord (&bfwd->magic);
2996       bfwd->magic.type = SYMVAL_LISP_MAGIC;
2997       for (i = 0; i < MAGIC_HANDLER_MAX; i++)
2998         {
2999           bfwd->handler[i] = Qnil;
3000           bfwd->harg[i] = Qnil;
3001         }
3002       bfwd->shadowed = valcontents;
3003       XSETSYMBOL_VALUE_MAGIC (XSYMBOL (variable)->value, bfwd);
3004     }
3005   else
3006     bfwd = XSYMBOL_VALUE_LISP_MAGIC (valcontents);
3007   bfwd->handler[htype] = handler;
3008   bfwd->harg[htype] = harg;
3009
3010   for (i = 0; i < MAGIC_HANDLER_MAX; i++)
3011     if (!NILP (bfwd->handler[i]))
3012       break;
3013
3014   if (i == MAGIC_HANDLER_MAX)
3015     /* there are no remaining handlers, so remove the structure. */
3016     XSYMBOL (variable)->value = bfwd->shadowed;
3017
3018   return Qnil;
3019 }
3020
3021 \f
3022 /* functions for working with variable aliases.  */
3023
3024 /* Follow the chain of variable aliases for SYMBOL.  Return the
3025    resulting symbol, whose value cell is guaranteed not to be a
3026    symbol-value-varalias.
3027
3028    Also maybe follow past symbol-value-lisp-magic -> symbol-value-varalias.
3029    If FUNSYM is t, always follow in such a case.  If FUNSYM is nil,
3030    never follow; stop right there.  Otherwise FUNSYM should be a
3031    recognized symbol-value function symbol; this means, follow
3032    unless there is a special handler for the named function.
3033
3034    OK, there is at least one reason why it's necessary for
3035    FOLLOW-PAST-LISP-MAGIC to be specified correctly: So that we
3036    can always be sure to catch cyclic variable aliasing.  If we never
3037    follow past Lisp magic, then if the following is done:
3038
3039    (defvaralias 'a 'b)
3040    add some magic behavior to a, but not a "get-value" handler
3041    (defvaralias 'b 'a)
3042
3043    then an attempt to retrieve a's or b's value would cause infinite
3044    looping in `symbol-value'.
3045
3046    We (of course) can't always follow past Lisp magic, because then
3047    we make any variable that is lisp-magic -> varalias behave as if
3048    the lisp-magic is not present at all.
3049  */
3050
3051 static Lisp_Object
3052 follow_varalias_pointers (Lisp_Object symbol,
3053                           Lisp_Object follow_past_lisp_magic)
3054 {
3055 #define VARALIAS_INDIRECTION_SUSPICION_LENGTH 16
3056   Lisp_Object tortoise, hare, val;
3057   int count;
3058
3059   /* quick out just in case */
3060   if (!SYMBOL_VALUE_MAGIC_P (XSYMBOL (symbol)->value))
3061     return symbol;
3062
3063   /* Compare implementation of indirect_function().  */
3064   for (hare = tortoise = symbol, count = 0;
3065        val = fetch_value_maybe_past_magic (hare, follow_past_lisp_magic),
3066          SYMBOL_VALUE_VARALIAS_P (val);
3067        hare = symbol_value_varalias_aliasee (XSYMBOL_VALUE_VARALIAS (val)),
3068          count++)
3069     {
3070       if (count < VARALIAS_INDIRECTION_SUSPICION_LENGTH) continue;
3071
3072       if (count & 1)
3073         tortoise = symbol_value_varalias_aliasee
3074           (XSYMBOL_VALUE_VARALIAS (fetch_value_maybe_past_magic
3075                                    (tortoise, follow_past_lisp_magic)));
3076       if (EQ (hare, tortoise))
3077         return Fsignal (Qcyclic_variable_indirection, list1 (symbol));
3078     }
3079
3080   return hare;
3081 }
3082
3083 DEFUN ("defvaralias", Fdefvaralias, 2, 2, 0, /*
3084 Define a variable as an alias for another variable.
3085 Thenceforth, any operations performed on VARIABLE will actually be
3086 performed on ALIAS.  Both VARIABLE and ALIAS should be symbols.
3087 If ALIAS is nil, remove any aliases for VARIABLE.
3088 ALIAS can itself be aliased, and the chain of variable aliases
3089 will be followed appropriately.
3090 If VARIABLE already has a value, this value will be shadowed
3091 until the alias is removed, at which point it will be restored.
3092 Currently VARIABLE cannot be a built-in variable, a variable that
3093 has a buffer-local value in any buffer, or the symbols nil or t.
3094 \(ALIAS, however, can be any type of variable.)
3095 */
3096        (variable, alias))
3097 {
3098   struct symbol_value_varalias *bfwd;
3099   Lisp_Object valcontents;
3100
3101   CHECK_SYMBOL (variable);
3102   reject_constant_symbols (variable, Qunbound, 0, Qt);
3103
3104   valcontents = XSYMBOL (variable)->value;
3105
3106   if (NILP (alias))
3107     {
3108       if (SYMBOL_VALUE_VARALIAS_P (valcontents))
3109         {
3110           XSYMBOL (variable)->value =
3111             symbol_value_varalias_shadowed
3112               (XSYMBOL_VALUE_VARALIAS (valcontents));
3113         }
3114       return Qnil;
3115     }
3116
3117   CHECK_SYMBOL (alias);
3118   if (SYMBOL_VALUE_VARALIAS_P (valcontents))
3119     {
3120       /* transmogrify */
3121       XSYMBOL_VALUE_VARALIAS (valcontents)->aliasee = alias;
3122       return Qnil;
3123     }
3124
3125   if (SYMBOL_VALUE_MAGIC_P (valcontents)
3126       && !UNBOUNDP (valcontents))
3127     signal_simple_error ("Variable is magic and cannot be aliased", variable);
3128   reject_constant_symbols (variable, Qunbound, 0, Qt);
3129
3130   bfwd = alloc_lcrecord_type (struct symbol_value_varalias,
3131                               &lrecord_symbol_value_varalias);
3132   zero_lcrecord (&bfwd->magic);
3133   bfwd->magic.type = SYMVAL_VARALIAS;
3134   bfwd->aliasee = alias;
3135   bfwd->shadowed = valcontents;
3136
3137   XSETSYMBOL_VALUE_MAGIC (valcontents, bfwd);
3138   XSYMBOL (variable)->value = valcontents;
3139   return Qnil;
3140 }
3141
3142 DEFUN ("variable-alias", Fvariable_alias, 1, 2, 0, /*
3143 If VARIABLE is aliased to another variable, return that variable.
3144 VARIABLE should be a symbol.  If VARIABLE is not aliased, return nil.
3145 Variable aliases are created with `defvaralias'.  See also
3146 `indirect-variable'.
3147 */
3148        (variable, follow_past_lisp_magic))
3149 {
3150   Lisp_Object valcontents;
3151
3152   CHECK_SYMBOL (variable);
3153   if (!NILP (follow_past_lisp_magic) && !EQ (follow_past_lisp_magic, Qt))
3154     {
3155       CHECK_SYMBOL (follow_past_lisp_magic);
3156       handler_type_from_function_symbol (follow_past_lisp_magic, 0);
3157     }
3158
3159   valcontents = fetch_value_maybe_past_magic (variable,
3160                                               follow_past_lisp_magic);
3161
3162   if (SYMBOL_VALUE_VARALIAS_P (valcontents))
3163     return symbol_value_varalias_aliasee
3164       (XSYMBOL_VALUE_VARALIAS (valcontents));
3165   else
3166     return Qnil;
3167 }
3168
3169 DEFUN ("indirect-variable", Findirect_variable, 1, 2, 0, /*
3170 Return the variable at the end of OBJECT's variable-alias chain.
3171 If OBJECT is a symbol, follow all variable aliases and return
3172 the final (non-aliased) symbol.  Variable aliases are created with
3173 the function `defvaralias'.
3174 If OBJECT is not a symbol, just return it.
3175 Signal a cyclic-variable-indirection error if there is a loop in the
3176 variable chain of symbols.
3177 */
3178        (object, follow_past_lisp_magic))
3179 {
3180   if (!SYMBOLP (object))
3181     return object;
3182   if (!NILP (follow_past_lisp_magic) && !EQ (follow_past_lisp_magic, Qt))
3183     {
3184       CHECK_SYMBOL (follow_past_lisp_magic);
3185       handler_type_from_function_symbol (follow_past_lisp_magic, 0);
3186     }
3187   return follow_varalias_pointers (object, follow_past_lisp_magic);
3188 }
3189
3190 \f
3191 /************************************************************************/
3192 /*                            initialization                            */
3193 /************************************************************************/
3194
3195 /* A dumped XEmacs image has a lot more than 1511 symbols.  Last
3196    estimate was that there were actually around 6300.  So let's try
3197    making this bigger and see if we get better hashing behavior. */
3198 #define OBARRAY_SIZE 16411
3199
3200 #ifndef Qzero
3201 Lisp_Object Qzero;
3202 #endif
3203 #ifndef Qnull_pointer
3204 Lisp_Object Qnull_pointer;
3205 #endif
3206
3207 /* some losing systems can't have static vars at function scope... */
3208 static const struct symbol_value_magic guts_of_unbound_marker =
3209 { /* struct symbol_value_magic */
3210   { /* struct lcrecord_header */
3211     { /* struct lrecord_header */
3212       lrecord_type_symbol_value_forward, /* lrecord_type_index */
3213       1, /* mark bit */
3214       1, /* c_readonly bit */
3215       1, /* lisp_readonly bit */
3216     },
3217     0, /* next */
3218     0, /* uid  */
3219     0, /* free */
3220   },
3221   0, /* value */
3222   SYMVAL_UNBOUND_MARKER
3223 };
3224
3225 void
3226 init_symbols_once_early (void)
3227 {
3228   INIT_LRECORD_IMPLEMENTATION (symbol);
3229   INIT_LRECORD_IMPLEMENTATION (symbol_value_forward);
3230   INIT_LRECORD_IMPLEMENTATION (symbol_value_buffer_local);
3231   INIT_LRECORD_IMPLEMENTATION (symbol_value_lisp_magic);
3232   INIT_LRECORD_IMPLEMENTATION (symbol_value_varalias);
3233
3234   reinit_symbols_once_early ();
3235
3236   /* Bootstrapping problem: Qnil isn't set when make_string_nocopy is
3237      called the first time. */
3238   Qnil = Fmake_symbol (make_string_nocopy ((const Bufbyte *) "nil", 3));
3239   XSYMBOL (Qnil)->name->plist = Qnil;
3240   XSYMBOL (Qnil)->value = Qnil; /* Nihil ex nihil */
3241   XSYMBOL (Qnil)->plist = Qnil;
3242
3243   Vobarray = make_vector (OBARRAY_SIZE, Qzero);
3244   initial_obarray = Vobarray;
3245   staticpro (&initial_obarray);
3246   /* Intern nil in the obarray */
3247   {
3248     int hash = hash_string (string_data (XSYMBOL (Qnil)->name), 3);
3249     XVECTOR_DATA (Vobarray)[hash % OBARRAY_SIZE] = Qnil;
3250   }
3251
3252   {
3253     /* Required to get around a GCC syntax error on certain
3254        architectures */
3255     const struct symbol_value_magic *tem = &guts_of_unbound_marker;
3256
3257     XSETSYMBOL_VALUE_MAGIC (Qunbound, tem);
3258   }
3259
3260   XSYMBOL (Qnil)->function = Qunbound;
3261
3262   defsymbol (&Qt, "t");
3263   XSYMBOL (Qt)->value = Qt;     /* Veritas aeterna */
3264   Vquit_flag = Qnil;
3265
3266   dump_add_root_object (&Qnil);
3267   dump_add_root_object (&Qunbound);
3268   dump_add_root_object (&Vquit_flag);
3269 }
3270
3271 void
3272 reinit_symbols_once_early (void)
3273 {
3274 #ifndef Qzero
3275   Qzero = make_int (0); /* Only used if Lisp_Object is a union type */
3276 #endif
3277
3278 #ifndef Qnull_pointer
3279   /* C guarantees that Qnull_pointer will be initialized to all 0 bits,
3280      so the following is actually a no-op.  */
3281   XSETOBJ (Qnull_pointer, 0);
3282 #endif
3283 }
3284
3285 static void
3286 defsymbol_massage_name_1 (Lisp_Object *location, const char *name, int dump_p,
3287                           int multiword_predicate_p)
3288 {
3289   char temp[500];
3290   int len = strlen (name) - 1;
3291   int i;
3292
3293   if (multiword_predicate_p)
3294     assert (len + 1 < sizeof (temp));
3295   else
3296     assert (len < sizeof (temp));
3297   strcpy (temp, name + 1); /* Remove initial Q */
3298   if (multiword_predicate_p)
3299     {
3300       strcpy (temp + len - 1, "_p");
3301       len++;
3302     }
3303   for (i = 0; i < len; i++)
3304     if (temp[i] == '_')
3305       temp[i] = '-';
3306   *location = Fintern (make_string ((const Bufbyte *) temp, len), Qnil);
3307   if (dump_p)
3308     staticpro (location);
3309   else
3310     staticpro_nodump (location);
3311 }
3312
3313 void
3314 defsymbol_massage_name_nodump (Lisp_Object *location, const char *name)
3315 {
3316   defsymbol_massage_name_1 (location, name, 0, 0);
3317 }
3318
3319 void
3320 defsymbol_massage_name (Lisp_Object *location, const char *name)
3321 {
3322   defsymbol_massage_name_1 (location, name, 1, 0);
3323 }
3324
3325 void
3326 defsymbol_massage_multiword_predicate_nodump (Lisp_Object *location,
3327                                               const char *name)
3328 {
3329   defsymbol_massage_name_1 (location, name, 0, 1);
3330 }
3331
3332 void
3333 defsymbol_massage_multiword_predicate (Lisp_Object *location, const char *name)
3334 {
3335   defsymbol_massage_name_1 (location, name, 1, 1);
3336 }
3337
3338 void
3339 defsymbol_nodump (Lisp_Object *location, const char *name)
3340 {
3341   *location = Fintern (make_string_nocopy ((const Bufbyte *) name,
3342                                            strlen (name)),
3343                        Qnil);
3344   staticpro_nodump (location);
3345 }
3346
3347 void
3348 defsymbol (Lisp_Object *location, const char *name)
3349 {
3350   *location = Fintern (make_string_nocopy ((const Bufbyte *) name,
3351                                            strlen (name)),
3352                        Qnil);
3353   staticpro (location);
3354 }
3355
3356 void
3357 defkeyword (Lisp_Object *location, const char *name)
3358 {
3359   defsymbol (location, name);
3360   Fset (*location, *location);
3361 }
3362
3363 void
3364 defkeyword_massage_name (Lisp_Object *location, const char *name)
3365 {
3366   char temp[500];
3367   int len = strlen (name);
3368
3369   assert (len < sizeof (temp));
3370   strcpy (temp, name);
3371   temp[1] = ':'; /* it's an underscore in the C variable */
3372
3373   defsymbol_massage_name (location, temp);
3374   Fset (*location, *location);
3375 }
3376
3377 #ifdef DEBUG_XEMACS
3378 /* Check that nobody spazzed writing a DEFUN. */
3379 static void
3380 check_sane_subr (Lisp_Subr *subr, Lisp_Object sym)
3381 {
3382   assert (subr->min_args >= 0);
3383   assert (subr->min_args <= SUBR_MAX_ARGS);
3384
3385   if (subr->max_args != MANY &&
3386       subr->max_args != UNEVALLED)
3387     {
3388       /* Need to fix lisp.h and eval.c if SUBR_MAX_ARGS too small */
3389       assert (subr->max_args <= SUBR_MAX_ARGS);
3390       assert (subr->min_args <= subr->max_args);
3391     }
3392
3393   assert (UNBOUNDP (XSYMBOL (sym)->function));
3394 }
3395 #else
3396 #define check_sane_subr(subr, sym) /* nothing */
3397 #endif
3398
3399 #ifdef HAVE_SHLIB
3400 /*
3401  * If we are not in a pure undumped Emacs, we need to make a duplicate of
3402  * the subr. This is because the only time this function will be called
3403  * in a running Emacs is when a dynamically loaded module is adding a
3404  * subr, and we need to make sure that the subr is in allocated, Lisp-
3405  * accessible memory.  The address assigned to the static subr struct
3406  * in the shared object will be a trampoline address, so we need to create
3407  * a copy here to ensure that a real address is used.
3408  *
3409  * Once we have copied everything across, we re-use the original static
3410  * structure to store a pointer to the newly allocated one. This will be
3411  * used in emodules.c by emodules_doc_subr() to find a pointer to the
3412  * allocated object so that we can set its doc string properly.
3413  *
3414  * NOTE: We don't actually use the DOC pointer here any more, but we did
3415  * in an earlier implementation of module support. There is no harm in
3416  * setting it here in case we ever need it in future implementations.
3417  * subr->doc will point to the new subr structure that was allocated.
3418  * Code can then get this value from the static subr structure and use
3419  * it if required.
3420  *
3421  * FIXME: Should newsubr be staticpro()'ed? I don't think so but I need
3422  * a guru to check.
3423  */
3424 #define check_module_subr()                                             \
3425 do {                                                                    \
3426   if (initialized) {                                                    \
3427     Lisp_Subr *newsubr = (Lisp_Subr *) xmalloc (sizeof (Lisp_Subr));    \
3428     memcpy (newsubr, subr, sizeof (Lisp_Subr));                         \
3429     subr->doc = (const char *)newsubr;                                  \
3430     subr = newsubr;                                                     \
3431   }                                                                     \
3432 } while (0)
3433 #else /* ! HAVE_SHLIB */
3434 #define check_module_subr()
3435 #endif
3436
3437 void
3438 defsubr (Lisp_Subr *subr)
3439 {
3440   Lisp_Object sym = intern (subr_name (subr));
3441   Lisp_Object fun;
3442
3443   check_sane_subr (subr, sym);
3444   check_module_subr ();
3445
3446   XSETSUBR (fun, subr);
3447   XSYMBOL (sym)->function = fun;
3448 }
3449
3450 /* Define a lisp macro using a Lisp_Subr. */
3451 void
3452 defsubr_macro (Lisp_Subr *subr)
3453 {
3454   Lisp_Object sym = intern (subr_name (subr));
3455   Lisp_Object fun;
3456
3457   check_sane_subr (subr, sym);
3458   check_module_subr();
3459
3460   XSETSUBR (fun, subr);
3461   XSYMBOL (sym)->function = Fcons (Qmacro, fun);
3462 }
3463
3464 static void
3465 deferror_1 (Lisp_Object *symbol, const char *name, const char *messuhhj,
3466             Lisp_Object inherits_from, int massage_p)
3467 {
3468   Lisp_Object conds;
3469   if (massage_p)
3470     defsymbol_massage_name (symbol, name);
3471   else
3472     defsymbol (symbol, name);
3473
3474   assert (SYMBOLP (inherits_from));
3475   conds = Fget (inherits_from, Qerror_conditions, Qnil);
3476   Fput (*symbol, Qerror_conditions, Fcons (*symbol, conds));
3477   /* NOT build_translated_string ().  This function is called at load time
3478      and the string needs to get translated at run time.  (This happens
3479      in the function (display-error) in cmdloop.el.) */
3480   Fput (*symbol, Qerror_message, build_string (messuhhj));
3481 }
3482
3483 void
3484 deferror (Lisp_Object *symbol, const char *name, const char *messuhhj,
3485           Lisp_Object inherits_from)
3486 {
3487   deferror_1 (symbol, name, messuhhj, inherits_from, 0);
3488 }
3489
3490 void
3491 deferror_massage_name (Lisp_Object *symbol, const char *name,
3492                        const char *messuhhj, Lisp_Object inherits_from)
3493 {
3494   deferror_1 (symbol, name, messuhhj, inherits_from, 1);
3495 }
3496
3497 void
3498 deferror_massage_name_and_message (Lisp_Object *symbol, const char *name,
3499                                    Lisp_Object inherits_from)
3500 {
3501   char temp[500];
3502   int i;
3503   int len = strlen (name) - 1;
3504
3505   assert (len < sizeof (temp));
3506   strcpy (temp, name + 1); /* Remove initial Q */
3507   temp[0] = toupper (temp[0]);
3508   for (i = 0; i < len; i++)
3509     if (temp[i] == '_')
3510       temp[i] = ' ';
3511
3512   deferror_1 (symbol, name, temp, inherits_from, 1);
3513 }
3514
3515 void
3516 syms_of_symbols (void)
3517 {
3518   DEFSYMBOL (Qvariable_documentation);
3519   DEFSYMBOL (Qvariable_domain); /* I18N3 */
3520   DEFSYMBOL (Qad_advice_info);
3521   DEFSYMBOL (Qad_activate);
3522
3523   DEFSYMBOL (Qget_value);
3524   DEFSYMBOL (Qset_value);
3525   DEFSYMBOL (Qbound_predicate);
3526   DEFSYMBOL (Qmake_unbound);
3527   DEFSYMBOL (Qlocal_predicate);
3528   DEFSYMBOL (Qmake_local);
3529
3530   DEFSYMBOL (Qboundp);
3531   DEFSYMBOL (Qglobally_boundp);
3532   DEFSYMBOL (Qmakunbound);
3533   DEFSYMBOL (Qsymbol_value);
3534   DEFSYMBOL (Qset);
3535   DEFSYMBOL (Qsetq_default);
3536   DEFSYMBOL (Qdefault_boundp);
3537   DEFSYMBOL (Qdefault_value);
3538   DEFSYMBOL (Qset_default);
3539   DEFSYMBOL (Qmake_variable_buffer_local);
3540   DEFSYMBOL (Qmake_local_variable);
3541   DEFSYMBOL (Qkill_local_variable);
3542   DEFSYMBOL (Qkill_console_local_variable);
3543   DEFSYMBOL (Qsymbol_value_in_buffer);
3544   DEFSYMBOL (Qsymbol_value_in_console);
3545   DEFSYMBOL (Qlocal_variable_p);
3546
3547   DEFSYMBOL (Qconst_integer);
3548   DEFSYMBOL (Qconst_boolean);
3549   DEFSYMBOL (Qconst_object);
3550   DEFSYMBOL (Qconst_specifier);
3551   DEFSYMBOL (Qdefault_buffer);
3552   DEFSYMBOL (Qcurrent_buffer);
3553   DEFSYMBOL (Qconst_current_buffer);
3554   DEFSYMBOL (Qdefault_console);
3555   DEFSYMBOL (Qselected_console);
3556   DEFSYMBOL (Qconst_selected_console);
3557
3558   DEFSUBR (Fintern);
3559   DEFSUBR (Fintern_soft);
3560   DEFSUBR (Funintern);
3561   DEFSUBR (Fmapatoms);
3562   DEFSUBR (Fapropos_internal);
3563
3564   DEFSUBR (Fsymbol_function);
3565   DEFSUBR (Fsymbol_plist);
3566   DEFSUBR (Fsymbol_name);
3567   DEFSUBR (Fmakunbound);
3568   DEFSUBR (Ffmakunbound);
3569   DEFSUBR (Fboundp);
3570   DEFSUBR (Fglobally_boundp);
3571   DEFSUBR (Ffboundp);
3572   DEFSUBR (Ffset);
3573   DEFSUBR (Fdefine_function);
3574   Ffset (intern ("defalias"), intern ("define-function"));
3575   DEFSUBR (Fsetplist);
3576   DEFSUBR (Fsymbol_value_in_buffer);
3577   DEFSUBR (Fsymbol_value_in_console);
3578   DEFSUBR (Fbuilt_in_variable_type);
3579   DEFSUBR (Fsymbol_value);
3580   DEFSUBR (Fset);
3581   DEFSUBR (Fdefault_boundp);
3582   DEFSUBR (Fdefault_value);
3583   DEFSUBR (Fset_default);
3584   DEFSUBR (Fsetq_default);
3585   DEFSUBR (Fmake_variable_buffer_local);
3586   DEFSUBR (Fmake_local_variable);
3587   DEFSUBR (Fkill_local_variable);
3588   DEFSUBR (Fkill_console_local_variable);
3589   DEFSUBR (Flocal_variable_p);
3590   DEFSUBR (Fdefvaralias);
3591   DEFSUBR (Fvariable_alias);
3592   DEFSUBR (Findirect_variable);
3593   DEFSUBR (Fdontusethis_set_symbol_value_handler);
3594 }
3595
3596 /* Create and initialize a Lisp variable whose value is forwarded to C data */
3597 void
3598 defvar_magic (const char *symbol_name, const struct symbol_value_forward *magic)
3599 {
3600   Lisp_Object sym;
3601
3602 #if defined(HAVE_SHLIB)
3603   /*
3604    * As with defsubr(), this will only be called in a dumped Emacs when
3605    * we are adding variables from a dynamically loaded module. That means
3606    * we can't use purespace. Take that into account.
3607    */
3608   if (initialized)
3609     sym = Fintern (build_string (symbol_name), Qnil);
3610   else
3611 #endif
3612     sym = Fintern (make_string_nocopy ((const Bufbyte *) symbol_name,
3613                                        strlen (symbol_name)), Qnil);
3614
3615   XSETOBJ (XSYMBOL (sym)->value, magic);
3616 }
3617
3618 void
3619 vars_of_symbols (void)
3620 {
3621   DEFVAR_LISP ("obarray", &Vobarray /*
3622 Symbol table for use by `intern' and `read'.
3623 It is a vector whose length ought to be prime for best results.
3624 The vector's contents don't make sense if examined from Lisp programs;
3625 to find all the symbols in an obarray, use `mapatoms'.
3626 */ );
3627   /* obarray has been initialized long before */
3628 }