fix ticket #562
authorLisandro Dalcin <dalcinl@gmail.com>
Fri, 25 Feb 2011 20:03:46 +0000 (17:03 -0300)
committerLisandro Dalcin <dalcinl@gmail.com>
Fri, 25 Feb 2011 20:03:46 +0000 (17:03 -0300)
Cython/Compiler/Nodes.py
Cython/Compiler/TypeSlots.py
tests/run/ipow_crash_T562.pyx

index c41c681493c7e94527339ed4fc60070d6475d930..dbc6d47e67cf17430efc380cb70630599d515c1c 100644 (file)
@@ -2278,6 +2278,8 @@ class DefNode(FuncDefNode):
                         arg.hdr_type.declaration_code(arg.hdr_cname))
         if not self.entry.is_special and sig.method_flags() == [TypeSlots.method_noargs]:
             arg_code_list.append("CYTHON_UNUSED PyObject *unused")
+        if (self.entry.scope.is_c_class_scope and self.entry.name == "__ipow__"):
+            arg_code_list.append("CYTHON_UNUSED PyObject *unused")
         if sig.has_generic_args:
             arg_code_list.append(
                 "PyObject *%s, PyObject *%s"
index d6bf22e82565fd8c9f3cdbde5fdc3ec862ea40ce..4565c7e7d77fe5470bc608e7d9d712c4ef7ff404 100644 (file)
@@ -603,7 +603,7 @@ PyNumberMethods = (
     MethodSlot(ibinaryfunc, "nb_inplace_multiply", "__imul__"),
     MethodSlot(ibinaryfunc, "nb_inplace_divide", "__idiv__", py3 = False),
     MethodSlot(ibinaryfunc, "nb_inplace_remainder", "__imod__"),
-    MethodSlot(ternaryfunc, "nb_inplace_power", "__ipow__"), # NOT iternaryfunc!!!
+    MethodSlot(ibinaryfunc, "nb_inplace_power", "__ipow__"), # actually ternaryfunc!!!
     MethodSlot(ibinaryfunc, "nb_inplace_lshift", "__ilshift__"),
     MethodSlot(ibinaryfunc, "nb_inplace_rshift", "__irshift__"),
     MethodSlot(ibinaryfunc, "nb_inplace_and", "__iand__"),
index f231322f6e1bcf5508d27502c337ac15ff52a4e0..2cba79010d8b58348bbf4c77674d022ff68f2376 100644 (file)
@@ -1,6 +1,21 @@
+class IPOW:
+    """
+    >>> IPOW().__ipow__('a')
+    a
+    >>> x = IPOW()
+    >>> x **= 'z'
+    z
+    """
+    def __ipow__(self, other):
+        print ("%s" % other)
+
 cdef class CrashIPOW:
     """
     >>> CrashIPOW().__ipow__('a')
+    a
+    >>> x = CrashIPOW()
+    >>> x **= 'z'
+    z
     """
-    def __ipow__(self, other, mod):
-        print "%s, %s" % (other, mod)
+    def __ipow__(self, other):
+        print ("%s" % other)