diff options
author | Guido van Rossum <guido@python.org> | 2001-10-07 20:54:12 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-10-07 20:54:12 (GMT) |
commit | 03290ecbf1661c0192e6abdbe00ae163af461d77 (patch) | |
tree | fc324d37b87c8d229d726f41de8dfc3bc33fda3a /Objects | |
parent | 1f733baa04a56eed0a5823158205fc04502e3050 (diff) | |
download | cpython-03290ecbf1661c0192e6abdbe00ae163af461d77.zip cpython-03290ecbf1661c0192e6abdbe00ae163af461d77.tar.gz cpython-03290ecbf1661c0192e6abdbe00ae163af461d77.tar.bz2 |
Implement isinstance(x, (A, B, ...)). Note that we only allow tuples,
not other sequences (then we'd have to except strings, and we'd still
be susceptible to recursive attacks).
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/abstract.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 4891622..33991a8 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1805,6 +1805,20 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls) else if (PyType_Check(cls)) { retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); } + else if (PyTuple_Check(cls)) { + /* Not a general sequence -- that opens up the road to + recursion and stack overflow. */ + int i, n; + + n = PyTuple_GET_SIZE(cls); + for (i = 0; i < n; i++) { + retval = PyObject_IsInstance( + inst, PyTuple_GET_ITEM(cls, i)); + if (retval != 0) + break; + } + return retval; + } else if (!PyInstance_Check(inst)) { if (__class__ == NULL) { __class__ = PyString_FromString("__class__"); @@ -1827,7 +1841,8 @@ PyObject_IsInstance(PyObject *inst, PyObject *cls) if (retval < 0) { PyErr_SetString(PyExc_TypeError, - "isinstance() arg 2 must be a class or type"); + "isinstance() arg 2 must be a class or type " + "or tuple of those"); } return retval; } |