summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_collectionsmodule.c8
-rw-r--r--Modules/_io/bufferedio.c7
-rw-r--r--Modules/_io/fileio.c8
-rw-r--r--Modules/_io/iobase.c38
-rw-r--r--Modules/_io/textio.c48
-rw-r--r--Modules/_pickle.c139
-rw-r--r--Modules/arraymodule.c7
-rw-r--r--Modules/itertoolsmodule.c10
8 files changed, 94 insertions, 171 deletions
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 222cace..5753dd9 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -1339,12 +1339,10 @@ deque_reduce(dequeobject *deque)
PyObject *dict, *it;
_Py_IDENTIFIER(__dict__);
- dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__);
+ if (_PyObject_LookupAttrId((PyObject *)deque, &PyId___dict__, &dict) < 0) {
+ return NULL;
+ }
if (dict == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return NULL;
- }
- PyErr_Clear();
dict = Py_None;
Py_INCREF(dict);
}
diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c
index b81abde..2b7aaaf 100644
--- a/Modules/_io/bufferedio.c
+++ b/Modules/_io/bufferedio.c
@@ -1541,7 +1541,9 @@ _bufferedreader_read_all(buffered *self)
}
_bufferedreader_reset_buf(self);
- readall = _PyObject_GetAttrWithoutError(self->raw, _PyIO_str_readall);
+ if (_PyObject_LookupAttr(self->raw, _PyIO_str_readall, &readall) < 0) {
+ goto cleanup;
+ }
if (readall) {
tmp = _PyObject_CallNoArg(readall);
Py_DECREF(readall);
@@ -1561,9 +1563,6 @@ _bufferedreader_read_all(buffered *self)
}
goto cleanup;
}
- else if (PyErr_Occurred()) {
- goto cleanup;
- }
chunks = PyList_New(0);
if (chunks == NULL)
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index 269142c..0d5bf3b 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -1073,12 +1073,10 @@ fileio_repr(fileio *self)
if (self->fd < 0)
return PyUnicode_FromFormat("<_io.FileIO [closed]>");
- nameobj = _PyObject_GetAttrId((PyObject *) self, &PyId_name);
+ if (_PyObject_LookupAttrId((PyObject *) self, &PyId_name, &nameobj) < 0) {
+ return NULL;
+ }
if (nameobj == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
- else
- return NULL;
res = PyUnicode_FromFormat(
"<_io.FileIO fd=%d mode='%s' closefd=%s>",
self->fd, mode_string(self), self->closefd ? "True" : "False");
diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 348d449..0c329bf 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -133,18 +133,12 @@ static int
iobase_is_closed(PyObject *self)
{
PyObject *res;
+ int ret;
/* This gets the derived attribute, which is *not* __IOBase_closed
in most cases! */
- res = _PyObject_GetAttrId(self, &PyId___IOBase_closed);
- if (res == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return -1;
- }
- PyErr_Clear();
- return 0;
- }
- Py_DECREF(res);
- return 1;
+ ret = _PyObject_LookupAttrId(self, &PyId___IOBase_closed, &res);
+ Py_XDECREF(res);
+ return ret;
}
/* Flush and close methods */
@@ -190,20 +184,16 @@ iobase_check_closed(PyObject *self)
int closed;
/* This gets the derived attribute, which is *not* __IOBase_closed
in most cases! */
- res = _PyObject_GetAttrWithoutError(self, _PyIO_str_closed);
- if (res == NULL) {
- if (PyErr_Occurred()) {
+ closed = _PyObject_LookupAttr(self, _PyIO_str_closed, &res);
+ if (closed > 0) {
+ closed = PyObject_IsTrue(res);
+ Py_DECREF(res);
+ if (closed > 0) {
+ PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
return -1;
}
- return 0;
- }
- closed = PyObject_IsTrue(res);
- Py_DECREF(res);
- if (closed <= 0) {
- return closed;
}
- PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");
- return -1;
+ return closed;
}
PyObject *
@@ -273,8 +263,7 @@ iobase_finalize(PyObject *self)
/* If `closed` doesn't exist or can't be evaluated as bool, then the
object is probably in an unusable state, so ignore. */
- res = _PyObject_GetAttrWithoutError(self, _PyIO_str_closed);
- if (res == NULL) {
+ if (_PyObject_LookupAttr(self, _PyIO_str_closed, &res) <= 0) {
PyErr_Clear();
closed = -1;
}
@@ -538,8 +527,7 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t limit)
PyObject *peek, *buffer, *result;
Py_ssize_t old_size = -1;
- peek = _PyObject_GetAttrWithoutError(self, _PyIO_str_peek);
- if (peek == NULL && PyErr_Occurred()) {
+ if (_PyObject_LookupAttr(self, _PyIO_str_peek, &peek) < 0) {
return NULL;
}
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 9f3fd2d..717b56a 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -924,14 +924,10 @@ _textiowrapper_set_encoder(textio *self, PyObject *codec_info,
return -1;
/* Get the normalized named of the codec */
- res = _PyObject_GetAttrId(codec_info, &PyId_name);
- if (res == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
- else
- return -1;
+ if (_PyObject_LookupAttrId(codec_info, &PyId_name, &res) < 0) {
+ return -1;
}
- else if (PyUnicode_Check(res)) {
+ if (res != NULL && PyUnicode_Check(res)) {
const encodefuncentry *e = encodefuncs;
while (e->name != NULL) {
if (_PyUnicode_EqualToASCIIString(res, e->name)) {
@@ -1177,19 +1173,17 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
if (Py_TYPE(buffer) == &PyBufferedReader_Type ||
Py_TYPE(buffer) == &PyBufferedWriter_Type ||
- Py_TYPE(buffer) == &PyBufferedRandom_Type) {
- raw = _PyObject_GetAttrId(buffer, &PyId_raw);
+ Py_TYPE(buffer) == &PyBufferedRandom_Type)
+ {
+ if (_PyObject_LookupAttrId(buffer, &PyId_raw, &raw) < 0)
+ goto error;
/* Cache the raw FileIO object to speed up 'closed' checks */
- if (raw == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
+ if (raw != NULL) {
+ if (Py_TYPE(raw) == &PyFileIO_Type)
+ self->raw = raw;
else
- goto error;
+ Py_DECREF(raw);
}
- else if (Py_TYPE(raw) == &PyFileIO_Type)
- self->raw = raw;
- else
- Py_DECREF(raw);
}
res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL);
@@ -1201,17 +1195,12 @@ _io_TextIOWrapper___init___impl(textio *self, PyObject *buffer,
goto error;
self->seekable = self->telling = r;
- res = _PyObject_GetAttrWithoutError(buffer, _PyIO_str_read1);
- if (res != NULL) {
- Py_DECREF(res);
- self->has_read1 = 1;
- }
- else if (!PyErr_Occurred()) {
- self->has_read1 = 0;
- }
- else {
+ r = _PyObject_LookupAttr(buffer, _PyIO_str_read1, &res);
+ if (r < 0) {
goto error;
}
+ Py_XDECREF(res);
+ self->has_read1 = r;
self->encoding_start_of_stream = 0;
if (_textiowrapper_fix_encoder_state(self) < 0) {
@@ -3020,10 +3009,9 @@ textiowrapper_newlines_get(textio *self, void *context)
{
PyObject *res;
CHECK_ATTACHED(self);
- if (self->decoder == NULL)
- Py_RETURN_NONE;
- res = _PyObject_GetAttrWithoutError(self->decoder, _PyIO_str_newlines);
- if (res == NULL && !PyErr_Occurred()) {
+ if (self->decoder == NULL ||
+ _PyObject_LookupAttr(self->decoder, _PyIO_str_newlines, &res) == 0)
+ {
Py_RETURN_NONE;
}
return res;
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index f06a87d..05f9a02 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -367,18 +367,15 @@ init_method_ref(PyObject *self, _Py_Identifier *name,
PyObject **method_func, PyObject **method_self)
{
PyObject *func, *func2;
+ int ret;
/* *method_func and *method_self should be consistent. All refcount decrements
should be occurred after setting *method_self and *method_func. */
- func = _PyObject_GetAttrId(self, name);
+ ret = _PyObject_LookupAttrId(self, name, &func);
if (func == NULL) {
*method_self = NULL;
Py_CLEAR(*method_func);
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return -1;
- }
- PyErr_Clear();
- return 0;
+ return ret;
}
if (PyMethod_Check(func) && PyMethod_GET_SELF(func) == self) {
@@ -1155,11 +1152,12 @@ _Pickler_SetOutputStream(PicklerObject *self, PyObject *file)
{
_Py_IDENTIFIER(write);
assert(file != NULL);
- self->write = _PyObject_GetAttrId(file, &PyId_write);
+ if (_PyObject_LookupAttrId(file, &PyId_write, &self->write) < 0) {
+ return -1;
+ }
if (self->write == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_SetString(PyExc_TypeError,
- "file must have a 'write' attribute");
+ PyErr_SetString(PyExc_TypeError,
+ "file must have a 'write' attribute");
return -1;
}
@@ -1504,19 +1502,16 @@ _Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file)
_Py_IDENTIFIER(read);
_Py_IDENTIFIER(readline);
- self->peek = _PyObject_GetAttrId(file, &PyId_peek);
- if (self->peek == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
- else
- return -1;
+ if (_PyObject_LookupAttrId(file, &PyId_peek, &self->peek) < 0) {
+ return -1;
}
- self->read = _PyObject_GetAttrId(file, &PyId_read);
- self->readline = _PyObject_GetAttrId(file, &PyId_readline);
+ (void)_PyObject_LookupAttrId(file, &PyId_read, &self->read);
+ (void)_PyObject_LookupAttrId(file, &PyId_readline, &self->readline);
if (self->readline == NULL || self->read == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ if (!PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError,
"file must have 'read' and 'readline' attributes");
+ }
Py_CLEAR(self->read);
Py_CLEAR(self->readline);
Py_CLEAR(self->peek);
@@ -1691,7 +1686,7 @@ get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
PyObject *name = PyList_GET_ITEM(names, i);
Py_XDECREF(parent);
parent = obj;
- obj = PyObject_GetAttr(parent, name);
+ (void)_PyObject_LookupAttr(parent, name, &obj);
if (obj == NULL) {
Py_DECREF(parent);
return NULL;
@@ -1704,16 +1699,6 @@ get_deep_attribute(PyObject *obj, PyObject *names, PyObject **pparent)
return obj;
}
-static void
-reformat_attribute_error(PyObject *obj, PyObject *name)
-{
- if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- PyErr_Format(PyExc_AttributeError,
- "Can't get attribute %R on %R", name, obj);
- }
-}
-
static PyObject *
getattribute(PyObject *obj, PyObject *name, int allow_qualname)
@@ -1727,10 +1712,13 @@ getattribute(PyObject *obj, PyObject *name, int allow_qualname)
attr = get_deep_attribute(obj, dotted_path, NULL);
Py_DECREF(dotted_path);
}
- else
- attr = PyObject_GetAttr(obj, name);
- if (attr == NULL)
- reformat_attribute_error(obj, name);
+ else {
+ (void)_PyObject_LookupAttr(obj, name, &attr);
+ }
+ if (attr == NULL && !PyErr_Occurred()) {
+ PyErr_Format(PyExc_AttributeError,
+ "Can't get attribute %R on %R", name, obj);
+ }
return attr;
}
@@ -1748,9 +1736,6 @@ _checkmodule(PyObject *module_name, PyObject *module,
PyObject *candidate = get_deep_attribute(module, dotted_path, NULL);
if (candidate == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- }
return -1;
}
if (candidate != global) {
@@ -1772,14 +1757,10 @@ whichmodule(PyObject *global, PyObject *dotted_path)
_Py_IDENTIFIER(modules);
_Py_IDENTIFIER(__main__);
- module_name = _PyObject_GetAttrId(global, &PyId___module__);
-
- if (module_name == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- return NULL;
- PyErr_Clear();
+ if (_PyObject_LookupAttrId(global, &PyId___module__, &module_name) < 0) {
+ return NULL;
}
- else {
+ if (module_name) {
/* In some rare cases (e.g., bound methods of extension types),
__module__ can be None. If it is so, then search sys.modules for
the module of global. */
@@ -3328,12 +3309,8 @@ save_global(PicklerObject *self, PyObject *obj, PyObject *name)
global_name = name;
}
else {
- global_name = _PyObject_GetAttrId(obj, &PyId___qualname__);
- if (global_name == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- goto error;
- PyErr_Clear();
- }
+ if (_PyObject_LookupAttrId(obj, &PyId___qualname__, &global_name) < 0)
+ goto error;
if (global_name == NULL) {
global_name = _PyObject_GetAttrId(obj, &PyId___name__);
if (global_name == NULL)
@@ -3656,13 +3633,9 @@ get_class(PyObject *obj)
PyObject *cls;
_Py_IDENTIFIER(__class__);
- cls = _PyObject_GetAttrId(obj, &PyId___class__);
- if (cls == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- cls = (PyObject *) Py_TYPE(obj);
- Py_INCREF(cls);
- }
+ if (_PyObject_LookupAttrId(obj, &PyId___class__, &cls) == 0) {
+ cls = (PyObject *) Py_TYPE(obj);
+ Py_INCREF(cls);
}
return cls;
}
@@ -3734,14 +3707,10 @@ save_reduce(PicklerObject *self, PyObject *args, PyObject *obj)
PyObject *name;
_Py_IDENTIFIER(__name__);
- name = _PyObject_GetAttrId(callable, &PyId___name__);
- if (name == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return -1;
- }
- PyErr_Clear();
+ if (_PyObject_LookupAttrId(callable, &PyId___name__, &name) < 0) {
+ return -1;
}
- else if (PyUnicode_Check(name)) {
+ if (name != NULL && PyUnicode_Check(name)) {
_Py_IDENTIFIER(__newobj_ex__);
use_newobj_ex = _PyUnicode_EqualToASCIIId(
name, &PyId___newobj_ex__);
@@ -4108,7 +4077,9 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
don't actually have to check for a __reduce__ method. */
/* Check for a __reduce_ex__ method. */
- reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce_ex__);
+ if (_PyObject_LookupAttrId(obj, &PyId___reduce_ex__, &reduce_func) < 0) {
+ goto error;
+ }
if (reduce_func != NULL) {
PyObject *proto;
proto = PyLong_FromLong(self->proto);
@@ -4119,12 +4090,6 @@ save(PicklerObject *self, PyObject *obj, int pers_save)
else {
PickleState *st = _Pickle_GetGlobalState();
- if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
- PyErr_Clear();
- }
- else {
- goto error;
- }
/* Check for a __reduce__ method. */
reduce_func = _PyObject_GetAttrId(obj, &PyId___reduce__);
if (reduce_func != NULL) {
@@ -4401,13 +4366,9 @@ _pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
return -1;
}
- self->dispatch_table = _PyObject_GetAttrId((PyObject *)self,
- &PyId_dispatch_table);
- if (self->dispatch_table == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return -1;
- }
- PyErr_Clear();
+ if (_PyObject_LookupAttrId((PyObject *)self,
+ &PyId_dispatch_table, &self->dispatch_table) < 0) {
+ return -1;
}
return 0;
@@ -5370,12 +5331,11 @@ instantiate(PyObject *cls, PyObject *args)
if (!PyTuple_GET_SIZE(args) && PyType_Check(cls)) {
_Py_IDENTIFIER(__getinitargs__);
_Py_IDENTIFIER(__new__);
- PyObject *func = _PyObject_GetAttrId(cls, &PyId___getinitargs__);
+ PyObject *func;
+ if (_PyObject_LookupAttrId(cls, &PyId___getinitargs__, &func) < 0) {
+ return NULL;
+ }
if (func == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
- return NULL;
- }
- PyErr_Clear();
return _PyObject_CallMethodIdObjArgs(cls, &PyId___new__, cls, NULL);
}
Py_DECREF(func);
@@ -6225,16 +6185,11 @@ load_build(UnpicklerObject *self)
inst = self->stack->data[Py_SIZE(self->stack) - 1];
- setstate = _PyObject_GetAttrId(inst, &PyId___setstate__);
- if (setstate == NULL) {
- if (PyErr_ExceptionMatches(PyExc_AttributeError))
- PyErr_Clear();
- else {
- Py_DECREF(state);
- return -1;
- }
+ if (_PyObject_LookupAttrId(inst, &PyId___setstate__, &setstate) < 0) {
+ Py_DECREF(state);
+ return -1;
}
- else {
+ if (setstate != NULL) {
PyObject *result;
/* The explicit __setstate__ is responsible for everything. */
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 8c3f0a1..900c374 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -2203,11 +2203,10 @@ array_array___reduce_ex__(arrayobject *self, PyObject *value)
if (protocol == -1 && PyErr_Occurred())
return NULL;
- dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
+ if (_PyObject_LookupAttrId((PyObject *)self, &PyId___dict__, &dict) < 0) {
+ return NULL;
+ }
if (dict == NULL) {
- if (!PyErr_ExceptionMatches(PyExc_AttributeError))
- return NULL;
- PyErr_Clear();
dict = Py_None;
Py_INCREF(dict);
}
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 985915f..1113fb6 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -830,17 +830,15 @@ tee(PyObject *self, PyObject *args)
return NULL;
}
- copyfunc = _PyObject_GetAttrId(it, &PyId___copy__);
- if (copyfunc != NULL) {
- copyable = it;
- }
- else if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ if (_PyObject_LookupAttrId(it, &PyId___copy__, &copyfunc) < 0) {
Py_DECREF(it);
Py_DECREF(result);
return NULL;
}
+ if (copyfunc != NULL) {
+ copyable = it;
+ }
else {
- PyErr_Clear();
copyable = tee_fromiterable(it);
Py_DECREF(it);
if (copyable == NULL) {