patchlevel 1000

This commit is contained in:
Karsten Hopp 2013-05-22 14:13:12 +02:00
parent 5357f602ce
commit ae61a4312d
15 changed files with 6930 additions and 2 deletions

55
7.3.1000 Normal file
View File

@ -0,0 +1,55 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.1000
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.1000 (whoa!)
Problem: Typo in char value causes out of bounds access.
Solution: Fix character value. (Klemens Baum)
Files: src/regexp.c
*** ../vim-7.3.999/src/regexp.c 2013-05-21 00:02:54.000000000 +0200
--- src/regexp.c 2013-05-21 21:25:58.000000000 +0200
***************
*** 6899,6905 ****
{
decomp_T d;
! if (c >= 0x4b20 && c <= 0xfb4f)
{
d = decomp_table[c - 0xfb20];
*c1 = d.a;
--- 6899,6905 ----
{
decomp_T d;
! if (c >= 0xfb20 && c <= 0xfb4f)
{
d = decomp_table[c - 0xfb20];
*c1 = d.a;
*** ../vim-7.3.999/src/version.c 2013-05-21 21:20:16.000000000 +0200
--- src/version.c 2013-05-21 21:22:14.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 1000,
/**/
--
ARTHUR: The swallow may fly south with the sun, or the house martin or the
plover seek warmer hot lands in winter, yet these are not strangers to
our land.
SOLDIER: Are you suggesting coconuts migrate?
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

50
7.3.988 Normal file
View File

@ -0,0 +1,50 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.988
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.988
Problem: New regexp engine is slow.
Solution: Break out of the loop when the state list is empty.
Files: src/regexp_nfa.c
*** ../vim-7.3.987/src/regexp_nfa.c 2013-05-21 12:43:52.000000000 +0200
--- src/regexp_nfa.c 2013-05-21 14:01:33.000000000 +0200
***************
*** 2951,2956 ****
--- 2951,2961 ----
#ifdef NFA_REGEXP_DEBUG_LOG
fprintf(debug, "\n-------------------\n");
#endif
+ /*
+ * If the state lists are empty we can stop.
+ */
+ if (thislist->n == 0 && neglist->n == 0)
+ break;
/* compute nextlist */
for (i = 0; i < thislist->n || neglist->n > 0; ++i)
*** ../vim-7.3.987/src/version.c 2013-05-21 13:30:17.000000000 +0200
--- src/version.c 2013-05-21 14:02:12.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 988,
/**/
--
The chat program is in public domain. This is not the GNU public license.
If it breaks then you get to keep both pieces.
-- Copyright notice for the chat program
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

67
7.3.989 Normal file
View File

@ -0,0 +1,67 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.989
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.989
Problem: New regexp engine compares negative numbers to character.
Solution: Add missing case statements.
Files: src/regexp_nfa.c
*** ../vim-7.3.988/src/regexp_nfa.c 2013-05-21 14:02:55.000000000 +0200
--- src/regexp_nfa.c 2013-05-21 15:31:47.000000000 +0200
***************
*** 3383,3390 ****
--- 3383,3412 ----
ADD_POS_NEG_STATE(t->state);
break;
+ case NFA_MOPEN + 0:
+ case NFA_MOPEN + 1:
+ case NFA_MOPEN + 2:
+ case NFA_MOPEN + 3:
+ case NFA_MOPEN + 4:
+ case NFA_MOPEN + 5:
+ case NFA_MOPEN + 6:
+ case NFA_MOPEN + 7:
+ case NFA_MOPEN + 8:
+ case NFA_MOPEN + 9:
+ /* handled below */
+ break;
+
+ case NFA_SKIP_CHAR:
+ case NFA_ZSTART:
+ /* TODO: should not happen? */
+ break;
+
default: /* regular character */
+ /* TODO: put this in #ifdef later */
+ if (t->state->c < -256)
+ EMSGN("INTERNAL: Negative state char: %ld", t->state->c);
result = (no_Magic(t->state->c) == c);
+
if (!result)
result = ireg_ic == TRUE
&& MB_TOLOWER(t->state->c) == MB_TOLOWER(c);
*** ../vim-7.3.988/src/version.c 2013-05-21 14:02:55.000000000 +0200
--- src/version.c 2013-05-21 15:32:50.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 989,
/**/
--
God made machine language; all the rest is the work of man.
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

305
7.3.990 Normal file
View File

@ -0,0 +1,305 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.990
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.990
Problem: Memory leak in new regexp engine.
Solution: Jump to end of function to free memory. (Dominique Pelle)
Files: src/regexp_nfa.c
*** ../vim-7.3.989/src/regexp_nfa.c 2013-05-21 15:33:37.000000000 +0200
--- src/regexp_nfa.c 2013-05-21 16:17:15.000000000 +0200
***************
*** 2143,2148 ****
--- 2143,2149 ----
nfa_state_T *s;
nfa_state_T *s1;
nfa_state_T *matchstate;
+ nfa_state_T *ret = NULL;
if (postfix == NULL)
return NULL;
***************
*** 2211,2217 ****
e1 = POP();
s = new_state(NFA_SPLIT, e1.start, e2.start);
if (s == NULL)
! return NULL;
PUSH(frag(s, append(e1.out, e2.out)));
break;
--- 2212,2218 ----
e1 = POP();
s = new_state(NFA_SPLIT, e1.start, e2.start);
if (s == NULL)
! goto theend;
PUSH(frag(s, append(e1.out, e2.out)));
break;
***************
*** 2225,2231 ****
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! return NULL;
patch(e.out, s);
PUSH(frag(s, list1(&s->out1)));
break;
--- 2226,2232 ----
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! goto theend;
patch(e.out, s);
PUSH(frag(s, list1(&s->out1)));
break;
***************
*** 2240,2246 ****
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! return NULL;
PUSH(frag(s, append(e.out, list1(&s->out1))));
break;
--- 2241,2247 ----
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! goto theend;
PUSH(frag(s, append(e.out, list1(&s->out1))));
break;
***************
*** 2254,2260 ****
e = POP();
s = new_state(NFA_SPLIT, NULL, e.start);
if (s == NULL)
! return NULL;
PUSH(frag(s, append(e.out, list1(&s->out))));
break;
--- 2255,2261 ----
e = POP();
s = new_state(NFA_SPLIT, NULL, e.start);
if (s == NULL)
! goto theend;
PUSH(frag(s, append(e.out, list1(&s->out))));
break;
***************
*** 2268,2274 ****
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! return NULL;
patch(e.out, s);
PUSH(frag(e.start, list1(&s->out1)));
break;
--- 2269,2275 ----
e = POP();
s = new_state(NFA_SPLIT, e.start, NULL);
if (s == NULL)
! goto theend;
patch(e.out, s);
PUSH(frag(e.start, list1(&s->out1)));
break;
***************
*** 2283,2289 ****
}
s = new_state(NFA_SKIP_CHAR, NULL, NULL);
if (s == NULL)
! return NULL;
PUSH(frag(s, list1(&s->out)));
break;
--- 2284,2290 ----
}
s = new_state(NFA_SKIP_CHAR, NULL, NULL);
if (s == NULL)
! goto theend;
PUSH(frag(s, list1(&s->out)));
break;
***************
*** 2293,2299 ****
* END_INVISIBLE, similarly to MOPEN.
*/
/* TODO: Maybe this drops the speed? */
! return NULL;
if (nfa_calc_size == TRUE)
{
--- 2294,2300 ----
* END_INVISIBLE, similarly to MOPEN.
*/
/* TODO: Maybe this drops the speed? */
! goto theend;
if (nfa_calc_size == TRUE)
{
***************
*** 2303,2314 ****
e = POP();
s1 = new_state(NFA_END_INVISIBLE, NULL, NULL);
if (s1 == NULL)
! return NULL;
patch(e.out, s1);
s = new_state(NFA_START_INVISIBLE, e.start, s1);
if (s == NULL)
! return NULL;
PUSH(frag(s, list1(&s1->out)));
break;
--- 2304,2315 ----
e = POP();
s1 = new_state(NFA_END_INVISIBLE, NULL, NULL);
if (s1 == NULL)
! goto theend;
patch(e.out, s1);
s = new_state(NFA_START_INVISIBLE, e.start, s1);
if (s == NULL)
! goto theend;
PUSH(frag(s, list1(&s1->out)));
break;
***************
*** 2357,2366 ****
{
s = new_state(mopen, NULL, NULL);
if (s == NULL)
! return NULL;
s1 = new_state(mclose, NULL, NULL);
if (s1 == NULL)
! return NULL;
patch(list1(&s->out), s1);
PUSH(frag(s, list1(&s1->out)));
break;
--- 2358,2367 ----
{
s = new_state(mopen, NULL, NULL);
if (s == NULL)
! goto theend;
s1 = new_state(mclose, NULL, NULL);
if (s1 == NULL)
! goto theend;
patch(list1(&s->out), s1);
PUSH(frag(s, list1(&s1->out)));
break;
***************
*** 2371,2381 ****
e = POP();
s = new_state(mopen, e.start, NULL); /* `(' */
if (s == NULL)
! return NULL;
s1 = new_state(mclose, NULL, NULL); /* `)' */
if (s1 == NULL)
! return NULL;
patch(e.out, s1);
if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING)
--- 2372,2382 ----
e = POP();
s = new_state(mopen, e.start, NULL); /* `(' */
if (s == NULL)
! goto theend;
s1 = new_state(mclose, NULL, NULL); /* `)' */
if (s1 == NULL)
! goto theend;
patch(e.out, s1);
if (mopen == NFA_MULTIBYTE || mopen == NFA_COMPOSING)
***************
*** 2397,2403 ****
}
s = new_state(*p, NULL, NULL);
if (s == NULL)
! return NULL;
PUSH(frag(s, list1(&s->out)));
break;
--- 2398,2404 ----
}
s = new_state(*p, NULL, NULL);
if (s == NULL)
! goto theend;
PUSH(frag(s, list1(&s->out)));
break;
***************
*** 2408,2414 ****
if (nfa_calc_size == TRUE)
{
nstate++;
! return NULL; /* Return value when counting size is ignored anyway */
}
e = POP();
--- 2409,2415 ----
if (nfa_calc_size == TRUE)
{
nstate++;
! goto theend; /* Return value when counting size is ignored anyway */
}
e = POP();
***************
*** 2418,2431 ****
if (istate >= nstate)
EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA "));
- vim_free(stack);
-
matchstate = &state_ptr[istate++]; /* the match state */
matchstate->c = NFA_MATCH;
matchstate->out = matchstate->out1 = NULL;
patch(e.out, matchstate);
! return e.start;
#undef POP1
#undef PUSH1
--- 2419,2434 ----
if (istate >= nstate)
EMSG_RET_NULL(_("E876: (NFA regexp) Not enough space to store the whole NFA "));
matchstate = &state_ptr[istate++]; /* the match state */
matchstate->c = NFA_MATCH;
matchstate->out = matchstate->out1 = NULL;
patch(e.out, matchstate);
! ret = e.start;
!
! theend:
! vim_free(stack);
! return ret;
#undef POP1
#undef PUSH1
*** ../vim-7.3.989/src/version.c 2013-05-21 15:33:37.000000000 +0200
--- src/version.c 2013-05-21 16:18:03.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 990,
/**/
--
This message contains 78% recycled characters.
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

745
7.3.991 Normal file
View File

@ -0,0 +1,745 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.991
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.991
Problem: More can be shared by Python 2 and 3.
Solution: Move more stuff to if_py_both. (ZyX)
Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
src/testdir/test87.ok
*** ../vim-7.3.990/src/if_py_both.h 2013-05-17 21:20:13.000000000 +0200
--- src/if_py_both.h 2013-05-21 18:07:46.000000000 +0200
***************
*** 30,35 ****
--- 30,38 ----
#define INVALID_WINDOW_VALUE ((win_T *)(-1))
#define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1))
+ typedef void (*rangeinitializer)(void *);
+ typedef void (*runner)(const char *, void *, PyGILState_STATE *);
+
static int ConvertFromPyObject(PyObject *, typval_T *);
static int _ConvertFromPyObject(PyObject *, typval_T *, PyObject *);
static PyObject *WindowNew(win_T *, tabpage_T *);
***************
*** 39,44 ****
--- 42,49 ----
static PyInt RangeStart;
static PyInt RangeEnd;
+ static PyObject *globals;
+
/*
* obtain a lock on the Vim data structures
*/
***************
*** 1296,1302 ****
FunctionObject *this = (FunctionObject *) (self);
func_unref(this->name);
! PyMem_Del(this->name);
DESTRUCTOR_FINISH(self);
}
--- 1301,1307 ----
FunctionObject *this = (FunctionObject *) (self);
func_unref(this->name);
! PyMem_Free(this->name);
DESTRUCTOR_FINISH(self);
}
***************
*** 3432,3437 ****
--- 3437,3562 ----
}
static void
+ init_range_cmd(exarg_T *eap)
+ {
+ RangeStart = eap->line1;
+ RangeEnd = eap->line2;
+ }
+
+ static void
+ init_range_eval(typval_T *rettv UNUSED)
+ {
+ RangeStart = (PyInt) curwin->w_cursor.lnum;
+ RangeEnd = RangeStart;
+ }
+
+ static void
+ run_cmd(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate UNUSED)
+ {
+ PyRun_SimpleString((char *) cmd);
+ }
+
+ static const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n ";
+ static int code_hdr_len = 30;
+
+ static void
+ run_do(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate)
+ {
+ PyInt lnum;
+ size_t len;
+ char *code;
+ int status;
+ PyObject *pyfunc, *pymain;
+
+ if (u_save(RangeStart - 1, RangeEnd + 1) != OK)
+ {
+ EMSG(_("cannot save undo information"));
+ return;
+ }
+
+ len = code_hdr_len + STRLEN(cmd);
+ code = PyMem_New(char, len + 1);
+ memcpy(code, code_hdr, code_hdr_len);
+ STRCPY(code + code_hdr_len, cmd);
+ status = PyRun_SimpleString(code);
+ PyMem_Free(code);
+
+ if (status)
+ {
+ EMSG(_("failed to run the code"));
+ return;
+ }
+
+ status = 0;
+ pymain = PyImport_AddModule("__main__");
+ pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC);
+ PyGILState_Release(*pygilstate);
+
+ for (lnum = RangeStart; lnum <= RangeEnd; ++lnum)
+ {
+ PyObject *line, *linenr, *ret;
+
+ *pygilstate = PyGILState_Ensure();
+ if (!(line = GetBufferLine(curbuf, lnum)))
+ goto err;
+ if (!(linenr = PyInt_FromLong((long) lnum)))
+ {
+ Py_DECREF(line);
+ goto err;
+ }
+ ret = PyObject_CallFunctionObjArgs(pyfunc, line, linenr, NULL);
+ Py_DECREF(line);
+ Py_DECREF(linenr);
+ if (!ret)
+ goto err;
+
+ if (ret != Py_None)
+ if (SetBufferLine(curbuf, lnum, ret, NULL) == FAIL)
+ goto err;
+
+ Py_XDECREF(ret);
+ PythonIO_Flush();
+ PyGILState_Release(*pygilstate);
+ }
+ goto out;
+ err:
+ *pygilstate = PyGILState_Ensure();
+ PyErr_PrintEx(0);
+ PythonIO_Flush();
+ status = 1;
+ out:
+ if (!status)
+ *pygilstate = PyGILState_Ensure();
+ Py_DECREF(pyfunc);
+ PyObject_SetAttrString(pymain, DOPY_FUNC, NULL);
+ if (status)
+ return;
+ check_cursor();
+ update_curbuf(NOT_VALID);
+ }
+
+ static void
+ run_eval(const char *cmd, typval_T *rettv, PyGILState_STATE *pygilstate UNUSED)
+ {
+ PyObject *r;
+
+ r = PyRun_String((char *) cmd, Py_eval_input, globals, globals);
+ if (r == NULL)
+ {
+ if (PyErr_Occurred() && !msg_silent)
+ PyErr_PrintEx(0);
+ EMSG(_("E858: Eval did not return a valid python object"));
+ }
+ else
+ {
+ if (ConvertFromPyObject(r, rettv) == -1)
+ EMSG(_("E859: Failed to convert returned python object to vim value"));
+ Py_DECREF(r);
+ }
+ PyErr_Clear();
+ }
+
+ static void
set_ref_in_py(const int copyID)
{
pylinkedlist_T *cur;
*** ../vim-7.3.990/src/if_python3.c 2013-05-17 16:39:59.000000000 +0200
--- src/if_python3.c 2013-05-21 18:07:39.000000000 +0200
***************
*** 703,710 ****
* Internal function prototypes.
*/
- static PyObject *globals;
-
static int PythonIO_Init(void);
static PyObject *Py3Init_vim(void);
--- 703,708 ----
***************
*** 827,833 ****
* External interface
*/
static void
! DoPy3Command(exarg_T *eap, const char *cmd, typval_T *rettv)
{
#if defined(MACOS) && !defined(MACOS_X_UNIX)
GrafPtr oldPort;
--- 825,831 ----
* External interface
*/
static void
! DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
{
#if defined(MACOS) && !defined(MACOS_X_UNIX)
GrafPtr oldPort;
***************
*** 848,863 ****
if (Python3_Init())
goto theend;
! if (rettv == NULL)
! {
! RangeStart = eap->line1;
! RangeEnd = eap->line2;
! }
! else
! {
! RangeStart = (PyInt) curwin->w_cursor.lnum;
! RangeEnd = RangeStart;
! }
Python_Release_Vim(); /* leave vim */
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
--- 846,853 ----
if (Python3_Init())
goto theend;
! init_range(arg);
!
Python_Release_Vim(); /* leave vim */
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
***************
*** 881,908 ****
(char *)ENC_OPT, CODEC_ERROR_HANDLER);
cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER);
Py_XDECREF(cmdstr);
- if (rettv == NULL)
- PyRun_SimpleString(PyBytes_AsString(cmdbytes));
- else
- {
- PyObject *r;
! r = PyRun_String(PyBytes_AsString(cmdbytes), Py_eval_input,
! globals, globals);
! if (r == NULL)
! {
! if (PyErr_Occurred() && !msg_silent)
! PyErr_PrintEx(0);
! EMSG(_("E860: Eval did not return a valid python 3 object"));
! }
! else
! {
! if (ConvertFromPyObject(r, rettv) == -1)
! EMSG(_("E861: Failed to convert returned python 3 object to vim value"));
! Py_DECREF(r);
! }
! PyErr_Clear();
! }
Py_XDECREF(cmdbytes);
PyGILState_Release(pygilstate);
--- 871,878 ----
(char *)ENC_OPT, CODEC_ERROR_HANDLER);
cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER);
Py_XDECREF(cmdstr);
! run(PyBytes_AsString(cmdbytes), arg, &pygilstate);
Py_XDECREF(cmdbytes);
PyGILState_Release(pygilstate);
***************
*** 936,945 ****
script = script_get(eap, eap->arg);
if (!eap->skip)
{
! if (script == NULL)
! DoPy3Command(eap, (char *)eap->arg, NULL);
! else
! DoPy3Command(eap, (char *)script, NULL);
}
vim_free(script);
}
--- 906,915 ----
script = script_get(eap, eap->arg);
if (!eap->skip)
{
! DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
! (rangeinitializer) init_range_cmd,
! (runner) run_cmd,
! (void *) eap);
}
vim_free(script);
}
***************
*** 1000,1100 ****
/* Execute the file */
! DoPy3Command(eap, buffer, NULL);
}
void
ex_py3do(exarg_T *eap)
{
! linenr_T i;
! const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n ";
! const char *s = (const char *) eap->arg;
! size_t len;
! char *code;
! int status;
! PyObject *pyfunc, *pymain;
! PyGILState_STATE pygilstate;
!
! if (Python3_Init())
! goto theend;
!
! if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
! {
! EMSG(_("cannot save undo information"));
! return;
! }
! len = strlen(code_hdr) + strlen(s);
! code = malloc(len + 1);
! STRCPY(code, code_hdr);
! STRNCAT(code, s, len + 1);
! pygilstate = PyGILState_Ensure();
! status = PyRun_SimpleString(code);
! vim_free(code);
! if (status)
! {
! EMSG(_("failed to run the code"));
! return;
! }
! status = 0; /* good */
! pymain = PyImport_AddModule("__main__");
! pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC);
! PyGILState_Release(pygilstate);
!
! for (i = eap->line1; i <= eap->line2; i++)
! {
! const char *line;
! PyObject *pyline, *pylinenr, *pyret, *pybytes;
!
! line = (char *)ml_get(i);
! pygilstate = PyGILState_Ensure();
! pyline = PyUnicode_Decode(line, strlen(line),
! (char *)ENC_OPT, CODEC_ERROR_HANDLER);
! pylinenr = PyLong_FromLong(i);
! pyret = PyObject_CallFunctionObjArgs(pyfunc, pyline, pylinenr, NULL);
! Py_DECREF(pyline);
! Py_DECREF(pylinenr);
! if (!pyret)
! {
! PyErr_PrintEx(0);
! PythonIO_Flush();
! status = 1;
! goto out;
! }
!
! if (pyret && pyret != Py_None)
! {
! if (!PyUnicode_Check(pyret))
! {
! EMSG(_("E863: return value must be an instance of str"));
! Py_XDECREF(pyret);
! status = 1;
! goto out;
! }
! pybytes = PyUnicode_AsEncodedString(pyret,
! (char *)ENC_OPT, CODEC_ERROR_HANDLER);
! ml_replace(i, (char_u *) PyBytes_AsString(pybytes), 1);
! Py_DECREF(pybytes);
! changed();
! #ifdef SYNTAX_HL
! syn_changed(i); /* recompute syntax hl. for this line */
! #endif
! }
! Py_XDECREF(pyret);
! PythonIO_Flush();
! PyGILState_Release(pygilstate);
! }
! pygilstate = PyGILState_Ensure();
! out:
! Py_DECREF(pyfunc);
! PyObject_SetAttrString(pymain, DOPY_FUNC, NULL);
! PyGILState_Release(pygilstate);
! if (status)
! return;
! check_cursor();
! update_curbuf(NOT_VALID);
!
! theend:
! return;
}
/******************************************************
--- 970,988 ----
/* Execute the file */
! DoPyCommand(buffer,
! (rangeinitializer) init_range_cmd,
! (runner) run_cmd,
! (void *) eap);
}
void
ex_py3do(exarg_T *eap)
{
! DoPyCommand((char *)eap->arg,
! (rangeinitializer)init_range_cmd,
! (runner)run_do,
! (void *)eap);
}
/******************************************************
***************
*** 1790,1796 ****
void
do_py3eval (char_u *str, typval_T *rettv)
{
! DoPy3Command(NULL, (char *) str, rettv);
switch(rettv->v_type)
{
case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
--- 1678,1687 ----
void
do_py3eval (char_u *str, typval_T *rettv)
{
! DoPyCommand((char *) str,
! (rangeinitializer) init_range_eval,
! (runner) run_eval,
! (void *) rettv);
switch(rettv->v_type)
{
case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
*** ../vim-7.3.990/src/if_python.c 2013-05-17 16:39:59.000000000 +0200
--- src/if_python.c 2013-05-21 18:07:11.000000000 +0200
***************
*** 659,666 ****
* Internal function prototypes.
*/
- static PyObject *globals;
-
static void PythonIO_Flush(void);
static int PythonIO_Init(void);
static int PythonMod_Init(void);
--- 659,664 ----
***************
*** 828,834 ****
* External interface
*/
static void
! DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv)
{
#ifndef PY_CAN_RECURSE
static int recursive = 0;
--- 826,832 ----
* External interface
*/
static void
! DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
{
#ifndef PY_CAN_RECURSE
static int recursive = 0;
***************
*** 861,876 ****
if (Python_Init())
goto theend;
! if (rettv == NULL)
! {
! RangeStart = eap->line1;
! RangeEnd = eap->line2;
! }
! else
! {
! RangeStart = (PyInt) curwin->w_cursor.lnum;
! RangeEnd = RangeStart;
! }
Python_Release_Vim(); /* leave vim */
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
--- 859,866 ----
if (Python_Init())
goto theend;
! init_range(arg);
!
Python_Release_Vim(); /* leave vim */
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
***************
*** 892,918 ****
Python_RestoreThread(); /* enter python */
#endif
! if (rettv == NULL)
! PyRun_SimpleString((char *)(cmd));
! else
! {
! PyObject *r;
!
! r = PyRun_String((char *)(cmd), Py_eval_input, globals, globals);
! if (r == NULL)
! {
! if (PyErr_Occurred() && !msg_silent)
! PyErr_PrintEx(0);
! EMSG(_("E858: Eval did not return a valid python object"));
! }
! else
! {
! if (ConvertFromPyObject(r, rettv) == -1)
! EMSG(_("E859: Failed to convert returned python object to vim value"));
! Py_DECREF(r);
! }
! PyErr_Clear();
! }
#ifdef PY_CAN_RECURSE
PyGILState_Release(pygilstate);
--- 882,888 ----
Python_RestoreThread(); /* enter python */
#endif
! run((char *) cmd, arg, &pygilstate);
#ifdef PY_CAN_RECURSE
PyGILState_Release(pygilstate);
***************
*** 952,961 ****
script = script_get(eap, eap->arg);
if (!eap->skip)
{
! if (script == NULL)
! DoPythonCommand(eap, (char *)eap->arg, NULL);
! else
! DoPythonCommand(eap, (char *)script, NULL);
}
vim_free(script);
}
--- 922,931 ----
script = script_get(eap, eap->arg);
if (!eap->skip)
{
! DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
! (rangeinitializer) init_range_cmd,
! (runner) run_cmd,
! (void *) eap);
}
vim_free(script);
}
***************
*** 1001,1094 ****
*p++ = '\0';
/* Execute the file */
! DoPythonCommand(eap, buffer, NULL);
}
void
ex_pydo(exarg_T *eap)
{
! linenr_T i;
! const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n ";
! const char *s = (const char *) eap->arg;
! size_t len;
! char *code;
! int status;
! PyObject *pyfunc, *pymain;
! PyGILState_STATE pygilstate;
!
! if (Python_Init())
! return;
!
! if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
! {
! EMSG(_("cannot save undo information"));
! return;
! }
! len = strlen(code_hdr) + strlen(s);
! code = malloc(len + 1);
! STRCPY(code, code_hdr);
! STRNCAT(code, s, len + 1);
! pygilstate = PyGILState_Ensure();
! status = PyRun_SimpleString(code);
! vim_free(code);
! if (status)
! {
! EMSG(_("failed to run the code"));
! return;
! }
! status = 0; /* good */
! pymain = PyImport_AddModule("__main__");
! pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC);
! PyGILState_Release(pygilstate);
!
! for (i = eap->line1; i <= eap->line2; i++)
! {
! const char *line;
! PyObject *pyline, *pylinenr, *pyret;
!
! line = (char *)ml_get(i);
! pygilstate = PyGILState_Ensure();
! pyline = PyString_FromStringAndSize(line, strlen(line));
! pylinenr = PyLong_FromLong(i);
! pyret = PyObject_CallFunctionObjArgs(pyfunc, pyline, pylinenr, NULL);
! Py_DECREF(pyline);
! Py_DECREF(pylinenr);
! if (!pyret)
! {
! PyErr_PrintEx(0);
! PythonIO_Flush();
! status = 1;
! goto out;
! }
!
! if (pyret && pyret != Py_None)
! {
! if (!PyString_Check(pyret))
! {
! EMSG(_("E863: return value must be an instance of str"));
! Py_XDECREF(pyret);
! status = 1;
! goto out;
! }
! ml_replace(i, (char_u *) PyString_AsString(pyret), 1);
! changed();
! #ifdef SYNTAX_HL
! syn_changed(i); /* recompute syntax hl. for this line */
! #endif
! }
! Py_XDECREF(pyret);
! PythonIO_Flush();
! PyGILState_Release(pygilstate);
! }
! pygilstate = PyGILState_Ensure();
! out:
! Py_DECREF(pyfunc);
! PyObject_SetAttrString(pymain, DOPY_FUNC, NULL);
! PyGILState_Release(pygilstate);
! if (status)
! return;
! check_cursor();
! update_curbuf(NOT_VALID);
}
/******************************************************
--- 971,989 ----
*p++ = '\0';
/* Execute the file */
! DoPyCommand(buffer,
! (rangeinitializer) init_range_cmd,
! (runner) run_cmd,
! (void *) eap);
}
void
ex_pydo(exarg_T *eap)
{
! DoPyCommand((char *)eap->arg,
! (rangeinitializer) init_range_cmd,
! (runner)run_do,
! (void *)eap);
}
/******************************************************
***************
*** 1525,1531 ****
void
do_pyeval (char_u *str, typval_T *rettv)
{
! DoPythonCommand(NULL, (char *) str, rettv);
switch(rettv->v_type)
{
case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
--- 1420,1429 ----
void
do_pyeval (char_u *str, typval_T *rettv)
{
! DoPyCommand((char *) str,
! (rangeinitializer) init_range_eval,
! (runner) run_eval,
! (void *) rettv);
switch(rettv->v_type)
{
case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
*** ../vim-7.3.990/src/testdir/test87.ok 2013-05-17 16:18:27.000000000 +0200
--- src/testdir/test87.ok 2013-05-21 17:59:56.000000000 +0200
***************
*** 59,68 ****
['c', 1]
['d', ['e']]
0.0
! "\0": Vim(let):E861:
! {"\0": 1}: Vim(let):E861:
undefined_name: Vim(let):Trace
! vim: Vim(let):E861:
[1]
[1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
Abc
--- 59,68 ----
['c', 1]
['d', ['e']]
0.0
! "\0": Vim(let):E859:
! {"\0": 1}: Vim(let):E859:
undefined_name: Vim(let):Trace
! vim: Vim(let):E859:
[1]
[1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
Abc
*** ../vim-7.3.990/src/version.c 2013-05-21 16:28:05.000000000 +0200
--- src/version.c 2013-05-21 18:19:20.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 991,
/**/
--
Mynd you, m00se bites Kan be pretty nasti ...
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

