changeset 4593:0cf552b325b5 v7.3.1044

updated for version 7.3.1044 Problem: Python: No {Buffer,TabPage,Window}.valid attributes. Solution: Python patch 5: add .valid (ZyX)
author Bram Moolenaar <bram@vim.org>
date Wed, 29 May 2013 22:15:30 +0200
parents 706bcc2010f5
children 3c76a1a28155
files src/if_py_both.h src/if_python.c src/if_python3.c src/testdir/test86.in src/testdir/test86.ok src/testdir/test87.in src/testdir/test87.ok src/version.c
diffstat 8 files changed, 85 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -1815,6 +1815,19 @@ TabPageDestructor(TabPageObject *self)
 }
 
     static PyObject *
+TabPageAttrValid(TabPageObject *self, char *name)
+{
+    PyObject *r;
+
+    if (strcmp(name, "valid") != 0)
+	return NULL;
+
+    r = ((self->tab == INVALID_TABPAGE_VALUE) ? Py_False : Py_True);
+    Py_INCREF(r);
+    return r;
+}
+
+    static PyObject *
 TabPageAttr(TabPageObject *self, char *name)
 {
     if (strcmp(name, "windows") == 0)
@@ -2010,6 +2023,19 @@ get_firstwin(TabPageObject *tabObject)
 }
 
     static PyObject *
+WindowAttrValid(WindowObject *self, char *name)
+{
+    PyObject *r;
+
+    if (strcmp(name, "valid") != 0)
+	return NULL;
+
+    r = ((self->win == INVALID_WINDOW_VALUE) ? Py_False : Py_True);
+    Py_INCREF(r);
+    return r;
+}
+
+    static PyObject *
 WindowAttr(WindowObject *self, char *name)
 {
     if (strcmp(name, "buffer") == 0)
@@ -2050,8 +2076,8 @@ WindowAttr(WindowObject *self, char *nam
 	return (PyObject *)(self->tabObject);
     }
     else if (strcmp(name,"__members__") == 0)
-	return Py_BuildValue("[sssssssss]", "buffer", "cursor", "height",
-		"vars", "options", "number", "row", "col", "tabpage");
+	return Py_BuildValue("[ssssssssss]", "buffer", "cursor", "height",
+		"vars", "options", "number", "row", "col", "tabpage", "valid");
     else
 	return NULL;
 }
@@ -3186,6 +3212,19 @@ BufferSlice(BufferObject *self, PyInt lo
 }
 
     static PyObject *
