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