2719
7.3.992 Normal file

File diff suppressed because it is too large Load Diff

248
7.3.993 Normal file
View File

@ -0,0 +1,248 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.993
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.993
Problem: Python: Later patch does things slightly differently.
Solution: Adjusted argument type changes. (ZyX)
Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
*** ../vim-7.3.992/src/if_py_both.h 2013-05-21 18:30:29.000000000 +0200
--- src/if_py_both.h 2013-05-21 18:42:28.000000000 +0200
***************
*** 220,226 ****
}
static PyObject *
! OutputFlush(PyObject *self UNUSED)
{
/* do nothing */
Py_INCREF(Py_None);
--- 220,226 ----
}
static PyObject *
! OutputFlush(PyObject *self UNUSED, PyObject *args UNUSED)
{
/* do nothing */
Py_INCREF(Py_None);
***************
*** 230,240 ****
/***************/
static struct PyMethodDef OutputMethods[] = {
! /* name, function, calling, doc */
! {"write", (PyCFunction)OutputWrite, METH_VARARGS, ""},
! {"writelines", (PyCFunction)OutputWritelines, METH_VARARGS, ""},
! {"flush", (PyCFunction)OutputFlush, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL}
};
static OutputObject Output =
--- 230,240 ----
/***************/
static struct PyMethodDef OutputMethods[] = {
! /* name, function, calling, doc */
! {"write", (PyCFunction)OutputWrite, 1, ""},
! {"writelines", (PyCFunction)OutputWritelines, 1, ""},
! {"flush", (PyCFunction)OutputFlush, 1, ""},
! { NULL, NULL, 0, NULL}
};
static OutputObject Output =
***************
*** 533,544 ****
*/
static struct PyMethodDef VimMethods[] = {
! /* name, function, calling, documentation */
! {"command", VimCommand, METH_VARARGS, "Execute a Vim ex-mode command" },
! {"eval", VimEval, METH_VARARGS, "Evaluate an expression using Vim evaluator" },
! {"bindeval", VimEvalPy, METH_VARARGS, "Like eval(), but returns objects attached to vim ones"},
! {"strwidth", VimStrwidth, METH_VARARGS, "Screen string width, counts <Tab> as having width 1"},
! { NULL, NULL, 0, NULL }
};
/*
--- 533,544 ----
*/
static struct PyMethodDef VimMethods[] = {
! /* name, function, calling, documentation */
! {"command", VimCommand, 1, "Execute a Vim ex-mode command" },
! {"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" },
! {"bindeval", VimEvalPy, 1, "Like eval(), but returns objects attached to vim ones"},
! {"strwidth", VimStrwidth, 1, "Screen string width, counts <Tab> as having width 1"},
! { NULL, NULL, 0, NULL }
};
/*
***************
*** 868,875 ****
};
static struct PyMethodDef DictionaryMethods[] = {
! {"keys", (PyCFunction)DictionaryListKeys, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL }
};
static PyTypeObject ListType;
--- 868,875 ----
};
static struct PyMethodDef DictionaryMethods[] = {
! {"keys", (PyCFunction)DictionaryListKeys, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL }
};
static PyTypeObject ListType;
***************
*** 1248,1255 ****
}
static struct PyMethodDef ListMethods[] = {
! {"extend", (PyCFunction)ListConcatInPlace, METH_O, ""},
! { NULL, NULL, 0, NULL }
};
typedef struct
--- 1248,1255 ----
}
static struct PyMethodDef ListMethods[] = {
! {"extend", (PyCFunction)ListConcatInPlace, METH_O, ""},
! { NULL, NULL, 0, NULL }
};
typedef struct
***************
*** 1349,1356 ****
}
static struct PyMethodDef FunctionMethods[] = {
! {"__call__", (PyCFunction)FunctionCall, METH_VARARGS|METH_KEYWORDS, ""},
! { NULL, NULL, 0, NULL}
};
/*
--- 1349,1356 ----
}
static struct PyMethodDef FunctionMethods[] = {
! {"__call__", (PyCFunction)FunctionCall, METH_VARARGS|METH_KEYWORDS, ""},
! { NULL, NULL, 0, NULL }
};
/*
***************
*** 2960,2968 ****
}
static struct PyMethodDef RangeMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)RangeAppend, METH_VARARGS, "Append data to the Vim range" },
! { NULL, NULL, 0, NULL }
};
static PyTypeObject BufferType;
--- 2960,2968 ----
}
static struct PyMethodDef RangeMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)RangeAppend, 1, "Append data to the Vim range" },
! { NULL, NULL, 0, NULL }
};
static PyTypeObject BufferType;
***************
*** 3146,3159 ****
}
static struct PyMethodDef BufferMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)BufferAppend, METH_VARARGS, "Append data to Vim buffer" },
! {"mark", (PyCFunction)BufferMark, METH_VARARGS, "Return (row,col) representing position of named mark" },
! {"range", (PyCFunction)BufferRange, METH_VARARGS, "Return a range object which represents the part of the given buffer between line numbers s and e" },
#if PY_VERSION_HEX >= 0x03000000
! {"__dir__", (PyCFunction)BufferDir, METH_NOARGS, "List buffer attributes" },
#endif
! { NULL, NULL, 0, NULL }
};
/*
--- 3146,3159 ----
}
static struct PyMethodDef BufferMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)BufferAppend, 1, "Append data to Vim buffer" },
! {"mark", (PyCFunction)BufferMark, 1, "Return (row,col) representing position of named mark" },
! {"range", (PyCFunction)BufferRange, 1, "Return a range object which represents the part of the given buffer between line numbers s and e" },
#if PY_VERSION_HEX >= 0x03000000
! {"__dir__", (PyCFunction)BufferDir, 4, "List its attributes" },
#endif
! { NULL, NULL, 0, NULL }
};
/*
*** ../vim-7.3.992/src/if_python3.c 2013-05-21 18:30:29.000000000 +0200
--- src/if_python3.c 2013-05-21 18:42:28.000000000 +0200
***************
*** 666,672 ****
return PyType_GenericAlloc(type,nitems);
}
! static PyObject *BufferDir(PyObject *);
static PyObject *OutputGetattro(PyObject *, PyObject *);
static int OutputSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *BufferGetattro(PyObject *, PyObject *);
--- 666,672 ----
return PyType_GenericAlloc(type,nitems);
}
! static PyObject *BufferDir(PyObject *, PyObject *);
static PyObject *OutputGetattro(PyObject *, PyObject *);
static int OutputSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *BufferGetattro(PyObject *, PyObject *);
***************
*** 1091,1097 ****
}
static PyObject *
! BufferDir(PyObject *self UNUSED)
{
return Py_BuildValue("[sssss]", "name", "number",
"append", "mark", "range");
--- 1091,1097 ----
}
static PyObject *
! BufferDir(PyObject *self UNUSED, PyObject *args UNUSED)
{
return Py_BuildValue("[sssss]", "name", "number",
"append", "mark", "range");
*** ../vim-7.3.992/src/version.c 2013-05-21 18:30:29.000000000 +0200
--- src/version.c 2013-05-21 18:46:51.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 993,
/**/
--
How come wrong numbers are never busy?
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

249
7.3.994 Normal file
View File

@ -0,0 +1,249 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.994
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.994
Problem: Python: using magic constants.
Solution: Use descriptive values for ml_flags. (ZyX)
Files: src/if_py_both.h, src/if_python3.c
*** ../vim-7.3.993/src/if_py_both.h 2013-05-21 18:47:17.000000000 +0200
--- src/if_py_both.h 2013-05-21 18:51:12.000000000 +0200
***************
*** 220,226 ****
}
static PyObject *
! OutputFlush(PyObject *self UNUSED, PyObject *args UNUSED)
{
/* do nothing */
Py_INCREF(Py_None);
--- 220,226 ----
}
static PyObject *
! OutputFlush(PyObject *self UNUSED)
{
/* do nothing */
Py_INCREF(Py_None);
***************
*** 230,240 ****
/***************/
static struct PyMethodDef OutputMethods[] = {
! /* name, function, calling, doc */
! {"write", (PyCFunction)OutputWrite, 1, ""},
! {"writelines", (PyCFunction)OutputWritelines, 1, ""},
! {"flush", (PyCFunction)OutputFlush, 1, ""},
! { NULL, NULL, 0, NULL}
};
static OutputObject Output =
--- 230,240 ----
/***************/
static struct PyMethodDef OutputMethods[] = {
! /* name, function, calling, doc */
! {"write", (PyCFunction)OutputWrite, METH_VARARGS, ""},
! {"writelines", (PyCFunction)OutputWritelines, METH_VARARGS, ""},
! {"flush", (PyCFunction)OutputFlush, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL}
};
static OutputObject Output =
***************
*** 533,544 ****
*/
static struct PyMethodDef VimMethods[] = {
! /* name, function, calling, documentation */
! {"command", VimCommand, 1, "Execute a Vim ex-mode command" },
! {"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" },
! {"bindeval", VimEvalPy, 1, "Like eval(), but returns objects attached to vim ones"},
! {"strwidth", VimStrwidth, 1, "Screen string width, counts <Tab> as having width 1"},
! { NULL, NULL, 0, NULL }
};
/*
--- 533,544 ----
*/
static struct PyMethodDef VimMethods[] = {
! /* name, function, calling, documentation */
! {"command", VimCommand, METH_VARARGS, "Execute a Vim ex-mode command" },
! {"eval", VimEval, METH_VARARGS, "Evaluate an expression using Vim evaluator" },
! {"bindeval", VimEvalPy, METH_VARARGS, "Like eval(), but returns objects attached to vim ones"},
! {"strwidth", VimStrwidth, METH_VARARGS, "Screen string width, counts <Tab> as having width 1"},
! { NULL, NULL, 0, NULL }
};
/*
***************
*** 868,875 ****
};
static struct PyMethodDef DictionaryMethods[] = {
! {"keys", (PyCFunction)DictionaryListKeys, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL }
};
static PyTypeObject ListType;
--- 868,875 ----
};
static struct PyMethodDef DictionaryMethods[] = {
! {"keys", (PyCFunction)DictionaryListKeys, METH_NOARGS, ""},
! { NULL, NULL, 0, NULL }
};
static PyTypeObject ListType;
***************
*** 1248,1255 ****
}
static struct PyMethodDef ListMethods[] = {
! {"extend", (PyCFunction)ListConcatInPlace, METH_O, ""},
! { NULL, NULL, 0, NULL }
};
typedef struct
--- 1248,1255 ----
}
static struct PyMethodDef ListMethods[] = {
! {"extend", (PyCFunction)ListConcatInPlace, METH_O, ""},
! { NULL, NULL, 0, NULL }
};
typedef struct
***************
*** 1349,1356 ****
}
static struct PyMethodDef FunctionMethods[] = {
! {"__call__", (PyCFunction)FunctionCall, METH_VARARGS|METH_KEYWORDS, ""},
! { NULL, NULL, 0, NULL }
};
/*
--- 1349,1356 ----
}
static struct PyMethodDef FunctionMethods[] = {
! {"__call__", (PyCFunction)FunctionCall, METH_VARARGS|METH_KEYWORDS, ""},
! { NULL, NULL, 0, NULL}
};
/*
***************
*** 2960,2968 ****
}
static struct PyMethodDef RangeMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)RangeAppend, 1, "Append data to the Vim range" },
! { NULL, NULL, 0, NULL }
};
static PyTypeObject BufferType;
--- 2960,2968 ----
}
static struct PyMethodDef RangeMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)RangeAppend, METH_VARARGS, "Append data to the Vim range" },
! { NULL, NULL, 0, NULL }
};
static PyTypeObject BufferType;
***************
*** 3146,3159 ****
}
static struct PyMethodDef BufferMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)BufferAppend, 1, "Append data to Vim buffer" },
! {"mark", (PyCFunction)BufferMark, 1, "Return (row,col) representing position of named mark" },
! {"range", (PyCFunction)BufferRange, 1, "Return a range object which represents the part of the given buffer between line numbers s and e" },
#if PY_VERSION_HEX >= 0x03000000
! {"__dir__", (PyCFunction)BufferDir, 4, "List its attributes" },
#endif
! { NULL, NULL, 0, NULL }
};
/*
--- 3146,3159 ----
}
static struct PyMethodDef BufferMethods[] = {
! /* name, function, calling, documentation */
! {"append", (PyCFunction)BufferAppend, METH_VARARGS, "Append data to Vim buffer" },
! {"mark", (PyCFunction)BufferMark, METH_VARARGS, "Return (row,col) representing position of named mark" },
! {"range", (PyCFunction)BufferRange, METH_VARARGS, "Return a range object which represents the part of the given buffer between line numbers s and e" },
#if PY_VERSION_HEX >= 0x03000000
! {"__dir__", (PyCFunction)BufferDir, METH_NOARGS, "List buffer attributes" },
#endif
! { NULL, NULL, 0, NULL }
};
/*
*** ../vim-7.3.993/src/if_python3.c 2013-05-21 18:47:17.000000000 +0200
--- src/if_python3.c 2013-05-21 18:51:12.000000000 +0200
***************
*** 666,672 ****
return PyType_GenericAlloc(type,nitems);
}
! static PyObject *BufferDir(PyObject *, PyObject *);
static PyObject *OutputGetattro(PyObject *, PyObject *);
static int OutputSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *BufferGetattro(PyObject *, PyObject *);
--- 666,672 ----
return PyType_GenericAlloc(type,nitems);
}
! static PyObject *BufferDir(PyObject *);
static PyObject *OutputGetattro(PyObject *, PyObject *);
static int OutputSetattro(PyObject *, PyObject *, PyObject *);
static PyObject *BufferGetattro(PyObject *, PyObject *);
***************
*** 1091,1097 ****
}
static PyObject *
! BufferDir(PyObject *self UNUSED, PyObject *args UNUSED)
{
return Py_BuildValue("[sssss]", "name", "number",
"append", "mark", "range");
--- 1091,1097 ----
}
static PyObject *
! BufferDir(PyObject *self UNUSED)
{
return Py_BuildValue("[sssss]", "name", "number",
"append", "mark", "range");
*** ../vim-7.3.993/src/version.c 2013-05-21 18:47:17.000000000 +0200
--- src/version.c 2013-05-21 18:51:33.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 994,
/**/
--
It might look like I'm doing nothing, but at the cellular level
I'm really quite busy.
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

