#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; }