summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-05-12 15:38:26 +0200
committerBram Moolenaar <Bram@vim.org>2018-05-12 15:38:26 +0200
commitb0f42ba60d9e6d101d103421ba0c351811615c15 (patch)
tree083b82fcd12fc95a90d779898a6a2b9939ef7837 /src/eval.c
parentff3be4fe1e2e723de48b826cb992c798e296c41e (diff)
patch 8.0.1817: a timer may change v:count unexpectedlyv8.0.1817
Problem: A timer may change v:count unexpectedly. Solution: Save and restore v:count and similar variables when a timer callback is invoked. (closes #2897)
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/eval.c b/src/eval.c
index 63f8bde329..b787474d10 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -6462,6 +6462,29 @@ set_vcount(
}
/*
+ * Save variables that might be changed as a side effect. Used when executing
+ * a timer callback.
+ */
+ void
+save_vimvars(vimvars_save_T *vvsave)
+{
+ vvsave->vv_prevcount = vimvars[VV_PREVCOUNT].vv_nr;
+ vvsave->vv_count = vimvars[VV_COUNT].vv_nr;
+ vvsave->vv_count1 = vimvars[VV_COUNT1].vv_nr;
+}
+
+/*
+ * Restore variables saved by save_vimvars().
+ */
+ void
+restore_vimvars(vimvars_save_T *vvsave)
+{
+ vimvars[VV_PREVCOUNT].vv_nr = vvsave->vv_prevcount;
+ vimvars[VV_COUNT].vv_nr = vvsave->vv_count;
+ vimvars[VV_COUNT1].vv_nr = vvsave->vv_count1;
+}
+
+/*
* Set string v: variable to a copy of "val".
*/
void