Author: Manuel Jacob <[email protected]>
Branch: py3.5
Changeset: r90753:023f7c3d05ee
Date: 2017-03-19 18:52 +0100
http://bitbucket.org/pypy/pypy/changeset/023f7c3d05ee/

Log:    Implement PyModule_GetDef().

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,6 +565,7 @@
     'PyUnicode_FromFormat', 'PyUnicode_FromFormatV', 
'PyUnicode_AsWideCharString',
     'PyUnicode_GetSize', 'PyUnicode_GetLength',
     'PyModule_AddObject', 'PyModule_AddIntConstant', 
'PyModule_AddStringConstant',
+    'PyModule_GetDef',
     '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
@@ -70,6 +70,8 @@
 #define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c)
 #define PyModule_AddStringMacro(m, c) PyModule_AddStringConstant(m, #c, c)
 
+PyAPI_FUNC(struct PyModuleDef*) PyModule_GetDef(PyObject*);
+
 
 PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...);
 PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list);
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,8 +1,8 @@
 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)
-from pypy.module.cpyext.pyobject import PyObject, as_pyobj
+    parse_dir, bootstrap_function)
+from pypy.module.cpyext.pyobject import PyObject, as_pyobj, make_typedescr
 from pypy.interpreter.module import Module
 from pypy.module.cpyext.methodobject import (
     W_PyCFunctionObject, PyCFunction_NewEx, PyDescr_NewMethod,
@@ -13,6 +13,11 @@
 
 cts.parse_header(parse_dir / 'cpyext_moduleobject.h')
 PyModuleDef = cts.gettype('PyModuleDef *')
+PyModuleObject = cts.gettype('PyModuleObject *')
+
+@bootstrap_function
+def init_moduleobject(space):
+    make_typedescr(Module.typedef, basestruct=PyModuleObject.TO)
 
 @cpython_api([PyModuleDef, rffi.INT_real], PyObject)
 def PyModule_Create2(space, module, api_version):
@@ -35,6 +40,7 @@
     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
     state.package_context = None, None
 
     if f_path is not None:
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
@@ -36,3 +36,9 @@
   inquiry m_clear;
   freefunc m_free;
 } PyModuleDef;
+
+typedef struct {
+    PyObject_HEAD
+    struct PyModuleDef *md_def;
+    //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
@@ -592,3 +592,13 @@
     Py_DECREF(o);
     return result < 0 ? -1 : 0;
 }
+
+PyModuleDef*
+PyModule_GetDef(PyObject* m)
+{
+    if (!PyModule_Check(m)) {
+        PyErr_BadArgument();
+        return NULL;
+    }
+    return ((PyModuleObject *)m)->md_def;
+}
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
@@ -1,4 +1,5 @@
 from pypy.module.cpyext.test.test_api import BaseApiTest
+from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
 from rpython.rtyper.lltypesystem import rffi
 
 
@@ -10,3 +11,19 @@
         p2 = api.PyModule_GetName(w_sys)
         assert p2 == p
         self.raises(space, api, SystemError, api.PyModule_GetName, 
space.w_True)
+
+
+class AppTestModuleObject(AppTestCpythonExtensionBase):
+    def test_getdef(self):
+        module = self.import_extension('foo', [
+            ("check_getdef_same", "METH_NOARGS",
+             """
+                 return PyBool_FromLong(PyModule_GetDef(mod_global) == 
&moduledef);
+             """
+            )], prologue="""
+            static struct PyModuleDef moduledef;
+            static PyObject *mod_global;
+            """, more_init="""
+               mod_global = mod;
+            """)
+        assert module.check_getdef_same()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to