To: vim_dev@googlegroups.com Subject: Patch 7.3.995 Fcc: outbox From: Bram Moolenaar 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 ///