home *** CD-ROM | disk | FTP | other *** search
- To: vim_dev@googlegroups.com
- Subject: Patch 7.3.220
- 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.220
- Problem: Python 3: vim.error is a 'str' instead of an 'Exception' object,
- so 'except' or 'raise' it causes a 'SystemError' exception.
- Buffer objects do not support slice assignment.
- When exchanging text between Vim and Python, multibyte texts become
- gabage or cause Unicode Expceptions, etc.
- 'py3file' tries to read in the file as Unicode, sometimes causes
- UnicodeDecodeException
- Solution: Fix the problems. (lilydjwg)
- Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
-
-
- *** ../mercurial/vim73/src/if_py_both.h 2011-03-22 15:47:18.000000000 +0100
- --- src/if_py_both.h 2011-06-18 23:54:25.000000000 +0200
- ***************
- *** 65,74 ****
- OutputWrite(PyObject *self, PyObject *args)
- {
- int len;
- ! char *str;
- int error = ((OutputObject *)(self))->error;
-
- ! if (!PyArg_ParseTuple(args, "s#", &str, &len))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- --- 65,74 ----
- OutputWrite(PyObject *self, PyObject *args)
- {
- int len;
- ! char *str = NULL;
- int error = ((OutputObject *)(self))->error;
-
- ! if (!PyArg_ParseTuple(args, "es#", p_enc, &str, &len))
- return NULL;
-
- Py_BEGIN_ALLOW_THREADS
- ***************
- *** 76,81 ****
- --- 76,82 ----
- writer((writefn)(error ? emsg : msg), (char_u *)str, len);
- Python_Release_Vim();
- Py_END_ALLOW_THREADS
- + PyMem_Free(str);
-
- Py_INCREF(Py_None);
- return Py_None;
- ***************
- *** 104,113 ****
- for (i = 0; i < n; ++i)
- {
- PyObject *line = PyList_GetItem(list, i);
- ! char *str;
- PyInt len;
-
- ! if (!PyArg_Parse(line, "s#", &str, &len)) {
- PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
- Py_DECREF(list);
- return NULL;
- --- 105,114 ----
- for (i = 0; i < n; ++i)
- {
- PyObject *line = PyList_GetItem(list, i);
- ! char *str = NULL;
- PyInt len;
-
- ! if (!PyArg_Parse(line, "es#", p_enc, &str, &len)) {
- PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
- Py_DECREF(list);
- return NULL;
- ***************
- *** 118,123 ****
- --- 119,125 ----
- writer((writefn)(error ? emsg : msg), (char_u *)str, len);
- Python_Release_Vim();
- Py_END_ALLOW_THREADS
- + PyMem_Free(str);
- }
-
- Py_DECREF(list);
- ***************
- *** 681,686 ****
- --- 683,689 ----
- {
- const char *str;
- char *save;
- + PyObject *bytes;
- PyInt len;
- PyInt i;
- char *p;
- ***************
- *** 691,698 ****
- return NULL;
- }
-
- ! str = PyString_AsString(obj);
- ! len = PyString_Size(obj);
-
- /*
- * Error checking: String must not contain newlines, as we
- --- 694,702 ----
- return NULL;
- }
-
- ! bytes = PyString_AsBytes(obj); /* for Python 2 this does nothing */
- ! str = PyString_AsString(bytes);
- ! len = PyString_Size(bytes);
-
- /*
- * Error checking: String must not contain newlines, as we
- ***************
- *** 731,736 ****
- --- 735,741 ----
- }
-
- save[i] = '\0';
- + PyString_FreeBytes(bytes); /* Python 2 does nothing here */
-
- return save;
- }
- ***************
- *** 817,823 ****
- invalidate_botline();
- }
-
- ! /* Replace a line in the specified buffer. The line number is
- * in Vim format (1-based). The replacement line is given as
- * a Python string object. The object is checked for validity
- * and correct format. Errors are returned as a value of FAIL.
- --- 822,829 ----
- invalidate_botline();
- }
-
- ! /*
- ! * Replace a line in the specified buffer. The line number is
- * in Vim format (1-based). The replacement line is given as
- * a Python string object. The object is checked for validity
- * and correct format. Errors are returned as a value of FAIL.
- ***************
- *** 908,913 ****
- --- 914,1106 ----
- }
- }
-
- + /* Replace a range of lines in the specified buffer. The line numbers are in
- + * Vim format (1-based). The range is from lo up to, but not including, hi.
- + * The replacement lines are given as a Python list of string objects. The
- + * list is checked for validity and correct format. Errors are returned as a
- + * value of FAIL. The return value is OK on success.
- + * If OK is returned and len_change is not NULL, *len_change
- + * is set to the change in the buffer length.
- + */
- + static int
- + SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_change)
- + {
- + /* First of all, we check the thpe of the supplied Python object.
- + * There are three cases:
- + * 1. NULL, or None - this is a deletion.
- + * 2. A list - this is a replacement.
- + * 3. Anything else - this is an error.
- + */
- + if (list == Py_None || list == NULL)
- + {
- + PyInt i;
- + PyInt n = (int)(hi - lo);
- + buf_T *savebuf = curbuf;
- +
- + PyErr_Clear();
- + curbuf = buf;
- +
- + if (u_savedel((linenr_T)lo, (long)n) == FAIL)
- + PyErr_SetVim(_("cannot save undo information"));
- + else
- + {
- + for (i = 0; i < n; ++i)
- + {
- + if (ml_delete((linenr_T)lo, FALSE) == FAIL)
- + {
- + PyErr_SetVim(_("cannot delete line"));
- + break;
- + }
- + }
- + if (buf == curwin->w_buffer)
- + py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
- + deleted_lines_mark((linenr_T)lo, (long)i);
- + }
- +
- + curbuf = savebuf;
- +
- + if (PyErr_Occurred() || VimErrorCheck())
- + return FAIL;
- +
- + if (len_change)
- + *len_change = -n;
- +
- + return OK;
- + }
- + else if (PyList_Check(list))
- + {
- + PyInt i;
- + PyInt new_len = PyList_Size(list);
- + PyInt old_len = hi - lo;
- + PyInt extra = 0; /* lines added to text, can be negative */
- + char **array;
- + buf_T *savebuf;
- +
- + if (new_len == 0) /* avoid allocating zero bytes */
- + array = NULL;
- + else
- + {
- + array = (char **)alloc((unsigned)(new_len * sizeof(char *)));
- + if (array == NULL)
- + {
- + PyErr_NoMemory();
- + return FAIL;
- + }
- + }
- +
- + for (i = 0; i < new_len; ++i)
- + {
- + PyObject *line = PyList_GetItem(list, i);
- +
- + array[i] = StringToLine(line);
- + if (array[i] == NULL)
- + {
- + while (i)
- + vim_free(array[--i]);
- + vim_free(array);
- + return FAIL;
- + }
- + }
- +
- + savebuf = curbuf;
- +
- + PyErr_Clear();
- + curbuf = buf;
- +
- + if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
- + PyErr_SetVim(_("cannot save undo information"));
- +
- + /* If the size of the range is reducing (ie, new_len < old_len) we
- + * need to delete some old_len. We do this at the start, by
- + * repeatedly deleting line "lo".
- + */
- + if (!PyErr_Occurred())
- + {
- + for (i = 0; i < old_len - new_len; ++i)
- + if (ml_delete((linenr_T)lo, FALSE) == FAIL)
- + {
- + PyErr_SetVim(_("cannot delete line"));
- + break;
- + }
- + extra -= i;
- + }
- +
- + /* For as long as possible, replace the existing old_len with the
- + * new old_len. This is a more efficient operation, as it requires
- + * less memory allocation and freeing.
- + */
- + if (!PyErr_Occurred())
- + {
- + for (i = 0; i < old_len && i < new_len; ++i)
- + if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], FALSE)
- + == FAIL)
- + {
- + PyErr_SetVim(_("cannot replace line"));
- + break;
- + }
- + }
- + else
- + i = 0;
- +
- + /* Now we may need to insert the remaining new old_len. If we do, we
- + * must free the strings as we finish with them (we can't pass the
- + * responsibility to vim in this case).
- + */
- + if (!PyErr_Occurred())
- + {
- + while (i < new_len)
- + {
- + if (ml_append((linenr_T)(lo + i - 1),
- + (char_u *)array[i], 0, FALSE) == FAIL)
- + {
- + PyErr_SetVim(_("cannot insert line"));
- + break;
- + }
- + vim_free(array[i]);
- + ++i;
- + ++extra;
- + }
- + }
- +
- + /* Free any left-over old_len, as a result of an error */
- + while (i < new_len)
- + {
- + vim_free(array[i]);
- + ++i;
- + }
- +
- + /* Free the array of old_len. All of its contents have now
- + * been dealt with (either freed, or the responsibility passed
- + * to vim.
- + */
- + vim_free(array);
- +
- + /* Adjust marks. Invalidate any which lie in the
- + * changed range, and move any in the remainder of the buffer.
- + */
- + mark_adjust((linenr_T)lo, (linenr_T)(hi - 1),
- + (long)MAXLNUM, (long)extra);
- + changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
- +
- + if (buf == curwin->w_buffer)
- + py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
- +
- + curbuf = savebuf;
- +
- + if (PyErr_Occurred() || VimErrorCheck())
- + return FAIL;
- +
- + if (len_change)
- + *len_change = new_len - old_len;
- +
- + return OK;
- + }
- + else
- + {
- + PyErr_BadArgument();
- + return FAIL;
- + }
- + }
-
- /* Insert a number of lines into the specified buffer after the specifed line.
- * The line number is in Vim format (1-based). The lines to be inserted are
- ***************
- *** 1108,1113 ****
- --- 1301,1340 ----
- return -1;
-
- if (new_end)
- + *new_end = end + len_change;
- +
- + return 0;
- + }
- +
- + static PyInt
- + RBAsSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
- + {
- + PyInt size;
- + PyInt len_change;
- +
- + /* Self must be a valid buffer */
- + if (CheckBuffer(self))
- + return -1;
- +
- + /* Sort out the slice range */
- + size = end - start + 1;
- +
- + if (lo < 0)
- + lo = 0;
- + else if (lo > size)
- + lo = size;
- + if (hi < 0)
- + hi = 0;
- + if (hi < lo)
- + hi = lo;
- + else if (hi > size)
- + hi = size;
- +
- + if (SetBufferLineList(self->buf, lo + start, hi + start,
- + val, &len_change) == FAIL)
- + return -1;
- +
- + if (new_end)
- *new_end = end + len_change;
-
- return 0;
- *** ../mercurial/vim73/src/if_python.c 2011-03-26 18:32:00.000000000 +0100
- --- src/if_python.c 2011-06-19 00:02:15.000000000 +0200
- ***************
- *** 56,61 ****
- --- 56,65 ----
-
- static void init_structs(void);
-
- + /* No-op conversion functions, use with care! */
- + #define PyString_AsBytes(obj) (obj)
- + #define PyString_FreeBytes(obj)
- +
- #if !defined(FEAT_PYTHON) && defined(PROTO)
- /* Use this to be able to generate prototypes without python being used. */
- # define PyObject Py_ssize_t
- ***************
- *** 129,134 ****
- --- 133,139 ----
- */
- # define PyArg_Parse dll_PyArg_Parse
- # define PyArg_ParseTuple dll_PyArg_ParseTuple
- + # define PyMem_Free dll_PyMem_Free
- # define PyDict_SetItemString dll_PyDict_SetItemString
- # define PyErr_BadArgument dll_PyErr_BadArgument
- # define PyErr_Clear dll_PyErr_Clear
- ***************
- *** 189,194 ****
- --- 194,200 ----
- */
- static int(*dll_PyArg_Parse)(PyObject *, char *, ...);
- static int(*dll_PyArg_ParseTuple)(PyObject *, char *, ...);
- + static int(*dll_PyMem_Free)(void *);
- static int(*dll_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
- static int(*dll_PyErr_BadArgument)(void);
- static void(*dll_PyErr_Clear)(void);
- ***************
- *** 271,276 ****
- --- 277,283 ----
- {
- {"PyArg_Parse", (PYTHON_PROC*)&dll_PyArg_Parse},
- {"PyArg_ParseTuple", (PYTHON_PROC*)&dll_PyArg_ParseTuple},
- + {"PyMem_Free", (PYTHON_PROC*)&dll_PyMem_Free},
- {"PyDict_SetItemString", (PYTHON_PROC*)&dll_PyDict_SetItemString},
- {"PyErr_BadArgument", (PYTHON_PROC*)&dll_PyErr_BadArgument},
- {"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear},
- ***************
- *** 833,876 ****
- static PyObject *CurrentGetattr(PyObject *, char *);
- static int CurrentSetattr(PyObject *, char *, PyObject *);
-
- - /* Common routines for buffers and line ranges
- - * -------------------------------------------
- - */
- -
- - static PyInt
- - RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
- - {
- - PyInt size;
- - PyInt len_change;
- -
- - /* Self must be a valid buffer */
- - if (CheckBuffer(self))
- - return -1;
- -
- - /* Sort out the slice range */
- - size = end - start + 1;
- -
- - if (lo < 0)
- - lo = 0;
- - else if (lo > size)
- - lo = size;
- - if (hi < 0)
- - hi = 0;
- - if (hi < lo)
- - hi = lo;
- - else if (hi > size)
- - hi = size;
- -
- - if (SetBufferLineList(self->buf, lo + start, hi + start,
- - val, &len_change) == FAIL)
- - return -1;
- -
- - if (new_end)
- - *new_end = end + len_change;
- -
- - return 0;
- - }
- -
- static PySequenceMethods BufferAsSeq = {
- (PyInquiry) BufferLength, /* sq_length, len(x) */
- (binaryfunc) 0, /* BufferConcat, */ /* sq_concat, x+y */
- --- 840,845 ----
- ***************
- *** 1038,1044 ****
- static PyInt
- BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
- {
- ! return RBAssSlice((BufferObject *)(self), lo, hi, val, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- NULL);
- }
- --- 1007,1013 ----
- static PyInt
- BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
- {
- ! return RBAsSlice((BufferObject *)(self), lo, hi, val, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- NULL);
- }
- ***************
- *** 1088,1094 ****
- static PyInt
- RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
- {
- ! return RBAssSlice(((RangeObject *)(self))->buf, lo, hi, val,
- ((RangeObject *)(self))->start,
- ((RangeObject *)(self))->end,
- &((RangeObject *)(self))->end);
- --- 1057,1063 ----
- static PyInt
- RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
- {
- ! return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val,
- ((RangeObject *)(self))->start,
- ((RangeObject *)(self))->end,
- &((RangeObject *)(self))->end);
- ***************
- *** 1435,1628 ****
- * 4. Utility functions for handling the interface between Vim and Python.
- */
-
- - /* Replace a range of lines in the specified buffer. The line numbers are in
- - * Vim format (1-based). The range is from lo up to, but not including, hi.
- - * The replacement lines are given as a Python list of string objects. The
- - * list is checked for validity and correct format. Errors are returned as a
- - * value of FAIL. The return value is OK on success.
- - * If OK is returned and len_change is not NULL, *len_change
- - * is set to the change in the buffer length.
- - */
- - static int
- - SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_change)
- - {
- - /* First of all, we check the thpe of the supplied Python object.
- - * There are three cases:
- - * 1. NULL, or None - this is a deletion.
- - * 2. A list - this is a replacement.
- - * 3. Anything else - this is an error.
- - */
- - if (list == Py_None || list == NULL)
- - {
- - PyInt i;
- - PyInt n = (int)(hi - lo);
- - buf_T *savebuf = curbuf;
- -
- - PyErr_Clear();
- - curbuf = buf;
- -
- - if (u_savedel((linenr_T)lo, (long)n) == FAIL)
- - PyErr_SetVim(_("cannot save undo information"));
- - else
- - {
- - for (i = 0; i < n; ++i)
- - {
- - if (ml_delete((linenr_T)lo, FALSE) == FAIL)
- - {
- - PyErr_SetVim(_("cannot delete line"));
- - break;
- - }
- - }
- - if (buf == curwin->w_buffer)
- - py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
- - deleted_lines_mark((linenr_T)lo, (long)i);
- - }
- -
- - curbuf = savebuf;
- -
- - if (PyErr_Occurred() || VimErrorCheck())
- - return FAIL;
- -
- - if (len_change)
- - *len_change = -n;
- -
- - return OK;
- - }
- - else if (PyList_Check(list))
- - {
- - PyInt i;
- - PyInt new_len = PyList_Size(list);
- - PyInt old_len = hi - lo;
- - PyInt extra = 0; /* lines added to text, can be negative */
- - char **array;
- - buf_T *savebuf;
- -
- - if (new_len == 0) /* avoid allocating zero bytes */
- - array = NULL;
- - else
- - {
- - array = (char **)alloc((unsigned)(new_len * sizeof(char *)));
- - if (array == NULL)
- - {
- - PyErr_NoMemory();
- - return FAIL;
- - }
- - }
- -
- - for (i = 0; i < new_len; ++i)
- - {
- - PyObject *line = PyList_GetItem(list, i);
- -
- - array[i] = StringToLine(line);
- - if (array[i] == NULL)
- - {
- - while (i)
- - vim_free(array[--i]);
- - vim_free(array);
- - return FAIL;
- - }
- - }
- -
- - savebuf = curbuf;
- -
- - PyErr_Clear();
- - curbuf = buf;
- -
- - if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
- - PyErr_SetVim(_("cannot save undo information"));
- -
- - /* If the size of the range is reducing (ie, new_len < old_len) we
- - * need to delete some old_len. We do this at the start, by
- - * repeatedly deleting line "lo".
- - */
- - if (!PyErr_Occurred())
- - {
- - for (i = 0; i < old_len - new_len; ++i)
- - if (ml_delete((linenr_T)lo, FALSE) == FAIL)
- - {
- - PyErr_SetVim(_("cannot delete line"));
- - break;
- - }
- - extra -= i;
- - }
- -
- - /* For as long as possible, replace the existing old_len with the
- - * new old_len. This is a more efficient operation, as it requires
- - * less memory allocation and freeing.
- - */
- - if (!PyErr_Occurred())
- - {
- - for (i = 0; i < old_len && i < new_len; ++i)
- - if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], FALSE)
- - == FAIL)
- - {
- - PyErr_SetVim(_("cannot replace line"));
- - break;
- - }
- - }
- - else
- - i = 0;
- -
- - /* Now we may need to insert the remaining new old_len. If we do, we
- - * must free the strings as we finish with them (we can't pass the
- - * responsibility to vim in this case).
- - */
- - if (!PyErr_Occurred())
- - {
- - while (i < new_len)
- - {
- - if (ml_append((linenr_T)(lo + i - 1),
- - (char_u *)array[i], 0, FALSE) == FAIL)
- - {
- - PyErr_SetVim(_("cannot insert line"));
- - break;
- - }
- - vim_free(array[i]);
- - ++i;
- - ++extra;
- - }
- - }
- -
- - /* Free any left-over old_len, as a result of an error */
- - while (i < new_len)
- - {
- - vim_free(array[i]);
- - ++i;
- - }
- -
- - /* Free the array of old_len. All of its contents have now
- - * been dealt with (either freed, or the responsibility passed
- - * to vim.
- - */
- - vim_free(array);
- -
- - /* Adjust marks. Invalidate any which lie in the
- - * changed range, and move any in the remainder of the buffer.
- - */
- - mark_adjust((linenr_T)lo, (linenr_T)(hi - 1),
- - (long)MAXLNUM, (long)extra);
- - changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
- -
- - if (buf == curwin->w_buffer)
- - py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
- -
- - curbuf = savebuf;
- -
- - if (PyErr_Occurred() || VimErrorCheck())
- - return FAIL;
- -
- - if (len_change)
- - *len_change = new_len - old_len;
- -
- - return OK;
- - }
- - else
- - {
- - PyErr_BadArgument();
- - return FAIL;
- - }
- - }
- -
- /* Convert a Vim line into a Python string.
- * All internal newlines are replaced by null characters.
- *
- --- 1404,1409 ----
- *** ../mercurial/vim73/src/if_python3.c 2011-06-12 21:37:06.000000000 +0200
- --- src/if_python3.c 2011-06-19 00:10:42.000000000 +0200
- ***************
- *** 70,77 ****
-
- #define PyInt Py_ssize_t
- #define PyString_Check(obj) PyUnicode_Check(obj)
- ! #define PyString_AsString(obj) _PyUnicode_AsString(obj)
- ! #define PyString_Size(obj) PyUnicode_GET_SIZE(obj)
- #define PyString_FromString(repr) PyUnicode_FromString(repr)
-
- #if defined(DYNAMIC_PYTHON3) || defined(PROTO)
- --- 70,79 ----
-
- #define PyInt Py_ssize_t
- #define PyString_Check(obj) PyUnicode_Check(obj)
- ! #define PyString_AsBytes(obj) PyUnicode_AsEncodedString(obj, (char *)p_enc, NULL);
- ! #define PyString_FreeBytes(obj) Py_XDECREF(bytes)
- ! #define PyString_AsString(obj) PyBytes_AsString(obj)
- ! #define PyString_Size(obj) PyBytes_GET_SIZE(bytes)
- #define PyString_FromString(repr) PyUnicode_FromString(repr)
-
- #if defined(DYNAMIC_PYTHON3) || defined(PROTO)
- ***************
- *** 99,104 ****
- --- 101,107 ----
- # define PyArg_Parse py3_PyArg_Parse
- # undef PyArg_ParseTuple
- # define PyArg_ParseTuple py3_PyArg_ParseTuple
- + # define PyMem_Free py3_PyMem_Free
- # define PyDict_SetItemString py3_PyDict_SetItemString
- # define PyErr_BadArgument py3_PyErr_BadArgument
- # define PyErr_Clear py3_PyErr_Clear
- ***************
- *** 140,147 ****
- --- 143,155 ----
- # define PyModule_AddObject py3_PyModule_AddObject
- # define PyImport_AppendInittab py3_PyImport_AppendInittab
- # define _PyUnicode_AsString py3__PyUnicode_AsString
- + # undef PyUnicode_AsEncodedString
- + # define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString
- + # undef PyBytes_AsString
- + # define PyBytes_AsString py3_PyBytes_AsString
- # define PyObject_GenericGetAttr py3_PyObject_GenericGetAttr
- # define PySlice_Type (*py3_PySlice_Type)
- + # define PyErr_NewException py3_PyErr_NewException
- # ifdef Py_DEBUG
- # define _Py_NegativeRefcount py3__Py_NegativeRefcount
- # define _Py_RefTotal (*py3__Py_RefTotal)
- ***************
- *** 157,164 ****
- # define PyModule_Create2 py3_PyModule_Create2
- # undef PyUnicode_FromString
- # define PyUnicode_FromString py3_PyUnicode_FromString
- ! # undef PyUnicode_FromStringAndSize
- ! # define PyUnicode_FromStringAndSize py3_PyUnicode_FromStringAndSize
-
- # ifdef Py_DEBUG
- # undef PyObject_NEW
- --- 165,172 ----
- # define PyModule_Create2 py3_PyModule_Create2
- # undef PyUnicode_FromString
- # define PyUnicode_FromString py3_PyUnicode_FromString
- ! # undef PyUnicode_Decode
- ! # define PyUnicode_Decode py3_PyUnicode_Decode
-
- # ifdef Py_DEBUG
- # undef PyObject_NEW
- ***************
- *** 199,205 ****
- static int (*py3_PyType_Ready)(PyTypeObject *type);
- static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
- static PyObject* (*py3_PyUnicode_FromString)(const char *u);
- ! static PyObject* (*py3_PyUnicode_FromStringAndSize)(const char *u, Py_ssize_t size);
- static long (*py3_PyLong_AsLong)(PyObject *);
- static void (*py3_PyErr_SetNone)(PyObject *);
- static void (*py3_PyEval_InitThreads)(void);
- --- 207,214 ----
- static int (*py3_PyType_Ready)(PyTypeObject *type);
- static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
- static PyObject* (*py3_PyUnicode_FromString)(const char *u);
- ! static PyObject* (*py3_PyUnicode_Decode)(const char *u, Py_ssize_t size,
- ! const char *encoding, const char *errors);
- static long (*py3_PyLong_AsLong)(PyObject *);
- static void (*py3_PyErr_SetNone)(PyObject *);
- static void (*py3_PyEval_InitThreads)(void);
- ***************
- *** 207,212 ****
- --- 216,222 ----
- static PyThreadState*(*py3_PyEval_SaveThread)(void);
- static int (*py3_PyArg_Parse)(PyObject *, char *, ...);
- static int (*py3_PyArg_ParseTuple)(PyObject *, char *, ...);
- + static int (*py3_PyMem_Free)(void *);
- static int (*py3_Py_IsInitialized)(void);
- static void (*py3_PyErr_Clear)(void);
- static PyObject*(*py3__PyObject_Init)(PyObject *, PyTypeObject *);
- ***************
- *** 214,224 ****
- --- 224,237 ----
- static int (*py3_PyModule_AddObject)(PyObject *m, const char *name, PyObject *o);
- static int (*py3_PyImport_AppendInittab)(const char *name, PyObject* (*initfunc)(void));
- static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
- + static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
- + static char* (*py3_PyBytes_AsString)(PyObject *bytes);
- static PyObject* (*py3_PyObject_GenericGetAttr)(PyObject *obj, PyObject *name);
- static PyObject* (*py3_PyModule_Create2)(struct PyModuleDef* module, int module_api_version);
- static PyObject* (*py3_PyType_GenericAlloc)(PyTypeObject *type, Py_ssize_t nitems);
- static PyObject* (*py3_PyType_GenericNew)(PyTypeObject *type, PyObject *args, PyObject *kwds);
- static PyTypeObject* py3_PySlice_Type;
- + static PyObject* (*py3_PyErr_NewException)(char *name, PyObject *base, PyObject *dict);
- # ifdef Py_DEBUG
- static void (*py3__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op);
- static Py_ssize_t* py3__Py_RefTotal;
- ***************
- *** 259,264 ****
- --- 272,278 ----
- {"Py_SetPythonHome", (PYTHON_PROC*)&py3_Py_SetPythonHome},
- {"Py_Initialize", (PYTHON_PROC*)&py3_Py_Initialize},
- {"PyArg_ParseTuple", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
- + {"PyMem_Free", (PYTHON_PROC*)&py3_PyMem_Free},
- {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
- {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
- {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
- ***************
- *** 289,295 ****
- {"PyEval_RestoreThread", (PYTHON_PROC*)&py3_PyEval_RestoreThread},
- {"PyEval_SaveThread", (PYTHON_PROC*)&py3_PyEval_SaveThread},
- {"PyArg_Parse", (PYTHON_PROC*)&py3_PyArg_Parse},
- - {"PyArg_ParseTuple", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
- {"Py_IsInitialized", (PYTHON_PROC*)&py3_Py_IsInitialized},
- {"_Py_NoneStruct", (PYTHON_PROC*)&py3__Py_NoneStruct},
- {"PyErr_Clear", (PYTHON_PROC*)&py3_PyErr_Clear},
- --- 303,308 ----
- ***************
- *** 297,307 ****
- --- 310,322 ----
- {"PyModule_AddObject", (PYTHON_PROC*)&py3_PyModule_AddObject},
- {"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab},
- {"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString},
- + {"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString},
- {"PyObject_GenericGetAttr", (PYTHON_PROC*)&py3_PyObject_GenericGetAttr},
- {"PyModule_Create2", (PYTHON_PROC*)&py3_PyModule_Create2},
- {"PyType_GenericAlloc", (PYTHON_PROC*)&py3_PyType_GenericAlloc},
- {"PyType_GenericNew", (PYTHON_PROC*)&py3_PyType_GenericNew},
- {"PySlice_Type", (PYTHON_PROC*)&py3_PySlice_Type},
- + {"PyErr_NewException", (PYTHON_PROC*)&py3_PyErr_NewException},
- # ifdef Py_DEBUG
- {"_Py_NegativeRefcount", (PYTHON_PROC*)&py3__Py_NegativeRefcount},
- {"_Py_RefTotal", (PYTHON_PROC*)&py3__Py_RefTotal},
- ***************
- *** 337,343 ****
- py3_runtime_link_init(char *libname, int verbose)
- {
- int i;
- ! void *ucs_from_string, *ucs_from_string_and_size;
-
- # if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
- /* Can't have Python and Python3 loaded at the same time.
- --- 352,358 ----
- py3_runtime_link_init(char *libname, int verbose)
- {
- int i;
- ! void *ucs_from_string, *ucs_decode, *ucs_as_encoded_string;
-
- # if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
- /* Can't have Python and Python3 loaded at the same time.
- ***************
- *** 377,395 ****
- /* Load unicode functions separately as only the ucs2 or the ucs4 functions
- * will be present in the library. */
- ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
- ! ucs_from_string_and_size = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS2_FromStringAndSize");
- ! if (!ucs_from_string || !ucs_from_string_and_size)
- {
- ucs_from_string = symbol_from_dll(hinstPy3,
- "PyUnicodeUCS4_FromString");
- ! ucs_from_string_and_size = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS4_FromStringAndSize");
- }
- ! if (ucs_from_string && ucs_from_string_and_size)
- {
- py3_PyUnicode_FromString = ucs_from_string;
- ! py3_PyUnicode_FromStringAndSize = ucs_from_string_and_size;
- }
- else
- {
- --- 392,415 ----
- /* Load unicode functions separately as only the ucs2 or the ucs4 functions
- * will be present in the library. */
- ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
- ! ucs_decode = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS2_Decode");
- ! ucs_as_encoded_string = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS2_AsEncodedString");
- ! if (!ucs_from_string || !ucs_decode || !ucs_as_encoded_string)
- {
- ucs_from_string = symbol_from_dll(hinstPy3,
- "PyUnicodeUCS4_FromString");
- ! ucs_decode = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS4_Decode");
- ! ucs_as_encoded_string = symbol_from_dll(hinstPy3,
- ! "PyUnicodeUCS4_AsEncodedString");
- }
- ! if (ucs_from_string && ucs_decode && ucs_as_encoded_string)
- {
- py3_PyUnicode_FromString = ucs_from_string;
- ! py3_PyUnicode_Decode = ucs_decode;
- ! py3_PyUnicode_AsEncodedString = ucs_as_encoded_string;
- }
- else
- {
- ***************
- *** 567,574 ****
- /* Remove the element from sys.path that was added because of our
- * argv[0] value in Py3Init_vim(). Previously we used an empty
- * string, but dependinding on the OS we then get an empty entry or
- ! * the current directory in sys.path. */
- ! PyRun_SimpleString("import sys; sys.path = list(filter(lambda x: x != '/must>not&exist', sys.path))");
-
- // lock is created and acquired in PyEval_InitThreads() and thread
- // state is created in Py_Initialize()
- --- 587,597 ----
- /* Remove the element from sys.path that was added because of our
- * argv[0] value in Py3Init_vim(). Previously we used an empty
- * string, but dependinding on the OS we then get an empty entry or
- ! * the current directory in sys.path.
- ! * Only after vim has been imported, the element does exist in
- ! * sys.path.
- ! */
- ! PyRun_SimpleString("import vim; import sys; sys.path = list(filter(lambda x: not x.endswith('must>not&exist'), sys.path))");
-
- // lock is created and acquired in PyEval_InitThreads() and thread
- // state is created in Py_Initialize()
- ***************
- *** 605,610 ****
- --- 628,635 ----
- #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
- char *saved_locale;
- #endif
- + PyObject *cmdstr;
- + PyObject *cmdbytes;
-
- #if defined(MACOS) && !defined(MACOS_X_UNIX)
- GetPort(&oldPort);
- ***************
- *** 634,640 ****
-
- pygilstate = PyGILState_Ensure();
-
- ! PyRun_SimpleString((char *)(cmd));
-
- PyGILState_Release(pygilstate);
-
- --- 659,671 ----
-
- pygilstate = PyGILState_Ensure();
-
- ! /* PyRun_SimpleString expects a UTF-8 string. Wrong encoding may cause
- ! * SyntaxError (unicode error). */
- ! cmdstr = PyUnicode_Decode(cmd, strlen(cmd), (char *)p_enc, NULL);
- ! cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", NULL);
- ! Py_XDECREF(cmdstr);
- ! PyRun_SimpleString(PyBytes_AsString(cmdbytes));
- ! Py_XDECREF(cmdbytes);
-
- PyGILState_Release(pygilstate);
-
- ***************
- *** 693,699 ****
- * different options under Windows, meaning that stdio pointers aren't
- * compatible between the two. Yuk.
- *
- ! * construct: exec(compile(open('a_filename').read(), 'a_filename', 'exec'))
- *
- * We need to escape any backslashes or single quotes in the file name, so that
- * Python won't mangle the file name.
- --- 724,733 ----
- * different options under Windows, meaning that stdio pointers aren't
- * compatible between the two. Yuk.
- *
- ! * construct: exec(compile(open('a_filename', 'rb').read(), 'a_filename', 'exec'))
- ! *
- ! * Using bytes so that Python can detect the source encoding as it normally
- ! * does. The doc does not say "compile" accept bytes, though.
- *
- * We need to escape any backslashes or single quotes in the file name, so that
- * Python won't mangle the file name.
- ***************
- *** 716,723 ****
- return;
- if (i==0)
- {
- ! strcpy(p,"').read(),'");
- ! p += 11;
- }
- else
- {
- --- 750,757 ----
- return;
- if (i==0)
- {
- ! strcpy(p,"','rb').read(),'");
- ! p += 16;
- }
- else
- {
- ***************
- *** 812,819 ****
-
- static Py_ssize_t BufferLength(PyObject *);
- static PyObject *BufferItem(PyObject *, Py_ssize_t);
- - static Py_ssize_t BufferAsItem(PyObject *, Py_ssize_t, PyObject *);
- static PyObject* BufferSubscript(PyObject *self, PyObject* idx);
-
-
- /* Line range type - Implementation functions
- --- 846,853 ----
-
- static Py_ssize_t BufferLength(PyObject *);
- static PyObject *BufferItem(PyObject *, Py_ssize_t);
- static PyObject* BufferSubscript(PyObject *self, PyObject* idx);
- + static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val);
-
-
- /* Line range type - Implementation functions
- ***************
- *** 835,841 ****
- (ssizeargfunc) 0, /* sq_repeat, x*n */
- (ssizeargfunc) BufferItem, /* sq_item, x[i] */
- 0, /* was_sq_slice, x[i:j] */
- ! (ssizeobjargproc) BufferAsItem, /* sq_ass_item, x[i]=v */
- 0, /* sq_ass_slice, x[i:j]=v */
- 0, /* sq_contains */
- 0, /* sq_inplace_concat */
- --- 869,875 ----
- (ssizeargfunc) 0, /* sq_repeat, x*n */
- (ssizeargfunc) BufferItem, /* sq_item, x[i] */
- 0, /* was_sq_slice, x[i:j] */
- ! 0, /* sq_ass_item, x[i]=v */
- 0, /* sq_ass_slice, x[i:j]=v */
- 0, /* sq_contains */
- 0, /* sq_inplace_concat */
- ***************
- *** 845,851 ****
- PyMappingMethods BufferAsMapping = {
- /* mp_length */ (lenfunc)BufferLength,
- /* mp_subscript */ (binaryfunc)BufferSubscript,
- ! /* mp_ass_subscript */ (objobjargproc)0,
- };
-
-
- --- 879,885 ----
- PyMappingMethods BufferAsMapping = {
- /* mp_length */ (lenfunc)BufferLength,
- /* mp_subscript */ (binaryfunc)BufferSubscript,
- ! /* mp_ass_subscript */ (objobjargproc)BufferAsSubscript,
- };
-
-
- ***************
- *** 897,902 ****
- --- 931,938 ----
-
- if (this->buf && this->buf != INVALID_BUFFER_VALUE)
- this->buf->b_python3_ref = NULL;
- +
- + Py_TYPE(self)->tp_free((PyObject*)self);
- }
-
- static PyObject *
- ***************
- *** 975,989 ****
- (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count);
- }
-
- - static Py_ssize_t
- - BufferAsItem(PyObject *self, Py_ssize_t n, PyObject *val)
- - {
- - return RBAsItem((BufferObject *)(self), n, val, 1,
- - (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- - NULL);
- - }
- -
- -
- static PyObject *
- BufferSubscript(PyObject *self, PyObject* idx)
- {
- --- 1011,1016 ----
- ***************
- *** 999,1011 ****
- &step, &slicelen) < 0) {
- return NULL;
- }
- ! return BufferSlice(self,start,stop+1);
- } else {
- PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
- return NULL;
- }
- }
-
- static PySequenceMethods RangeAsSeq = {
- (lenfunc) RangeLength, /* sq_length, len(x) */
- (binaryfunc) 0, /* RangeConcat, sq_concat, x+y */
- --- 1026,1064 ----
- &step, &slicelen) < 0) {
- return NULL;
- }
- ! return BufferSlice(self,start,stop);
- } else {
- PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
- return NULL;
- }
- }
-
- + static Py_ssize_t
- + BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
- + {
- + if (PyLong_Check(idx)) {
- + long n = PyLong_AsLong(idx);
- + return RBAsItem((BufferObject *)(self), n, val, 1,
- + (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- + NULL);
- + } else if (PySlice_Check(idx)) {
- + Py_ssize_t start, stop, step, slicelen;
- +
- + if (PySlice_GetIndicesEx((PySliceObject *)idx,
- + (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
- + &start, &stop,
- + &step, &slicelen) < 0) {
- + return -1;
- + }
- + return RBAsSlice((BufferObject *)(self), start, stop, val, 1,
- + (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- + NULL);
- + } else {
- + PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
- + return -1;
- + }
- + }
- +
- static PySequenceMethods RangeAsSeq = {
- (lenfunc) RangeLength, /* sq_length, len(x) */
- (binaryfunc) 0, /* RangeConcat, sq_concat, x+y */
- ***************
- *** 1032,1037 ****
- --- 1085,1091 ----
- RangeDestructor(PyObject *self)
- {
- Py_DECREF(((RangeObject *)(self))->buf);
- + Py_TYPE(self)->tp_free((PyObject*)self);
- }
-
- static PyObject *
- ***************
- *** 1159,1164 ****
- --- 1213,1220 ----
-
- if (this->win && this->win != INVALID_WINDOW_VALUE)
- this->win->w_python3_ref = NULL;
- +
- + Py_TYPE(self)->tp_free((PyObject*)self);
- }
-
- static PyObject *
- ***************
- *** 1350,1357 ****
- PySys_SetArgv(1, argv);
-
- mod = PyModule_Create(&vimmodule);
-
- ! VimError = Py_BuildValue("s", "vim.error");
-
- PyModule_AddObject(mod, "error", VimError);
- Py_INCREF((PyObject *)(void *)&TheBufferList);
- --- 1406,1416 ----
- PySys_SetArgv(1, argv);
-
- mod = PyModule_Create(&vimmodule);
- + if (mod == NULL)
- + return NULL;
-
- ! VimError = PyErr_NewException("vim.error", NULL, NULL);
- ! Py_INCREF(VimError);
-
- PyModule_AddObject(mod, "error", VimError);
- Py_INCREF((PyObject *)(void *)&TheBufferList);
- ***************
- *** 1404,1410 ****
- }
- *p = '\0';
-
- ! result = PyUnicode_FromStringAndSize(tmp, len);
-
- vim_free(tmp);
- return result;
- --- 1463,1469 ----
- }
- *p = '\0';
-
- ! result = PyUnicode_Decode(tmp, len, (char *)p_enc, NULL);
-
- vim_free(tmp);
- return result;
- *** ../vim-7.3.219/src/version.c 2011-06-13 02:03:55.000000000 +0200
- --- src/version.c 2011-06-19 00:25:38.000000000 +0200
- ***************
- *** 711,712 ****
- --- 711,714 ----
- { /* Add new patch number below this line */
- + /**/
- + 220,
- /**/
-
- --
- I'm in shape. Round IS a shape.
-
- /// 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 ///
-