trac #561: fixed major performance bug in special functions (by not generating Python...
authorCarl Witty <Carl.Witty@gmail.com>
Tue, 27 Jul 2010 06:25:00 +0000 (23:25 -0700)
committerCarl Witty <Carl.Witty@gmail.com>
Tue, 27 Jul 2010 06:25:00 +0000 (23:25 -0700)
Cython/Compiler/Code.py
Cython/Compiler/Nodes.py

index 368d0ebfb9338a016f4da2e3d6fed540fd4ea386..505fd21654f9cf2bf0e1e0a75700976b6be92432 100644 (file)
@@ -1230,7 +1230,14 @@ class CCodeWriter(object):
         #    code = "((PyObject*)%s)" % code
         self.put_init_to_py_none(code, entry.type, nanny)
 
-    def put_pymethoddef(self, entry, term):
+    def put_pymethoddef(self, entry, term, allow_skip=True):
+        if entry.is_special or entry.name in ['__getitem__', '__setslice__', '__delslice__', '__setitem__', '__delitem__', '__getattr__', '__getattribute__', '__setattr__', '__delattr__']:
+            if entry.name not in ['__next__', '__getreadbuffer__', '__getwritebuffer__', '__getsegcount__', '__getcharbuffer__', '__getbuffer__', '__releasebuffer__']:
+                # Python's typeobject.c will automatically fill in our slot
+                # in add_operators() (called by PyType_Ready) with a value
+                # that's better than ours.
+                if allow_skip:
+                    return
         from TypeSlots import method_coexist
         if entry.doc:
             doc_code = entry.doc_cname
index 97a1b80af7701021532bbe0abce33f1b54fdc16d..05ce3c965aba325ca363235870b15a4b483abebf 100644 (file)
@@ -2239,7 +2239,7 @@ class DefNode(FuncDefNode):
             code.put(
                 "static PyMethodDef %s = " % 
                     self.entry.pymethdef_cname)
-            code.put_pymethoddef(self.entry, ";")
+            code.put_pymethoddef(self.entry, ";", allow_skip=False)
         code.putln("%s {" % header)
 
     def generate_argument_declarations(self, env, code):