512
7.3.995 Normal file
View File

@ -0,0 +1,512 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.995
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.995
Problem: Python: Module initialization is duplicated.
Solution: Move to shared file. (ZyX)
Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
*** ../vim-7.3.994/src/if_py_both.h 2013-05-21 19:01:51.000000000 +0200
--- src/if_py_both.h 2013-05-21 19:07:17.000000000 +0200
***************
*** 4181,4183 ****
--- 4181,4295 ----
vimmodule.m_methods = VimMethods;
#endif
}
+
+ #define PYTYPE_READY(type) \
+ if (PyType_Ready(&type)) \
+ return -1;
+
+ static int
+ init_types()
+ {
+ PYTYPE_READY(IterType);
+ PYTYPE_READY(BufferType);
+ PYTYPE_READY(RangeType);
+ PYTYPE_READY(WindowType);
+ PYTYPE_READY(TabPageType);
+ PYTYPE_READY(BufMapType);
+ PYTYPE_READY(WinListType);
+ PYTYPE_READY(TabListType);
+ PYTYPE_READY(CurrentType);
+ PYTYPE_READY(DictionaryType);
+ PYTYPE_READY(ListType);
+ PYTYPE_READY(FunctionType);
+ PYTYPE_READY(OptionsType);
+ PYTYPE_READY(OutputType);
+ return 0;
+ }
+
+ static BufMapObject TheBufferMap =
+ {
+ PyObject_HEAD_INIT(&BufMapType)
+ };
+
+ static WinListObject TheWindowList =
+ {
+ PyObject_HEAD_INIT(&WinListType)
+ NULL
+ };
+
+ static CurrentObject TheCurrent =
+ {
+ PyObject_HEAD_INIT(&CurrentType)
+ };
+
+ static TabListObject TheTabPageList =
+ {
+ PyObject_HEAD_INIT(&TabListType)
+ };
+
+ static struct numeric_constant {
+ char *name;
+ int value;
+ } numeric_constants[] = {
+ {"VAR_LOCKED", VAR_LOCKED},
+ {"VAR_FIXED", VAR_FIXED},
+ {"VAR_SCOPE", VAR_SCOPE},
+ {"VAR_DEF_SCOPE", VAR_DEF_SCOPE},
+ };
+
+ static struct object_constant {
+ char *name;
+ PyObject *value;
+ } object_constants[] = {
+ {"buffers", (PyObject *)(void *)&TheBufferMap},
+ {"windows", (PyObject *)(void *)&TheWindowList},
+ {"tabpages", (PyObject *)(void *)&TheTabPageList},
+ {"current", (PyObject *)(void *)&TheCurrent},
+ };
+
+ typedef int (*object_adder)(PyObject *, const char *, PyObject *);
+
+ #define ADD_OBJECT(m, name, obj) \
+ if (add_object(m, name, obj)) \
+ return -1;
+
+ #define ADD_CHECKED_OBJECT(m, name, obj) \
+ { \
+ PyObject *value = obj; \
+ if (!value) \
+ return -1; \
+ ADD_OBJECT(m, name, value); \
+ }
+
+ static int
+ populate_module(PyObject *m, object_adder add_object)
+ {
+ int i;
+
+ for (i = 0; i < (int)(sizeof(numeric_constants)
+ / sizeof(struct numeric_constant));
+ ++i)
+ ADD_CHECKED_OBJECT(m, numeric_constants[i].name,
+ PyInt_FromLong(numeric_constants[i].value));
+
+ for (i = 0; i < (int)(sizeof(object_constants)
+ / sizeof(struct object_constant));
+ ++i)
+ {
+ PyObject *value;
+
+ value = object_constants[i].value;
+ Py_INCREF(value);
+ ADD_OBJECT(m, object_constants[i].name, value);
+ }
+
+ if (!(VimError = PyErr_NewException("vim.error", NULL, NULL)))
+ return -1;
+ ADD_OBJECT(m, "error", VimError);
+
+ ADD_CHECKED_OBJECT(m, "vars", DictionaryNew(&globvardict));
+ ADD_CHECKED_OBJECT(m, "vvars", DictionaryNew(&vimvardict));
+ ADD_CHECKED_OBJECT(m, "options",
+ OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL));
+ return 0;
+ }
*** ../vim-7.3.994/src/if_python3.c 2013-05-21 19:01:51.000000000 +0200
--- src/if_python3.c 2013-05-21 19:07:40.000000000 +0200
***************
*** 700,706 ****
* Internal function prototypes.
*/
- static int PythonIO_Init(void);
static PyObject *Py3Init_vim(void);
/******************************************************
--- 700,705 ----
***************
*** 780,786 ****
get_py3_exceptions();
#endif
! if (PythonIO_Init())
goto fail;
globals = PyModule_GetDict(PyImport_AddModule("__main__"));
--- 779,785 ----
get_py3_exceptions();
#endif
! if (PythonIO_Init_io())
goto fail;
globals = PyModule_GetDict(PyImport_AddModule("__main__"));
***************
*** 811,817 ****
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
--- 810,816 ----
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init_io() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
***************
*** 1008,1022 ****
return OutputSetattr((OutputObject *)(self), name, val);
}
- /***************/
-
- static int
- PythonIO_Init(void)
- {
- PyType_Ready(&OutputType);
- return PythonIO_Init_io();
- }
-
/******************************************************
* 3. Implementation of the Vim module for Python
*/
--- 1007,1012 ----
***************
*** 1538,1585 ****
}
#endif
- static BufMapObject TheBufferMap =
- {
- PyObject_HEAD_INIT(&BufMapType)
- };
-
- static WinListObject TheWindowList =
- {
- PyObject_HEAD_INIT(&WinListType)
- NULL
- };
-
- static CurrentObject TheCurrent =
- {
- PyObject_HEAD_INIT(&CurrentType)
- };
-
- static TabListObject TheTabPageList =
- {
- PyObject_HEAD_INIT(&TabListType)
- };
-
static PyObject *
Py3Init_vim(void)
{
PyObject *mod;
! PyObject *tmp;
/* The special value is removed from sys.path in Python3_Init(). */
static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
! PyType_Ready(&IterType);
! PyType_Ready(&BufferType);
! PyType_Ready(&RangeType);
! PyType_Ready(&WindowType);
! PyType_Ready(&TabPageType);
! PyType_Ready(&BufMapType);
! PyType_Ready(&WinListType);
! PyType_Ready(&TabListType);
! PyType_Ready(&CurrentType);
! PyType_Ready(&DictionaryType);
! PyType_Ready(&ListType);
! PyType_Ready(&FunctionType);
! PyType_Ready(&OptionsType);
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
--- 1528,1543 ----
}
#endif
static PyObject *
Py3Init_vim(void)
{
PyObject *mod;
!
/* The special value is removed from sys.path in Python3_Init(). */
static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
! if (init_types())
! return NULL;
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
***************
*** 1588,1622 ****
if (mod == NULL)
return NULL;
! VimError = PyErr_NewException("vim.error", NULL, NULL);
!
! Py_INCREF(VimError);
! PyModule_AddObject(mod, "error", VimError);
! Py_INCREF((PyObject *)(void *)&TheBufferMap);
! PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferMap);
! Py_INCREF((PyObject *)(void *)&TheCurrent);
! PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent);
! Py_INCREF((PyObject *)(void *)&TheWindowList);
! PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
! Py_INCREF((PyObject *)(void *)&TheTabPageList);
! PyModule_AddObject(mod, "tabpages", (PyObject *)(void *)&TheTabPageList);
!
! PyModule_AddObject(mod, "vars", DictionaryNew(&globvardict));
! PyModule_AddObject(mod, "vvars", DictionaryNew(&vimvardict));
! PyModule_AddObject(mod, "options",
! OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL));
!
! #define ADD_INT_CONSTANT(name, value) \
! tmp = PyLong_FromLong(value); \
! Py_INCREF(tmp); \
! PyModule_AddObject(mod, name, tmp)
!
! ADD_INT_CONSTANT("VAR_LOCKED", VAR_LOCKED);
! ADD_INT_CONSTANT("VAR_FIXED", VAR_FIXED);
! ADD_INT_CONSTANT("VAR_SCOPE", VAR_SCOPE);
! ADD_INT_CONSTANT("VAR_DEF_SCOPE", VAR_DEF_SCOPE);
!
! if (PyErr_Occurred())
return NULL;
return mod;
--- 1546,1552 ----
if (mod == NULL)
return NULL;
! if (populate_module(mod, PyModule_AddObject))
return NULL;
return mod;
*** ../vim-7.3.994/src/if_python.c 2013-05-21 18:30:29.000000000 +0200
--- src/if_python.c 2013-05-21 19:07:26.000000000 +0200
***************
*** 657,663 ****
* Internal function prototypes.
*/
- static int PythonIO_Init(void);
static int PythonMod_Init(void);
--- 657,662 ----
***************
*** 772,778 ****
get_exceptions();
#endif
! if (PythonIO_Init())
goto fail;
if (PythonMod_Init())
--- 771,777 ----
get_exceptions();
#endif
! if (PythonIO_Init_io())
goto fail;
if (PythonMod_Init())
***************
*** 806,812 ****
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
--- 805,811 ----
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init_io() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
***************
*** 993,1009 ****
return Py_FindMethod(OutputMethods, self, name);
}
- /***************/
-
- static int
- PythonIO_Init(void)
- {
- /* Fixups... */
- PyType_Ready(&OutputType);
-
- return PythonIO_Init_io();
- }
-
/******************************************************
* 3. Implementation of the Vim module for Python
*/
--- 992,997 ----
***************
*** 1242,1288 ****
}
#endif
! static BufMapObject TheBufferMap =
! {
! PyObject_HEAD_INIT(&BufMapType)
! };
!
! static WinListObject TheWindowList =
! {
! PyObject_HEAD_INIT(&WinListType)
! NULL
! };
!
! static CurrentObject TheCurrent =
! {
! PyObject_HEAD_INIT(&CurrentType)
! };
!
! static TabListObject TheTabPageList =
{
! PyObject_HEAD_INIT(&TabListType)
! };
static int
PythonMod_Init(void)
{
PyObject *mod;
PyObject *dict;
! PyObject *tmp;
/* The special value is removed from sys.path in Python_Init(). */
static char *(argv[2]) = {"/must>not&exist/foo", NULL};
! /* Fixups... */
! PyType_Ready(&IterType);
! PyType_Ready(&BufferType);
! PyType_Ready(&RangeType);
! PyType_Ready(&WindowType);
! PyType_Ready(&TabPageType);
! PyType_Ready(&BufMapType);
! PyType_Ready(&WinListType);
! PyType_Ready(&TabListType);
! PyType_Ready(&CurrentType);
! PyType_Ready(&OptionsType);
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
--- 1230,1255 ----
}
#endif
! static int
! add_object(PyObject *dict, const char *name, PyObject *object)
{
! if (PyDict_SetItemString(dict, (char *) name, object))
! return -1;
! Py_DECREF(object);
! return 0;
! }
static int
PythonMod_Init(void)
{
PyObject *mod;
PyObject *dict;
!
/* The special value is removed from sys.path in Python_Init(). */
static char *(argv[2]) = {"/must>not&exist/foo", NULL};
! if (init_types())
! return -1;
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
***************
*** 1290,1320 ****
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
dict = PyModule_GetDict(mod);
! VimError = PyErr_NewException("vim.error", NULL, NULL);
!
! PyDict_SetItemString(dict, "error", VimError);
! PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferMap);
! PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
! PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
! PyDict_SetItemString(dict, "tabpages", (PyObject *)(void *)&TheTabPageList);
! tmp = DictionaryNew(&globvardict);
! PyDict_SetItemString(dict, "vars", tmp);
! Py_DECREF(tmp);
! tmp = DictionaryNew(&vimvardict);
! PyDict_SetItemString(dict, "vvars", tmp);
! Py_DECREF(tmp);
! tmp = OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL);
! PyDict_SetItemString(dict, "options", tmp);
! Py_DECREF(tmp);
! PyDict_SetItemString(dict, "VAR_LOCKED", PyInt_FromLong(VAR_LOCKED));
! PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED));
! PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE));
! PyDict_SetItemString(dict, "VAR_DEF_SCOPE", PyInt_FromLong(VAR_DEF_SCOPE));
!
! if (PyErr_Occurred())
! return -1;
!
! return 0;
}
/*************************************************************************
--- 1257,1263 ----
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
dict = PyModule_GetDict(mod);
! return populate_module(dict, add_object);
}
/*************************************************************************
*** ../vim-7.3.994/src/version.c 2013-05-21 19:01:51.000000000 +0200
--- src/version.c 2013-05-21 19:06:22.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 995,
/**/
--
System administrators are just like women: You can't live with them and you
can't live without them.
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

