Author: Matti Picus <matti.pi...@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 + + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit