Mercurial > vim
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 */ |