From eba01c49808bb0e8ee36afb6a802bc3e20635c0b Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Fri, 14 May 1993 14:37:53 +0000 Subject: * cmds.c (Fforward_char): Check proposed new position, and then set point, instead of setting point to a potentially invalid position. --- src/cmds.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'src/cmds.c') 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; } -- cgit v1.2.1