diff --git a/7.3.1228 b/7.3.1228 new file mode 100644 index 0000000..9fc1cd8 --- /dev/null +++ b/7.3.1228 @@ -0,0 +1,359 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.1228 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.1228 +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) +Files: src/if_py_both.h, src/if_python3.c, src/if_python.c + + +*** ../vim-7.3.1227/src/if_py_both.h 2013-06-23 13:00:40.000000000 +0200 +--- src/if_py_both.h 2013-06-23 13:08:18.000000000 +0200 +*************** +*** 18,24 **** + #endif + + #ifdef FEAT_MBYTE +! # define ENC_OPT p_enc + #else + # define ENC_OPT "latin1" + #endif +--- 18,24 ---- + #endif + + #ifdef FEAT_MBYTE +! # define ENC_OPT ((char *)p_enc) + #else + # define ENC_OPT "latin1" + #endif +*************** +*** 92,119 **** + 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) + return NULL; + + *todecref = NULL; + } + else if (PyUnicode_Check(object)) + { +! bytes = PyUnicode_AsEncodedString(object, (char *)ENC_OPT, NULL); +! if (bytes == NULL) +! return NULL; + +! if(PyString_AsStringAndSize(bytes, (char **) &p, NULL) == -1) + return NULL; +! if (p == NULL) + return NULL; + + *todecref = bytes; + } +--- 92,120 ---- + StringToChars(PyObject *object, PyObject **todecref) + { + char_u *p; + + if (PyBytes_Check(object)) + { + +! if (PyBytes_AsStringAndSize(object, (char **) &p, NULL) == -1 +! || p == NULL) + return NULL; + + *todecref = NULL; + } + else if (PyUnicode_Check(object)) + { +! PyObject *bytes; + +! if (!(bytes = PyUnicode_AsEncodedString(object, ENC_OPT, NULL))) + return NULL; +! +! if(PyBytes_AsStringAndSize(bytes, (char **) &p, NULL) == -1 +! || p == NULL) +! { +! Py_DECREF(bytes); + return NULL; ++ } + + *todecref = bytes; + } +*************** +*** 133,138 **** +--- 134,140 ---- + + if (!(string = PyString_FromString(s))) + return -1; ++ + if (PyList_Append(list, string)) + { + Py_DECREF(string); +*************** +*** 534,543 **** + } + + 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]; +--- 536,543 ---- +*************** +*** 3385,3406 **** + static char * + StringToLine(PyObject *obj) + { +! const char *str; +! char *save; +! PyObject *bytes; +! PyInt len; +! PyInt i; +! char *p; + +! if (obj == NULL || !PyString_Check(obj)) + { +! PyErr_BadArgument(); +! 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 +--- 3385,3415 ---- + static char * + StringToLine(PyObject *obj) + { +! char *str; +! char *save; +! PyObject *bytes = NULL; +! Py_ssize_t len; +! PyInt i; +! char *p; + +! if (PyBytes_Check(obj)) + { +! 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; + +! if(PyBytes_AsStringAndSize(bytes, &str, &len) == -1 +! || str == NULL) +! { +! Py_DECREF(bytes); +! return NULL; +! } +! } + + /* + * Error checking: String must not contain newlines, as we +*************** +*** 3439,3445 **** + } + + save[i] = '\0'; +! PyString_FreeBytes(bytes); /* Python 2 does nothing here */ + + return save; + } +--- 3448,3454 ---- + } + + save[i] = '\0'; +! Py_XDECREF(bytes); /* Python 2 does nothing here */ + + return save; + } +*************** +*** 3568,3577 **** + + return OK; + } +! else if (PyString_Check(line)) + { +! char *save = StringToLine(line); +! buf_T *savebuf; + + if (save == NULL) + return FAIL; +--- 3577,3586 ---- + + return OK; + } +! else if (PyBytes_Check(line) || PyUnicode_Check(line)) + { +! char *save = StringToLine(line); +! buf_T *savebuf; + + if (save == NULL) + return FAIL; +*************** +*** 3821,3827 **** + /* 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)) + { + char *str = StringToLine(lines); + buf_T *savebuf; +--- 3830,3836 ---- + /* 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 (PyBytes_Check(lines) || PyUnicode_Check(lines)) + { + char *str = StringToLine(lines); + buf_T *savebuf; +*************** +*** 5254,5260 **** + { + char_u *result; + +! if (PyString_AsStringAndSize(obj, (char **) &result, NULL) == -1) + return -1; + if (result == NULL) + return -1; +--- 5263,5269 ---- + { + char_u *result; + +! if (PyBytes_AsStringAndSize(obj, (char **) &result, NULL) == -1) + return -1; + if (result == NULL) + return -1; +*************** +*** 5269,5279 **** + PyObject *bytes; + char_u *result; + +! bytes = PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, NULL); + if (bytes == NULL) + return -1; + +! if(PyString_AsStringAndSize(bytes, (char **) &result, NULL) == -1) + return -1; + if (result == NULL) + return -1; +--- 5278,5288 ---- + PyObject *bytes; + char_u *result; + +! bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL); + if (bytes == NULL) + return -1; + +! if(PyBytes_AsStringAndSize(bytes, (char **) &result, NULL) == -1) + return -1; + if (result == NULL) + return -1; +*** ../vim-7.3.1227/src/if_python3.c 2013-06-13 20:57:44.000000000 +0200 +--- src/if_python3.c 2013-06-23 13:08:18.000000000 +0200 +*************** +*** 84,96 **** + + #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) +--- 84,91 ---- +*************** +*** 357,363 **** + # 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 PyObject* (*py3_PyBytes_FromString)(char *str); + static PyObject* (*py3_PyFloat_FromDouble)(double num); + static double (*py3_PyFloat_AsDouble)(PyObject *); +--- 352,358 ---- + # 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, Py_ssize_t *length); + static PyObject* (*py3_PyBytes_FromString)(char *str); + static PyObject* (*py3_PyFloat_FromDouble)(double num); + static double (*py3_PyFloat_AsDouble)(PyObject *); +*** ../vim-7.3.1227/src/if_python.c 2013-06-12 14:40:58.000000000 +0200 +--- src/if_python.c 2013-06-23 13:08:18.000000000 +0200 +*************** +*** 68,79 **** + #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) + + #if !defined(FEAT_PYTHON) && defined(PROTO) + /* Use this to be able to generate prototypes without python being used. */ +--- 68,76 ---- + #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 +! #define PyBytes_AsStringAndSize PyString_AsStringAndSize + + #if !defined(FEAT_PYTHON) && defined(PROTO) + /* Use this to be able to generate prototypes without python being used. */ +*** ../vim-7.3.1227/src/version.c 2013-06-23 13:00:40.000000000 +0200 +--- src/version.c 2013-06-23 13:07:40.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1228, + /**/ + +-- + In war we're tough and able. + Quite indefatigable + Between our quests + We sequin vests + And impersonate Clark Gable + It's a busy life in Camelot. + I have to push the pram a lot. + "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 ///