diff options
author | Guido van Rossum <guido@python.org> | 2001-10-07 20:54:12 +0000 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-10-07 20:54:12 +0000 |
commit | 03290ecbf1661c0192e6abdbe00ae163af461d77 (patch) | |
tree | fc324d37b87c8d229d726f41de8dfc3bc33fda3a /Objects/abstract.c | |
parent | 1f733baa04a56eed0a5823158205fc04502e3050 (diff) | |
download | cpython-git-03290ecbf1661c0192e6abdbe00ae163af461d77.tar.gz |
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/abstract.c')
-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 4891622a72..33991a81cb 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; } |