Fixed memory leak in ":ownsyntax".
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index fda756f..c57b8d4 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1163,13 +1163,6 @@
A variable name that is preceded with "w:" is local to the current window. It
is deleted when the window is closed.
-One local window variable is predefined:
- *w:ownsyntax-variable* *ownsyntax*
-w:ownsyntax Set to 1 if the window has an independent syntax installed
- via the |:ownsyntax| command. The default for a window is
- 0. Syntax scripts can use this to determine whether they
- should set b:current_syntax or w:current_syntax.
-
*tabpage-variable* *t:var*
A variable name that is preceded with "t:" is local to the current tab page,
It is deleted when the tab page is closed. {not available when compiled
diff --git a/src/eval.c b/src/eval.c
index ca9389f..2e5b876 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3884,11 +3884,6 @@
++hi;
return cat_prefix_varname('w', hi->hi_key);
}
- if (wdone == ht->ht_used)
- {
- ++wdone;
- return (char_u *)"w:ownsyntax";
- }
#ifdef FEAT_WINDOWS
/* t: variables */
@@ -18758,18 +18753,6 @@
tv = &atv;
}
- if (STRCMP(name, "w:ownsyntax") == 0)
- {
- atv.v_type = VAR_NUMBER;
-#ifdef FEAT_SYN_HL
- atv.vval.v_number = (curwin->w_s != &curwin->w_buffer->b_s) ? 1 : 0;
-#else
- atv.vval.v_number = 0;
-#endif
- tv = &atv;
- }
-
-
/*
* Check for user-defined variables.
*/
@@ -19292,6 +19275,7 @@
/*
* Get the string value of a (global/local) variable.
+ * Note: see get_tv_string() for how long the pointer remains valid.
* Returns NULL when it doesn't exist.
*/
char_u *
diff --git a/src/syntax.c b/src/syntax.c
index 370bc76..2b70c6d 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -3537,8 +3537,7 @@
syntax_clear(curwin->w_s);
if (curwin->w_s == &curwin->w_buffer->b_s)
do_unlet((char_u *)"b:current_syntax", TRUE);
- else
- do_unlet((char_u *)"w:current_syntax", TRUE);
+ do_unlet((char_u *)"w:current_syntax", TRUE);
}
}
@@ -6157,6 +6156,9 @@
ex_ownsyntax(eap)
exarg_T *eap;
{
+ char_u *old_value;
+ char_u *new_value;
+
if (curwin->w_s == &curwin->w_buffer->b_s)
{
curwin->w_s = (synblock_T *)alloc(sizeof(synblock_T));
@@ -6170,7 +6172,26 @@
clear_string_option(&curwin->w_s->b_p_spl);
#endif
}
+
+ /* save value of b:current_syntax */
+ old_value = get_var_value((char_u *)"b:current_syntax");
+ if (old_value != NULL)
+ old_value = vim_strsave(old_value);
+
+ /* Apply the "syntax" autocommand event, this finds and loads the syntax
+ * file. */
apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, TRUE, curbuf);
+
+ /* move value of b:current_syntax to w:current_syntax */
+ new_value = get_var_value((char_u *)"b:current_syntax");
+ set_internal_string_var((char_u *)"w:current_syntax", new_value);
+
+ /* restore value of b:current_syntax */
+ if (old_value != NULL)
+ {
+ set_internal_string_var((char_u *)"b:current_syntax", old_value);
+ vim_free(old_value);
+ }
}
int
diff --git a/src/window.c b/src/window.c
index d6aae7c..e878d9f 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4410,7 +4410,10 @@
#ifdef FEAT_SYN_HL
/* free independent synblock */
if (wp->w_s != &wp->w_buffer->b_s)
+ {
+ syntax_clear(wp->w_s);
vim_free(wp->w_s);
+ }
#endif
#ifdef FEAT_AUTOCMD