cpython: 913268337886 (original) (raw)

Mercurial > cpython

changeset 102820:913268337886 3.5

Issue #27782: Fix m_methods handling in multiphase init Multi-phase extension module import now correctly allows the ``m_methods`` field to be used to add module level functions to instances of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang. [#27782]

Nick Coghlan ncoghlan@gmail.com
date Sun, 21 Aug 2016 17:41:56 +1000
parents 43ae044eaccc
children fb509792dffc 45ef062734d6
files Doc/c-api/module.rst Include/moduleobject.h Lib/test/test_importlib/extension/test_loader.py Misc/ACKS Misc/NEWS Modules/_testmultiphase.c Objects/moduleobject.c
diffstat 7 files changed, 83 insertions(+), 32 deletions(-)[+] [-] Doc/c-api/module.rst 2 Include/moduleobject.h 2 Lib/test/test_importlib/extension/test_loader.py 9 Misc/ACKS 1 Misc/NEWS 4 Modules/_testmultiphase.c 33 Objects/moduleobject.c 64

line wrap: on

line diff

--- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -324,7 +324,7 @@ The available slot types are: :c:type:PyModule_Type. Any type can be used, as long as it supports setting and getting import-related attributes. However, only PyModule_Type instances may be returned if the

.. c:var:: Py_mod_exec

--- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -77,7 +77,7 @@ typedef struct PyModuleDef{ traverseproc m_traverse; inquiry m_clear; freefunc m_free; -}PyModuleDef; +} PyModuleDef; #ifdef __cplusplus }

--- a/Lib/test/test_importlib/extension/test_loader.py +++ b/Lib/test/test_importlib/extension/test_loader.py @@ -212,6 +212,15 @@ class MultiPhaseExtensionModuleTests(abc self.assertNotEqual(type(mod), type(unittest)) self.assertEqual(mod.three, 3)

+ def test_null_slots(self): '''Test that NULL slots aren't a problem''' name = self.name + '_null_slots'

--- a/Misc/ACKS +++ b/Misc/ACKS @@ -1657,6 +1657,7 @@ Nickolai Zeldovich Yuxiao Zeng Uwe Zessin Cheng Zhang +Xiang Zhang Kai Zhu Tarek Ziadé Jelle Zijlstra

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Release date: TBA Core and Builtins ----------------- +- Issue #27782: Multi-phase extension module import now correctly allows the

--- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -248,6 +248,7 @@ PyInit__testmultiphase(PyObject spec) /*** Importing a non-module object ****/ static PyModuleDef def_nonmodule; +static PyModuleDef def_nonmodule_with_methods; /* Create a SimpleNamespace(three=3) / static PyObject @@ -255,7 +256,7 @@ createfunc_nonmodule(PyObject *spec, PyM { PyObject *dct, *ns, *three;

+PyDoc_STRVAR(nonmodule_bar_doc, +"bar(i,j)\n[](#l6.25) +\n[](#l6.26) +Return the difference of i - j."); + +static PyObject * +nonmodule_bar(PyObject *self, PyObject *args) +{

+} + +static PyMethodDef nonmodule_methods[] = {

+}; + +static PyModuleDef def_nonmodule_with_methods = TEST_MODULE_DEF(

+ +PyMODINIT_FUNC +PyInit__testmultiphase_nonmodule_with_methods(PyObject *spec) +{

+} + /**** Non-ASCII-named modules ****/ static PyModuleDef def_nonascii_latin = { [](#l6.56)

--- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -130,6 +130,34 @@ check_api_version(const char *name, int return 1; } +static int +_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions) +{

+

+

+} + PyObject PyModule_Create2(struct PyModuleDef module, int module_api_version) { @@ -269,7 +297,7 @@ PyModule_FromDefAndSpec2(struct PyModule } } } else {

@@ -297,7 +325,7 @@ PyModule_FromDefAndSpec2(struct PyModule } if (def->m_methods != NULL) {

@@ -331,7 +359,7 @@ PyModule_ExecDef(PyObject *module, PyMod return -1; }

@@ -387,37 +415,15 @@ PyModule_ExecDef(PyObject *module, PyMod int PyModule_AddFunctions(PyObject *m, PyMethodDef *functions) {

-

} int