| #include "parts.h" | |
| #include "util.h" | |
| static PyObject * | |
| object_getoptionalattr(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj, *attr_name, *value = UNINITIALIZED_PTR; | |
| if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| NULLABLE(attr_name); | |
| switch (PyObject_GetOptionalAttr(obj, attr_name, &value)) { | |
| case -1: | |
| assert(value == NULL); | |
| return NULL; | |
| case 0: | |
| assert(value == NULL); | |
| return Py_NewRef(PyExc_AttributeError); | |
| case 1: | |
| return value; | |
| default: | |
| Py_FatalError("PyObject_GetOptionalAttr() returned invalid code"); | |
| Py_UNREACHABLE(); | |
| } | |
| } | |
| static PyObject * | |
| object_getoptionalattrstring(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj, *value = UNINITIALIZED_PTR; | |
| const char *attr_name; | |
| Py_ssize_t size; | |
| if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| switch (PyObject_GetOptionalAttrString(obj, attr_name, &value)) { | |
| case -1: | |
| assert(value == NULL); | |
| return NULL; | |
| case 0: | |
| assert(value == NULL); | |
| return Py_NewRef(PyExc_AttributeError); | |
| case 1: | |
| return value; | |
| default: | |
| Py_FatalError("PyObject_GetOptionalAttrString() returned invalid code"); | |
| Py_UNREACHABLE(); | |
| } | |
| } | |
| static PyObject * | |
| object_hasattrwitherror(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj, *attr_name; | |
| if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| NULLABLE(attr_name); | |
| RETURN_INT(PyObject_HasAttrWithError(obj, attr_name)); | |
| } | |
| static PyObject * | |
| object_hasattrstringwitherror(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj; | |
| const char *attr_name; | |
| Py_ssize_t size; | |
| if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| RETURN_INT(PyObject_HasAttrStringWithError(obj, attr_name)); | |
| } | |
| static PyObject * | |
| mapping_getoptionalitemstring(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj, *value = UNINITIALIZED_PTR; | |
| const char *attr_name; | |
| Py_ssize_t size; | |
| if (!PyArg_ParseTuple(args, "Oz#", &obj, &attr_name, &size)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| switch (PyMapping_GetOptionalItemString(obj, attr_name, &value)) { | |
| case -1: | |
| assert(value == NULL); | |
| return NULL; | |
| case 0: | |
| assert(value == NULL); | |
| return Py_NewRef(PyExc_KeyError); | |
| case 1: | |
| return value; | |
| default: | |
| Py_FatalError("PyMapping_GetOptionalItemString() returned invalid code"); | |
| Py_UNREACHABLE(); | |
| } | |
| } | |
| static PyObject * | |
| mapping_getoptionalitem(PyObject *self, PyObject *args) | |
| { | |
| PyObject *obj, *attr_name, *value = UNINITIALIZED_PTR; | |
| if (!PyArg_ParseTuple(args, "OO", &obj, &attr_name)) { | |
| return NULL; | |
| } | |
| NULLABLE(obj); | |
| NULLABLE(attr_name); | |
| switch (PyMapping_GetOptionalItem(obj, attr_name, &value)) { | |
| case -1: | |
| assert(value == NULL); | |
| return NULL; | |
| case 0: | |
| assert(value == NULL); | |
| return Py_NewRef(PyExc_KeyError); | |
| case 1: | |
| return value; | |
| default: | |
| Py_FatalError("PyMapping_GetOptionalItem() returned invalid code"); | |
| Py_UNREACHABLE(); | |
| } | |
| } | |
| static PyMethodDef test_methods[] = { | |
| {"object_getoptionalattr", object_getoptionalattr, METH_VARARGS}, | |
| {"object_getoptionalattrstring", object_getoptionalattrstring, METH_VARARGS}, | |
| {"object_hasattrwitherror", object_hasattrwitherror, METH_VARARGS}, | |
| {"object_hasattrstringwitherror", object_hasattrstringwitherror, METH_VARARGS}, | |
| {"mapping_getoptionalitem", mapping_getoptionalitem, METH_VARARGS}, | |
| {"mapping_getoptionalitemstring", mapping_getoptionalitemstring, METH_VARARGS}, | |
| {NULL}, | |
| }; | |
| int | |
| _PyTestCapi_Init_Abstract(PyObject *m) | |
| { | |
| if (PyModule_AddFunctions(m, test_methods) < 0) { | |
| return -1; | |
| } | |
| return 0; | |
| } |