[pypy-commit] pypy py3k: issue1884: kill PyInt_*

pjenvey noreply at buildbot.pypy.org
Mon Oct 13 23:52:32 CEST 2014


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r73929:83c6e78c4f7d
Date: 2014-10-13 14:51 -0700
http://bitbucket.org/pypy/pypy/changeset/83c6e78c4f7d/

Log:	issue1884: kill PyInt_*

diff --git a/pypy/module/cpyext/intobject.py b/pypy/module/cpyext/intobject.py
deleted file mode 100644
--- a/pypy/module/cpyext/intobject.py
+++ /dev/null
@@ -1,162 +0,0 @@
-
-from rpython.rtyper.lltypesystem import rffi, lltype
-from pypy.interpreter.error import OperationError
-from pypy.module.cpyext.api import (
-    cpython_api, cpython_struct, build_type_checkers, bootstrap_function,
-    PyObject, PyObjectFields, CONST_STRING, CANNOT_FAIL, Py_ssize_t)
-from pypy.module.cpyext.pyobject import (
-    make_typedescr, track_reference, RefcountState, from_ref)
-from rpython.rlib.rarithmetic import r_uint, intmask, LONG_TEST, r_ulonglong
-from pypy.objspace.std.intobject import W_IntObject
-import sys
-
-PyIntObjectStruct = lltype.ForwardReference()
-PyIntObject = lltype.Ptr(PyIntObjectStruct)
-PyIntObjectFields = PyObjectFields + \
-    (("ob_ival", rffi.LONG),)
-cpython_struct("PyIntObject", PyIntObjectFields, PyIntObjectStruct)
-
- at bootstrap_function
-def init_intobject(space):
-    "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))
-    w_obj = space.allocate_instance(W_IntObject, w_type)
-    w_obj.__init__(intval)
-    track_reference(space, obj, w_obj)
-    state = space.fromcache(RefcountState)
-    state.set_lifeline(w_obj, obj)
-    return w_obj
-
-PyInt_Check, PyInt_CheckExact = build_type_checkers("Int")
-
- at cpython_api([], lltype.Signed, error=CANNOT_FAIL)
-def PyInt_GetMax(space):
-    """Return the system's idea of the largest integer it can handle (LONG_MAX,
-    as defined in the system header files)."""
-    return sys.maxint
-
- at cpython_api([lltype.Signed], PyObject)
-def PyInt_FromLong(space, ival):
-    """Create a new integer object with a value of ival.
-    
-    """
-    return space.wrap(ival)
-
- at cpython_api([PyObject], lltype.Signed, error=-1)
-def PyInt_AsLong(space, w_obj):
-    """Will first attempt to cast the object to a PyIntObject, if it is not
-    already one, and then return its value. If there is an error, -1 is
-    returned, and the caller should check PyErr_Occurred() to find out whether
-    there was an error, or whether the value just happened to be -1."""
-    if w_obj is None:
-        raise OperationError(space.w_TypeError,
-                             space.wrap("an integer is required, got NULL"))
-    return space.int_w(space.int(w_obj))
-
- at cpython_api([PyObject], lltype.Unsigned, error=-1)
-def PyInt_AsUnsignedLong(space, w_obj):
-    """Return a C unsigned long representation of the contents of pylong.
-    If pylong is greater than ULONG_MAX, an OverflowError is
-    raised."""
-    if w_obj is None:
-        raise OperationError(space.w_TypeError,
-                             space.wrap("an integer is required, got NULL"))
-    return space.uint_w(space.int(w_obj))
-
-
- at cpython_api([PyObject], rffi.ULONG, error=-1)
-def PyInt_AsUnsignedLongMask(space, w_obj):
-    """Will first attempt to cast the object to a PyIntObject or
-    PyLongObject, if it is not already one, and then return its value as
-    unsigned long.  This function does not check for overflow.
-    """
-    w_int = space.int(w_obj)
-    num = space.bigint_w(w_int)
-    return num.uintmask()
-
-
- at cpython_api([PyObject], rffi.ULONGLONG, error=-1)
-def PyInt_AsUnsignedLongLongMask(space, w_obj):
-    """Will first attempt to cast the object to a PyIntObject or
-    PyLongObject, if it is not already one, and then return its value as
-    unsigned long long, without checking for overflow.
-    """
-    w_int = space.int(w_obj)
-    if space.isinstance_w(w_int, space.w_int):
-        num = space.int_w(w_int)
-        return r_ulonglong(num)
-    else:
-        num = space.bigint_w(w_int)
-        return num.ulonglongmask()
-
- at cpython_api([PyObject], lltype.Signed, error=CANNOT_FAIL)
-def PyInt_AS_LONG(space, w_int):
-    """Return the value of the object w_int. No error checking is performed."""
-    return space.int_w(w_int)
-
- at cpython_api([PyObject], Py_ssize_t, error=-1)
-def PyInt_AsSsize_t(space, w_obj):
-    """Will first attempt to cast the object to a PyIntObject or
-    PyLongObject, if it is not already one, and then return its value as
-    Py_ssize_t.
-    """
-    if w_obj is None:
-        raise OperationError(space.w_TypeError,
-                             space.wrap("an integer is required, got NULL"))
-    return space.int_w(w_obj) # XXX this is wrong on win64
-
-LONG_MAX = int(LONG_TEST - 1)
-
- at cpython_api([rffi.SIZE_T], PyObject)
-def PyInt_FromSize_t(space, ival):
-    """Create a new integer object with a value of ival. If the value exceeds
-    LONG_MAX, a long integer object is returned.
-    """
-    if ival <= LONG_MAX:
-        return space.wrap(intmask(ival))
-    return space.wrap(ival)
-
- at cpython_api([Py_ssize_t], PyObject)
-def PyInt_FromSsize_t(space, ival):
-    """Create a new integer object with a value of ival. If the value is larger
-    than LONG_MAX or smaller than LONG_MIN, a long integer object is
-    returned.
-    """
-    return space.wrap(ival)
-
- at cpython_api([CONST_STRING, rffi.CCHARPP, rffi.INT_real], PyObject)
-def PyInt_FromString(space, str, pend, base):
-    """Return a new PyIntObject or PyLongObject based on the string
-    value in str, which is interpreted according to the radix in base.  If
-    pend is non-NULL, *pend will point to the first character in str which
-    follows the representation of the number.  If base is 0, the radix will be
-    determined based on the leading characters of str: if str starts with
-    '0x' or '0X', radix 16 will be used; if str starts with '0', radix
-    8 will be used; otherwise radix 10 will be used.  If base is not 0, it
-    must be between 2 and 36, inclusive.  Leading spaces are ignored.  If
-    there are no digits, ValueError will be raised.  If the string represents
-    a number too large to be contained within the machine's long int type
-    and overflow warnings are being suppressed, a PyLongObject will be
-    returned.  If overflow warnings are not being suppressed, NULL will be
-    returned in this case."""
-    s = rffi.charp2str(str)
-    w_str = space.wrap(s)
-    w_base = space.wrap(rffi.cast(lltype.Signed, base))
-    if pend:
-        pend[0] = rffi.ptradd(str, len(s))
-    return space.call_function(space.w_int, w_str, w_base)
diff --git a/pypy/module/cpyext/test/test_intobject.py b/pypy/module/cpyext/test/test_intobject.py
deleted file mode 100644
--- a/pypy/module/cpyext/test/test_intobject.py
+++ /dev/null
@@ -1,195 +0,0 @@
-import py.test
-from pypy.module.cpyext.test.test_api import BaseApiTest
-from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
-import sys
-
-py.test.skip("PyInt_ APIs were removed from py3k")
-
-class TestIntObject(BaseApiTest):
-    def test_intobject(self, space, api):
-        assert api.PyInt_Check(space.wrap(3))
-        assert api.PyInt_Check(space.w_True)
-        assert not api.PyInt_Check(space.wrap((1, 2, 3)))
-        for i in [3, -5, -1, -sys.maxint, sys.maxint - 1]:
-            x = api.PyInt_AsLong(space.wrap(i))
-            y = api.PyInt_AS_LONG(space.wrap(i))
-            assert x == i
-            assert y == i
-            w_x = api.PyInt_FromLong(x + 1)
-            assert space.type(w_x) is space.w_int
-            assert space.eq_w(w_x, space.wrap(i + 1))
-
-        assert api.PyInt_AsLong(space.w_None) == -1
-        assert api.PyErr_Occurred() is space.w_TypeError
-        api.PyErr_Clear()
-
-        assert api.PyInt_AsLong(None) == -1
-        assert api.PyErr_Occurred() is space.w_TypeError
-        api.PyErr_Clear()
-
-        assert api.PyInt_AsUnsignedLong(space.wrap(sys.maxint)) == sys.maxint
-        assert api.PyInt_AsUnsignedLong(space.wrap(-5)) == sys.maxint * 2 + 1
-        assert api.PyErr_Occurred() is space.w_ValueError
-        api.PyErr_Clear()
-
-        assert (api.PyInt_AsUnsignedLongMask(space.wrap(sys.maxint))
-                == sys.maxint)
-        assert (api.PyInt_AsUnsignedLongMask(space.wrap(10**30))
-                == 10**30 % ((sys.maxint + 1) * 2))
-
-        assert (api.PyInt_AsUnsignedLongLongMask(space.wrap(sys.maxint))
-                == sys.maxint)
-        assert (api.PyInt_AsUnsignedLongLongMask(space.wrap(10**30))
-                == 10**30 % (2**64))
-
-    def test_coerce(self, space, api):
-        w_obj = space.appexec([], """():
-            class Coerce(object):
-                def __int__(self):
-                    return 42
-            return Coerce()""")
-        assert api.PyInt_AsLong(w_obj) == 42
-
-class AppTestIntObject(AppTestCpythonExtensionBase):
-    def test_fromstring(self):
-        module = self.import_extension('foo', [
-            ("from_string", "METH_NOARGS",
-             """
-                 return PyInt_FromString("1234", NULL, 16);
-             """),
-            ])
-        assert module.from_string() == 0x1234
-        assert type(module.from_string()) is int
-
-    def test_size_t(self):
-        module = self.import_extension('foo', [
-            ("values", "METH_NOARGS",
-             """
-                 return Py_BuildValue("NNNN",
-                     PyInt_FromSize_t(123),
-                     PyInt_FromSize_t((size_t)-1),
-                     PyInt_FromSsize_t(123),
-                     PyInt_FromSsize_t((size_t)-1));
-             """),
-            ])
-        values = module.values()
-        types = [type(x) for x in values]
-        assert types == [int, int, int, int]
-
-    def test_int_subtype(self):
-        module = self.import_extension(
-            'foo', [
-            ("newEnum", "METH_VARARGS",
-             """
-                EnumObject *enumObj;
-                long intval;
-                PyObject *name;
-
-                if (!PyArg_ParseTuple(args, "Oi", &name, &intval))
-                    return NULL;
-
-                PyType_Ready(&Enum_Type);
-                enumObj = PyObject_New(EnumObject, &Enum_Type);
-                if (!enumObj) {
-                    return NULL;
-                }
-
-                enumObj->ob_ival = intval;
-                Py_INCREF(name);
-                enumObj->ob_name = name;
-
-                return (PyObject *)enumObj;
-             """),
-            ],
-            prologue="""
-            typedef struct
-            {
-                PyObject_HEAD
-                long ob_ival;
-                PyObject* ob_name;
-            } EnumObject;
-
-            static void
-            enum_dealloc(PyObject *op)
-            {
-                    Py_DECREF(((EnumObject *)op)->ob_name);
-                    Py_TYPE(op)->tp_free(op);
-            }
-
-            static PyMemberDef enum_members[] = {
-                {"name", T_OBJECT, offsetof(EnumObject, ob_name), 0, NULL},
-                {NULL}  /* Sentinel */
-            };
-
-            PyTypeObject Enum_Type = {
-                PyObject_HEAD_INIT(0)
-                /*ob_size*/             0,
-                /*tp_name*/             "Enum",
-                /*tp_basicsize*/        sizeof(EnumObject),
-                /*tp_itemsize*/         0,
-                /*tp_dealloc*/          enum_dealloc,
-                /*tp_print*/            0,
-                /*tp_getattr*/          0,
-                /*tp_setattr*/          0,
-                /*tp_compare*/          0,
-                /*tp_repr*/             0,
-                /*tp_as_number*/        0,
-                /*tp_as_sequence*/      0,
-                /*tp_as_mapping*/       0,
-                /*tp_hash*/             0,
-                /*tp_call*/             0,
-                /*tp_str*/              0,
-                /*tp_getattro*/         0,
-                /*tp_setattro*/         0,
-                /*tp_as_buffer*/        0,
-                /*tp_flags*/            Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-                /*tp_doc*/              0,
-                /*tp_traverse*/         0,
-                /*tp_clear*/            0,
-                /*tp_richcompare*/      0,
-                /*tp_weaklistoffset*/   0,
-                /*tp_iter*/             0,
-                /*tp_iternext*/         0,
-                /*tp_methods*/          0,
-                /*tp_members*/          enum_members,
-                /*tp_getset*/           0,
-                /*tp_base*/             0, /* set to &PyInt_Type in init function for MSVC */
-                /*tp_dict*/             0,
-                /*tp_descr_get*/        0,
-                /*tp_descr_set*/        0,
-                /*tp_dictoffset*/       0,
-                /*tp_init*/             0,
-                /*tp_alloc*/            0,
-                /*tp_new*/              0
-            };
-            """, more_init = '''
-            Enum_Type.tp_base = &PyInt_Type;
-            ''')
-
-        a = module.newEnum("ULTIMATE_ANSWER", 42)
-        assert type(a).__name__ == "Enum"
-        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);
-                PyObject * val;
-                if (!PyInt_Check(obj)) {
-                    Py_DECREF(obj);
-                    PyErr_SetNone(PyExc_ValueError);
-                    return NULL;
-                }
-                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_longobject.py b/pypy/module/cpyext/test/test_longobject.py
--- a/pypy/module/cpyext/test/test_longobject.py
+++ b/pypy/module/cpyext/test/test_longobject.py
@@ -1,6 +1,5 @@
 import sys, py
 from rpython.rtyper.lltypesystem import rffi, lltype
-from pypy.objspace.std.intobject import W_IntObject
 from pypy.objspace.std.longobject import W_LongObject
 from pypy.module.cpyext.test.test_api import BaseApiTest
 from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase


More information about the pypy-commit mailing list