[pypy-commit] pypy default: merge cpyext-int, which fixes calling PyInt_FromLong
mattip
noreply at buildbot.pypy.org
Sat Nov 9 22:11:49 CET 2013
Author: Matti Picus <matti.picus at gmail.com>
Branch:
Changeset: r67911:5038b9a315c9
Date: 2013-11-09 23:10 +0200
http://bitbucket.org/pypy/pypy/changeset/5038b9a315c9/
Log: merge cpyext-int, which fixes calling PyInt_FromLong
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -91,6 +91,7 @@
.. branch: safe-win-mmap
.. branch: boolean-indexing-cleanup
.. branch: cpyext-best_base
+.. branch: cpyext-int
.. branch: fileops2
.. branch: nobold-backtrace
diff --git a/pypy/module/cpyext/intobject.py b/pypy/module/cpyext/intobject.py
--- a/pypy/module/cpyext/intobject.py
+++ b/pypy/module/cpyext/intobject.py
@@ -21,8 +21,17 @@
"Type description of PyIntObject"
make_typedescr(space.w_int.instancetypedef,
basestruct=PyIntObject.TO,
+ attach=int_attach,
realize=int_realize)
+def int_attach(space, py_obj, w_obj):
+ """
+ Fills a newly allocated PyIntObject with the given int object. The
+ value must not be modified.
+ """
+ py_int = rffi.cast(PyIntObject, py_obj)
+ py_int.c_ob_ival = space.int_w(w_obj)
+
def int_realize(space, obj):
intval = rffi.cast(lltype.Signed, rffi.cast(PyIntObject, obj).c_ob_ival)
w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
diff --git a/pypy/module/cpyext/test/test_intobject.py b/pypy/module/cpyext/test/test_intobject.py
--- a/pypy/module/cpyext/test/test_intobject.py
+++ b/pypy/module/cpyext/test/test_intobject.py
@@ -97,7 +97,7 @@
return (PyObject *)enumObj;
"""),
- ],
+ ],
prologue="""
typedef struct
{
@@ -166,3 +166,24 @@
assert isinstance(a, int)
assert a == int(a) == 42
assert a.name == "ULTIMATE_ANSWER"
+
+ def test_int_cast(self):
+ mod = self.import_extension('foo', [
+ #prove it works for ints
+ ("test_int", "METH_NOARGS",
+ """
+ PyObject * obj = PyInt_FromLong(42);
+ if (!PyInt_Check(obj)) {
+ Py_DECREF(obj);
+ PyErr_SetNone(PyExc_ValueError);
+ return NULL;
+ }
+ PyObject * val = PyInt_FromLong(((PyIntObject *)obj)->ob_ival);
+ Py_DECREF(obj);
+ return val;
+ """
+ ),
+ ])
+ i = mod.test_int()
+ assert isinstance(i, int)
+ assert i == 42
diff --git a/pypy/module/cpyext/test/test_ndarrayobject.py b/pypy/module/cpyext/test/test_ndarrayobject.py
--- a/pypy/module/cpyext/test/test_ndarrayobject.py
+++ b/pypy/module/cpyext/test/test_ndarrayobject.py
@@ -1,5 +1,3 @@
-import py
-
from pypy.module.cpyext.test.test_api import BaseApiTest
from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
from rpython.rtyper.lltypesystem import rffi, lltype
@@ -286,3 +284,5 @@
arr = mod.test_FromObject()
dt = mod.test_DescrFromType(11)
assert dt.num == 11
+
+
More information about the pypy-commit
mailing list