aboutsummaryrefslogtreecommitdiffstats
path: root/src/lread.c
diff options
context:
space:
mode:
authorNoam Postavsky2015-11-19 19:50:06 -0500
committerNoam Postavsky2016-12-02 20:25:14 -0500
commit227213164e06363f0a4fb2beeeb647c99749299e (patch)
tree8fda48112af0631ce9b6c595e33101a9b5961909 /src/lread.c
parent0fc4761ca88175c30da7209c9ab1cde788b66a76 (diff)
downloademacs-227213164e06363f0a4fb2beeeb647c99749299e.tar.gz
emacs-227213164e06363f0a4fb2beeeb647c99749299e.zip
Add lisp watchpoints
This allows calling a function whenever a symbol-value is changed. * src/lisp.h (lisp_h_SYMBOL_TRAPPED_WRITE_P): (SYMBOL_TRAPPED_WRITE_P): New function/macro. (lisp_h_SYMBOL_CONSTANT_P): Check for SYMBOL_NOWRITE specifically. (enum symbol_trapped_write): New enumeration. (struct Lisp_Symbol): Rename field constant to trapped_write. (make_symbol_constant): New function. * src/data.c (Fadd_variable_watcher, Fremove_variable_watcher): (set_symbol_trapped_write, restore_symbol_trapped_write): (harmonize_variable_watchers, notify_variable_watchers): New functions. * src/data.c (Fset_default): Call `notify_variable_watchers' for trapped symbols. (set_internal): Change bool argument BIND to 3-value enum and call `notify_variable_watchers' for trapped symbols. * src/data.c (syms_of_data): * src/data.c (syms_of_data): * src/font.c (syms_of_font): * src/lread.c (intern_sym, init_obarray): * src/buffer.c (syms_of_buffer): Use make_symbol_constant. * src/alloc.c (init_symbol): * src/bytecode.c (exec_byte_code): Use SYMBOL_TRAPPED_WRITE_P. * src/data.c (Fmake_variable_buffer_local, Fmake_local_variable): (Fmake_variable_frame_local): * src/eval.c (Fdefvaralias, specbind): Refer to Lisp_Symbol's trapped_write instead of constant. (Ffuncall): Move subr calling code into separate function. (funcall_subr): New function.
Diffstat (limited to 'src/lread.c')
-rw-r--r--src/lread.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/lread.c b/src/lread.c
index eab9b8bea08..14f9393cc47 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -3833,7 +3833,7 @@ intern_sym (Lisp_Object sym, Lisp_Object obarray, Lisp_Object index)
3833 3833
3834 if (SREF (SYMBOL_NAME (sym), 0) == ':' && EQ (obarray, initial_obarray)) 3834 if (SREF (SYMBOL_NAME (sym), 0) == ':' && EQ (obarray, initial_obarray))
3835 { 3835 {
3836 XSYMBOL (sym)->constant = 1; 3836 make_symbol_constant (sym);
3837 XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL; 3837 XSYMBOL (sym)->redirect = SYMBOL_PLAINVAL;
3838 SET_SYMBOL_VAL (XSYMBOL (sym), sym); 3838 SET_SYMBOL_VAL (XSYMBOL (sym), sym);
3839 } 3839 }
@@ -4120,12 +4120,12 @@ init_obarray (void)
4120 4120
4121 DEFSYM (Qnil, "nil"); 4121 DEFSYM (Qnil, "nil");
4122 SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil); 4122 SET_SYMBOL_VAL (XSYMBOL (Qnil), Qnil);
4123 XSYMBOL (Qnil)->constant = 1; 4123 make_symbol_constant (Qnil);
4124 XSYMBOL (Qnil)->declared_special = true; 4124 XSYMBOL (Qnil)->declared_special = true;
4125 4125
4126 DEFSYM (Qt, "t"); 4126 DEFSYM (Qt, "t");
4127 SET_SYMBOL_VAL (XSYMBOL (Qt), Qt); 4127 SET_SYMBOL_VAL (XSYMBOL (Qt), Qt);
4128 XSYMBOL (Qt)->constant = 1; 4128 make_symbol_constant (Qt);
4129 XSYMBOL (Qt)->declared_special = true; 4129 XSYMBOL (Qt)->declared_special = true;
4130 4130
4131 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */ 4131 /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */