comparison src/if_python3.c @ 4833:70b1178dec79 v7.3.1163

updated for version 7.3.1163 Problem: Not easy to load Python modules. Solution: Search "python2", "python3" and "pythonx" directories in 'runtimepath' for Python modules. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Mon, 10 Jun 2013 21:27:29 +0200
parents 46077370bc60
children 52850ef928f8
comparison
equal deleted inserted replaced
4832:54430b55ceff 4833:70b1178dec79
132 # define PyErr_Occurred py3_PyErr_Occurred 132 # define PyErr_Occurred py3_PyErr_Occurred
133 # define PyErr_PrintEx py3_PyErr_PrintEx 133 # define PyErr_PrintEx py3_PyErr_PrintEx
134 # define PyErr_SetNone py3_PyErr_SetNone 134 # define PyErr_SetNone py3_PyErr_SetNone
135 # define PyErr_SetString py3_PyErr_SetString 135 # define PyErr_SetString py3_PyErr_SetString
136 # define PyErr_SetObject py3_PyErr_SetObject 136 # define PyErr_SetObject py3_PyErr_SetObject
137 # define PyErr_ExceptionMatches py3_PyErr_ExceptionMatches
137 # define PyEval_InitThreads py3_PyEval_InitThreads 138 # define PyEval_InitThreads py3_PyEval_InitThreads
138 # define PyEval_RestoreThread py3_PyEval_RestoreThread 139 # define PyEval_RestoreThread py3_PyEval_RestoreThread
139 # define PyEval_SaveThread py3_PyEval_SaveThread 140 # define PyEval_SaveThread py3_PyEval_SaveThread
140 # define PyGILState_Ensure py3_PyGILState_Ensure 141 # define PyGILState_Ensure py3_PyGILState_Ensure
141 # define PyGILState_Release py3_PyGILState_Release 142 # define PyGILState_Release py3_PyGILState_Release
142 # define PyLong_AsLong py3_PyLong_AsLong 143 # define PyLong_AsLong py3_PyLong_AsLong
143 # define PyLong_FromLong py3_PyLong_FromLong 144 # define PyLong_FromLong py3_PyLong_FromLong
144 # define PyList_GetItem py3_PyList_GetItem 145 # define PyList_GetItem py3_PyList_GetItem
145 # define PyList_Append py3_PyList_Append 146 # define PyList_Append py3_PyList_Append
147 # define PyList_Insert py3_PyList_Insert
146 # define PyList_New py3_PyList_New 148 # define PyList_New py3_PyList_New
147 # define PyList_SetItem py3_PyList_SetItem 149 # define PyList_SetItem py3_PyList_SetItem
148 # define PyList_Size py3_PyList_Size 150 # define PyList_Size py3_PyList_Size
149 # define PySequence_Check py3_PySequence_Check 151 # define PySequence_Check py3_PySequence_Check
150 # define PySequence_Size py3_PySequence_Size 152 # define PySequence_Size py3_PySequence_Size
175 # define PyObject_CallFunctionObjArgs py3_PyObject_CallFunctionObjArgs 177 # define PyObject_CallFunctionObjArgs py3_PyObject_CallFunctionObjArgs
176 # define PyObject_Call py3_PyObject_Call 178 # define PyObject_Call py3_PyObject_Call
177 # define PyEval_GetLocals py3_PyEval_GetLocals 179 # define PyEval_GetLocals py3_PyEval_GetLocals
178 # define PyEval_GetGlobals py3_PyEval_GetGlobals 180 # define PyEval_GetGlobals py3_PyEval_GetGlobals
179 # define PySys_SetObject py3_PySys_SetObject 181 # define PySys_SetObject py3_PySys_SetObject
182 # define PySys_GetObject py3_PySys_GetObject
180 # define PySys_SetArgv py3_PySys_SetArgv 183 # define PySys_SetArgv py3_PySys_SetArgv
181 # define PyType_Ready py3_PyType_Ready 184 # define PyType_Ready py3_PyType_Ready
182 #undef Py_BuildValue 185 #undef Py_BuildValue
183 # define Py_BuildValue py3_Py_BuildValue 186 # define Py_BuildValue py3_Py_BuildValue
184 # define Py_SetPythonHome py3_Py_SetPythonHome 187 # define Py_SetPythonHome py3_Py_SetPythonHome
266 static void (*py3_Py_Initialize)(void); 269 static void (*py3_Py_Initialize)(void);
267 static PyObject* (*py3_PyList_New)(Py_ssize_t size); 270 static PyObject* (*py3_PyList_New)(Py_ssize_t size);
268 static PyGILState_STATE (*py3_PyGILState_Ensure)(void); 271 static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
269 static void (*py3_PyGILState_Release)(PyGILState_STATE); 272 static void (*py3_PyGILState_Release)(PyGILState_STATE);
270 static int (*py3_PySys_SetObject)(char *, PyObject *); 273 static int (*py3_PySys_SetObject)(char *, PyObject *);
271 static PyObject* (*py3_PyList_Append)(PyObject *, PyObject *); 274 static PyObject* (*py3_PySys_GetObject)(char *);
275 static int (*py3_PyList_Append)(PyObject *, PyObject *);
276 static int (*py3_PyList_Insert)(PyObject *, int, PyObject *);
272 static Py_ssize_t (*py3_PyList_Size)(PyObject *); 277 static Py_ssize_t (*py3_PyList_Size)(PyObject *);
273 static int (*py3_PySequence_Check)(PyObject *); 278 static int (*py3_PySequence_Check)(PyObject *);
274 static Py_ssize_t (*py3_PySequence_Size)(PyObject *); 279 static Py_ssize_t (*py3_PySequence_Size)(PyObject *);
275 static PyObject* (*py3_PySequence_GetItem)(PyObject *, Py_ssize_t); 280 static PyObject* (*py3_PySequence_GetItem)(PyObject *, Py_ssize_t);
276 static PyObject* (*py3_PySequence_Fast)(PyObject *, const char *); 281 static PyObject* (*py3_PySequence_Fast)(PyObject *, const char *);
282 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength); 287 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength);
283 static PyObject* (*py3_PyErr_NoMemory)(void); 288 static PyObject* (*py3_PyErr_NoMemory)(void);
284 static void (*py3_Py_Finalize)(void); 289 static void (*py3_Py_Finalize)(void);
285 static void (*py3_PyErr_SetString)(PyObject *, const char *); 290 static void (*py3_PyErr_SetString)(PyObject *, const char *);
286 static void (*py3_PyErr_SetObject)(PyObject *, PyObject *); 291 static void (*py3_PyErr_SetObject)(PyObject *, PyObject *);
292 static int (*py3_PyErr_ExceptionMatches)(PyObject *);
287 static int (*py3_PyRun_SimpleString)(char *); 293 static int (*py3_PyRun_SimpleString)(char *);
288 static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *); 294 static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *);
289 static PyObject* (*py3_PyObject_GetAttrString)(PyObject *, const char *); 295 static PyObject* (*py3_PyObject_GetAttrString)(PyObject *, const char *);
290 static int (*py3_PyObject_HasAttrString)(PyObject *, const char *); 296 static int (*py3_PyObject_HasAttrString)(PyObject *, const char *);
291 static PyObject* (*py3_PyObject_SetAttrString)(PyObject *, const char *, PyObject *); 297 static PyObject* (*py3_PyObject_SetAttrString)(PyObject *, const char *, PyObject *);
391 static PyObject *p3imp_PyExc_KeyError; 397 static PyObject *p3imp_PyExc_KeyError;
392 static PyObject *p3imp_PyExc_KeyboardInterrupt; 398 static PyObject *p3imp_PyExc_KeyboardInterrupt;
393 static PyObject *p3imp_PyExc_TypeError; 399 static PyObject *p3imp_PyExc_TypeError;
394 static PyObject *p3imp_PyExc_ValueError; 400 static PyObject *p3imp_PyExc_ValueError;
395 static PyObject *p3imp_PyExc_RuntimeError; 401 static PyObject *p3imp_PyExc_RuntimeError;
402 static PyObject *p3imp_PyExc_ImportError;
396 403
397 # define PyExc_AttributeError p3imp_PyExc_AttributeError 404 # define PyExc_AttributeError p3imp_PyExc_AttributeError
398 # define PyExc_IndexError p3imp_PyExc_IndexError 405 # define PyExc_IndexError p3imp_PyExc_IndexError
399 # define PyExc_KeyError p3imp_PyExc_KeyError 406 # define PyExc_KeyError p3imp_PyExc_KeyError
400 # define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt 407 # define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt
401 # define PyExc_TypeError p3imp_PyExc_TypeError 408 # define PyExc_TypeError p3imp_PyExc_TypeError
402 # define PyExc_ValueError p3imp_PyExc_ValueError 409 # define PyExc_ValueError p3imp_PyExc_ValueError
403 # define PyExc_RuntimeError p3imp_PyExc_RuntimeError 410 # define PyExc_RuntimeError p3imp_PyExc_RuntimeError
411 # define PyExc_ImportError p3imp_PyExc_ImportError
404 412
405 /* 413 /*
406 * Table of name to function pointer of python. 414 * Table of name to function pointer of python.
407 */ 415 */
408 # define PYTHON_PROC FARPROC 416 # define PYTHON_PROC FARPROC
426 {"PyMem_Malloc", (PYTHON_PROC*)&py3_PyMem_Malloc}, 434 {"PyMem_Malloc", (PYTHON_PROC*)&py3_PyMem_Malloc},
427 {"PyList_New", (PYTHON_PROC*)&py3_PyList_New}, 435 {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
428 {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure}, 436 {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
429 {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release}, 437 {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
430 {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject}, 438 {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject},
439 {"PySys_GetObject", (PYTHON_PROC*)&py3_PySys_GetObject},
431 {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append}, 440 {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append},
441 {"PyList_Insert", (PYTHON_PROC*)&py3_PyList_Insert},
432 {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size}, 442 {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size},
433 {"PySequence_Check", (PYTHON_PROC*)&py3_PySequence_Check}, 443 {"PySequence_Check", (PYTHON_PROC*)&py3_PySequence_Check},
434 {"PySequence_Size", (PYTHON_PROC*)&py3_PySequence_Size}, 444 {"PySequence_Size", (PYTHON_PROC*)&py3_PySequence_Size},
435 {"PySequence_GetItem", (PYTHON_PROC*)&py3_PySequence_GetItem}, 445 {"PySequence_GetItem", (PYTHON_PROC*)&py3_PySequence_GetItem},
436 {"PySequence_Fast", (PYTHON_PROC*)&py3_PySequence_Fast}, 446 {"PySequence_Fast", (PYTHON_PROC*)&py3_PySequence_Fast},
439 {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx}, 449 {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx},
440 {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory}, 450 {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
441 {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize}, 451 {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
442 {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString}, 452 {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
443 {"PyErr_SetObject", (PYTHON_PROC*)&py3_PyErr_SetObject}, 453 {"PyErr_SetObject", (PYTHON_PROC*)&py3_PyErr_SetObject},
454 {"PyErr_ExceptionMatches", (PYTHON_PROC*)&py3_PyErr_ExceptionMatches},
444 {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString}, 455 {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
445 {"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String}, 456 {"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String},
446 {"PyObject_GetAttrString", (PYTHON_PROC*)&py3_PyObject_GetAttrString}, 457 {"PyObject_GetAttrString", (PYTHON_PROC*)&py3_PyObject_GetAttrString},
447 {"PyObject_HasAttrString", (PYTHON_PROC*)&py3_PyObject_HasAttrString}, 458 {"PyObject_HasAttrString", (PYTHON_PROC*)&py3_PyObject_HasAttrString},
448 {"PyObject_SetAttrString", (PYTHON_PROC*)&py3_PyObject_SetAttrString}, 459 {"PyObject_SetAttrString", (PYTHON_PROC*)&py3_PyObject_SetAttrString},
662 p3imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError"); 673 p3imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError");
663 p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); 674 p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
664 p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError"); 675 p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
665 p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError"); 676 p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
666 p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); 677 p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
678 p3imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
667 Py_XINCREF(p3imp_PyExc_AttributeError); 679 Py_XINCREF(p3imp_PyExc_AttributeError);
668 Py_XINCREF(p3imp_PyExc_IndexError); 680 Py_XINCREF(p3imp_PyExc_IndexError);
669 Py_XINCREF(p3imp_PyExc_KeyError); 681 Py_XINCREF(p3imp_PyExc_KeyError);
670 Py_XINCREF(p3imp_PyExc_KeyboardInterrupt); 682 Py_XINCREF(p3imp_PyExc_KeyboardInterrupt);
671 Py_XINCREF(p3imp_PyExc_TypeError); 683 Py_XINCREF(p3imp_PyExc_TypeError);
672 Py_XINCREF(p3imp_PyExc_ValueError); 684 Py_XINCREF(p3imp_PyExc_ValueError);
673 Py_XINCREF(p3imp_PyExc_RuntimeError); 685 Py_XINCREF(p3imp_PyExc_RuntimeError);
686 Py_XINCREF(p3imp_PyExc_ImportError);
674 Py_XDECREF(exmod); 687 Py_XDECREF(exmod);
675 } 688 }
676 #endif /* DYNAMIC_PYTHON3 */ 689 #endif /* DYNAMIC_PYTHON3 */
677 690
678 static int py3initialised = 0; 691 static int py3initialised = 0;
721 static int DictionarySetattro(PyObject *, PyObject *, PyObject *); 734 static int DictionarySetattro(PyObject *, PyObject *, PyObject *);
722 static PyObject *ListGetattro(PyObject *, PyObject *); 735 static PyObject *ListGetattro(PyObject *, PyObject *);
723 static int ListSetattro(PyObject *, PyObject *, PyObject *); 736 static int ListSetattro(PyObject *, PyObject *, PyObject *);
724 static PyObject *FunctionGetattro(PyObject *, PyObject *); 737 static PyObject *FunctionGetattro(PyObject *, PyObject *);
725 738
739 static PyObject *VimPathHook(PyObject *, PyObject *);
740
726 static struct PyModuleDef vimmodule; 741 static struct PyModuleDef vimmodule;
742
743 static PyObject *path_finder;
744 static PyObject *py_find_module = NULL;
727 745
728 #define PY_CAN_RECURSE 746 #define PY_CAN_RECURSE
729 747
730 /* 748 /*
731 * Include the code shared with if_python.c 749 * Include the code shared with if_python.c
1583 } 1601 }
1584 } 1602 }
1585 #endif 1603 #endif
1586 1604
1587 static PyObject * 1605 static PyObject *
1606 VimPathHook(PyObject *self UNUSED, PyObject *args)
1607 {
1608 char *path;
1609
1610 if (PyArg_ParseTuple(args, "s", &path)
1611 && STRCMP(path, vim_special_path) == 0)
1612 {
1613 Py_INCREF(&FinderType);
1614 return (PyObject *) &FinderType;
1615 }
1616
1617 PyErr_Clear();
1618 PyErr_SetNone(PyExc_ImportError);
1619 return NULL;
1620 }
1621
1622 static PyObject *
1623 FinderFindModule(PyObject *cls UNUSED, PyObject *fullname)
1624 {
1625 PyObject *new_path;
1626 PyObject *r;
1627
1628 if (!(new_path = Vim_GetPaths(NULL)))
1629 return NULL;
1630
1631 /* call find_module of the super() class */
1632 r = PyObject_CallFunctionObjArgs(py_find_module, fullname, new_path, NULL);
1633
1634 Py_DECREF(new_path);
1635
1636 return r;
1637 }
1638
1639 static struct PyMethodDef FinderMethods[] = {
1640 {"find_module", FinderFindModule, METH_CLASS|METH_O, ""},
1641 {NULL, NULL, 0, NULL}
1642 };
1643
1644 static PyObject *
1588 Py3Init_vim(void) 1645 Py3Init_vim(void)
1589 { 1646 {
1590 PyObject *mod;
1591
1592 /* The special value is removed from sys.path in Python3_Init(). */ 1647 /* The special value is removed from sys.path in Python3_Init(). */
1593 static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL}; 1648 static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
1649 PyObject *importlib_machinery;
1650
1651 if (!(importlib_machinery = PyImport_ImportModule("importlib.machinery")))
1652 return NULL;
1653
1654 if (!(path_finder = PyObject_GetAttrString(importlib_machinery,
1655 "PathFinder")))
1656 {
1657 Py_DECREF(importlib_machinery);
1658 return NULL;
1659 }
1660
1661 Py_DECREF(importlib_machinery);
1662
1663 vim_memset(&FinderType, 0, sizeof(FinderObject));
1664 FinderType.tp_name = "vim.Finder";
1665 FinderType.tp_basicsize = sizeof(FinderObject);
1666 FinderType.tp_base = (PyTypeObject *) path_finder;
1667 FinderType.tp_flags = Py_TPFLAGS_DEFAULT;
1668 FinderType.tp_doc = "Vim finder class, for use with path hook";
1669 FinderType.tp_methods = FinderMethods;
1594 1670
1595 if (init_types()) 1671 if (init_types())
1596 return NULL; 1672 return NULL;
1597 1673
1598 /* Set sys.argv[] to avoid a crash in warn(). */ 1674 /* Set sys.argv[] to avoid a crash in warn(). */
1599 PySys_SetArgv(1, argv); 1675 PySys_SetArgv(1, argv);
1600 1676
1601 mod = PyModule_Create(&vimmodule); 1677 if ((vim_module = PyModule_Create(&vimmodule)) == NULL)
1602 if (mod == NULL)
1603 return NULL; 1678 return NULL;
1604 1679
1605 if (populate_module(mod, PyModule_AddObject, PyObject_GetAttrString)) 1680 if (populate_module(vim_module, PyModule_AddObject, PyObject_GetAttrString))
1606 return NULL; 1681 return NULL;
1607 1682
1608 return mod; 1683 if (init_sys_path())
1684 return NULL;
1685
1686 return vim_module;
1609 } 1687 }
1610 1688
1611 /************************************************************************* 1689 /*************************************************************************
1612 * 4. Utility functions for handling the interface between Vim and Python. 1690 * 4. Utility functions for handling the interface between Vim and Python.
1613 */ 1691 */