[vim/f17] - patchlevel 965
Karsten Hopp
karsten at fedoraproject.org
Tue May 21 11:35:49 UTC 2013
commit 98f57671195e3badbbbb4267d06b7b7e6fa2ba85
Author: Karsten Hopp <karsten at redhat.com>
Date: Tue May 21 13:33:39 2013 +0200
- patchlevel 965
7.3.965 | 331 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 331 insertions(+), 0 deletions(-)
---
diff --git a/7.3.965 b/7.3.965
new file mode 100644
index 0000000..cc2d676
--- /dev/null
+++ b/7.3.965
@@ -0,0 +1,331 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.965
+Fcc: outbox
+From: Bram Moolenaar <Bram at moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.965
+Problem: Python garbage collection not working properly.
+Solution: Add support for garbage collection. (ZyX)
+Files: src/if_py_both.h
+
+
+*** ../vim-7.3.964/src/if_py_both.h 2013-05-17 16:18:27.000000000 +0200
+--- src/if_py_both.h 2013-05-17 16:21:05.000000000 +0200
+***************
+*** 543,548 ****
+--- 543,550 ----
+
+ typedef PyObject *(*nextfun)(void **);
+ typedef void (*destructorfun)(void *);
++ typedef int (*traversefun)(void *, visitproc, void *);
++ typedef int (*clearfun)(void **);
+
+ /* Main purpose of this object is removing the need for do python initialization
+ * (i.e. PyType_Ready and setting type attributes) for a big bunch of objects.
+***************
+*** 554,563 ****
+ void *cur;
+ nextfun next;
+ destructorfun destruct;
+ } IterObject;
+
+ static PyObject *
+! IterNew(void *start, destructorfun destruct, nextfun next)
+ {
+ IterObject *self;
+
+--- 556,568 ----
+ void *cur;
+ nextfun next;
+ destructorfun destruct;
++ traversefun traverse;
++ clearfun clear;
+ } IterObject;
+
+ static PyObject *
+! IterNew(void *start, destructorfun destruct, nextfun next, traversefun traverse,
+! clearfun clear)
+ {
+ IterObject *self;
+
+***************
+*** 565,570 ****
+--- 570,577 ----
+ self->cur = start;
+ self->next = next;
+ self->destruct = destruct;
++ self->traverse = traverse;
++ self->clear = clear;
+
+ return (PyObject *)(self);
+ }
+***************
+*** 579,584 ****
+--- 586,613 ----
+ DESTRUCTOR_FINISH(self);
+ }
+
++ static int
++ IterTraverse(PyObject *self, visitproc visit, void *arg)
++ {
++ IterObject *this = (IterObject *)(self);
++
++ if (this->traverse != NULL)
++ return this->traverse(this->cur, visit, arg);
++ else
++ return 0;
++ }
++
++ static int
++ IterClear(PyObject *self)
++ {
++ IterObject *this = (IterObject *)(self);
++
++ if (this->clear != NULL)
++ return this->clear(&this->cur);
++ else
++ return 0;
++ }
++
+ static PyObject *
+ IterNext(PyObject *self)
+ {
+***************
+*** 1034,1040 ****
+ lii->list = l;
+
+ return IterNew(lii,
+! (destructorfun) ListIterDestruct, (nextfun) ListIterNext);
+ }
+
+ static int
+--- 1063,1070 ----
+ lii->list = l;
+
+ return IterNew(lii,
+! (destructorfun) ListIterDestruct, (nextfun) ListIterNext,
+! NULL, NULL);
+ }
+
+ static int
+***************
+*** 1348,1353 ****
+--- 1378,1430 ----
+ PyObject *fromObj;
+ } OptionsObject;
+
++ static int
++ dummy_check(void *arg UNUSED)
++ {
++ return 0;
++ }
++
++ static PyObject *
++ OptionsNew(int opt_type, void *from, checkfun Check, PyObject *fromObj)
++ {
++ OptionsObject *self;
++
++ self = PyObject_NEW(OptionsObject, &OptionsType);
++ if (self == NULL)
++ return NULL;
++
++ self->opt_type = opt_type;
++ self->from = from;
++ self->Check = Check;
++ self->fromObj = fromObj;
++ if (fromObj)
++ Py_INCREF(fromObj);
++
++ return (PyObject *)(self);
++ }
++
++ static void
++ OptionsDestructor(PyObject *self)
++ {
++ if (((OptionsObject *)(self))->fromObj)
++ Py_DECREF(((OptionsObject *)(self))->fromObj);
++ DESTRUCTOR_FINISH(self);
++ }
++
++ static int
++ OptionsTraverse(PyObject *self, visitproc visit, void *arg)
++ {
++ Py_VISIT(((OptionsObject *)(self))->fromObj);
++ return 0;
++ }
++
++ static int
++ OptionsClear(PyObject *self)
++ {
++ Py_CLEAR(((OptionsObject *)(self))->fromObj);
++ return 0;
++ }
++
+ static PyObject *
+ OptionsItem(OptionsObject *this, PyObject *keyObject)
+ {
+***************
+*** 1562,1600 ****
+ return r;
+ }
+
+- static int
+- dummy_check(void *arg UNUSED)
+- {
+- return 0;
+- }
+-
+- static PyObject *
+- OptionsNew(int opt_type, void *from, checkfun Check, PyObject *fromObj)
+- {
+- OptionsObject *self;
+-
+- self = PyObject_NEW(OptionsObject, &OptionsType);
+- if (self == NULL)
+- return NULL;
+-
+- self->opt_type = opt_type;
+- self->from = from;
+- self->Check = Check;
+- self->fromObj = fromObj;
+- if (fromObj)
+- Py_INCREF(fromObj);
+-
+- return (PyObject *)(self);
+- }
+-
+- static void
+- OptionsDestructor(PyObject *self)
+- {
+- if (((OptionsObject *)(self))->fromObj)
+- Py_DECREF(((OptionsObject *)(self))->fromObj);
+- DESTRUCTOR_FINISH(self);
+- }
+-
+ static PyMappingMethods OptionsAsMapping = {
+ (lenfunc) NULL,
+ (binaryfunc) OptionsItem,
+--- 1639,1644 ----
+***************
+*** 1843,1848 ****
+--- 1887,1905 ----
+ else
+ return firstwin;
+ }
++ static int
++ WindowTraverse(PyObject *self, visitproc visit, void *arg)
++ {
++ Py_VISIT(((PyObject *)(((WindowObject *)(self))->tabObject)));
++ return 0;
++ }
++
++ static int
++ WindowClear(PyObject *self)
++ {
++ Py_CLEAR((((WindowObject *)(self))->tabObject));
++ return 0;
++ }
+
+ static PyObject *
+ WindowAttr(WindowObject *this, char *name)
+***************
+*** 3193,3198 ****
+--- 3250,3269 ----
+ }
+ }
+
++ static int
++ BufMapIterTraverse(PyObject *buffer, visitproc visit, void *arg)
++ {
++ Py_VISIT(buffer);
++ return 0;
++ }
++
++ static int
++ BufMapIterClear(PyObject **buffer)
++ {
++ Py_CLEAR(*buffer);
++ return 0;
++ }
++
+ static PyObject *
+ BufMapIterNext(PyObject **buffer)
+ {
+***************
+*** 3228,3234 ****
+
+ buffer = BufferNew(firstbuf);
+ return IterNew(buffer,
+! (destructorfun) BufMapIterDestruct, (nextfun) BufMapIterNext);
+ }
+
+ static PyMappingMethods BufMapAsMapping = {
+--- 3299,3306 ----
+
+ buffer = BufferNew(firstbuf);
+ return IterNew(buffer,
+! (destructorfun) BufMapIterDestruct, (nextfun) BufMapIterNext,
+! (traversefun) BufMapIterTraverse, (clearfun) BufMapIterClear);
+ }
+
+ static PyMappingMethods BufMapAsMapping = {
+***************
+*** 3837,3842 ****
+--- 3909,3916 ----
+ IterType.tp_iter = IterIter;
+ IterType.tp_iternext = IterNext;
+ IterType.tp_dealloc = IterDestructor;
++ IterType.tp_traverse = IterTraverse;
++ IterType.tp_clear = IterClear;
+
+ vim_memset(&BufferType, 0, sizeof(BufferType));
+ BufferType.tp_name = "vim.buffer";
+***************
+*** 3865,3870 ****
+--- 3939,3946 ----
+ WindowType.tp_flags = Py_TPFLAGS_DEFAULT;
+ WindowType.tp_doc = "vim Window object";
+ WindowType.tp_methods = WindowMethods;
++ WindowType.tp_traverse = WindowTraverse;
++ WindowType.tp_clear = WindowClear;
+ #if PY_MAJOR_VERSION >= 3
+ WindowType.tp_getattro = WindowGetattro;
+ WindowType.tp_setattro = WindowSetattro;
+***************
+*** 4003,4008 ****
+--- 4079,4086 ----
+ OptionsType.tp_doc = "object for manipulating options";
+ OptionsType.tp_as_mapping = &OptionsAsMapping;
+ OptionsType.tp_dealloc = OptionsDestructor;
++ OptionsType.tp_traverse = OptionsTraverse;
++ OptionsType.tp_clear = OptionsClear;
+
+ #if PY_MAJOR_VERSION >= 3
+ vim_memset(&vimmodule, 0, sizeof(vimmodule));
+*** ../vim-7.3.964/src/version.c 2013-05-17 16:18:27.000000000 +0200
+--- src/version.c 2013-05-17 16:21:24.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+ { /* Add new patch number below this line */
++ /**/
++ 965,
+ /**/
+
+--
+ARTHUR: Charge!
+ [They all charge with swords drawn towards the RABBIT. A tremendous twenty
+ second fight with Peckinpahish shots and borrowing heavily also on the
+ Kung Fu and karate-type films ensues, in which some four KNIGHTS are
+ comprehensively killed.]
+ARTHUR: Run away! Run away!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram at 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 ///
More information about the scm-commits
mailing list