Author: Armin Rigo <ar...@tunes.org>
Branch: cpyext-ext
Changeset: r82645:11338c928fad
Date: 2016-03-01 21:07 +0100
http://bitbucket.org/pypy/pypy/changeset/11338c928fad/

Log:    fix slot_nb_int, and attempt a test, but blocked by issue 2248

diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -337,10 +337,6 @@
     return 0
 
 @cpython_api([PyObject], PyObject, header=None)
-def slot_nb_int(space, w_self):
-    return space.int(w_self)
-
-@cpython_api([PyObject], PyObject, header=None)
 def slot_tp_iter(space, w_self):
     return space.iter(w_self)
 
@@ -395,6 +391,17 @@
             return space.call_function(getattr_fn, w_self, w_name)
         api_func = slot_tp_getattro.api_func
 
+    elif name == 'tp_as_number.c_nb_int':
+        int_fn = w_type.getdictvalue(space, '__int__')
+        if int_fn is None:
+            return
+
+        @cpython_api([PyObject], PyObject, header=header)
+        @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'), typedef.name))
+        def slot_nb_int(space, w_self):
+            return space.call_function(int_fn, w_self)
+        api_func = slot_nb_int.api_func
+
     elif name == 'tp_as_number.c_nb_float':
         float_fn = w_type.getdictvalue(space, '__float__')
         if float_fn is None:
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
@@ -469,21 +469,28 @@
 
     def test_nb_int(self):
         module = self.import_extension('foo', [
-            ("nb_int", "METH_O",
+            ("nb_int", "METH_VARARGS",
              '''
-                 if (!args->ob_type->tp_as_number ||
-                     !args->ob_type->tp_as_number->nb_int)
+                 PyTypeObject *type = (PyTypeObject *)PyTuple_GET_ITEM(args, 
0);
+                 PyObject *obj = PyTuple_GET_ITEM(args, 1);
+                 if (!type->tp_as_number ||
+                     !type->tp_as_number->nb_int)
                  {
                      PyErr_SetNone(PyExc_ValueError);
                      return NULL;
                  }
-                 return args->ob_type->tp_as_number->nb_int(args);
+                 return type->tp_as_number->nb_int(obj);
              '''
              )
             ])
-        assert module.nb_int(10) == 10
-        assert module.nb_int(-12.3) == -12
-        raises(ValueError, module.nb_int, "123")
+        assert module.nb_int(int, 10) == 10
+        assert module.nb_int(float, -12.3) == -12
+        raises(ValueError, module.nb_int, str, "123")
+        class F(float):
+            def __int__(self):
+                return 666
+        skip("XXX fix issue 2248 first")
+        assert module.nb_int(float, F(-12.3)) == -12
 
     def test_nb_float(self):
         module = self.import_extension('foo', [
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to