]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.1228 v7.3.1228
authorBram Moolenaar <Bram@vim.org>
Sun, 23 Jun 2013 11:11:18 +0000 (13:11 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 23 Jun 2013 11:11:18 +0000 (13:11 +0200)
Problem:    Python: various inconsistencies and problems.
Solution:   StringToLine now supports both bytes() and unicode() objects.
            Make function names consistant.  Fix memory leak fixed in
            StringToLine. (ZyX)

src/if_py_both.h
src/if_python.c
src/if_python3.c
src/version.c

index 64b7e542f259c14455a4daea391c898040494967..71c30af41f1339eaa620d0d6aa826520a752df67 100644 (file)
@@ -18,7 +18,7 @@ typedef int Py_ssize_t;  /* Python 2.4 and earlier don't have this type. */
 #endif
 
 #ifdef FEAT_MBYTE
-# define ENC_OPT p_enc
+# define ENC_OPT ((char *)p_enc)
 #else
 # define ENC_OPT "latin1"
 #endif
@@ -92,28 +92,29 @@ Python_Release_Vim(void)
 StringToChars(PyObject *object, PyObject **todecref)
 {
     char_u     *p;
-    PyObject   *bytes = NULL;
 
     if (PyBytes_Check(object))
     {
 
-       if (PyString_AsStringAndSize(object, (char **) &p, NULL) == -1)
-           return NULL;
-       if (p == NULL)
+       if (PyBytes_AsStringAndSize(object, (char **) &p, NULL) == -1
+               || p == NULL)
            return NULL;
 
        *todecref = NULL;
     }
     else if (PyUnicode_Check(object))
     {
-       bytes = PyUnicode_AsEncodedString(object, (char *)ENC_OPT, NULL);
-       if (bytes == NULL)
-           return NULL;
+       PyObject        *bytes;
 
-       if(PyString_AsStringAndSize(bytes, (char **) &p, NULL) == -1)
+       if (!(bytes = PyUnicode_AsEncodedString(object, ENC_OPT, NULL)))
            return NULL;
-       if (p == NULL)
+
+       if(PyBytes_AsStringAndSize(bytes, (char **) &p, NULL) == -1
+               || p == NULL)
+       {
+           Py_DECREF(bytes);
            return NULL;
+       }
 
        *todecref = bytes;
     }
@@ -133,6 +134,7 @@ add_string(PyObject *list, char *s)
 
     if (!(string = PyString_FromString(s)))
        return -1;
+
     if (PyList_Append(list, string))
     {
        Py_DECREF(string);
@@ -534,10 +536,8 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict)
     }
 
     if (our_tv->v_type == VAR_STRING)
-    {
        result = PyString_FromString(our_tv->vval.v_string == NULL
                                        ? "" : (char *)our_tv->vval.v_string);
-    }
     else if (our_tv->v_type == VAR_NUMBER)
     {
        char buf[NUMBUFLEN];
@@ -3385,22 +3385,31 @@ WinListItem(WinListObject *self, PyInt n)
     static char *
 StringToLine(PyObject *obj)
 {
-    const char *str;
-    char *save;
-    PyObject *bytes;
-    PyInt len;
-    PyInt i;
-    char *p;
+    char       *str;
+    char       *save;
+    PyObject   *bytes = NULL;
+    Py_ssize_t len;
+    PyInt      i;
+    char       *p;
 
-    if (obj == NULL || !PyString_Check(obj))
+    if (PyBytes_Check(obj))
     {
-       PyErr_BadArgument();
-       return NULL;
+       if (PyBytes_AsStringAndSize(obj, &str, &len) == -1
+               || str == NULL)
+           return NULL;
     }
+    else if (PyUnicode_Check(obj))
+    {
+       if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL)))
+           return NULL;
 
-    bytes = PyString_AsBytes(obj);  /* for Python 2 this does nothing */
-    str = PyString_AsString(bytes);
-    len = PyString_Size(bytes);
+       if(PyBytes_AsStringAndSize(bytes, &str, &len) == -1
+               || str == NULL)
+       {
+           Py_DECREF(bytes);
+           return NULL;
+       }
+    }
 
     /*
      * Error checking: String must not contain newlines, as we
@@ -3439,7 +3448,7 @@ StringToLine(PyObject *obj)
     }
 
     save[i] = '\0';
-    PyString_FreeBytes(bytes);  /* Python 2 does nothing here */
+    Py_XDECREF(bytes);  /* Python 2 does nothing here */
 
     return save;
 }
