Docstrings for special methods
authorRobert Bradshaw <robertwb@math.washington.edu>
Fri, 17 Aug 2007 22:46:16 +0000 (15:46 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Fri, 17 Aug 2007 22:46:16 +0000 (15:46 -0700)
Cython/Compiler/Code.py
Cython/Compiler/Symtab.py

index 196c4172e967f1a867a1c7d6fcfa98eb97db29da..87b877a20553bb25bc71c188e3d6d0d8727f2930 100644 (file)
@@ -6,6 +6,7 @@ import Naming
 import Options
 from Cython.Utils import open_new_file
 from PyrexTypes import py_object_type, typecast
+from TypeSlots import get_special_method_signature
 
 class CCodeWriter:
     # f                file            output file
@@ -288,10 +289,15 @@ class CCodeWriter:
             doc_code = entry.doc_cname
         else:
             doc_code = 0
+        # Add METH_COEXIST to special methods
+        meth_flags = "METH_VARARGS|METH_KEYWORDS"
+        if get_special_method_signature(entry.name):
+            meth_flags = "METH_VARARGS|METH_KEYWORDS|METH_COEXIST"            
         self.putln(
-            '{"%s", (PyCFunction)%s, METH_VARARGS|METH_KEYWORDS, %s}%s' % (
+            '{"%s", (PyCFunction)%s, %s, %s}%s' % (
                 entry.name, 
-                entry.func_cname, 
+                entry.func_cname,
+                meth_flags,
                 doc_code,
                 term))
     
index 9c437f19232492c19930755f52266b2574559085..4aa3a7da5d8535e0ed63ba3cdfc6779f11557d84 100644 (file)
@@ -1079,14 +1079,19 @@ class CClassScope(ClassScope):
 
     def declare_pyfunction(self, name, pos):
         # Add an entry for a method.
+        if name in ('__eq__', '__ne__', '__lt__', '__gt__', '__le__', '__ge__'):
+            error(pos, "Special method %s must be implemented via __richcmp__" 
+% name)
         entry = self.declare(name, name, py_object_type, pos)
         special_sig = get_special_method_signature(name)
         if special_sig:
+            # Special methods get put in the method table with a particular
+            # signature declared in advance.
             entry.signature = special_sig
-            # Special methods don't get put in the method table
         else:
             entry.signature = pymethod_signature
-            self.pyfunc_entries.append(entry)
+
+        self.pyfunc_entries.append(entry)
         return entry
             
     def declare_cfunction(self, name, type, pos,