Author: Ronan Lamy <ronan.l...@gmail.com> Branch: multiphase Changeset: r92135:b086a8161ab6 Date: 2017-08-12 20:23 +0200 http://bitbucket.org/pypy/pypy/changeset/b086a8161ab6/
Log: Ensure that reloading an extension is a no-op 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 @@ -1595,6 +1595,8 @@ return space.getbuiltinmodule("cpyext") mod_as_pyobj = rawrefcount.from_obj(PyObject, w_mod) + if cts.cast('PyModuleObject*', mod_as_pyobj).c_md_state: + return if mod_as_pyobj: return exec_def(space, w_mod, mod_as_pyobj) 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 @@ -142,6 +142,11 @@ mod = rffi.cast(PyModuleObject, mod_as_pyobj) moddef = mod.c_md_def cur_slot = rffi.cast(rffi.CArrayPtr(PyModuleDef_Slot), moddef.c_m_slots) + if moddef.c_m_size >= 0 and not mod.c_md_state: + # Always set md_state, to use as marker for exec_extension_module() + # (cf. CPython's PyModule_ExecDef) + mod.c_md_state = lltype.malloc( + rffi.VOIDP.TO, moddef.c_m_size, flavor='raw', zero=True) while cur_slot and rffi.cast(lltype.Signed, cur_slot[0].c_slot): if rffi.cast(lltype.Signed, cur_slot[0].c_slot) == 2: execf = rffi.cast(execfunctype, cur_slot[0].c_value) 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 @@ -175,7 +175,8 @@ import importlib module = self.import_module(name=self.name) ex_class = module.Example - importlib.reload(module) + # Simulate what importlib.reload() does, without recomputing the spec + module.__spec__.loader.exec_module(module) assert ex_class is module.Example def w_load_from_name(self, name, origin=None, use_prefix=True): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit