From: Stefan Monnier <monnier@IRO.UMontreal.CA>
To: Kelly Dean <kelly@prtime.org>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH] (Updated) Run hook when variable is set
Date: Thu, 05 Feb 2015 08:57:46 -0500 [thread overview]
Message-ID: <jwv8ugc7aaj.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <jVIYuz9HDffV43ipfbBSRnq9w1necVQTP0nWJ3JkwTZ@local> (Kelly Dean's message of "Thu, 05 Feb 2015 03:10:57 +0000")
> I'm unclear on your reason for extending the «constant» field to
> include the «hooked» bit, rather than giving the latter its own name.
I thought it was clear: so that the new feature does not cost anything
as long as you don't use it. I.e. that extends existing tests of
"constant is 0" to mean both "not constant" and "not hooked either".
> Either way, a new bit is needed (I can't fit the meaning of «hooked»
> into «constant»'s current two bits)
Why not? Currently `constant' occupies two bits but is used as
a boolean value. So there's a bit available right there. And if not,
you can add a bit to that field.
> Example usage:
I don't understand your example: what's `varhook'? What's `hook'?
What's `unhook'?
> +INLINE void
> +try_run_varhook (struct Lisp_Symbol* sym, bool buf_local,
> + Dyn_Bind_Direction dir, Lisp_Object value)
> +{
> + if (sym->hooked)
> + run_varhook (sym, buf_local, dir, value);
> +}
The hook should be called *to perform the assignment*, rather than
calling it after performing the assignment ourselves.
And it should not use run_hook* but funcall (i.e. the hook should be
manipulated in Elisp via `add-function' rather than via `add-hook').
> -extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
> - Lisp_Object (*funcall)
> - (ptrdiff_t nargs, Lisp_Object *args));
> +extern Lisp_Object run_hook_with_args (ptrdiff_t, Lisp_Object *,
> + Lisp_Object (*) (ptrdiff_t, Lisp_Object *));
What for?
> if (!sym->constant)
> - SET_SYMBOL_VAL (sym, value);
> + {
> + SET_SYMBOL_VAL (sym, value);
> + try_run_varhook (sym, false, Dyn_Bind, value);
> + }
You just slowed down all the code even if the feature is not used.
I think we can do better.
> if (sym->redirect == SYMBOL_PLAINVAL)
> {
> - SET_SYMBOL_VAL (sym, specpdl_old_value (specpdl_ptr));
> + Lisp_Object oldval = specpdl_old_value (specpdl_ptr);
> + SET_SYMBOL_VAL (sym, oldval);
> + try_run_varhook (sym, false, Dyn_Unbind, oldval);
Same here.
> +run_varhook (struct Lisp_Symbol* sym, bool buf_local, Dyn_Bind_Direction dir,
> + Lisp_Object value)
> +{
> + Lisp_Object hook_and_args[4];
> + if (dir == Dyn_Skip) /* From backtrace_eval_unrewind */
> + return;
Hmm... didn't think of backtrace_eval_unrewind. Indeed, I think we
don't want this to trigger a hook (well, maybe there are cases where
we'd want this, but I don't think the current code can handle it
correctly/safely).
> + hook_and_args[0] = Qvarhook;
> + XSETSYMBOL (hook_and_args[1], sym);
> + switch (dir)
> + {
> + case Dyn_Current:
> + {
> + bool shadowed;
> + if (buf_local)
> + shadowed = let_shadows_buffer_binding_p (sym);
> + else shadowed = let_shadows_global_binding_p (hook_and_args[1]);
> + if (shadowed) hook_and_args[2] = Qdyn_local;
> + else if (buf_local) hook_and_args[2] = Qbuf_local;
> + else hook_and_args[2] = Qglobal;
> + break;
> + }
> + case Dyn_Global:
> + {
> + if (let_shadows_global_binding_p (hook_and_args[1]))
> + hook_and_args[2] = Qinvalid;
> + else hook_and_args[2] = Qglobal;
> + break;
> + }
> + case Dyn_Bind: hook_and_args[2] = Qdyn_bind; break;
> + case Dyn_Unbind: hook_and_args[2] = Qdyn_unbind; break;
> + default: emacs_abort ();
> + }
> + hook_and_args[3] = value;
> + run_hook_with_args (4, hook_and_args, funcall_nil);
I think I'd rather turn `dir' into a Lisp_Object (a symbol) and send
this directly to the hook. And then, if/when needed we can try and
make available to Elisp the functionality of things like
let_shadows_*_binding_p.
BTW in order to keep the performance cost of this patch to a minimum, we
may end up reducing its precision.
> + DEFSYM (Qvarhook, "varhook");
Ah, here it is. Please use a name more along the lines of Elisp style.
E.g. `variable-watch-function'.
> + defsubr (&Shook);
> + defsubr (&Sunhook);
> + defsubr (&Shookedp);
Use less generic names. E.g. `variable-watch-set',
`variable-watch-unset', and `variable-watch-p'.
Stefan
next prev parent reply other threads:[~2015-02-05 13:57 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-20 2:54 Proposal to change cursor appearance to indicate region activation Kelly Dean
2013-04-20 7:23 ` Drew Adams
2015-01-22 5:38 ` [PATCH] " Kelly Dean
2015-01-22 14:25 ` Stefan Monnier
2015-01-23 3:08 ` [PATCH] " Kelly Dean
2015-01-23 4:55 ` Stefan Monnier
2015-01-23 11:07 ` Kelly Dean
2015-01-23 17:49 ` Drew Adams
2015-01-24 3:06 ` Kelly Dean
2015-01-24 4:52 ` Stefan Monnier
2015-01-24 9:22 ` Kelly Dean
2015-01-25 14:29 ` Stefan Monnier
2015-01-28 9:15 ` [PATCH] Run hook when variable is set Kelly Dean
2015-01-28 9:23 ` [PATCH] Proposal to change cursor appearance to indicate region activation Kelly Dean
2015-01-28 11:24 ` David Kastrup
2015-01-28 12:13 ` David Kastrup
2015-01-29 10:46 ` Kelly Dean
2015-01-29 11:16 ` David Kastrup
2015-01-30 7:20 ` Kelly Dean
2015-01-30 9:19 ` David Kastrup
2015-01-30 10:05 ` Kelly Dean
2015-01-30 10:12 ` David Kastrup
2015-01-30 9:43 ` Kelly Dean
2015-01-28 19:25 ` [PATCH] Run hook when variable is set Stefan Monnier
2015-01-29 8:20 ` Kelly Dean
2015-01-29 8:28 ` Lars Ingebrigtsen
2015-01-29 14:58 ` Stefan Monnier
2015-01-30 7:34 ` Kelly Dean
2015-01-30 15:55 ` Stefan Monnier
2015-01-31 9:18 ` Kelly Dean
2015-01-31 20:48 ` Stefan Monnier
2015-02-02 5:40 ` Kelly Dean
2015-02-02 15:57 ` Stefan Monnier
2015-02-03 19:56 ` Kelly Dean
2015-02-03 22:49 ` Stefan Monnier
2015-02-05 3:10 ` [PATCH] (Updated) " Kelly Dean
2015-02-05 13:57 ` Stefan Monnier [this message]
2015-02-06 5:34 ` Kelly Dean
2015-02-06 14:42 ` Stefan Monnier
2015-02-07 12:27 ` Kelly Dean
2015-02-07 15:09 ` Stefan Monnier
2015-02-09 3:24 ` Kelly Dean
2015-02-12 19:58 ` Stefan Monnier
2015-02-13 23:08 ` Kelly Dean
2015-02-14 0:55 ` Stefan Monnier
2015-02-14 22:19 ` Kelly Dean
2015-02-15 20:25 ` Stefan Monnier
2015-02-17 2:22 ` Kelly Dean
2015-02-17 23:07 ` Richard Stallman
2015-02-18 3:19 ` The purpose of makunbound (Was: Run hook when variable is set) Kelly Dean
2015-02-18 5:48 ` The purpose of makunbound Stefan Monnier
2015-02-18 8:51 ` Kelly Dean
2015-02-18 14:34 ` Stefan Monnier
2015-02-18 18:53 ` Kelly Dean
2015-02-18 22:42 ` Stefan Monnier
2015-02-19 10:36 ` Kelly Dean
2015-02-22 0:18 ` Kelly Dean
2015-02-19 10:45 ` Kelly Dean
2015-02-19 13:33 ` Stefan Monnier
2015-02-19 23:51 ` Kelly Dean
2015-02-20 1:59 ` Stefan Monnier
2015-02-20 9:35 ` Kelly Dean
2015-02-20 16:55 ` Stefan Monnier
2015-02-20 2:58 ` Stephen J. Turnbull
2015-02-20 0:56 ` Richard Stallman
2015-02-20 9:02 ` Kelly Dean
2015-02-20 15:41 ` Richard Stallman
2015-02-21 5:45 ` Stephen J. Turnbull
2015-02-22 0:32 ` Kelly Dean
2015-02-22 8:45 ` Andreas Schwab
2015-02-18 5:15 ` [PATCH] (Updated) Run hook when variable is set Kelly Dean
2015-02-18 22:37 ` Stefan Monnier
2015-02-18 22:37 ` Stefan Monnier
2015-02-19 10:35 ` Kelly Dean
2015-02-19 13:30 ` Stefan Monnier
2015-02-20 6:48 ` Kelly Dean
2015-02-20 19:29 ` Stefan Monnier
2015-02-21 14:18 ` Kelly Dean
2015-02-21 20:51 ` Stefan Monnier
2015-02-22 0:32 ` Kelly Dean
2015-02-22 10:40 ` Stephen J. Turnbull
2015-02-22 21:35 ` Stefan Monnier
2015-02-23 3:09 ` Kelly Dean
2015-02-23 4:19 ` Stefan Monnier
2015-02-20 20:27 ` Proposal for debugging/testing option Kelly Dean
2015-02-24 16:28 ` Stefan Monnier
2015-02-14 20:37 ` [PATCH] (Updated) Run hook when variable is set Johan Bockgård
2015-02-15 19:36 ` Stefan Monnier
2015-02-15 19:53 ` Patches: inline vs. attachment, compressed vs. uncompressed. [was: Run hook when variable is set] Alan Mackenzie
2015-02-06 9:55 ` [PATCH] (Updated) Run hook when variable is set Kelly Dean
2015-01-30 23:29 ` [PATCH] " Richard Stallman
2015-01-31 9:23 ` Kelly Dean
2015-01-31 23:16 ` Richard Stallman
2015-02-02 5:41 ` Kelly Dean
2015-02-01 2:04 ` Alexis
2015-02-01 4:05 ` Stefan Monnier
2015-02-01 8:58 ` David Kastrup
2015-01-29 16:06 ` Eli Zaretskii
2015-01-30 7:14 ` Kelly Dean
2015-01-30 9:08 ` Eli Zaretskii
2015-01-23 20:34 ` [PATCH] Proposal to change cursor appearance to indicate region activation Stefan Monnier
2015-01-24 0:25 ` Kelly Dean
2015-01-23 10:01 ` Tassilo Horn
2015-01-23 17:49 ` Drew Adams
2015-01-23 10:06 ` Eli Zaretskii
2015-01-23 11:40 ` Kelly Dean
2015-01-23 11:56 ` Eli Zaretskii
2015-01-22 5:41 ` Kelly Dean
2013-11-23 13:34 ` Stefan Monnier
2013-11-23 20:25 ` Drew Adams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwv8ugc7aaj.fsf-monnier+emacs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
--cc=kelly@prtime.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).