+BufferAttrValid(BufferObject *self, char *name)
+{
+    PyObject *r;
+
+    if (strcmp(name, "valid") != 0)
+	return NULL;
+
+    r = ((self->buf == INVALID_BUFFER_VALUE) ? Py_False : Py_True);
+    Py_INCREF(r);
+    return r;
+}
+
+    static PyObject *
 BufferAttr(BufferObject *self, char *name)
 {
     if (strcmp(name, "name") == 0)
@@ -3198,7 +3237,8 @@ BufferAttr(BufferObject *self, char *nam
 	return OptionsNew(SREQ_BUF, self->buf, (checkfun) CheckBuffer,
 			(PyObject *) self);
     else if (strcmp(name,"__members__") == 0)
-	return Py_BuildValue("[ssss]", "name", "number", "vars", "options");
+	return Py_BuildValue("[sssss]", "name", "number", "vars", "options",
+		"valid");
     else
 	return NULL;
 }
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -1125,6 +1125,9 @@ BufferGetattr(PyObject *self, char *name
 {
     PyObject *r;
 
+    if ((r = BufferAttrValid((BufferObject *)(self), name)))
+	return r;
+
     if (CheckBuffer((BufferObject *)(self)))
 	return NULL;
 
@@ -1206,6 +1209,9 @@ TabPageGetattr(PyObject *self, char *nam
 {
     PyObject *r;
 
+    if ((r = TabPageAttrValid((TabPageObject *)(self), name)))
+	return r;
+
     if (CheckTabPage((TabPageObject *)(self)))
 	return NULL;
 
@@ -1224,6 +1230,9 @@ WindowGetattr(PyObject *self, char *name
 {
     PyObject *r;
 
+    if ((r = WindowAttrValid((WindowObject *)(self), name)))
+	return r;
+
     if (CheckWindow((WindowObject *)(self)))
 	return NULL;
 
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -1067,12 +1067,15 @@ static PyMappingMethods BufferAsMapping 
  */
 
     static PyObject *
-BufferGetattro(PyObject *self, PyObject*nameobj)
+BufferGetattro(PyObject *self, PyObject *nameobj)
 {
     PyObject *r;
 
     GET_ATTR_STRING(name, nameobj);
 
+    if ((r = BufferAttrValid((BufferObject *)(self), name)))
+	return r;
+
     if (CheckBuffer((BufferObject *)(self)))
 	return NULL;
 
@@ -1094,8 +1097,9 @@ BufferSetattro(PyObject *self, PyObject 
     static PyObject *
 BufferDir(PyObject *self UNUSED)
 {
-    return Py_BuildValue("[sssss]", "name", "number",
-						   "append", "mark", "range");
+    return Py_BuildValue("[ssssssss]",
+	    "name", "number", "vars", "options", "valid",
+	    "append", "mark", "range");
 }
 
 /******************/
@@ -1283,6 +1287,9 @@ TabPageGetattro(PyObject *self, PyObject
 
     GET_ATTR_STRING(name, nameobj);
 
+    if ((r = TabPageAttrValid((TabPageObject *)(self), name)))
+	return r;
+
     if (CheckTabPage((TabPageObject *)(self)))
 	return NULL;
 
@@ -1303,6 +1310,9 @@ WindowGetattro(PyObject *self, PyObject 
 
     GET_ATTR_STRING(name, nameobj);
 
+    if ((r = WindowAttrValid((WindowObject *)(self), name)))
+	return r;
+
     if (CheckWindow((WindowObject *)(self)))
 	return NULL;
 
--- a/src/testdir/test86.in
+++ b/src/testdir/test86.in
@@ -513,6 +513,7 @@ for _b in vim.buffers:
     if _b is not cb:
         vim.command('bwipeout! ' + str(_b.number))
 del _b
+cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
 for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")', 'b.name = "!"'):
     try:
         exec(expr)
@@ -663,9 +664,13 @@ cb.append('Current tab page: ' + repr(vi
 cb.append('Current window: ' + repr(vim.current.window))
 cb.append('Current buffer: ' + repr(vim.current.buffer))
 cb.append('Current line: ' + repr(vim.current.line))
+ws = list(vim.windows)
+ts = list(vim.tabpages)
 for b in vim.buffers:
     if b is not cb:
         vim.command('bwipeout! ' + str(b.number))
+cb.append('w.valid: ' + repr([w.valid for w in ws]))
+cb.append('t.valid: ' + repr([t.valid for t in ts]))
 EOF
 :tabonly!
 :only!
--- a/src/testdir/test86.ok
+++ b/src/testdir/test86.ok
@@ -328,6 +328,7 @@ testdir/bar
 1:BufFilePre:1
 7:BufFilePost:1
 testdir/test86.in
+valid: b:False, cb:True
 i:<buffer test86.in>
 i2:<buffer test86.in>
 i:<buffer a>
@@ -344,7 +345,7 @@ Number of tabs: 4
 Current tab pages:
   <tabpage 0>(1): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (36, 0)
+    <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (37, 0)
   <tabpage 1>(2): 1 windows, current is <window object (unknown)>
   Windows:
     <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
@@ -370,6 +371,8 @@ Current tab page: <tabpage 2>
 Current window: <window 0>
 Current buffer: <buffer test86.in>
 Current line: 'Type error at assigning None to vim.current.buffer'
+w.valid: [True, False]
+t.valid: [True, False, True, False]
 vim.vars:Dictionary:True
 vim.options:Options:True
 vim.bindeval("{}"):Dictionary:True
--- a/src/testdir/test87.in
+++ b/src/testdir/test87.in
@@ -500,6 +500,7 @@ for _b in vim.buffers:
     if _b is not cb:
         vim.command('bwipeout! ' + str(_b.number))
 del _b
+cb.append('valid: b:%s, cb:%s' % (repr(b.valid), repr(cb.valid)))
 for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
     try:
         exec(expr)
@@ -641,9 +642,13 @@ cb.append('Current tab page: ' + repr(vi
 cb.append('Current window: ' + repr(vim.current.window))
 cb.append('Current buffer: ' + repr(vim.current.buffer))
 cb.append('Current line: ' + repr(vim.current.line))
+ws = list(vim.windows)
+ts = list(vim.tabpages)
 for b in vim.buffers:
     if b is not cb:
         vim.command('bwipeout! ' + str(b.number))
+cb.append('w.valid: ' + repr([w.valid for w in ws]))
+cb.append('t.valid: ' + repr([t.valid for t in ts]))
 EOF
 :tabonly!
 :only!
--- a/src/testdir/test87.ok
+++ b/src/testdir/test87.ok
@@ -317,6 +317,7 @@ testdir/bar
 1:BufFilePre:1
 7:BufFilePost:1
 testdir/test87.in
+valid: b:False, cb:True
 i:<buffer test87.in>
 i2:<buffer test87.in>
 i:<buffer a>
@@ -333,7 +334,7 @@ Number of tabs: 4
 Current tab pages:
   <tabpage 0>(1): 1 windows, current is <window object (unknown)>
   Windows:
-    <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (36, 0)
+    <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (37, 0)
   <tabpage 1>(2): 1 windows, current is <window object (unknown)>
   Windows:
     <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
@@ -359,6 +360,8 @@ Current tab page: <tabpage 2>
 Current window: <window 0>
 Current buffer: <buffer test87.in>
 Current line: 'Type error at assigning None to vim.current.buffer'
+w.valid: [True, False]
+t.valid: [True, False, True, False]
 vim.vars:Dictionary:True
 vim.options:Options:True
 vim.bindeval("{}"):Dictionary:True
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1044,
+/**/
     1043,
 /**/
     1042,