summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-01-27 12:57:47 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2021-01-27 13:08:01 -0500
commite3fbbf830fef9bedee7b26460c79843780962bc0 (patch)
tree5239eb20fa8d3ef4f3f7c59924dc18039fd0c4ee /lib/sqlalchemy
parent25ee5a05df0daeb7dc7ba432172d6abc76ffab56 (diff)
downloadsqlalchemy-e3fbbf830fef9bedee7b26460c79843780962bc0.tar.gz
Repair incorrect symbol PyDict_GetItemWithError for Python 2
* ensure on python 2 correct cflags to fail on undefined symbols take effect * fail for implicit function declaration * python 2 does not publish PyDict_GetItemWithError but has it as _PyDict_GetItemWIthError but only as of Python 2.7.12 Change-Id: I007509afddf7f44ca64e52fa9140be39f815fa7a
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/cextension/immutabledict.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/sqlalchemy/cextension/immutabledict.c b/lib/sqlalchemy/cextension/immutabledict.c
index 9b864bf02..a185f85b8 100644
--- a/lib/sqlalchemy/cextension/immutabledict.c
+++ b/lib/sqlalchemy/cextension/immutabledict.c
@@ -20,6 +20,40 @@ typedef struct {
static PyTypeObject ImmutableDictType;
+#if PY_MAJOR_VERSION < 3
+/* For Python 2.7, VENDORED from cPython: https://github.com/python/cpython/commit/1c496178d2c863f135bd4a43e32e0f099480cd06
+ This function was added to Python 2.7.12 as an underscore function.
+
+ Variant of PyDict_GetItem() that doesn't suppress exceptions.
+ This returns NULL *with* an exception set if an exception occurred.
+ It returns NULL *without* an exception set if the key wasn't present.
+*/
+PyObject *
+PyDict_GetItemWithError(PyObject *op, PyObject *key)
+{
+ long hash;
+ PyDictObject *mp = (PyDictObject *)op;
+ PyDictEntry *ep;
+ if (!PyDict_Check(op)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ if (!PyString_CheckExact(key) ||
+ (hash = ((PyStringObject *) key)->ob_shash) == -1)
+ {
+ hash = PyObject_Hash(key);
+ if (hash == -1) {
+ return NULL;
+ }
+ }
+
+ ep = (mp->ma_lookup)(mp, key, hash);
+ if (ep == NULL) {
+ return NULL;
+ }
+ return ep->me_value;
+}
+#endif
static PyObject *