mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
SF # 595026: support for masks in getargs.c.
New functions: unsigned long PyInt_AsUnsignedLongMask(PyObject *); unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *); unsigned long PyLong_AsUnsignedLongMask(PyObject *); unsigned PY_LONG_LONG) PyLong_AsUnsignedLongLongMask(PyObject *); New and changed format codes: b unsigned char 0..UCHAR_MAX B unsigned char none ** h unsigned short 0..USHRT_MAX H unsigned short none ** i int INT_MIN..INT_MAX I * unsigned int 0..UINT_MAX l long LONG_MIN..LONG_MAX k * unsigned long none L long long LLONG_MIN..LLONG_MAX K * unsigned long long none Notes: * New format codes. ** Changed from previous "range-and-a-half" to "none"; the range-and-a-half checking wasn't particularly useful. New test test_getargs2.py, to verify all this.
This commit is contained in:
parent
e13ddc9ec8
commit
a4ea603b05
7 changed files with 596 additions and 27 deletions
|
@ -169,6 +169,7 @@ PyInt_AsLong(register PyObject *op)
|
|||
}
|
||||
else
|
||||
{
|
||||
Py_DECREF(io);
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"nb_int should return int object");
|
||||
return -1;
|
||||
|
@ -181,6 +182,96 @@ PyInt_AsLong(register PyObject *op)
|
|||
return val;
|
||||
}
|
||||
|
||||
unsigned long
|
||||
PyInt_AsUnsignedLongMask(register PyObject *op)
|
||||
{
|
||||
PyNumberMethods *nb;
|
||||
PyIntObject *io;
|
||||
unsigned long val;
|
||||
|
||||
if (op && PyInt_Check(op))
|
||||
return PyInt_AS_LONG((PyIntObject*) op);
|
||||
if (op && PyLong_Check(op))
|
||||
return PyLong_AsUnsignedLongMask(op);
|
||||
|
||||
if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
|
||||
nb->nb_int == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "an integer is required");
|
||||
return -1;
|
||||
}
|
||||
|
||||
io = (PyIntObject*) (*nb->nb_int) (op);
|
||||
if (io == NULL)
|
||||
return -1;
|
||||
if (!PyInt_Check(io)) {
|
||||
if (PyLong_Check(io)) {
|
||||
val = PyLong_AsUnsignedLongMask((PyObject *)io);
|
||||
Py_DECREF(io);
|
||||
if (PyErr_Occurred())
|
||||
return -1;
|
||||
return val;
|
||||
}
|
||||
else
|
||||
{
|
||||
Py_DECREF(io);
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"nb_int should return int object");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
val = PyInt_AS_LONG(io);
|
||||
Py_DECREF(io);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LONG_LONG
|
||||
unsigned PY_LONG_LONG
|
||||
PyInt_AsUnsignedLongLongMask(register PyObject *op)
|
||||
{
|
||||
PyNumberMethods *nb;
|
||||
PyIntObject *io;
|
||||
unsigned PY_LONG_LONG val;
|
||||
|
||||
if (op && PyInt_Check(op))
|
||||
return PyInt_AS_LONG((PyIntObject*) op);
|
||||
if (op && PyLong_Check(op))
|
||||
return PyLong_AsUnsignedLongLongMask(op);
|
||||
|
||||
if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
|
||||
nb->nb_int == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "an integer is required");
|
||||
return -1;
|
||||
}
|
||||
|
||||
io = (PyIntObject*) (*nb->nb_int) (op);
|
||||
if (io == NULL)
|
||||
return -1;
|
||||
if (!PyInt_Check(io)) {
|
||||
if (PyLong_Check(io)) {
|
||||
val = PyLong_AsUnsignedLongLongMask((PyObject *)io);
|
||||
Py_DECREF(io);
|
||||
if (PyErr_Occurred())
|
||||
return -1;
|
||||
return val;
|
||||
}
|
||||
else
|
||||
{
|
||||
Py_DECREF(io);
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"nb_int should return int object");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
val = PyInt_AS_LONG(io);
|
||||
Py_DECREF(io);
|
||||
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
|
||||
PyObject *
|
||||
PyInt_FromString(char *s, char **pend, int base)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue