To: vim-dev@vim.org Subject: Patch 7.3.007 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.007 Problem: Python code defines global "buffer". Re-implements a grow-array. Solution: Use a grow-array instead of coding the same functionality. Handle out-of-memory situation properly. Files: src/if_py_both.h *** ../vim-7.3.006/src/if_py_both.h 2010-08-15 21:57:27.000000000 +0200 --- src/if_py_both.h 2010-09-21 16:00:54.000000000 +0200 *************** *** 34,39 **** --- 34,40 ---- static PyObject *OutputWrite(PyObject *, PyObject *); static PyObject *OutputWritelines(PyObject *, PyObject *); + /* Function to write a line, points to either msg() or emsg(). */ typedef void (*writefn)(char_u *); static void writer(writefn fn, char_u *str, PyInt n); *************** *** 122,173 **** return Py_None; } ! static char_u *buffer = NULL; ! static PyInt buffer_len = 0; ! static PyInt buffer_size = 0; ! static writefn old_fn = NULL; static void - buffer_ensure(PyInt n) - { - PyInt new_size; - char_u *new_buffer; - - if (n < buffer_size) - return; - - new_size = buffer_size; - while (new_size < n) - new_size += 80; - - if (new_size != buffer_size) - { - new_buffer = alloc((unsigned)new_size); - if (new_buffer == NULL) - return; - - if (buffer) - { - memcpy(new_buffer, buffer, buffer_len); - vim_free(buffer); - } - - buffer = new_buffer; - buffer_size = new_size; - } - } - - static void PythonIO_Flush(void) { ! if (old_fn && buffer_len) { ! buffer[buffer_len] = 0; ! old_fn(buffer); } ! ! buffer_len = 0; } static void --- 123,141 ---- return Py_None; } ! /* Buffer IO, we write one whole line at a time. */ ! static garray_T io_ga = {0, 0, 1, 80, NULL}; static writefn old_fn = NULL; static void PythonIO_Flush(void) { ! if (old_fn != NULL && io_ga.ga_len > 0) { ! ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL; ! old_fn((char_u *)io_ga.ga_data); } ! io_ga.ga_len = 0; } static void *************** *** 175,204 **** { char_u *ptr; ! if (fn != old_fn && old_fn != NULL) PythonIO_Flush(); - old_fn = fn; while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL) { PyInt len = ptr - str; ! buffer_ensure(buffer_len + len + 1); ! memcpy(buffer + buffer_len, str, len); ! buffer_len += len; ! buffer[buffer_len] = 0; ! fn(buffer); str = ptr + 1; n -= len + 1; ! buffer_len = 0; } ! /* Put the remaining text into the buffer for later printing */ ! buffer_ensure(buffer_len + n + 1); ! memcpy(buffer + buffer_len, str, n); ! buffer_len += n; } /***************/ --- 143,176 ---- { char_u *ptr; ! /* Flush when switching output function. */ ! if (fn != old_fn) PythonIO_Flush(); old_fn = fn; + /* Write each NL separated line. Text after the last NL is kept for + * writing later. */ while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL) { PyInt len = ptr - str; ! if (ga_grow(&io_ga, len + 1) == FAIL) ! break; ! mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)len); ! ((char *)io_ga.ga_data)[io_ga.ga_len + len] = NUL; ! fn((char_u *)io_ga.ga_data); str = ptr + 1; n -= len + 1; ! io_ga.ga_len = 0; } ! /* Put the remaining text into io_ga for later printing. */ ! if (n > 0 && ga_grow(&io_ga, n + 1) == OK) ! { ! mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)n); ! io_ga.ga_len += n; ! } } /***************/ *** ../vim-7.3.006/src/version.c 2010-09-18 13:36:41.000000000 +0200 --- src/version.c 2010-09-21 16:49:13.000000000 +0200 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 7, /**/ -- hundred-and-one symptoms of being an internet addict: 180. You maintain more than six e-mail addresses. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///