summaryrefslogtreecommitdiffstats
path: root/Python/bltinmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r--Python/bltinmodule.c64
1 files changed, 59 insertions, 5 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 439498d..a89b3fc 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -169,7 +169,7 @@ builtin_filter(self, args)
if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
if (i < len)
goto Fail_1;
- if (PyErr_Occurred() == PyExc_IndexError) {
+ if (PyErr_ExceptionMatches(PyExc_IndexError)) {
PyErr_Clear();
break;
}
@@ -726,8 +726,9 @@ builtin_map(self, args)
if (item == NULL) {
if (i < sqp->len)
goto Fail_0;
- if (PyErr_Occurred() ==
- PyExc_IndexError) {
+ if (PyErr_ExceptionMatches(
+ PyExc_IndexError))
+ {
PyErr_Clear();
Py_INCREF(Py_None);
item = Py_None;
@@ -1067,7 +1068,7 @@ min_max(args, sign)
for (i = 0; ; i++) {
x = (*sq->sq_item)(v, i); /* Implies INCREF */
if (x == NULL) {
- if (PyErr_Occurred() == PyExc_IndexError) {
+ if (PyErr_ExceptionMatches(PyExc_IndexError)) {
PyErr_Clear();
break;
}
@@ -1415,7 +1416,7 @@ builtin_reduce(self, args)
}
if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
- if (PyErr_Occurred() == PyExc_IndexError) {
+ if (PyErr_ExceptionMatches(PyExc_IndexError)) {
PyErr_Clear();
break;
}
@@ -1613,6 +1614,57 @@ builtin_vars(self, args)
return d;
}
+static PyObject *
+builtin_isinstance(self, args)
+ PyObject *self;
+ PyObject *args;
+{
+ PyObject *inst;
+ PyObject *cls;
+ int retval;
+
+ if (!PyArg_ParseTuple(args, "OO", &inst, &cls))
+ return NULL;
+ if (!PyClass_Check(cls)) {
+ PyErr_SetString(PyExc_TypeError,
+ "second argument must be a class");
+ return NULL;
+ }
+
+ if (!PyInstance_Check(inst))
+ retval = 0;
+ else {
+ PyObject *inclass =
+ (PyObject*)((PyInstanceObject*)inst)->in_class;
+ retval = PyClass_IsSubclass(inclass, cls);
+ }
+ return PyInt_FromLong(retval);
+}
+
+
+static PyObject *
+builtin_issubclass(self, args)
+ PyObject *self;
+ PyObject *args;
+{
+ PyObject *derived;
+ PyObject *cls;
+ int retval;
+
+ if (!PyArg_ParseTuple(args, "OO", &derived, &cls))
+ return NULL;
+ if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
+ PyErr_SetString(PyExc_TypeError, "arguments must be classes");
+ return NULL;
+ }
+ /* shortcut */
+ if (!(retval = (derived == cls)))
+ retval = PyClass_IsSubclass(derived, cls);
+
+ return PyInt_FromLong(retval);
+}
+
+
static PyMethodDef builtin_methods[] = {
{"__import__", builtin___import__, 1},
{"abs", builtin_abs, 1},
@@ -1641,6 +1693,8 @@ static PyMethodDef builtin_methods[] = {
{"input", builtin_input, 1},
{"intern", builtin_intern, 1},
{"int", builtin_int, 1},
+ {"isinstance", builtin_isinstance, 1},
+ {"issubclass", builtin_issubclass, 1},
{"len", builtin_len, 1},
{"list", builtin_list, 1},
{"locals", builtin_locals, 1},