Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r91278:11e536df3c51 Date: 2017-05-14 17:24 +0200 http://bitbucket.org/pypy/pypy/changeset/11e536df3c51/
Log: Implement PyModule_GetState() diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -565,7 +565,7 @@ 'PyUnicode_FromFormat', 'PyUnicode_FromFormatV', 'PyUnicode_AsWideCharString', 'PyUnicode_GetSize', 'PyUnicode_GetLength', 'PyModule_AddObject', 'PyModule_AddIntConstant', 'PyModule_AddStringConstant', - 'PyModule_GetDef', 'PyModuleDef_Init', + 'PyModule_GetDef', 'PyModuleDef_Init', 'PyModule_GetState', 'Py_BuildValue', 'Py_VaBuildValue', 'PyTuple_Pack', '_PyArg_Parse_SizeT', '_PyArg_ParseTuple_SizeT', '_PyArg_ParseTupleAndKeywords_SizeT', '_PyArg_VaParse_SizeT', diff --git a/pypy/module/cpyext/include/modsupport.h b/pypy/module/cpyext/include/modsupport.h --- a/pypy/module/cpyext/include/modsupport.h +++ b/pypy/module/cpyext/include/modsupport.h @@ -71,6 +71,7 @@ #define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c) PyAPI_FUNC(struct PyModuleDef*) PyModule_GetDef(PyObject*); +PyAPI_FUNC(void*) PyModule_GetState(PyObject*); PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); diff --git a/pypy/module/cpyext/modsupport.py b/pypy/module/cpyext/modsupport.py --- a/pypy/module/cpyext/modsupport.py +++ b/pypy/module/cpyext/modsupport.py @@ -1,7 +1,7 @@ from rpython.rtyper.lltypesystem import rffi, lltype from pypy.module.cpyext.api import ( cpython_api, METH_STATIC, METH_CLASS, METH_COEXIST, CANNOT_FAIL, cts, - parse_dir, bootstrap_function, generic_cpy_call) + parse_dir, bootstrap_function, generic_cpy_call, slot_function) from pypy.module.cpyext.pyobject import PyObject, as_pyobj, make_typedescr from pypy.interpreter.module import Module from pypy.module.cpyext.methodobject import ( @@ -18,7 +18,16 @@ @bootstrap_function def init_moduleobject(space): - make_typedescr(Module.typedef, basestruct=PyModuleObject.TO) + make_typedescr(Module.typedef, basestruct=PyModuleObject.TO, + dealloc=module_dealloc) + +@slot_function([PyObject], lltype.Void) +def module_dealloc(space, py_obj): + py_module = rffi.cast(PyModuleObject, py_obj) + if py_module.c_md_state: + lltype.free(py_module.c_md_state, flavor='raw') + from pypy.module.cpyext.object import _dealloc + _dealloc(space, py_obj) @cpython_api([rffi.CCHARP], PyObject) def PyModule_New(space, name): @@ -49,7 +58,8 @@ if f_name is not None: modname = f_name w_mod = Module(space, space.newtext(modname)) - rffi.cast(PyModuleObject, as_pyobj(space, w_mod)).c_md_def = module + py_mod = rffi.cast(PyModuleObject, as_pyobj(space, w_mod)) + py_mod.c_md_def = module state.package_context = None, None if f_path is not None: @@ -62,6 +72,10 @@ if doc: space.setattr(w_mod, space.newtext("__doc__"), space.newtext(doc)) + + if module.c_m_size > 0: + py_mod.c_md_state = lltype.malloc(rffi.VOIDP.TO, module.c_m_size, + flavor='raw', zero=True) return w_mod diff --git a/pypy/module/cpyext/parse/cpyext_moduleobject.h b/pypy/module/cpyext/parse/cpyext_moduleobject.h --- a/pypy/module/cpyext/parse/cpyext_moduleobject.h +++ b/pypy/module/cpyext/parse/cpyext_moduleobject.h @@ -40,5 +40,5 @@ typedef struct { PyObject_HEAD struct PyModuleDef *md_def; - //void *md_state; + void *md_state; } PyModuleObject; diff --git a/pypy/module/cpyext/src/modsupport.c b/pypy/module/cpyext/src/modsupport.c --- a/pypy/module/cpyext/src/modsupport.c +++ b/pypy/module/cpyext/src/modsupport.c @@ -603,6 +603,16 @@ return ((PyModuleObject *)m)->md_def; } +void* +PyModule_GetState(PyObject* m) +{ + if (!PyModule_Check(m)) { + PyErr_BadArgument(); + return NULL; + } + return ((PyModuleObject *)m)->md_state; +} + PyTypeObject PyModuleDef_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "moduledef", /* tp_name */ diff --git a/pypy/module/cpyext/test/test_module.py b/pypy/module/cpyext/test/test_module.py --- a/pypy/module/cpyext/test/test_module.py +++ b/pypy/module/cpyext/test/test_module.py @@ -32,6 +32,29 @@ """) assert module.check_getdef_same() + def test_getstate(self): + module = self.import_extension('foo', [ + ("check_mod_getstate", "METH_NOARGS", + """ + struct module_state { int foo[51200]; }; + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "module_getstate_myextension", + NULL, + sizeof(struct module_state) + }; + PyObject *module = PyModule_Create(&moduledef); + int *p = (int *)PyModule_GetState(module); + int i; + for (i = 0; i < 51200; i++) + if (p[i] != 0) + return PyBool_FromLong(0); + Py_DECREF(module); + return PyBool_FromLong(1); + """ + )]) + assert module.check_mod_getstate() + class AppTestMultiPhase(AppTestCpythonExtensionBase): def test_basic(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit