To: vim_dev@googlegroups.com
Subject: Patch 7.3.995
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.3.995
Problem: Python: Module initialization is duplicated.
Solution: Move to shared file. (ZyX)
Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
*** ../vim-7.3.994/src/if_py_both.h 2013-05-21 19:01:51.000000000 +0200
--- src/if_py_both.h 2013-05-21 19:07:17.000000000 +0200
***************
*** 4181,4183 ****
--- 4181,4295 ----
vimmodule.m_methods = VimMethods;
#endif
}
+
+ #define PYTYPE_READY(type) \
+ if (PyType_Ready(&type)) \
+ return -1;
+
+ static int
+ init_types()
+ {
+ PYTYPE_READY(IterType);
+ PYTYPE_READY(BufferType);
+ PYTYPE_READY(RangeType);
+ PYTYPE_READY(WindowType);
+ PYTYPE_READY(TabPageType);
+ PYTYPE_READY(BufMapType);
+ PYTYPE_READY(WinListType);
+ PYTYPE_READY(TabListType);
+ PYTYPE_READY(CurrentType);
+ PYTYPE_READY(DictionaryType);
+ PYTYPE_READY(ListType);
+ PYTYPE_READY(FunctionType);
+ PYTYPE_READY(OptionsType);
+ PYTYPE_READY(OutputType);
+ return 0;
+ }
+
+ static BufMapObject TheBufferMap =
+ {
+ PyObject_HEAD_INIT(&BufMapType)
+ };
+
+ static WinListObject TheWindowList =
+ {
+ PyObject_HEAD_INIT(&WinListType)
+ NULL
+ };
+
+ static CurrentObject TheCurrent =
+ {
+ PyObject_HEAD_INIT(&CurrentType)
+ };
+
+ static TabListObject TheTabPageList =
+ {
+ PyObject_HEAD_INIT(&TabListType)
+ };
+
+ static struct numeric_constant {
+ char *name;
+ int value;
+ } numeric_constants[] = {
+ {"VAR_LOCKED", VAR_LOCKED},
+ {"VAR_FIXED", VAR_FIXED},
+ {"VAR_SCOPE", VAR_SCOPE},
+ {"VAR_DEF_SCOPE", VAR_DEF_SCOPE},
+ };
+
+ static struct object_constant {
+ char *name;
+ PyObject *value;
+ } object_constants[] = {
+ {"buffers", (PyObject *)(void *)&TheBufferMap},
+ {"windows", (PyObject *)(void *)&TheWindowList},
+ {"tabpages", (PyObject *)(void *)&TheTabPageList},
+ {"current", (PyObject *)(void *)&TheCurrent},
+ };
+
+ typedef int (*object_adder)(PyObject *, const char *, PyObject *);
+
+ #define ADD_OBJECT(m, name, obj) \
+ if (add_object(m, name, obj)) \
+ return -1;
+
+ #define ADD_CHECKED_OBJECT(m, name, obj) \
+ { \
+ PyObject *value = obj; \
+ if (!value) \
+ return -1; \
+ ADD_OBJECT(m, name, value); \
+ }
+
+ static int
+ populate_module(PyObject *m, object_adder add_object)
+ {
+ int i;
+
+ for (i = 0; i < (int)(sizeof(numeric_constants)
+ / sizeof(struct numeric_constant));
+ ++i)
+ ADD_CHECKED_OBJECT(m, numeric_constants[i].name,
+ PyInt_FromLong(numeric_constants[i].value));
+
+ for (i = 0; i < (int)(sizeof(object_constants)
+ / sizeof(struct object_constant));
+ ++i)
+ {
+ PyObject *value;
+
+ value = object_constants[i].value;
+ Py_INCREF(value);
+ ADD_OBJECT(m, object_constants[i].name, value);
+ }
+
+ if (!(VimError = PyErr_NewException("vim.error", NULL, NULL)))
+ return -1;
+ ADD_OBJECT(m, "error", VimError);
+
+ ADD_CHECKED_OBJECT(m, "vars", DictionaryNew(&globvardict));
+ ADD_CHECKED_OBJECT(m, "vvars", DictionaryNew(&vimvardict));
+ ADD_CHECKED_OBJECT(m, "options",
+ OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL));
+ return 0;
+ }
*** ../vim-7.3.994/src/if_python3.c 2013-05-21 19:01:51.000000000 +0200
--- src/if_python3.c 2013-05-21 19:07:40.000000000 +0200
***************
*** 700,706 ****
* Internal function prototypes.
*/
- static int PythonIO_Init(void);
static PyObject *Py3Init_vim(void);
/******************************************************
--- 700,705 ----
***************
*** 780,786 ****
get_py3_exceptions();
#endif
! if (PythonIO_Init())
goto fail;
globals = PyModule_GetDict(PyImport_AddModule("__main__"));
--- 779,785 ----
get_py3_exceptions();
#endif
! if (PythonIO_Init_io())
goto fail;
globals = PyModule_GetDict(PyImport_AddModule("__main__"));
***************
*** 811,817 ****
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
--- 810,816 ----
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init_io() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
***************
*** 1008,1022 ****
return OutputSetattr((OutputObject *)(self), name, val);
}
- /***************/
-
- static int
- PythonIO_Init(void)
- {
- PyType_Ready(&OutputType);
- return PythonIO_Init_io();
- }
-
/******************************************************
* 3. Implementation of the Vim module for Python
*/
--- 1007,1012 ----
***************
*** 1538,1585 ****
}
#endif
- static BufMapObject TheBufferMap =
- {
- PyObject_HEAD_INIT(&BufMapType)
- };
-
- static WinListObject TheWindowList =
- {
- PyObject_HEAD_INIT(&WinListType)
- NULL
- };
-
- static CurrentObject TheCurrent =
- {
- PyObject_HEAD_INIT(&CurrentType)
- };
-
- static TabListObject TheTabPageList =
- {
- PyObject_HEAD_INIT(&TabListType)
- };
-
static PyObject *
Py3Init_vim(void)
{
PyObject *mod;
! PyObject *tmp;
/* The special value is removed from sys.path in Python3_Init(). */
static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
! PyType_Ready(&IterType);
! PyType_Ready(&BufferType);
! PyType_Ready(&RangeType);
! PyType_Ready(&WindowType);
! PyType_Ready(&TabPageType);
! PyType_Ready(&BufMapType);
! PyType_Ready(&WinListType);
! PyType_Ready(&TabListType);
! PyType_Ready(&CurrentType);
! PyType_Ready(&DictionaryType);
! PyType_Ready(&ListType);
! PyType_Ready(&FunctionType);
! PyType_Ready(&OptionsType);
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
--- 1528,1543 ----
}
#endif
static PyObject *
Py3Init_vim(void)
{
PyObject *mod;
!
/* The special value is removed from sys.path in Python3_Init(). */
static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
! if (init_types())
! return NULL;
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
***************
*** 1588,1622 ****
if (mod == NULL)
return NULL;
! VimError = PyErr_NewException("vim.error", NULL, NULL);
!
! Py_INCREF(VimError);
! PyModule_AddObject(mod, "error", VimError);
! Py_INCREF((PyObject *)(void *)&TheBufferMap);
! PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferMap);
! Py_INCREF((PyObject *)(void *)&TheCurrent);
! PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent);
! Py_INCREF((PyObject *)(void *)&TheWindowList);
! PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
! Py_INCREF((PyObject *)(void *)&TheTabPageList);
! PyModule_AddObject(mod, "tabpages", (PyObject *)(void *)&TheTabPageList);
!
! PyModule_AddObject(mod, "vars", DictionaryNew(&globvardict));
! PyModule_AddObject(mod, "vvars", DictionaryNew(&vimvardict));
! PyModule_AddObject(mod, "options",
! OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL));
!
! #define ADD_INT_CONSTANT(name, value) \
! tmp = PyLong_FromLong(value); \
! Py_INCREF(tmp); \
! PyModule_AddObject(mod, name, tmp)
!
! ADD_INT_CONSTANT("VAR_LOCKED", VAR_LOCKED);
! ADD_INT_CONSTANT("VAR_FIXED", VAR_FIXED);
! ADD_INT_CONSTANT("VAR_SCOPE", VAR_SCOPE);
! ADD_INT_CONSTANT("VAR_DEF_SCOPE", VAR_DEF_SCOPE);
!
! if (PyErr_Occurred())
return NULL;
return mod;
--- 1546,1552 ----
if (mod == NULL)
return NULL;
! if (populate_module(mod, PyModule_AddObject))
return NULL;
return mod;
*** ../vim-7.3.994/src/if_python.c 2013-05-21 18:30:29.000000000 +0200
--- src/if_python.c 2013-05-21 19:07:26.000000000 +0200
***************
*** 657,663 ****
* Internal function prototypes.
*/
- static int PythonIO_Init(void);
static int PythonMod_Init(void);
--- 657,662 ----
***************
*** 772,778 ****
get_exceptions();
#endif
! if (PythonIO_Init())
goto fail;
if (PythonMod_Init())
--- 771,777 ----
get_exceptions();
#endif
! if (PythonIO_Init_io())
goto fail;
if (PythonMod_Init())
***************
*** 806,812 ****
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
--- 805,811 ----
fail:
/* We call PythonIO_Flush() here to print any Python errors.
* This is OK, as it is possible to call this function even
! * if PythonIO_Init_io() has not completed successfully (it will
* not do anything in this case).
*/
PythonIO_Flush();
***************
*** 993,1009 ****
return Py_FindMethod(OutputMethods, self, name);
}
- /***************/
-
- static int
- PythonIO_Init(void)
- {
- /* Fixups... */
- PyType_Ready(&OutputType);
-
- return PythonIO_Init_io();
- }
-
/******************************************************
* 3. Implementation of the Vim module for Python
*/
--- 992,997 ----
***************
*** 1242,1288 ****
}
#endif
! static BufMapObject TheBufferMap =
! {
! PyObject_HEAD_INIT(&BufMapType)
! };
!
! static WinListObject TheWindowList =
! {
! PyObject_HEAD_INIT(&WinListType)
! NULL
! };
!
! static CurrentObject TheCurrent =
! {
! PyObject_HEAD_INIT(&CurrentType)
! };
!
! static TabListObject TheTabPageList =
{
! PyObject_HEAD_INIT(&TabListType)
! };
static int
PythonMod_Init(void)
{
PyObject *mod;
PyObject *dict;
! PyObject *tmp;
/* The special value is removed from sys.path in Python_Init(). */
static char *(argv[2]) = {"/must>not&exist/foo", NULL};
! /* Fixups... */
! PyType_Ready(&IterType);
! PyType_Ready(&BufferType);
! PyType_Ready(&RangeType);
! PyType_Ready(&WindowType);
! PyType_Ready(&TabPageType);
! PyType_Ready(&BufMapType);
! PyType_Ready(&WinListType);
! PyType_Ready(&TabListType);
! PyType_Ready(&CurrentType);
! PyType_Ready(&OptionsType);
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
--- 1230,1255 ----
}
#endif
! static int
! add_object(PyObject *dict, const char *name, PyObject *object)
{
! if (PyDict_SetItemString(dict, (char *) name, object))
! return -1;
! Py_DECREF(object);
! return 0;
! }
static int
PythonMod_Init(void)
{
PyObject *mod;
PyObject *dict;
!
/* The special value is removed from sys.path in Python_Init(). */
static char *(argv[2]) = {"/must>not&exist/foo", NULL};
! if (init_types())
! return -1;
/* Set sys.argv[] to avoid a crash in warn(). */
PySys_SetArgv(1, argv);
***************
*** 1290,1320 ****
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
dict = PyModule_GetDict(mod);
! VimError = PyErr_NewException("vim.error", NULL, NULL);
!
! PyDict_SetItemString(dict, "error", VimError);
! PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferMap);
! PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
! PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
! PyDict_SetItemString(dict, "tabpages", (PyObject *)(void *)&TheTabPageList);
! tmp = DictionaryNew(&globvardict);
! PyDict_SetItemString(dict, "vars", tmp);
! Py_DECREF(tmp);
! tmp = DictionaryNew(&vimvardict);
! PyDict_SetItemString(dict, "vvars", tmp);
! Py_DECREF(tmp);
! tmp = OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL);
! PyDict_SetItemString(dict, "options", tmp);
! Py_DECREF(tmp);
! PyDict_SetItemString(dict, "VAR_LOCKED", PyInt_FromLong(VAR_LOCKED));
! PyDict_SetItemString(dict, "VAR_FIXED", PyInt_FromLong(VAR_FIXED));
! PyDict_SetItemString(dict, "VAR_SCOPE", PyInt_FromLong(VAR_SCOPE));
! PyDict_SetItemString(dict, "VAR_DEF_SCOPE", PyInt_FromLong(VAR_DEF_SCOPE));
!
! if (PyErr_Occurred())
! return -1;
!
! return 0;
}
/*************************************************************************
--- 1257,1263 ----
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
dict = PyModule_GetDict(mod);
! return populate_module(dict, add_object);
}
/*************************************************************************
*** ../vim-7.3.994/src/version.c 2013-05-21 19:01:51.000000000 +0200
--- src/version.c 2013-05-21 19:06:22.000000000 +0200
***************
*** 730,731 ****
--- 730,733 ----
{ /* Add new patch number below this line */
+ /**/
+ 995,
/**/
--
System administrators are just like women: You can't live with them and you
can't live without them.
/// 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 ///