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

Reply via email to