2007-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+ * buffer.c (Fbuffer_local_value): Remove redundant test.
+ (swap_out_buffer_local_variables): Swap out binding in `buffer' rather
+ than in `current-buffer' to match the comment.
+ Do the swap using swap_in_global_binding.
+
* data.c (store_symval_forwarding, set_internal):
* eval.c (specbind): Remove dead code.
CHECK_BUFFER (buffer);
buf = XBUFFER (buffer);
- if (SYMBOLP (variable))
- variable = indirect_variable (variable);
+ variable = indirect_variable (variable);
/* Look in local_var_list */
result = Fassoc (variable, buf->local_var_alist);
/* Need not do anything if some other buffer's binding is now encached. */
tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer;
- if (BUFFERP (tem) && XBUFFER (tem) == current_buffer)
+ if (EQ (tem, buffer))
{
- /* Symbol is set up for this buffer's old local value.
- Set it up for the current buffer with the default value. */
-
- tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->cdr;
- /* Store the symbol's current value into the alist entry
- it is currently set up for. This is so that, if the
- local is marked permanent, and we make it local again
- later in Fkill_all_local_variables, we don't lose the value. */
- XSETCDR (XCAR (tem),
- do_symval_forwarding (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue));
- /* Switch to the symbol's default-value alist entry. */
- XSETCAR (tem, tem);
- /* Mark it as current for buffer B. */
- XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer = buffer;
- /* Store the current value into any forwarding in the symbol. */
- store_symval_forwarding (sym,
- XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue,
- XCDR (tem), NULL);
+ /* Symbol is set up for this buffer's old local value:
+ swap it out! */
+ swap_in_global_binding (sym);
}
}
}