summaryrefslogtreecommitdiff
path: root/Objects/dictobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/dictobject.c')
-rw-r--r--Objects/dictobject.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 64585a41d6..09aba61c90 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -12,6 +12,20 @@
typedef PyDictEntry dictentry;
typedef PyDictObject dictobject;
+/* Set a key error with the specified argument, wrapping it in a
+ * tuple automatically so that tuple keys are not unpacked as the
+ * exception arguments. */
+static void
+set_key_error(PyObject *arg)
+{
+ PyObject *tup;
+ tup = PyTuple_Pack(1, arg);
+ if (!tup)
+ return; /* caller will expect error to be set anyway */
+ PyErr_SetObject(PyExc_KeyError, tup);
+ Py_DECREF(tup);
+}
+
/* Define this out if you don't want conversion statistics on exit. */
#undef SHOW_CONVERSION_COUNTS
@@ -307,6 +321,8 @@ lookdict(dictobject *mp, PyObject *key, register long hash)
else if (ep->me_key == dummy && freeslot == NULL)
freeslot = ep;
}
+ assert(0); /* NOT REACHED */
+ return 0;
}
/*
@@ -366,6 +382,8 @@ lookdict_string(dictobject *mp, PyObject *key, register long hash)
if (ep->me_key == dummy && freeslot == NULL)
freeslot = ep;
}
+ assert(0); /* NOT REACHED */
+ return 0;
}
/*
@@ -691,7 +709,7 @@ PyDict_DelItem(PyObject *op, PyObject *key)
if (ep == NULL)
return -1;
if (ep->me_value == NULL) {
- PyErr_SetObject(PyExc_KeyError, key);
+ set_key_error(key);
return -1;
}
old_key = ep->me_key;
@@ -1000,7 +1018,7 @@ dict_subscript(dictobject *mp, register PyObject *key)
return PyObject_CallFunctionObjArgs(missing,
(PyObject *)mp, key, NULL);
}
- PyErr_SetObject(PyExc_KeyError, key);
+ set_key_error(key);
return NULL;
}
else
@@ -1644,7 +1662,7 @@ dict_pop(dictobject *mp, PyObject *args)
Py_INCREF(deflt);
return deflt;
}
- PyErr_SetObject(PyExc_KeyError, key);
+ set_key_error(key);
return NULL;
}
old_key = ep->me_key;