comparison src/buffer.c @ 85328:d0d527210b0c

* lisp.h (enum Lisp_Misc_Type): Del Lisp_Misc_Some_Buffer_Local_Value. (XMISCANY): New macro. (XMISCTYPE): Use it. (struct Lisp_Misc_Any): New type. (union Lisp_Misc): Use it. (struct Lisp_Buffer_Local_Value): Add `local_if_set' bit. * data.c (Fboundp, store_symval_forwarding, swap_in_global_binding) (find_symbol_value, set_internal, default_value, Fset_default) (Fmake_variable_buffer_local, Fmake_local_variable) (Fkill_local_variable, Fmake_variable_frame_local, Flocal_variable_p) (Flocal_variable_if_set_p, Fvariable_binding_locus): The SOME_BUFFER_LOCAL_VALUEP distinction is replaced by local_if_set. * alloc.c (allocate_buffer): Set the size and tag. (allocate_misc, mark_maybe_object, mark_object, survives_gc_p): Use XMISCANY. (die): Follow the GNU convention for error messages. * print.c (print_object): SOME_BUFFER_LOCAL_VALUEP -> local_if_set. * buffer.c (Fget_buffer_create, Fmake_indirect_buffer): Don't set the tag any more. (set_buffer_internal_1): * frame.c (store_frame_param): * eval.c (specbind): * xdisp.c (select_frame_for_redisplay): Drop SOME_BUFFER_LOCAL_VALUEP.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 16 Oct 2007 15:42:58 +0000
parents 86224da3fd17
children 79043dac5524 1251cabc40b7
comparison
equal deleted inserted replaced
85327:84eaa97c1d65 85328:d0d527210b0c
358 358
359 if (SCHARS (name) == 0) 359 if (SCHARS (name) == 0)
360 error ("Empty string for buffer name is not allowed"); 360 error ("Empty string for buffer name is not allowed");
361 361
362 b = (struct buffer *) allocate_buffer (); 362 b = (struct buffer *) allocate_buffer ();
363
364 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
365 363
366 /* An ordinary buffer uses its own struct buffer_text. */ 364 /* An ordinary buffer uses its own struct buffer_text. */
367 b->text = &b->own_text; 365 b->text = &b->own_text;
368 b->base_buffer = 0; 366 b->base_buffer = 0;
369 367
414 412
415 name = Fcopy_sequence (name); 413 name = Fcopy_sequence (name);
416 STRING_SET_INTERVALS (name, NULL_INTERVAL); 414 STRING_SET_INTERVALS (name, NULL_INTERVAL);
417 b->name = name; 415 b->name = name;
418 416
419 if (SREF (name, 0) != ' ') 417 b->undo_list = (SREF (name, 0) != ' ') ? Qnil : Qt;
420 b->undo_list = Qnil;
421 else
422 b->undo_list = Qt;
423 418
424 reset_buffer (b); 419 reset_buffer (b);
425 reset_buffer_local_variables (b, 1); 420 reset_buffer_local_variables (b, 1);
426 421
427 b->mark = Fmake_marker (); 422 b->mark = Fmake_marker ();
428 BUF_MARKERS (b) = NULL; 423 BUF_MARKERS (b) = NULL;
429 b->name = name; 424 b->name = name;
430 425
431 /* Put this in the alist of all live buffers. */ 426 /* Put this in the alist of all live buffers. */
432 XSETPVECTYPE (b, PVEC_BUFFER);
433 XSETBUFFER (buf, b); 427 XSETBUFFER (buf, b);
434 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); 428 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
435 429
436 /* An error in calling the function here (should someone redefine it) 430 /* An error in calling the function here (should someone redefine it)
437 can lead to infinite regress until you run out of stack. rms 431 can lead to infinite regress until you run out of stack. rms
565 559
566 if (SCHARS (name) == 0) 560 if (SCHARS (name) == 0)
567 error ("Empty string for buffer name is not allowed"); 561 error ("Empty string for buffer name is not allowed");
568 562
569 b = (struct buffer *) allocate_buffer (); 563 b = (struct buffer *) allocate_buffer ();
570 b->size = sizeof (struct buffer) / sizeof (EMACS_INT); 564
571 XSETPVECTYPE (b, PVEC_BUFFER); 565 b->base_buffer = (XBUFFER (base_buffer)->base_buffer
572 566 ? XBUFFER (base_buffer)->base_buffer
573 if (XBUFFER (base_buffer)->base_buffer) 567 : XBUFFER (base_buffer));
574 b->base_buffer = XBUFFER (base_buffer)->base_buffer;
575 else
576 b->base_buffer = XBUFFER (base_buffer);
577 568
578 /* Use the base buffer's text object. */ 569 /* Use the base buffer's text object. */
579 b->text = b->base_buffer->text; 570 b->text = b->base_buffer->text;
580 571
581 BUF_BEGV (b) = BUF_BEGV (b->base_buffer); 572 BUF_BEGV (b) = BUF_BEGV (b->base_buffer);
1916 to find and update any that forward into C variables. */ 1907 to find and update any that forward into C variables. */
1917 1908
1918 for (tail = b->local_var_alist; CONSP (tail); tail = XCDR (tail)) 1909 for (tail = b->local_var_alist; CONSP (tail); tail = XCDR (tail))
1919 { 1910 {
1920 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); 1911 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail)));
1921 if ((BUFFER_LOCAL_VALUEP (valcontents) 1912 if ((BUFFER_LOCAL_VALUEP (valcontents))
1922 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1923 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, 1913 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1924 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem)))) 1914 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1925 /* Just reference the variable 1915 /* Just reference the variable
1926 to cause it to become set for this buffer. */ 1916 to cause it to become set for this buffer. */
1927 Fsymbol_value (XCAR (XCAR (tail))); 1917 Fsymbol_value (XCAR (XCAR (tail)));
1931 1921
1932 if (old_buf) 1922 if (old_buf)
1933 for (tail = old_buf->local_var_alist; CONSP (tail); tail = XCDR (tail)) 1923 for (tail = old_buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1934 { 1924 {
1935 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail))); 1925 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail)));
1936 if ((BUFFER_LOCAL_VALUEP (valcontents) 1926 if ((BUFFER_LOCAL_VALUEP (valcontents))
1937 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1938 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue, 1927 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
1939 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem)))) 1928 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1940 /* Just reference the variable 1929 /* Just reference the variable
1941 to cause it to become set for this buffer. */ 1930 to cause it to become set for this buffer. */
1942 Fsymbol_value (XCAR (XCAR (tail))); 1931 Fsymbol_value (XCAR (XCAR (tail)));
2491 reset_buffer_local_variables (current_buffer, 0); 2480 reset_buffer_local_variables (current_buffer, 0);
2492 2481
2493 /* Any which are supposed to be permanent, 2482 /* Any which are supposed to be permanent,
2494 make local again, with the same values they had. */ 2483 make local again, with the same values they had. */
2495 2484
2496 for (alist = oalist; !NILP (alist); alist = XCDR (alist)) 2485 for (alist = oalist; CONSP (alist); alist = XCDR (alist))
2497 { 2486 {
2498 sym = XCAR (XCAR (alist)); 2487 sym = XCAR (XCAR (alist));
2499 tem = Fget (sym, Qpermanent_local); 2488 tem = Fget (sym, Qpermanent_local);
2500 if (! NILP (tem)) 2489 if (! NILP (tem))
2501 { 2490 {
2521 Lisp_Object oalist, alist, sym, tem, buffer; 2510 Lisp_Object oalist, alist, sym, tem, buffer;
2522 2511
2523 XSETBUFFER (buffer, b); 2512 XSETBUFFER (buffer, b);
2524 oalist = b->local_var_alist; 2513 oalist = b->local_var_alist;
2525 2514
2526 for (alist = oalist; !NILP (alist); alist = XCDR (alist)) 2515 for (alist = oalist; CONSP (alist); alist = XCDR (alist))
2527 { 2516 {
2528 sym = XCAR (XCAR (alist)); 2517 sym = XCAR (XCAR (alist));
2529 2518
2530 /* Need not do anything if some other buffer's binding is now encached. */ 2519 /* Need not do anything if some other buffer's binding is now encached. */
2531 tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer; 2520 tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer;