diff options
| author | Noam Postavsky | 2015-11-19 19:50:06 -0500 |
|---|---|---|
| committer | Noam Postavsky | 2016-12-02 20:25:14 -0500 |
| commit | 227213164e06363f0a4fb2beeeb647c99749299e (patch) | |
| tree | 8fda48112af0631ce9b6c595e33101a9b5961909 /src/lread.c | |
| parent | 0fc4761ca88175c30da7209c9ab1cde788b66a76 (diff) | |
| download | emacs-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.c | 6 |
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. */ |