diff options
author | Jim Blandy <jimb@redhat.com> | 1993-05-14 14:37:53 +0000 |
---|---|---|
committer | Jim Blandy <jimb@redhat.com> | 1993-05-14 14:37:53 +0000 |
commit | 7b502dc3262f5d1a710048f50e30a0d822421864 (patch) | |
tree | 7a3705025941ebdf89132b88f746c5c14ebd1bb3 /src/cmds.c | |
parent | 52f8ec734ea9baabbbb91c773964f435b152105f (diff) | |
download | emacs-7b502dc3262f5d1a710048f50e30a0d822421864.tar.gz |
* cmds.c (Fforward_char): Check proposed new position, and then
set point, instead of setting point to a potentially invalid
position.
Diffstat (limited to 'src/cmds.c')
-rw-r--r-- | src/cmds.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/cmds.c b/src/cmds.c index e81d7c61e59..ed150f7d5d3 100644 --- a/src/cmds.c +++ b/src/cmds.c @@ -41,17 +41,28 @@ On reaching end of buffer, stop and signal error.") else CHECK_NUMBER (n, 0); - SET_PT (point + XINT (n)); - if (point < BEGV) - { - SET_PT (BEGV); - Fsignal (Qbeginning_of_buffer, Qnil); - } - if (point > ZV) - { - SET_PT (ZV); - Fsignal (Qend_of_buffer, Qnil); - } + /* This used to just set point to point + XINT (n), and then check + to see if it was within boundaries. But now that SET_PT can + potentially do a lot of stuff (calling entering and exiting + hooks, etcetera), that's not a good approach. So we validate the + proposed position, then set point. */ + { + int new_point = point + XINT (n); + + if (new_point < BEGV) + { + SET_PT (BEGV); + Fsignal (Qbeginning_of_buffer, Qnil); + } + if (new_point > ZV) + { + SET_PT (ZV); + Fsignal (Qend_of_buffer, Qnil); + } + + SET_PT (new_point); + } + return Qnil; } |