(5 of 9) Bug#00004 (no corresponding unlet notification and improper use of 'where' for local_if_set buffer local variables that shadow default.) ** Bug recreations are at the end I have included a patch for this bug that applies on top of my four previous submissions in the following email. This bug occurs because an unaccounted for path in do_one_unbind calls set_default_internal. Current regression testing only tests reaching the section of code my patch resides in from a direct call using set-default. I have also included testing that covers all the examples provided in the next email. It was the end of this bug's testing in which I unraveled even more existing bugs in which my work did not already solve. The bug following this required being solved in conjunction with this bug. Bug Recreation------------------------------------------------------------------ ------------------------------------------- - LIS let and set in the same buffer. (shadows default) ------------------------------------------- (defvar-local test 100) test (defvar results nil) results (add-variable-watcher 'test (lambda (&rest args) (push args results))) nil (let ((test 99)) (set 'test 66)) 66 results ((test 100 set nil) (test 66 set #) (test 99 let #)) ;; there should be an unlet and the others should not have a 'where'!!!!!!!!! ;; Every let should have a corresponding unlet so a watcher function can relieve ;; it's activity (if so desired) of watching its variable in a particular buffer ;; and then resume it after the unlet occurs in that particular buffer. ;; Also, in this example the 'let' is acting on the default value as this is a ;; 'let_shadows_default' case. The 'let','set', and 'unlet' all act on the default for ;; all variables that do not have their own value. It should not have a 'where'. ------------------------------------------- - LIS let and set in some buffer. (shadows default) ------------------------------------------- (defvar-local test 5) test (defvar results nil) results (add-variable-watcher 'test (lambda (&rest args) (push args results))) nil (with-temp-buffer (let ((test 99)) (set 'test 66))) 66 results ((test 5 set nil) (test 66 set #) (test 99 let #))