374
7.3.996 Normal file
View File

@ -0,0 +1,374 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.996
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.996
Problem: Python: Can't check types of what is returned by bindeval().
Solution: Add vim.List, vim.Dictionary and vim.Function types. (ZyX)
Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/testdir/test86.in,
src/testdir/test86.ok, src/testdir/test87.in,
src/testdir/test87.ok
*** ../vim-7.3.995/runtime/doc/if_pyth.txt 2013-05-17 16:39:59.000000000 +0200
--- runtime/doc/if_pyth.txt 2013-05-21 19:21:58.000000000 +0200
***************
*** 11,19 ****
3. Buffer objects |python-buffer|
4. Range objects |python-range|
5. Window objects |python-window|
! 6. pyeval(), py3eval() Vim functions |python-pyeval|
! 7. Dynamic loading |python-dynamic|
! 8. Python 3 |python3|
{Vi does not have any of these commands}
--- 11,20 ----
3. Buffer objects |python-buffer|
4. Range objects |python-range|
5. Window objects |python-window|
! 6. Tab page objects |python-tabpage|
! 7. pyeval(), py3eval() Vim functions |python-pyeval|
! 8. Dynamic loading |python-dynamic|
! 9. Python 3 |python3|
{Vi does not have any of these commands}
***************
*** 176,182 ****
list or dictionary. Thus modifications to these objects imply
modifications of the original.
! Additionally, vimlist and vimdictionary type have read-write
`.locked` attribute that returns
Value Meaning ~
zero Variable is not locked
--- 177,183 ----
list or dictionary. Thus modifications to these objects imply
modifications of the original.
! Additionally, vim.List and vim.Dictionary type have read-write
`.locked` attribute that returns
Value Meaning ~
zero Variable is not locked
***************
*** 189,202 ****
case these locks are ignored by anything except |:let|: |extend()|
does not care, neither does python interface).
! Vimdictionary type also supports `.scope` attribute which is one of
Value Meaning ~
zero Dictionary is not a scope one
vim.VAR_DEF_SCOPE Function-local or global scope dictionary
vim.VAR_SCOPE Other scope dictionary
2. if expression evaluates to a function reference, then it returns
! callable vimfunction object. Use self keyword argument to assign
|self| object for dictionary functions.
Note: this function has the same behavior as |lua-eval| (except that
--- 190,204 ----
case these locks are ignored by anything except |:let|: |extend()|
does not care, neither does python interface).
! vim.Dictionary type also supports `.scope` attribute which is one
! of
Value Meaning ~
zero Dictionary is not a scope one
vim.VAR_DEF_SCOPE Function-local or global scope dictionary
vim.VAR_SCOPE Other scope dictionary
2. if expression evaluates to a function reference, then it returns
! callable vim.Function object. Use self keyword argument to assign
|self| object for dictionary functions.
Note: this function has the same behavior as |lua-eval| (except that
***************
*** 205,210 ****
--- 207,216 ----
relying on outputs of vim.eval() being a copy of original or
vim.eval("1") returning a string.
+ You can use "List", "Dictionary" and "Function" vim module attributes
+ to test whether object has given type. These types are currently not
+ subclassable, neither they contain constructors, so you can use them
+ only for checks like `isinstance(obj, vim.List)`.
Error object of the "vim" module
***************
*** 302,307 ****
--- 308,316 ----
buffer-local options and |python-window| objects to access to
window-local options.
+ Type of this object is available via "Options" attribute of vim
+ module.
+
Output from Python *python-output*
Vim displays all Python code output in the Vim message area. Normal
output appears as information messages, and error output appears as
***************
*** 371,376 ****
--- 380,387 ----
A trailing '\n' is allowed and ignored, so that you can do: >
:py b.append(f.readlines())
+ Buffer object type is available using "Buffer" attribute of vim module.
+
Examples (assume b is the current buffer) >
:py print b.name # write the buffer file name
:py b[0] = "hello!!!" # replace the top line
***************
*** 412,417 ****
--- 423,430 ----
for Python's built-in list objects.
r.append(list, nr) Idem, after line "nr"
+ Range object type is available using "Range" attribute of vim module.
+
Example (assume r is the current range):
# Send all lines in a range to the default printer
vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))
***************
*** 456,461 ****
--- 469,476 ----
The height attribute is writable only if the screen is split horizontally.
The width attribute is writable only if the screen is split vertically.
+ Window object type is available using "Window" attribute of vim module.
+
==============================================================================
6. Tab page objects *python-tabpage*
***************
*** 474,487 ****
vars The tab page |t:| variables.
window Current tabpage window.
==============================================================================
! 6. pyeval() and py3eval() Vim functions *python-pyeval*
To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
functions to evaluate Python expressions and pass their values to VimL.
==============================================================================
! 7. Dynamic loading *python-dynamic*
On MS-Windows the Python library can be loaded dynamically. The |:version|
output then includes |+python/dyn|.
--- 489,504 ----
vars The tab page |t:| variables.
window Current tabpage window.
+ TabPage object type is available using "TabPage" attribute of vim module.
+
==============================================================================
! 7. pyeval() and py3eval() Vim functions *python-pyeval*
To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()|
functions to evaluate Python expressions and pass their values to VimL.
==============================================================================
! 8. Dynamic loading *python-dynamic*
On MS-Windows the Python library can be loaded dynamically. The |:version|
output then includes |+python/dyn|.
***************
*** 498,504 ****
sure edit "gvim.exe" and search for "python\d*.dll\c".
==============================================================================
! 8. Python 3 *python3*
*:py3* *:python3*
The `:py3` and `:python3` commands work similar to `:python`. A simple check
--- 515,521 ----
sure edit "gvim.exe" and search for "python\d*.dll\c".
==============================================================================
! 9. Python 3 *python3*
*:py3* *:python3*
The `:py3` and `:python3` commands work similar to `:python`. A simple check
*** ../vim-7.3.995/src/if_py_both.h 2013-05-21 19:10:56.000000000 +0200
--- src/if_py_both.h 2013-05-21 19:21:58.000000000 +0200
***************
*** 4245,4250 ****
--- 4245,4259 ----
{"windows", (PyObject *)(void *)&TheWindowList},
{"tabpages", (PyObject *)(void *)&TheTabPageList},
{"current", (PyObject *)(void *)&TheCurrent},
+
+ {"Buffer", (PyObject *)&BufferType},
+ {"Range", (PyObject *)&RangeType},
+ {"Window", (PyObject *)&WindowType},
+ {"TabPage", (PyObject *)&TabPageType},
+ {"Dictionary", (PyObject *)&DictionaryType},
+ {"List", (PyObject *)&ListType},
+ {"Function", (PyObject *)&FunctionType},
+ {"Options", (PyObject *)&OptionsType},
};
typedef int (*object_adder)(PyObject *, const char *, PyObject *);
*** ../vim-7.3.995/src/testdir/test86.in 2013-05-17 13:37:57.000000000 +0200
--- src/testdir/test86.in 2013-05-21 19:21:58.000000000 +0200
***************
*** 631,640 ****
cb.append('Current line: ' + repr(vim.current.line))
for b in vim.buffers:
if b is not cb:
! vim.command('bwipeout! ' + b.number)
EOF
:tabonly!
:only!
:endfun
:"
:call Test()
--- 631,656 ----
cb.append('Current line: ' + repr(vim.current.line))
for b in vim.buffers:
if b is not cb:
! vim.command('bwipeout! ' + str(b.number))
EOF
:tabonly!
:only!
+ :"
+ :" Test types
+ py << EOF
+ for expr, attr in (
+ ('vim.vars', 'Dictionary'),
+ ('vim.options', 'Options'),
+ ('vim.bindeval("{}")', 'Dictionary'),
+ ('vim.bindeval("[]")', 'List'),
+ ('vim.bindeval("function(\'tr\')")', 'Function'),
+ ('vim.current.buffer', 'Buffer'),
+ ('vim.current.range', 'Range'),
+ ('vim.current.window', 'Window'),
+ ('vim.current.tabpage', 'TabPage'),
+ ):
+ cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
+ EOF
:endfun
:"
:call Test()
*** ../vim-7.3.995/src/testdir/test86.ok 2013-05-17 16:18:27.000000000 +0200
--- src/testdir/test86.ok 2013-05-21 19:21:58.000000000 +0200
***************
*** 333,339 ****
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (954, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
--- 333,339 ----
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (970, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
***************
*** 359,361 ****
--- 359,370 ----
Current window: <window 0>
Current buffer: <buffer test86.in>
Current line: 'Type error at assigning None to vim.current.buffer'
+ vim.vars:Dictionary:True
+ vim.options:Options:True
+ vim.bindeval("{}"):Dictionary:True
+ vim.bindeval("[]"):List:True
+ vim.bindeval("function('tr')"):Function:True
+ vim.current.buffer:Buffer:True
+ vim.current.range:Range:True
+ vim.current.window:Window:True
+ vim.current.tabpage:TabPage:True
*** ../vim-7.3.995/src/testdir/test87.in 2013-05-17 13:37:57.000000000 +0200
--- src/testdir/test87.in 2013-05-21 19:21:58.000000000 +0200
***************
*** 622,627 ****
--- 622,643 ----
EOF
:tabonly!
:only!
+ :"
+ :" Test types
+ py3 << EOF
+ for expr, attr in (
+ ('vim.vars', 'Dictionary'),
+ ('vim.options', 'Options'),
+ ('vim.bindeval("{}")', 'Dictionary'),
+ ('vim.bindeval("[]")', 'List'),
+ ('vim.bindeval("function(\'tr\')")', 'Function'),
+ ('vim.current.buffer', 'Buffer'),
+ ('vim.current.range', 'Range'),
+ ('vim.current.window', 'Window'),
+ ('vim.current.tabpage', 'TabPage'),
+ ):
+ cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
+ EOF
:endfun
:"
:call Test()
*** ../vim-7.3.995/src/testdir/test87.ok 2013-05-21 18:19:33.000000000 +0200
--- src/testdir/test87.ok 2013-05-21 19:21:58.000000000 +0200
***************
*** 322,328 ****
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (930, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
--- 322,328 ----
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (946, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
***************
*** 348,350 ****
--- 348,359 ----
Current window: <window 0>
Current buffer: <buffer test87.in>
Current line: 'Type error at assigning None to vim.current.buffer'
+ vim.vars:Dictionary:True
+ vim.options:Options:True
+ vim.bindeval("{}"):Dictionary:True
+ vim.bindeval("[]"):List:True
+ vim.bindeval("function('tr')"):Function:True
+ vim.current.buffer:Buffer:True
+ vim.current.range:Range:True
+ vim.current.window:Window:True
+ vim.current.tabpage:TabPage:True
*** ../vim-7.3.995/src/version.c 2013-05-21 19:10:56.000000000 +0200
--- src/version.c 2013-05-21 19:48:38.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 996,
/**/
--
SUPERIMPOSE "England AD 787". After a few more seconds we hear hoofbeats in
the distance. They come slowly closer. Then out of the mist comes KING
ARTHUR followed by a SERVANT who is banging two half coconuts together.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

983
7.3.997 Normal file
View File

@ -0,0 +1,983 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.997
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.997
Problem: Vim and Python exceptions are different.
Solution: Make Vim exceptions be Python exceptions. (ZyX)
Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
src/testdir/test87.in, src/testdir/test87.ok
*** ../vim-7.3.996/src/if_py_both.h 2013-05-21 19:49:58.000000000 +0200
--- src/if_py_both.h 2013-05-21 20:35:07.000000000 +0200
***************
*** 272,291 ****
/* Check to see whether a Vim error has been reported, or a keyboard
* interrupt has been detected.
*/
static int
! VimErrorCheck(void)
{
if (got_int)
{
PyErr_SetNone(PyExc_KeyboardInterrupt);
return 1;
}
! else if (did_emsg && !PyErr_Occurred())
{
! PyErr_SetNone(VimError);
return 1;
}
return 0;
}
--- 272,313 ----
/* Check to see whether a Vim error has been reported, or a keyboard
* interrupt has been detected.
*/
+
+ static void
+ VimTryStart(void)
+ {
+ ++trylevel;
+ }
+
static int
! VimTryEnd(void)
{
+ --trylevel;
if (got_int)
{
PyErr_SetNone(PyExc_KeyboardInterrupt);
return 1;
}
! else if (!did_throw)
! return 0;
! else if (PyErr_Occurred())
! return 1;
! else
{
! PyErr_SetVim((char *) current_exception->value);
! discard_current_exception();
return 1;
}
+ }
+ static int
+ VimCheckInterrupt(void)
+ {
+ if (got_int)
+ {
+ PyErr_SetNone(PyExc_KeyboardInterrupt);
+ return 1;
+ }
return 0;
}
***************
*** 306,322 ****
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
do_cmdline_cmd((char_u *)cmd);
update_screen(VALID);
Python_Release_Vim();
Py_END_ALLOW_THREADS
! if (VimErrorCheck())
result = NULL;
else
result = Py_None;
Py_XINCREF(result);
return result;
}
--- 328,346 ----
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
+ VimTryStart();
do_cmdline_cmd((char_u *)cmd);
update_screen(VALID);
Python_Release_Vim();
Py_END_ALLOW_THREADS
! if (VimTryEnd())
result = NULL;
else
result = Py_None;
+
Py_XINCREF(result);
return result;
}
***************
*** 449,459 ****
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
our_tv = eval_expr((char_u *)expr, NULL);
-
Python_Release_Vim();
Py_END_ALLOW_THREADS
if (our_tv == NULL)
{
PyErr_SetVim(_("invalid expression"));
--- 473,486 ----
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
+ VimTryStart();
our_tv = eval_expr((char_u *)expr, NULL);
Python_Release_Vim();
Py_END_ALLOW_THREADS
+ if (VimTryEnd())
+ return NULL;
+
if (our_tv == NULL)
{
PyErr_SetVim(_("invalid expression"));
***************
*** 490,500 ****
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
our_tv = eval_expr((char_u *)expr, NULL);
-
Python_Release_Vim();
Py_END_ALLOW_THREADS
if (our_tv == NULL)
{
PyErr_SetVim(_("invalid expression"));
--- 517,530 ----
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
+ VimTryStart();
our_tv = eval_expr((char_u *)expr, NULL);
Python_Release_Vim();
Py_END_ALLOW_THREADS
+ if (VimTryEnd())
+ return NULL;
+
if (our_tv == NULL)
{
PyErr_SetVim(_("invalid expression"));
***************
*** 1324,1335 ****
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
error = func_call(name, &args, selfdict, &rettv);
Python_Release_Vim();
Py_END_ALLOW_THREADS
! if (error != OK)
{
result = NULL;
PyErr_SetVim(_("failed to run function"));
--- 1354,1368 ----
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
+ VimTryStart();
error = func_call(name, &args, selfdict, &rettv);
Python_Release_Vim();
Py_END_ALLOW_THREADS
! if (VimTryEnd())
! result = NULL;
! else if (error != OK)
{
result = NULL;
PyErr_SetVim(_("failed to run function"));
***************
*** 1486,1499 ****
win_T *save_curwin;
tabpage_T *save_curtab;
buf_T *save_curbuf;
- int r = 0;
switch (opt_type)
{
case SREQ_WIN:
if (switch_win(&save_curwin, &save_curtab, (win_T *)from,
win_find_tabpage((win_T *)from)) == FAIL)
{
PyErr_SetVim("Problem while switching windows.");
return -1;
}
--- 1519,1534 ----
win_T *save_curwin;
tabpage_T *save_curtab;
buf_T *save_curbuf;
+ VimTryStart();
switch (opt_type)
{
case SREQ_WIN:
if (switch_win(&save_curwin, &save_curtab, (win_T *)from,
win_find_tabpage((win_T *)from)) == FAIL)
{
+ if (VimTryEnd())
+ return -1;
PyErr_SetVim("Problem while switching windows.");
return -1;
}
***************
*** 1509,1515 ****
set_option_value(key, numval, stringval, opt_flags);
break;
}
! return r;
}
static int
--- 1544,1550 ----
set_option_value(key, numval, stringval, opt_flags);
break;
}
! return VimTryEnd();
}
static int
***************
*** 1961,1967 ****
}
/* Check for keyboard interrupts */
! if (VimErrorCheck())
return -1;
self->win->w_cursor.lnum = lnum;
--- 1996,2002 ----
}
/* Check for keyboard interrupts */
! if (VimCheckInterrupt())
return -1;
self->win->w_cursor.lnum = lnum;
***************
*** 1988,1998 ****
#endif
savewin = curwin;
curwin = self->win;
win_setheight(height);
curwin = savewin;
!
! /* Check for keyboard interrupts */
! if (VimErrorCheck())
return -1;
return 0;
--- 2023,2033 ----
#endif
savewin = curwin;
curwin = self->win;
+
+ VimTryStart();
win_setheight(height);
curwin = savewin;
! if (VimTryEnd())
return -1;
return 0;
***************
*** 2011,2021 ****
#endif
savewin = curwin;
curwin = self->win;
win_setwidth(width);
curwin = savewin;
!
! /* Check for keyboard interrupts */
! if (VimErrorCheck())
return -1;
return 0;
--- 2046,2056 ----
#endif
savewin = curwin;
curwin = self->win;
+
+ VimTryStart();
win_setwidth(width);
curwin = savewin;
! if (VimTryEnd())
return -1;
return 0;
***************
*** 2304,2309 ****
--- 2339,2346 ----
PyErr_Clear();
switch_buffer(&savebuf, buf);
+ VimTryStart();
+
if (u_savedel((linenr_T)n, 1L) == FAIL)
PyErr_SetVim(_("cannot save undo information"));
else if (ml_delete((linenr_T)n, FALSE) == FAIL)
***************
*** 2317,2323 ****
restore_buffer(savebuf);
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2354,2360 ----
restore_buffer(savebuf);
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2333,2338 ****
--- 2370,2377 ----
if (save == NULL)
return FAIL;
+ VimTryStart();
+
/* We do not need to free "save" if ml_replace() consumes it. */
PyErr_Clear();
switch_buffer(&savebuf, buf);
***************
*** 2356,2362 ****
if (buf == savebuf)
check_cursor_col();
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2395,2401 ----
if (buf == savebuf)
check_cursor_col();
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2395,2400 ****
--- 2434,2440 ----
buf_T *savebuf;
PyErr_Clear();
+ VimTryStart();
switch_buffer(&savebuf, buf);
if (u_savedel((linenr_T)lo, (long)n) == FAIL)
***************
*** 2416,2422 ****
restore_buffer(savebuf);
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2456,2462 ----
restore_buffer(savebuf);
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2459,2464 ****
--- 2499,2505 ----
}
}
+ VimTryStart();
PyErr_Clear();
// START of region without "return". Must call restore_buffer()!
***************
*** 2545,2551 ****
// END of region without "return".
restore_buffer(savebuf);
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2586,2592 ----
// END of region without "return".
restore_buffer(savebuf);
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2583,2588 ****
--- 2624,2630 ----
return FAIL;
PyErr_Clear();
+ VimTryStart();
switch_buffer(&savebuf, buf);
if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
***************
*** 2596,2602 ****
restore_buffer(savebuf);
update_screen(VALID);
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2638,2644 ----
restore_buffer(savebuf);
update_screen(VALID);
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2633,2638 ****
--- 2675,2681 ----
}
PyErr_Clear();
+ VimTryStart();
switch_buffer(&savebuf, buf);
if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
***************
*** 2666,2672 ****
restore_buffer(savebuf);
update_screen(VALID);
! if (PyErr_Occurred() || VimErrorCheck())
return FAIL;
if (len_change)
--- 2709,2715 ----
restore_buffer(savebuf);
update_screen(VALID);
! if (VimTryEnd())
return FAIL;
if (len_change)
***************
*** 2896,2902 ****
static void
RangeDestructor(RangeObject *self)
{
! Py_DECREF(self->buf);
DESTRUCTOR_FINISH(self);
}
--- 2939,2945 ----
static void
RangeDestructor(RangeObject *self)
{
! Py_XDECREF(self->buf);
DESTRUCTOR_FINISH(self);
}
***************
*** 3078,3086 ****
--- 3121,3132 ----
return NULL;
mark = *pmark;
+ VimTryStart();
switch_buffer(&savebuf, self->buf);
posp = getmark(mark, FALSE);
restore_buffer(savebuf);
+ if (VimTryEnd())
+ return NULL;
if (posp == NULL)
{
***************
*** 3088,3097 ****
return NULL;
}
- /* Check for keyboard interrupt */
- if (VimErrorCheck())
- return NULL;
-
if (posp->lnum <= 0)
{
/* Or raise an error? */
--- 3134,3139 ----
***************
*** 3330,3342 ****
return -1;
count = ((BufferObject *)(value))->buf->b_fnum;
if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL)
{
PyErr_SetVim(_("failed to switch to given buffer"));
return -1;
}
! return 0;
}
else if (strcmp(name, "window") == 0)
{
--- 3372,3387 ----
return -1;
count = ((BufferObject *)(value))->buf->b_fnum;
+ VimTryStart();
if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL)
{
+ if (VimTryEnd())
+ return -1;
PyErr_SetVim(_("failed to switch to given buffer"));
return -1;
}
! return VimTryEnd();
}
else if (strcmp(name, "window") == 0)
{
***************
*** 3359,3373 ****
return -1;
}
win_goto(((WindowObject *)(value))->win);
if (((WindowObject *)(value))->win != curwin)
{
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified window"));
return -1;
}
! return 0;
}
else if (strcmp(name, "tabpage") == 0)
{
--- 3404,3421 ----
return -1;
}
+ VimTryStart();
win_goto(((WindowObject *)(value))->win);
if (((WindowObject *)(value))->win != curwin)
{
+ if (VimTryEnd())
+ return -1;
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified window"));
return -1;
}
! return VimTryEnd();
}
else if (strcmp(name, "tabpage") == 0)
{
***************
*** 3380,3394 ****
if (CheckTabPage((TabPageObject *)(value)))
return -1;
goto_tabpage_tp(((TabPageObject *)(value))->tab, TRUE, TRUE);
if (((TabPageObject *)(value))->tab != curtab)
{
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified tab page"));
return -1;
}
! return 0;
}
else
{
--- 3428,3445 ----
if (CheckTabPage((TabPageObject *)(value)))
return -1;
+ VimTryStart();
goto_tabpage_tp(((TabPageObject *)(value))->tab, TRUE, TRUE);
if (((TabPageObject *)(value))->tab != curtab)
{
+ if (VimTryEnd())
+ return -1;
PyErr_SetString(PyExc_RuntimeError,
_("did not switch to the specified tab page"));
return -1;
}
! return VimTryEnd();
}
else
{
*** ../vim-7.3.996/src/testdir/test86.in 2013-05-21 19:49:58.000000000 +0200
--- src/testdir/test86.in 2013-05-21 20:34:32.000000000 +0200
***************
*** 380,399 ****
try:
exec(s, g, l)
except:
! vim.command('throw ' + repr(sys.exc_type.__name__))
def ev(s, g=globals(), l=locals()):
try:
return eval(s, g, l)
except:
! vim.command('throw ' + repr(sys.exc_type.__name__))
return 0
EOF
:function E(s)
: python e(vim.eval('a:s'))
:endfunction
:function Ev(s)
! : return pyeval('ev(vim.eval("a:s"))')
:endfunction
:py gopts1=vim.options
:py wopts1=vim.windows[2].options
--- 380,403 ----
try:
exec(s, g, l)
except:
! vim.command('return ' + repr(sys.exc_type.__name__))
def ev(s, g=globals(), l=locals()):
try:
return eval(s, g, l)
except:
! vim.command('let exc=' + repr(sys.exc_type.__name__))
return 0
EOF
:function E(s)
: python e(vim.eval('a:s'))
:endfunction
:function Ev(s)
! : let r=pyeval('ev(vim.eval("a:s"))')
! : if exists('exc')
! : throw exc
! : endif
! : return r
:endfunction
:py gopts1=vim.options
:py wopts1=vim.windows[2].options
***************
*** 437,463 ****
: catch
: put =' p/'.v.'! '.v:exception
: endtry
! : try
! : call E(v.'["'.oname.'"]=invval')
! : catch
! : put =' inv: '.string(invval).'! '.v:exception
! : endtry
: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
: let val=substitute(vv, '^.opts', 'oval', '')
! : try
! : call E(vv.'["'.oname.'"]='.val)
! : catch
! : put =' '.vv.'! '.v:exception
! : endtry
: endfor
: endfor
: call RecVars(oname)
: for v in ['wopts3', 'bopts3']
! : try
! : call E('del '.v.'["'.oname.'"]')
! : catch
! : put =' del '.v.'! '.v:exception
! : endtry
: endfor
: call RecVars(oname)
:endfor
--- 441,464 ----
: catch
: put =' p/'.v.'! '.v:exception
: endtry
! : let r=E(v.'['''.oname.''']=invval')
! : if r isnot 0
! : put =' inv: '.string(invval).'! '.r
! : endif
: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
: let val=substitute(vv, '^.opts', 'oval', '')
! : let r=E(vv.'['''.oname.''']='.val)
! : if r isnot 0
! : put =' '.vv.'! '.r
! : endif
: endfor
: endfor
: call RecVars(oname)
: for v in ['wopts3', 'bopts3']
! : let r=E('del '.v.'["'.oname.'"]')
! : if r isnot 0
! : put =' del '.v.'! '.r
! : endif
: endfor
: call RecVars(oname)
:endfor
***************
*** 651,656 ****
--- 652,676 ----
):
cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
EOF
+ :"
+ :" Test exceptions
+ :fun Exe(e)
+ : execute a:e
+ :endfun
+ py << EOF
+ def ee(expr, g=globals(), l=locals()):
+ try:
+ exec(expr, g, l)
+ except:
+ cb.append(repr(sys.exc_info()[:2]))
+ Exe = vim.bindeval('function("Exe")')
+ ee('vim.command("throw \'abc\'")')
+ ee('Exe("throw \'def\'")')
+ ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
+ ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
+ ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
+ ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
+ EOF
:endfun
:"
:call Test()
*** ../vim-7.3.996/src/testdir/test86.ok 2013-05-21 19:49:58.000000000 +0200
--- src/testdir/test86.ok 2013-05-21 20:38:29.000000000 +0200
***************
*** 333,339 ****
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (970, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
--- 333,339 ----
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (990, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
***************
*** 368,370 ****
--- 368,376 ----
vim.current.range:Range:True
vim.current.window:Window:True
vim.current.tabpage:TabPage:True
+ (<class 'vim.error'>, error('abc',))
+ (<class 'vim.error'>, error('def',))
+ (<class 'vim.error'>, error('ghi',))
+ (<class 'vim.error'>, error('Vim(echoerr):jkl',))
+ (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',))
+ (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',))
*** ../vim-7.3.996/src/testdir/test87.in 2013-05-21 19:49:58.000000000 +0200
--- src/testdir/test87.in 2013-05-21 20:34:32.000000000 +0200
***************
*** 367,386 ****
try:
exec(s, g, l)
except Exception as e:
! vim.command('throw ' + repr(e.__class__.__name__))
def ev(s, g=globals(), l=locals()):
try:
return eval(s, g, l)
except Exception as e:
! vim.command('throw ' + repr(e.__class__.__name__))
return 0
EOF
:function E(s)
: python3 e(vim.eval('a:s'))
:endfunction
:function Ev(s)
! : return py3eval('ev(vim.eval("a:s"))')
:endfunction
:py3 gopts1=vim.options
:py3 wopts1=vim.windows[2].options
--- 367,390 ----
try:
exec(s, g, l)
except Exception as e:
! vim.command('return ' + repr(e.__class__.__name__))
def ev(s, g=globals(), l=locals()):
try:
return eval(s, g, l)
except Exception as e:
! vim.command('let exc=' + repr(e.__class__.__name__))
return 0
EOF
:function E(s)
: python3 e(vim.eval('a:s'))
:endfunction
:function Ev(s)
! : let r=py3eval('ev(vim.eval("a:s"))')
! : if exists('exc')
! : throw exc
! : endif
! : return r
:endfunction
:py3 gopts1=vim.options
:py3 wopts1=vim.windows[2].options
***************
*** 424,450 ****
: catch
: put =' p/'.v.'! '.v:exception
: endtry
! : try
! : call E(v.'["'.oname.'"]=invval')
! : catch
! : put =' inv: '.string(invval).'! '.v:exception
! : endtry
: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
: let val=substitute(vv, '^.opts', 'oval', '')
! : try
! : call E(vv.'["'.oname.'"]='.val)
! : catch
! : put =' '.vv.'! '.v:exception
! : endtry
: endfor
: endfor
: call RecVars(oname)
: for v in ['wopts3', 'bopts3']
! : try
! : call E('del '.v.'["'.oname.'"]')
! : catch
! : put =' del '.v.'! '.v:exception
! : endtry
: endfor
: call RecVars(oname)
:endfor
--- 428,451 ----
: catch
: put =' p/'.v.'! '.v:exception
: endtry
! : let r=E(v.'['''.oname.''']=invval')
! : if r isnot 0
! : put =' inv: '.string(invval).'! '.r
! : endif
: for vv in (v is# 'gopts1' ? [v] : [v, v[:-2].'2', v[:-2].'3'])
: let val=substitute(vv, '^.opts', 'oval', '')
! : let r=E(vv.'['''.oname.''']='.val)
! : if r isnot 0
! : put =' '.vv.'! '.r
! : endif
: endfor
: endfor
: call RecVars(oname)
: for v in ['wopts3', 'bopts3']
! : let r=E('del '.v.'["'.oname.'"]')
! : if r isnot 0
! : put =' del '.v.'! '.r
! : endif
: endfor
: call RecVars(oname)
:endfor
***************
*** 638,643 ****
--- 639,663 ----
):
cb.append(expr + ':' + attr + ':' + repr(type(eval(expr)) is getattr(vim, attr)))
EOF
+ :"
+ :" Test exceptions
+ :fun Exe(e)
+ : execute a:e
+ :endfun
+ py3 << EOF
+ def ee(expr, g=globals(), l=locals()):
+ try:
+ exec(expr, g, l)
+ except Exception as e:
+ cb.append(repr((e.__class__, e)))
+ Exe = vim.bindeval('function("Exe")')
+ ee('vim.command("throw \'abc\'")')
+ ee('Exe("throw \'def\'")')
+ ee('vim.eval("Exe(\'throw \'\'ghi\'\'\')")')
+ ee('vim.eval("Exe(\'echoerr \'\'jkl\'\'\')")')
+ ee('vim.eval("Exe(\'xxx_non_existent_command_xxx\')")')
+ ee('vim.bindeval("Exe(\'xxx_non_existent_command_xxx\')")')
+ EOF
:endfun
:"
:call Test()
*** ../vim-7.3.996/src/testdir/test87.ok 2013-05-21 19:49:58.000000000 +0200
--- src/testdir/test87.ok 2013-05-21 20:38:46.000000000 +0200
***************
*** 322,328 ****
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (946, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
--- 322,328 ----
Current tab pages:
<tabpage 0>(1): 1 windows, current is <window object (unknown)>
Windows:
! <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (966, 0)
<tabpage 1>(2): 1 windows, current is <window object (unknown)>
Windows:
<window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
***************
*** 357,359 ****
--- 357,365 ----
vim.current.range:Range:True
vim.current.window:Window:True
vim.current.tabpage:TabPage:True
+ (<class 'vim.error'>, error('abc',))
+ (<class 'vim.error'>, error('def',))
+ (<class 'vim.error'>, error('ghi',))
+ (<class 'vim.error'>, error('Vim(echoerr):jkl',))
+ (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',))
+ (<class 'vim.error'>, error('Vim:E492: Not an editor command: xxx_non_existent_command_xxx',))
*** ../vim-7.3.996/src/version.c 2013-05-21 19:49:58.000000000 +0200
--- src/version.c 2013-05-21 20:32:46.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 997,
/**/
--
ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot.
King of all Britons, defeator of the Saxons, sovereign of all England!
[Pause]
SOLDIER: Get away!
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

414
7.3.998 Normal file
View File

@ -0,0 +1,414 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.998
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.998
Problem: Python: garbage collection issues.
Solution: Fix the GC issues: Use proper DESTRUCTOR_FINISH: avoids negative
refcounts, use PyObject_GC_* for objects with tp_traverse and
tp_clear, add RangeTraverse and RangeClear, use Py_XDECREF in some
places. (ZyX)
Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
*** ../vim-7.3.997/src/if_py_both.h 2013-05-21 20:40:35.000000000 +0200
--- src/if_py_both.h 2013-05-21 20:44:44.000000000 +0200
***************
*** 461,467 ****
}
static PyObject *
! VimEval(PyObject *self UNUSED, PyObject *args UNUSED)
{
char *expr;
typval_T *our_tv;
--- 461,467 ----
}
static PyObject *
! VimEval(PyObject *self UNUSED, PyObject *args)
{
char *expr;
typval_T *our_tv;
***************
*** 602,608 ****
{
IterObject *self;
! self = PyObject_NEW(IterObject, &IterType);
self->cur = start;
self->next = next;
self->destruct = destruct;
--- 602,608 ----
{
IterObject *self;
! self = PyObject_GC_New(IterObject, &IterType);
self->cur = start;
self->next = next;
self->destruct = destruct;
***************
*** 615,623 ****
static void
IterDestructor(IterObject *self)
{
self->destruct(self->cur);
!
! DESTRUCTOR_FINISH(self);
}
static int
--- 615,623 ----
static void
IterDestructor(IterObject *self)
{
+ PyObject_GC_UnTrack((void *)(self));
self->destruct(self->cur);
! PyObject_GC_Del((void *)(self));
}
static int
***************
*** 1414,1420 ****
{
OptionsObject *self;
! self = PyObject_NEW(OptionsObject, &OptionsType);
if (self == NULL)
return NULL;
--- 1414,1420 ----
{
OptionsObject *self;
! self = PyObject_GC_New(OptionsObject, &OptionsType);
if (self == NULL)
return NULL;
***************
*** 1431,1439 ****
static void
OptionsDestructor(OptionsObject *self)
{
! if (self->fromObj)
! Py_DECREF(self->fromObj);
! DESTRUCTOR_FINISH(self);
}
static int
--- 1431,1439 ----
static void
OptionsDestructor(OptionsObject *self)
{
! PyObject_GC_UnTrack((void *)(self));
! Py_XDECREF(self->fromObj);
! PyObject_GC_Del((void *)(self));
}
static int
***************
*** 1869,1875 ****
}
else
{
! self = PyObject_NEW(WindowObject, &WindowType);
if (self == NULL)
return NULL;
self->win = win;
--- 1869,1875 ----
}
else
{
! self = PyObject_GC_New(WindowObject, &WindowType);
if (self == NULL)
return NULL;
self->win = win;
***************
*** 1884,1895 ****
static void
WindowDestructor(WindowObject *self)
{
if (self->win && self->win != INVALID_WINDOW_VALUE)
WIN_PYTHON_REF(self->win) = NULL;
! Py_DECREF(((PyObject *)(self->tabObject)));
! DESTRUCTOR_FINISH(self);
}
static win_T *
--- 1884,1908 ----
static void
WindowDestructor(WindowObject *self)
{
+ PyObject_GC_UnTrack((void *)(self));
if (self->win && self->win != INVALID_WINDOW_VALUE)
WIN_PYTHON_REF(self->win) = NULL;
+ Py_XDECREF(((PyObject *)(self->tabObject)));
+ PyObject_GC_Del((void *)(self));
+ }
! static int
! WindowTraverse(WindowObject *self, visitproc visit, void *arg)
! {
! Py_VISIT(((PyObject *)(self->tabObject)));
! return 0;
! }
! static int
! WindowClear(WindowObject *self)
! {
! Py_CLEAR(self->tabObject);
! return 0;
}
static win_T *
***************
*** 1909,1927 ****
else
return firstwin;
}
- static int
- WindowTraverse(WindowObject *self, visitproc visit, void *arg)
- {
- Py_VISIT(((PyObject *)(self->tabObject)));
- return 0;
- }
-
- static int
- WindowClear(WindowObject *self)
- {
- Py_CLEAR(self->tabObject);
- return 0;
- }
static PyObject *
WindowAttr(WindowObject *self, char *name)
--- 1922,1927 ----
***************
*** 2917,2923 ****
{
BufferObject *bufr;
RangeObject *self;
! self = PyObject_NEW(RangeObject, &RangeType);
if (self == NULL)
return NULL;
--- 2917,2923 ----
{
BufferObject *bufr;
RangeObject *self;
! self = PyObject_GC_New(RangeObject, &RangeType);
if (self == NULL)
return NULL;
***************
*** 2939,2946 ****
static void
RangeDestructor(RangeObject *self)
{
Py_XDECREF(self->buf);
! DESTRUCTOR_FINISH(self);
}
static PyInt
--- 2939,2961 ----
static void
RangeDestructor(RangeObject *self)
{
+ PyObject_GC_UnTrack((void *)(self));
Py_XDECREF(self->buf);
! PyObject_GC_Del((void *)(self));
! }
!
! static int
! RangeTraverse(RangeObject *self, visitproc visit, void *arg)
! {
! Py_VISIT(((PyObject *)(self->buf)));
! return 0;
! }
!
! static int
! RangeClear(RangeObject *self)
! {
! Py_CLEAR(self->buf);
! return 0;
}
static PyInt
***************
*** 3267,3280 ****
static int
BufMapIterTraverse(PyObject *buffer, visitproc visit, void *arg)
{
! Py_VISIT(buffer);
return 0;
}
static int
BufMapIterClear(PyObject **buffer)
{
! Py_CLEAR(*buffer);
return 0;
}
--- 3282,3297 ----
static int
BufMapIterTraverse(PyObject *buffer, visitproc visit, void *arg)
{
! if (buffer)
! Py_VISIT(buffer);
return 0;
}
static int
BufMapIterClear(PyObject **buffer)
{
! if (*buffer)
! Py_CLEAR(*buffer);
return 0;
}
***************
*** 4144,4149 ****
--- 4161,4168 ----
RangeType.tp_flags = Py_TPFLAGS_DEFAULT;
RangeType.tp_doc = "vim Range object";
RangeType.tp_methods = RangeMethods;
+ RangeType.tp_traverse = (traverseproc)RangeTraverse;
+ RangeType.tp_clear = (inquiry)RangeClear;
#if PY_MAJOR_VERSION >= 3
RangeType.tp_getattro = (getattrofunc)RangeGetattro;
RangeType.tp_alloc = call_PyType_GenericAlloc;
*** ../vim-7.3.997/src/if_python3.c 2013-05-21 19:10:56.000000000 +0200
--- src/if_python3.c 2013-05-21 20:44:44.000000000 +0200
***************
*** 213,218 ****
--- 213,221 ----
# define PyObject_Malloc py3_PyObject_Malloc
# define PyObject_Free py3_PyObject_Free
# endif
+ # define _PyObject_GC_New py3__PyObject_GC_New
+ # define PyObject_GC_Del py3_PyObject_GC_Del
+ # define PyObject_GC_UnTrack py3_PyObject_GC_UnTrack
# define PyType_GenericAlloc py3_PyType_GenericAlloc
# define PyType_GenericNew py3_PyType_GenericNew
# define PyModule_Create2 py3_PyModule_Create2
***************
*** 334,339 ****
--- 337,345 ----
static void (*py3_PyObject_Free)(void*);
static void* (*py3_PyObject_Malloc)(size_t);
# endif
+ static PyObject*(*py3__PyObject_GC_New)(PyTypeObject *);
+ static void(*py3_PyObject_GC_Del)(void *);
+ static void(*py3_PyObject_GC_UnTrack)(void *);
static int (*py3_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
static HINSTANCE hinstPy3 = 0; /* Instance of python.dll */
***************
*** 463,468 ****
--- 469,477 ----
{"PyObject_Malloc", (PYTHON_PROC*)&py3_PyObject_Malloc},
{"PyObject_Free", (PYTHON_PROC*)&py3_PyObject_Free},
# endif
+ {"_PyObject_GC_New", (PYTHON_PROC*)&py3__PyObject_GC_New},
+ {"PyObject_GC_Del", (PYTHON_PROC*)&py3_PyObject_GC_Del},
+ {"PyObject_GC_UnTrack", (PYTHON_PROC*)&py3_PyObject_GC_UnTrack},
{"PyType_IsSubtype", (PYTHON_PROC*)&py3_PyType_IsSubtype},
{"PyCapsule_New", (PYTHON_PROC*)&py3_PyCapsule_New},
{"PyCapsule_GetPointer", (PYTHON_PROC*)&py3_PyCapsule_GetPointer},
***************
*** 638,644 ****
if (bytes != NULL) \
Py_XDECREF(bytes);
! #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self);
#define WIN_PYTHON_REF(win) win->w_python3_ref
#define BUF_PYTHON_REF(buf) buf->b_python3_ref
--- 647,653 ----
if (bytes != NULL) \
Py_XDECREF(bytes);
! #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self)
#define WIN_PYTHON_REF(win) win->w_python3_ref
#define BUF_PYTHON_REF(buf) buf->b_python3_ref
*** ../vim-7.3.997/src/if_python.c 2013-05-21 19:10:56.000000000 +0200
--- src/if_python.c 2013-05-21 20:44:44.000000000 +0200
***************
*** 224,229 ****
--- 224,232 ----
# define Py_Finalize dll_Py_Finalize
# define Py_IsInitialized dll_Py_IsInitialized
# define _PyObject_New dll__PyObject_New
+ # define _PyObject_GC_New dll__PyObject_GC_New
+ # define PyObject_GC_Del dll_PyObject_GC_Del
+ # define PyObject_GC_UnTrack dll_PyObject_GC_UnTrack
# if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
# define _PyObject_NextNotImplemented (*dll__PyObject_NextNotImplemented)
# endif
***************
*** 331,336 ****
--- 334,342 ----
static void(*dll_Py_Finalize)(void);
static int(*dll_Py_IsInitialized)(void);
static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *);
+ static PyObject*(*dll__PyObject_GC_New)(PyTypeObject *);
+ static void(*dll_PyObject_GC_Del)(void *);
+ static void(*dll_PyObject_GC_UnTrack)(void *);
static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *);
static PyObject* (*dll_PyObject_GetIter)(PyObject *);
static int (*dll_PyObject_IsTrue)(PyObject *);
***************
*** 474,479 ****
--- 480,488 ----
{"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
{"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
{"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New},
+ {"_PyObject_GC_New", (PYTHON_PROC*)&dll__PyObject_GC_New},
+ {"PyObject_GC_Del", (PYTHON_PROC*)&dll_PyObject_GC_Del},
+ {"PyObject_GC_UnTrack", (PYTHON_PROC*)&dll_PyObject_GC_UnTrack},
{"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init},
{"PyObject_GetIter", (PYTHON_PROC*)&dll_PyObject_GetIter},
{"PyObject_IsTrue", (PYTHON_PROC*)&dll_PyObject_IsTrue},
***************
*** 632,638 ****
#define DICTKEY_UNREF
#define DICTKEY_DECL
! #define DESTRUCTOR_FINISH(self) Py_DECREF(self);
#define WIN_PYTHON_REF(win) win->w_python_ref
#define BUF_PYTHON_REF(buf) buf->b_python_ref
--- 641,647 ----
#define DICTKEY_UNREF
#define DICTKEY_DECL
! #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self);
#define WIN_PYTHON_REF(win) win->w_python_ref
#define BUF_PYTHON_REF(buf) buf->b_python_ref
*** ../vim-7.3.997/src/version.c 2013-05-21 20:40:35.000000000 +0200
--- src/version.c 2013-05-21 20:43:56.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 998,
/**/
--
The problem with political jokes is that they get elected.
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

165
7.3.999 Normal file
View File

@ -0,0 +1,165 @@
To: vim_dev@googlegroups.com
Subject: Patch 7.3.999
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.999
Problem: New regexp engine sets curbuf temporarily.
Solution: Use reg_buf instead, like the old engine.
Files: src/regexp_nfa.c
*** ../vim-7.3.998/src/regexp_nfa.c 2013-05-21 16:28:05.000000000 +0200
--- src/regexp_nfa.c 2013-05-21 21:15:41.000000000 +0200
***************
*** 3125,3139 ****
int this_class;
/* Get class of current and previous char (if it exists). */
! this_class = mb_get_class(reginput);
if (this_class <= 1)
bow = FALSE;
else if (reg_prev_class() == this_class)
bow = FALSE;
}
#endif
! else if (!vim_iswordc(c)
! || (reginput > regline && vim_iswordc(reginput[-1])))
bow = FALSE;
if (bow)
addstate(thislist, t->state->out, &t->sub, 0, listid,
--- 3125,3140 ----
int this_class;
/* Get class of current and previous char (if it exists). */
! this_class = mb_get_class_buf(reginput, reg_buf);
if (this_class <= 1)
bow = FALSE;
else if (reg_prev_class() == this_class)
bow = FALSE;
}
#endif
! else if (!vim_iswordc_buf(c, reg_buf)
! || (reginput > regline
! && vim_iswordc_buf(reginput[-1], reg_buf)))
bow = FALSE;
if (bow)
addstate(thislist, t->state->out, &t->sub, 0, listid,
***************
*** 3153,3167 ****
int this_class, prev_class;
/* Get class of current and previous char (if it exists). */
! this_class = mb_get_class(reginput);
prev_class = reg_prev_class();
if (this_class == prev_class
|| prev_class == 0 || prev_class == 1)
eow = FALSE;
}
#endif
! else if (!vim_iswordc(reginput[-1])
! || (reginput[0] != NUL && vim_iswordc(c)))
eow = FALSE;
if (eow)
addstate(thislist, t->state->out, &t->sub, 0, listid,
--- 3154,3168 ----
int this_class, prev_class;
/* Get class of current and previous char (if it exists). */
! this_class = mb_get_class_buf(reginput, reg_buf);
prev_class = reg_prev_class();
if (this_class == prev_class
|| prev_class == 0 || prev_class == 1)
eow = FALSE;
}
#endif
! else if (!vim_iswordc_buf(reginput[-1], reg_buf)
! || (reginput[0] != NUL && vim_iswordc_buf(c, reg_buf)))
eow = FALSE;
if (eow)
addstate(thislist, t->state->out, &t->sub, 0, listid,
***************
*** 3267,3278 ****
break;
case NFA_KWORD: /* \k */
! result = vim_iswordp(reginput);
ADD_POS_NEG_STATE(t->state);
break;
case NFA_SKWORD: /* \K */
! result = !VIM_ISDIGIT(c) && vim_iswordp(reginput);
ADD_POS_NEG_STATE(t->state);
break;
--- 3268,3279 ----
break;
case NFA_KWORD: /* \k */
! result = vim_iswordp_buf(reginput, reg_buf);
ADD_POS_NEG_STATE(t->state);
break;
case NFA_SKWORD: /* \K */
! result = !VIM_ISDIGIT(c) && vim_iswordp_buf(reginput, reg_buf);
ADD_POS_NEG_STATE(t->state);
break;
***************
*** 3826,3834 ****
colnr_T col; /* column to start looking for match */
proftime_T *tm UNUSED; /* timeout limit or NULL */
{
- long r;
- buf_T *save_curbuf = curbuf;
-
reg_match = NULL;
reg_mmatch = rmp;
reg_buf = buf;
--- 3827,3832 ----
***************
*** 3842,3853 ****
#endif
ireg_maxcol = rmp->rmm_maxcol;
! /* Need to switch to buffer "buf" to make vim_iswordc() work. */
! curbuf = buf;
! r = nfa_regexec_both(NULL, col);
! curbuf = save_curbuf;
!
! return r;
}
#ifdef DEBUG
--- 3840,3846 ----
#endif
ireg_maxcol = rmp->rmm_maxcol;
! return nfa_regexec_both(NULL, col);
}
#ifdef DEBUG
*** ../vim-7.3.998/src/version.c 2013-05-21 20:51:55.000000000 +0200
--- src/version.c 2013-05-21 21:16:32.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 999,
/**/
--
SOLDIER: Where did you get the coconuts?
ARTHUR: Through ... We found them.
SOLDIER: Found them? In Mercea. The coconut's tropical!
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

View File

@ -1001,7 +1001,7 @@ Individual patches for Vim 7.3:
3304 7.3.967 (after 7.3.965) build fails on Mac OSX
2100 7.3.968 multi-byte support is only available with "big" features
1603 7.3.969 can't built with Python 3 and without Python 2
184170 7.3.970 pattern matching is slow, include the NFA engine
182647 7.3.970 (fixed) pattern matching is slow, include the NFA engine
4337 7.3.971 no support for VS2012 static code analysis
3720 7.3.972 cursor not restored properly after InsertEnter autocommand
3881 7.3.973 (after 7.3.970) compiler warnings, crash on startup
@ -1019,3 +1019,16 @@ Individual patches for Vim 7.3:
1691 7.3.985 GTK vim not started as gvim has WM_CLASS property wrong
2113 7.3.986 test 95 doesn't pass when 'encoding' isn't utf-8
6338 7.3.987 no easy to run an individual test; test 64 may fail
1552 7.3.988 new regexp engine is slow
1944 7.3.989 new regexp engine compares negative numbers to character
7487 7.3.990 memory leak in new regexp engine
18482 7.3.991 more can be shared between python 2 and 3
70337 7.3.992 Python: Too many type casts
7832 7.3.993 (after 7.3.992) later patch does things slightly differently
7845 7.3.994 Python: using magic constants
13902 7.3.995 Python: Module initialization is duplicated
14039 7.3.996 Python: Can't check types of what is returned by bindeval()
23712 7.3.997 Vim and Python exceptions are different
11177 7.3.998 Python: garbage collection issues
4683 7.3.999 new regexp engine sets curbuf temporarily
1637 7.3.1000 (whoa!) typo in char value causes out of bounds access

View File

@ -18,7 +18,7 @@
#used for pre-releases:
%define beta %{nil}
%define vimdir vim73%{?beta}
%define patchlevel 987
%define patchlevel 1000
Summary: The VIM editor
URL: http://www.vim.org/
@ -1043,6 +1043,19 @@ Patch984: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.984
Patch985: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.985
Patch986: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.986
Patch987: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.987
Patch988: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.988
Patch989: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.989
Patch990: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.990
Patch991: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.991
Patch992: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.992
Patch993: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.993
Patch994: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.994
Patch995: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.995
Patch996: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.996
Patch997: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.997
Patch998: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.998
Patch999: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.999
Patch1000: ftp://ftp.vim.org/pub/vim/patches/7.3/7.3.1000
Patch3000: vim-7.3-syntax.patch
Patch3002: vim-7.1-nowarnings.patch
@ -2177,6 +2190,19 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk
%patch985 -p0
%patch986 -p0
%patch987 -p0
%patch988 -p0
%patch989 -p0
%patch990 -p0
%patch991 -p0
%patch992 -p0
%patch993 -p0
%patch994 -p0
%patch995 -p0
%patch996 -p0
%patch997 -p0
%patch998 -p0
%patch999 -p0
%patch1000 -p0
# install spell files
@ -2672,6 +2698,9 @@ rm -rf %{buildroot}
%{_datadir}/icons/hicolor/*/apps/*
%changelog
* Wed May 22 2013 Karsten Hopp <karsten@redhat.com> 7.3.1000-1
- patchlevel 1000 !
* Tue May 21 2013 Karsten Hopp <karsten@redhat.com> 7.3.987-1
- patchlevel 987