do not emit C code for unused special method docstrings
authorLisandro Dalcin <dalcinl@gmail.com>
Thu, 15 Apr 2010 00:15:42 +0000 (21:15 -0300)
committerLisandro Dalcin <dalcinl@gmail.com>
Thu, 15 Apr 2010 00:15:42 +0000 (21:15 -0300)
Cython/Compiler/AnalysedTreeTransforms.py
Cython/Compiler/ModuleNode.py
Cython/Compiler/Nodes.py
Cython/Compiler/Symtab.py
tests/compile/specmethdocstring.pyx
tests/run/autotestdict.pyx

index f7ef59bd1a3431ee65b17a2d83bd2831848aa54f..6c4e1182baf3458d13b365a1fe912a17337a0528 100644 (file)
@@ -11,7 +11,8 @@ import Symtab
 class AutoTestDictTransform(ScopeTrackingTransform):
     # Handles autotestdict directive
 
-    blacklist = ['__cinit__', '__dealloc__', '__richcmp__', '__nonzero__']
+    blacklist = ['__cinit__', '__dealloc__', '__richcmp__', '__nonzero__',
+                 '__len__', '__contains__']
 
     def visit_ModuleNode(self, node):
         if node.is_pxd:
index 55c386d1187d3d5a81c8000d73e42f0fc23e26f5..9ef17f20aeba9d3f42c27ea6aa13a6fafe63bddc 100644 (file)
@@ -1535,7 +1535,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
     def generate_method_table(self, env, code):
         code.putln("")
         code.putln(
-            "static struct PyMethodDef %s[] = {" % 
+            "static PyMethodDef %s[] = {" % 
                 env.method_table_cname)
         for entry in env.pyfunc_entries:
             code.put_pymethoddef(entry, ",")
index 8781cc1e12c75bca2ba6b3f867b912a8ddd5ee8b..696882a55911d05d9c5534cd0fcc72ccaf958e50 100644 (file)
@@ -2086,7 +2086,11 @@ class DefNode(FuncDefNode):
         code.putln("%s; /*proto*/" % header)
         if proto_only:
             return
-        if self.entry.doc and Options.docstrings:
+        if (Options.docstrings and self.entry.doc and
+            (not self.entry.is_special or
+             self.entry.signature.method_flags()) and
+            not self.entry.scope.is_property_scope
+            ):
             docstr = self.entry.doc
             if docstr.is_unicode:
                 docstr = docstr.utf8encode()
index d2ffa6a417d16b04c471cb407efa77949070ab54..5b74ebc1fb556895357e860e978cbf3b288cb498 100644 (file)
@@ -207,6 +207,8 @@ class Scope(object):
     # return_type       PyrexType or None  Return type of function owning scope
     # is_py_class_scope boolean            Is a Python class scope
     # is_c_class_scope  boolean            Is an extension type scope
+    # is_cpp_class_scope  boolean          Is a C++ class scope
+    # is_property_scope boolean            Is a extension type property scope
     # scope_prefix      string             Disambiguator for C names
     # in_cinclude       boolean            Suppress C declaration code
     # qualified_name    string             "modname" or "modname.classname"
@@ -220,6 +222,7 @@ class Scope(object):
     is_py_class_scope = 0
     is_c_class_scope = 0
     is_cpp_class_scope = 0
+    is_property_scope = 0
     is_module_scope = 0
     scope_prefix = ""
     in_cinclude = 0
@@ -1619,6 +1622,8 @@ class PropertyScope(Scope):
     #  a property of an extension type.
     #
     #  parent_type   PyExtensionType   The type to which the property belongs
+
+    is_property_scope = 1
     
     def declare_pyfunction(self, name, pos):
         # Add an entry for a method.
index 7de1a5d6ec57ceffe336ba91d665f6c1ce7803c3..b28875a8fef134c673e3204beb928cb98b97f9e8 100644 (file)
@@ -1,8 +1,30 @@
 cdef class C:
+    def __cinit__(self):
+        "This is an unusable docstring."
     def __init__(self):
         "This is an unusable docstring."
+    def __dealloc__(self):
+        "This is an unusable docstring."
+    def __richcmp__(self, other, int op):
+        "This is an unusable docstring."
+    def __nonzero__(self):
+        "This is an unusable docstring."
+        return False
+    def __contains__(self, other):
+        "This is an unusable docstring."
+
     property foo:
         def __get__(self):
             "So is this."
         def __set__(self, x):
             "And here is another one."
+
+    def __add__(self, other):
+        "usable docstring"
+    def __iter__(self):
+        "usable docstring"
+        return False
+    def __next__(self):
+        "usable docstring"
+        return False
+
index 1a9a61350283bc75fbf4fbb5660f8c3bc5a83224..2f8bc71196aabbc3cc4fe38c4cdd4f13529f32e0 100644 (file)
@@ -110,4 +110,20 @@ cdef class MyCdefClass:
         False
         """
 
+    def __len__(self):
+        """
+        Should not be included, as it can't be looked up with getattr in Py 3.1
+
+        >>> True
+        False
+        """
+
+    def __contains__(self, value):
+        """
+        Should not be included, as it can't be looked up with getattr in Py 3.1
+
+        >>> True
+        False
+        """
+
 cdeffunc()