| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| + } |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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); |
| } |
| |
| / |
| |
| |
| |
| *** 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 /// |