comparison src/data.c @ 29735:ab56f683df46

(set_internal): If variable is frame-local, store the new value immediately into the frame parameter alist.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 19 Jun 2000 12:12:35 +0000
parents e522fcce15e8
children b600a31684db
comparison
equal deleted inserted replaced
29734:afc9d8eb0666 29735:ab56f683df46
1022 struct buffer *buf; 1022 struct buffer *buf;
1023 int bindflag; 1023 int bindflag;
1024 { 1024 {
1025 int voide = EQ (newval, Qunbound); 1025 int voide = EQ (newval, Qunbound);
1026 1026
1027 register Lisp_Object valcontents, tem1, current_alist_element; 1027 register Lisp_Object valcontents, innercontents, tem1, current_alist_element;
1028 1028
1029 if (buf == 0) 1029 if (buf == 0)
1030 buf = current_buffer; 1030 buf = current_buffer;
1031 1031
1032 /* If restoring in a dead buffer, do nothing. */ 1032 /* If restoring in a dead buffer, do nothing. */
1037 if (NILP (symbol) || EQ (symbol, Qt) 1037 if (NILP (symbol) || EQ (symbol, Qt)
1038 || (XSYMBOL (symbol)->name->data[0] == ':' 1038 || (XSYMBOL (symbol)->name->data[0] == ':'
1039 && EQ (XSYMBOL (symbol)->obarray, initial_obarray) 1039 && EQ (XSYMBOL (symbol)->obarray, initial_obarray)
1040 && !EQ (newval, symbol))) 1040 && !EQ (newval, symbol)))
1041 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil)); 1041 return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
1042 valcontents = XSYMBOL (symbol)->value; 1042
1043 innercontents = valcontents = XSYMBOL (symbol)->value;
1043 1044
1044 if (BUFFER_OBJFWDP (valcontents)) 1045 if (BUFFER_OBJFWDP (valcontents))
1045 { 1046 {
1046 int offset = XBUFFER_OBJFWD (valcontents)->offset; 1047 int offset = XBUFFER_OBJFWD (valcontents)->offset;
1047 int idx = PER_BUFFER_IDX (offset); 1048 int idx = PER_BUFFER_IDX (offset);
1128 1129
1129 /* Set `buffer' and `frame' slots for thebinding now loaded. */ 1130 /* Set `buffer' and `frame' slots for thebinding now loaded. */
1130 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf); 1131 XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
1131 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame; 1132 XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
1132 } 1133 }
1133 valcontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue; 1134 innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
1134 } 1135 }
1135 1136
1136 /* If storing void (making the symbol void), forward only through 1137 /* If storing void (making the symbol void), forward only through
1137 buffer-local indicator, not through Lisp_Objfwd, etc. */ 1138 buffer-local indicator, not through Lisp_Objfwd, etc. */
1138 if (voide) 1139 if (voide)
1139 store_symval_forwarding (symbol, Qnil, newval); 1140 store_symval_forwarding (symbol, Qnil, newval);
1140 else 1141 else
1141 store_symval_forwarding (symbol, valcontents, newval); 1142 store_symval_forwarding (symbol, innercontents, newval);
1143
1144 /* If we just set a variable whose current binding is frame-local,
1145 store the new value in the frame parameter too. */
1146
1147 if (BUFFER_LOCAL_VALUEP (valcontents)
1148 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
1149 {
1150 /* What binding is loaded right now? */
1151 current_alist_element
1152 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
1153
1154 /* If the current buffer is not the buffer whose binding is
1155 loaded, or if there may be frame-local bindings and the frame
1156 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
1157 the default binding is loaded, the loaded binding may be the
1158 wrong one. */
1159 if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
1160 XCDR (current_alist_element) = newval;
1161 }
1142 1162
1143 return newval; 1163 return newval;
1144 } 1164 }
1145 1165
1146 /* Access or set a buffer-local symbol's default value. */ 1166 /* Access or set a buffer-local symbol's default value. */