@@ -3568,10 +3577,10 @@ SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
 
        return OK;
     }
-    else if (PyString_Check(line))
+    else if (PyBytes_Check(line) || PyUnicode_Check(line))
     {
-       char *save = StringToLine(line);
-       buf_T *savebuf;
+       char    *save = StringToLine(line);
+       buf_T   *savebuf;
 
        if (save == NULL)
            return FAIL;
@@ -3821,7 +3830,7 @@ InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
     /* First of all, we check the type of the supplied Python object.
      * It must be a string or a list, or the call is in error.
      */
-    if (PyString_Check(lines))
+    if (PyBytes_Check(lines) || PyUnicode_Check(lines))
     {
        char    *str = StringToLine(lines);
        buf_T   *savebuf;
@@ -5254,7 +5263,7 @@ _ConvertFromPyObject(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
     {
        char_u  *result;
 
-       if (PyString_AsStringAndSize(obj, (char **) &result, NULL) == -1)
+       if (PyBytes_AsStringAndSize(obj, (char **) &result, NULL) == -1)
            return -1;
        if (result == NULL)
            return -1;
@@ -5269,11 +5278,11 @@ _ConvertFromPyObject(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
        PyObject        *bytes;
        char_u  *result;
 
-       bytes = PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, NULL);
+       bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL);
        if (bytes == NULL)
            return -1;
 
-       if(PyString_AsStringAndSize(bytes, (char **) &result, NULL) == -1)
+       if(PyBytes_AsStringAndSize(bytes, (char **) &result, NULL) == -1)
            return -1;
        if (result == NULL)
            return -1;
index 4a7c9d25893e628b6c3dffdcbc5a77f94434e394..ed51119912ac893531611ccddd302d4d11d7519c 100644 (file)
 #undef main /* Defined in python.h - aargh */
 #undef HAVE_FCNTL_H /* Clash with os_win32.h */
 
-#define PyBytes_FromString PyString_FromString
-#define PyBytes_Check PyString_Check
-
-/* No-op conversion functions, use with care! */
-#define PyString_AsBytes(obj) (obj)
-#define PyString_FreeBytes(obj)
+#define PyBytes_FromString      PyString_FromString
+#define PyBytes_Check           PyString_Check
+#define PyBytes_AsStringAndSize PyString_AsStringAndSize
 
 #if !defined(FEAT_PYTHON) && defined(PROTO)
 /* Use this to be able to generate prototypes without python being used. */
index d53d601fc0cad4cb6195e02df1202c6fdafbae21..9052e4159706267138a6a32b6bd5ddf4f4ddeaa6 100644 (file)
 
 #define PyInt Py_ssize_t
 #define PyString_Check(obj) PyUnicode_Check(obj)
-#define PyString_AsBytes(obj) PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, CODEC_ERROR_HANDLER)
-#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)
 #define PyString_FromFormat PyUnicode_FromFormat
-#define PyString_AsStringAndSize(obj, buffer, len) PyBytes_AsStringAndSize(obj, buffer, len)
 #define PyInt_Check(obj) PyLong_Check(obj)
 #define PyInt_FromLong(i) PyLong_FromLong(i)
 #define PyInt_AsLong(obj) PyLong_AsLong(obj)
@@ -357,7 +352,7 @@ static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
 # endif
 static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
 static char* (*py3_PyBytes_AsString)(PyObject *bytes);
-static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, int *length);
+static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, Py_ssize_t *length);
 static PyObject* (*py3_PyBytes_FromString)(char *str);
 static PyObject* (*py3_PyFloat_FromDouble)(double num);
 static double (*py3_PyFloat_AsDouble)(PyObject *);
index 29a1b2816173cbf476b33ec5678f136be8483963..2fc01b66793bce1979bf0cd755f6992c3245e3cb 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1228,
 /**/
     1227,
 /**/