Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r92999:a6bc26a09fc3
Date: 2017-11-12 22:15 +0000
http://bitbucket.org/pypy/pypy/changeset/a6bc26a09fc3/
Log: Implement __text_signature__ on C-defined types
diff --git a/pypy/module/cpyext/test/test_typeobject.py
b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -453,6 +453,16 @@
p = property(lambda: "never used", pset, pdel)
assert module.tp_descr_set(p) is True
+ def test_text_signature(self):
+ module = self.import_module(name='docstrings')
+ assert module.SomeType.__text_signature__ == '()'
+ assert module.SomeType.__doc__ == 'A type with a signature'
+ if '__pypy__' in sys.modules:
+ assert module.HeapType.__text_signature__ == '()'
+ else: # XXX: bug in CPython?
+ assert module.HeapType.__text_signature__ is None
+ assert module.HeapType.__doc__ == 'A type with a signature'
+
class TestTypes(BaseApiTest):
def test_type_attributes(self, space, api):
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -23,7 +23,7 @@
from pypy.module.cpyext.cparser import CTypeSpace
from pypy.module.cpyext.methodobject import (W_PyCClassMethodObject,
W_PyCWrapperObject, PyCFunction_NewEx, PyCFunction, PyMethodDef,
- W_PyCMethodObject, W_PyCFunctionObject)
+ W_PyCMethodObject, W_PyCFunctionObject, extract_doc, extract_txtsig)
from pypy.module.cpyext.modsupport import convert_method_defs
from pypy.module.cpyext.pyobject import (
PyObject, make_ref, from_ref, get_typedescr, make_typedescr,
@@ -331,7 +331,7 @@
if not getattr(struct, slot_names[1]):
setattr(struct, slot_names[1], slot_func_helper)
-def add_operators(space, dict_w, pto):
+def add_operators(space, dict_w, pto, name):
from pypy.module.cpyext.object import PyObject_HashNotImplemented
hash_not_impl = PyObject_HashNotImplemented.api_func.get_llhelper(space)
for method_name, slot_names, wrapper_func, wrapper_func_kwds, doc in
slotdefs_for_wrappers:
@@ -361,8 +361,8 @@
wrapper_func_kwds, doc, func_voidp, offset=offset)
dict_w[method_name] = w_obj
if pto.c_tp_doc:
- dict_w['__doc__'] = space.newtext(
- rffi.charp2str(cts.cast('char*', pto.c_tp_doc)))
+ raw_doc = rffi.charp2str(cts.cast('char*', pto.c_tp_doc))
+ dict_w['__doc__'] = space.newtext(extract_doc(raw_doc, name))
if pto.c_tp_new:
add_tp_new_wrapper(space, dict_w, pto)
@@ -504,12 +504,12 @@
bases_w = space.fixedview(from_ref(space, pto.c_tp_bases))
dict_w = {}
- add_operators(space, dict_w, pto)
+ name = rffi.charp2str(cts.cast('char*', pto.c_tp_name))
+ add_operators(space, dict_w, pto, name)
convert_method_defs(space, dict_w, pto.c_tp_methods, self)
convert_getset_defs(space, dict_w, pto.c_tp_getset, self)
convert_member_defs(space, dict_w, pto.c_tp_members, self)
- name = rffi.charp2str(cts.cast('char*', pto.c_tp_name))
flag_heaptype = pto.c_tp_flags & Py_TPFLAGS_HEAPTYPE
if flag_heaptype:
minsize = rffi.sizeof(PyHeapTypeObject.TO)
@@ -527,8 +527,9 @@
elif pto.c_tp_as_mapping and pto.c_tp_as_mapping.c_mp_subscript:
self.flag_map_or_seq = 'M'
if pto.c_tp_doc:
- self.w_doc = space.newtext(
- rffi.charp2str(cts.cast('char*', pto.c_tp_doc)))
+ rawdoc = rffi.charp2str(cts.cast('char*', pto.c_tp_doc))
+ self.w_doc = space.newtext_or_none(extract_doc(rawdoc, name))
+ self.text_signature = extract_txtsig(rawdoc, name)
@bootstrap_function
def init_typeobject(space):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit