/* ------------------------------------------------------------------------- */ #include "Python.h" #include "structmember.h" #ifndef PyVarObject_HEAD_INIT #define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size, #endif /* ------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD PyObject *dict; PyObject *wrapped; } WraptObjectProxyObject; PyTypeObject WraptObjectProxy_Type; typedef struct { WraptObjectProxyObject object_proxy; PyObject *instance; PyObject *wrapper; PyObject *adapter; PyObject *bound_type; } WraptFunctionWrapperObject; PyTypeObject WraptFunctionWrapperBase_Type; PyTypeObject WraptBoundFunctionWrapper_Type; PyTypeObject WraptBoundMethodWrapper_Type; PyTypeObject WraptFunctionWrapper_Type; /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { WraptObjectProxyObject *self; self = (WraptObjectProxyObject *)type->tp_alloc(type, 0); if (!self) return NULL; self->dict = PyDict_New(); self->wrapped = NULL; return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_raw_init(WraptObjectProxyObject *self, PyObject *wrapped) { Py_INCREF(wrapped); Py_XDECREF(self->wrapped); self->wrapped = wrapped; return 0; } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_init(WraptObjectProxyObject *self, PyObject *args, PyObject *kwds) { PyObject *wrapped = NULL; static char *kwlist[] = { "wrapped", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:ObjectProxy", kwlist, &wrapped)) { return -1; } return WraptObjectProxy_raw_init(self, wrapped); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_traverse(WraptObjectProxyObject *self, visitproc visit, void *arg) { Py_VISIT(self->dict); Py_VISIT(self->wrapped); return 0; } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_clear(WraptObjectProxyObject *self) { Py_CLEAR(self->dict); Py_CLEAR(self->wrapped); return 0; } /* ------------------------------------------------------------------------- */ static void WraptObjectProxy_dealloc(WraptObjectProxyObject *self) { WraptObjectProxy_clear(self); Py_TYPE(self)->tp_free(self); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_repr(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("<%s at %p for %s at %p>", Py_TYPE(self)->tp_name, self, Py_TYPE(self->wrapped)->tp_name, self->wrapped); #else return PyString_FromFormat("<%s at %p for %s at %p>", Py_TYPE(self)->tp_name, self, Py_TYPE(self->wrapped)->tp_name, self->wrapped); #endif } /* ------------------------------------------------------------------------- */ static long WraptObjectProxy_hash(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_Hash(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_call( WraptObjectProxyObject *self, PyObject *args, PyObject *kwds) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyEval_CallObjectWithKeywords(self->wrapped, args, kwds); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_str(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_Str(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_add(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Add(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_subtract(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Subtract(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_multiply(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Multiply(o1, o2); } /* ------------------------------------------------------------------------- */ #if PY_MAJOR_VERSION < 3 static PyObject *WraptObjectProxy_divide(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Divide(o1, o2); } #endif /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_remainder(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Remainder(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_divmod(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Divmod(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_power(PyObject *o1, PyObject *o2, PyObject *modulo) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Power(o1, o2, modulo); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_negative(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Negative(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_positive(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Positive(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_absolute(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Absolute(self->wrapped); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_bool(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_IsTrue(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_invert(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Invert(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_lshift(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Lshift(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_rshift(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Rshift(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_and(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_And(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_xor(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Xor(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_or(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_Or(o1, o2); } /* ------------------------------------------------------------------------- */ #if PY_MAJOR_VERSION < 3 static PyObject *WraptObjectProxy_int(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Int(self->wrapped); } #endif /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_long(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Long(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_float(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Float(self->wrapped); } /* ------------------------------------------------------------------------- */ #if PY_MAJOR_VERSION < 3 static PyObject *WraptObjectProxy_oct(WraptObjectProxyObject *self) { PyNumberMethods *nb; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if ((nb = self->wrapped->ob_type->tp_as_number) == NULL || nb->nb_oct == NULL) { PyErr_SetString(PyExc_TypeError, "oct() argument can't be converted to oct"); return NULL; } return (*nb->nb_oct)(self->wrapped); } #endif /* ------------------------------------------------------------------------- */ #if PY_MAJOR_VERSION < 3 static PyObject *WraptObjectProxy_hex(WraptObjectProxyObject *self) { PyNumberMethods *nb; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if ((nb = self->wrapped->ob_type->tp_as_number) == NULL || nb->nb_hex == NULL) { PyErr_SetString(PyExc_TypeError, "hex() argument can't be converted to hex"); return NULL; } return (*nb->nb_hex)(self->wrapped); } #endif /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_add(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceAdd(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_subtract( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceSubtract(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_multiply( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceMultiply(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ #if PY_MAJOR_VERSION < 3 static PyObject *WraptObjectProxy_inplace_divide( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceDivide(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } #endif /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_remainder( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceRemainder(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_power(WraptObjectProxyObject *self, PyObject *other, PyObject *modulo) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlacePower(self->wrapped, other, modulo); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_lshift(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceLshift(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_rshift(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceRshift(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_and(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceAnd(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_xor(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceXor(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_or(WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceOr(self->wrapped, other); Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_floor_divide(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_FloorDivide(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_true_divide(PyObject *o1, PyObject *o2) { if (PyObject_IsInstance(o1, (PyObject *)&WraptObjectProxy_Type)) o1 = ((WraptObjectProxyObject *)o1)->wrapped; if (PyObject_IsInstance(o2, (PyObject *)&WraptObjectProxy_Type)) o2 = ((WraptObjectProxyObject *)o2)->wrapped; return PyNumber_TrueDivide(o1, o2); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_floor_divide( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceFloorDivide(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_inplace_true_divide( WraptObjectProxyObject *self, PyObject *other) { PyObject *object = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (PyObject_IsInstance(other, (PyObject *)&WraptObjectProxy_Type)) other = ((WraptObjectProxyObject *)other)->wrapped; object = PyNumber_InPlaceTrueDivide(self->wrapped, other); if (!object) return NULL; Py_DECREF(self->wrapped); self->wrapped = object; Py_INCREF(self); return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_index(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyNumber_Index(self->wrapped); } /* ------------------------------------------------------------------------- */ static Py_ssize_t WraptObjectProxy_length(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_Length(self->wrapped); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_contains(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PySequence_Contains(self->wrapped, value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_getitem(WraptObjectProxyObject *self, PyObject *key) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetItem(self->wrapped, key); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_setitem(WraptObjectProxyObject *self, PyObject *key, PyObject* value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } if (value == NULL) return PyObject_DelItem(self->wrapped, key); else return PyObject_SetItem(self->wrapped, key, value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_dir( WraptObjectProxyObject *self, PyObject *args) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_Dir(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_enter( WraptObjectProxyObject *self, PyObject *args, PyObject *kwds) { PyObject *method = NULL; PyObject *result = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } method = PyObject_GetAttrString(self->wrapped, "__enter__"); if (!method) return NULL; result = PyEval_CallObjectWithKeywords(method, args, kwds); Py_XDECREF(method); return result; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_exit( WraptObjectProxyObject *self, PyObject *args, PyObject *kwds) { PyObject *method = NULL; PyObject *result = NULL; if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } method = PyObject_GetAttrString(self->wrapped, "__exit__"); if (!method) return NULL; result = PyEval_CallObjectWithKeywords(method, args, kwds); Py_XDECREF(method); return result; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_name( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__name__"); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_name(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttrString(self->wrapped, "__name__", value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_qualname( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__qualname__"); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_qualname(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttrString(self->wrapped, "__qualname__", value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_module( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__module__"); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_module(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttrString(self->wrapped, "__module__", value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_doc( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__doc__"); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_doc(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttrString(self->wrapped, "__doc__", value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_class( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__class__"); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_wrapped( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } Py_INCREF(self->wrapped); return self->wrapped; } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_wrapped(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } if (!value) { PyErr_SetString(PyExc_TypeError, "__wrapped__ must be an object"); return -1; } Py_INCREF(value); Py_DECREF(self->wrapped); self->wrapped = value; return 0; } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_get_annotations( WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttrString(self->wrapped, "__annotations__"); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_set_annotations(WraptObjectProxyObject *self, PyObject *value) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttrString(self->wrapped, "__annotations__", value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_getattro( WraptObjectProxyObject *self, PyObject *name) { PyObject *object = NULL; object = PyObject_GenericGetAttr((PyObject *)self, name); if (object) return object; PyErr_Clear(); if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetAttr(self->wrapped, name); } /* ------------------------------------------------------------------------- */ static int WraptObjectProxy_setattro( WraptObjectProxyObject *self, PyObject *name, PyObject *value) { static PyObject *self_prefix = NULL; static PyObject *attr_wrapped = NULL; PyObject *match = NULL; if (!self_prefix) { #if PY_MAJOR_VERSION >= 3 self_prefix = PyUnicode_InternFromString("_self_"); #else self_prefix = PyString_InternFromString("_self_"); #endif } match = PyEval_CallMethod(name, "startswith", "(O)", self_prefix); if (match == Py_True) { Py_DECREF(match); return PyObject_GenericSetAttr((PyObject *)self, name, value); } Py_XDECREF(match); if (!attr_wrapped) { #if PY_MAJOR_VERSION >= 3 attr_wrapped = PyUnicode_InternFromString("__wrapped__"); #else attr_wrapped = PyString_InternFromString("__wrapped__"); #endif } if (PyObject_RichCompareBool(name, attr_wrapped, Py_EQ) == 1) { Py_DECREF(attr_wrapped); return PyObject_GenericSetAttr((PyObject *)self, name, value); } if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return -1; } return PyObject_SetAttr(self->wrapped, name, value); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_richcompare(WraptObjectProxyObject *self, PyObject *other, int opcode) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_RichCompare(self->wrapped, other, opcode); } /* ------------------------------------------------------------------------- */ static PyObject *WraptObjectProxy_iter(WraptObjectProxyObject *self) { if (!self->wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } return PyObject_GetIter(self->wrapped); } /* ------------------------------------------------------------------------- */ static PyNumberMethods WraptObjectProxy_as_number = { (binaryfunc)WraptObjectProxy_add, /*nb_add*/ (binaryfunc)WraptObjectProxy_subtract, /*nb_subtract*/ (binaryfunc)WraptObjectProxy_multiply, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 (binaryfunc)WraptObjectProxy_divide, /*nb_divide*/ #endif (binaryfunc)WraptObjectProxy_remainder, /*nb_remainder*/ (binaryfunc)WraptObjectProxy_divmod, /*nb_divmod*/ (ternaryfunc)WraptObjectProxy_power, /*nb_power*/ (unaryfunc)WraptObjectProxy_negative, /*nb_negative*/ (unaryfunc)WraptObjectProxy_positive, /*nb_positive*/ (unaryfunc)WraptObjectProxy_absolute, /*nb_absolute*/ (inquiry)WraptObjectProxy_bool, /*nb_nonzero/nb_bool*/ (unaryfunc)WraptObjectProxy_invert, /*nb_invert*/ (binaryfunc)WraptObjectProxy_lshift, /*nb_lshift*/ (binaryfunc)WraptObjectProxy_rshift, /*nb_rshift*/ (binaryfunc)WraptObjectProxy_and, /*nb_and*/ (binaryfunc)WraptObjectProxy_xor, /*nb_xor*/ (binaryfunc)WraptObjectProxy_or, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif #if PY_MAJOR_VERSION < 3 (unaryfunc)WraptObjectProxy_int, /*nb_int*/ (unaryfunc)WraptObjectProxy_long, /*nb_long*/ #else (unaryfunc)WraptObjectProxy_long, /*nb_int*/ 0, /*nb_long/nb_reserved*/ #endif (unaryfunc)WraptObjectProxy_float, /*nb_float*/ #if PY_MAJOR_VERSION < 3 (unaryfunc)WraptObjectProxy_oct, /*nb_oct*/ (unaryfunc)WraptObjectProxy_hex, /*nb_hex*/ #endif (binaryfunc)WraptObjectProxy_inplace_add, /*nb_inplace_add*/ (binaryfunc)WraptObjectProxy_inplace_subtract, /*nb_inplace_subtract*/ (binaryfunc)WraptObjectProxy_inplace_multiply, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 (binaryfunc)WraptObjectProxy_inplace_divide, /*nb_inplace_divide*/ #endif (binaryfunc)WraptObjectProxy_inplace_remainder, /*nb_inplace_remainder*/ (ternaryfunc)WraptObjectProxy_inplace_power, /*nb_inplace_power*/ (binaryfunc)WraptObjectProxy_inplace_lshift, /*nb_inplace_lshift*/ (binaryfunc)WraptObjectProxy_inplace_rshift, /*nb_inplace_rshift*/ (binaryfunc)WraptObjectProxy_inplace_and, /*nb_inplace_and*/ (binaryfunc)WraptObjectProxy_inplace_xor, /*nb_inplace_xor*/ (binaryfunc)WraptObjectProxy_inplace_or, /*nb_inplace_or*/ (binaryfunc)WraptObjectProxy_floor_divide, /*nb_floor_divide*/ (binaryfunc)WraptObjectProxy_true_divide, /*nb_true_divide*/ (binaryfunc)WraptObjectProxy_inplace_floor_divide, /*nb_inplace_floor_divide*/ (binaryfunc)WraptObjectProxy_inplace_true_divide, /*nb_inplace_true_divide*/ (unaryfunc)WraptObjectProxy_index, /*nb_index*/ }; static PySequenceMethods WraptObjectProxy_as_sequence = { (lenfunc)WraptObjectProxy_length, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ (objobjproc)WraptObjectProxy_contains, /* sq_contains */ }; static PyMappingMethods WraptObjectProxy_as_mapping = { (lenfunc)WraptObjectProxy_length, /*mp_length*/ (binaryfunc)WraptObjectProxy_getitem, /*mp_subscript*/ (objobjargproc)WraptObjectProxy_setitem, /*mp_ass_subscript*/ }; static PyMethodDef WraptObjectProxy_methods[] = { { "__dir__", (PyCFunction)WraptObjectProxy_dir, METH_NOARGS, 0 }, { "__enter__", (PyCFunction)WraptObjectProxy_enter, METH_VARARGS | METH_KEYWORDS, 0 }, { "__exit__", (PyCFunction)WraptObjectProxy_exit, METH_VARARGS | METH_KEYWORDS, 0 }, { NULL, NULL }, }; static PyGetSetDef WraptObjectProxy_getset[] = { { "__name__", (getter)WraptObjectProxy_get_name, (setter)WraptObjectProxy_set_name, 0 }, { "__qualname__", (getter)WraptObjectProxy_get_qualname, (setter)WraptObjectProxy_set_qualname, 0 }, { "__module__", (getter)WraptObjectProxy_get_module, (setter)WraptObjectProxy_set_module, 0 }, { "__doc__", (getter)WraptObjectProxy_get_doc, (setter)WraptObjectProxy_set_doc, 0 }, { "__class__", (getter)WraptObjectProxy_get_class, NULL, 0 }, { "__annotations__", (getter)WraptObjectProxy_get_annotations, (setter)WraptObjectProxy_set_annotations, 0 }, { "__wrapped__", (getter)WraptObjectProxy_get_wrapped, (setter)WraptObjectProxy_set_wrapped, 0 }, { NULL }, }; PyTypeObject WraptObjectProxy_Type = { PyVarObject_HEAD_INIT(NULL, 0) "ObjectProxy", /*tp_name*/ sizeof(WraptObjectProxyObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)WraptObjectProxy_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ (unaryfunc)WraptObjectProxy_repr, /*tp_repr*/ &WraptObjectProxy_as_number, /*tp_as_number*/ &WraptObjectProxy_as_sequence, /*tp_as_sequence*/ &WraptObjectProxy_as_mapping, /*tp_as_mapping*/ (hashfunc)WraptObjectProxy_hash, /*tp_hash*/ (ternaryfunc)WraptObjectProxy_call, /*tp_call*/ (unaryfunc)WraptObjectProxy_str, /*tp_str*/ (getattrofunc)WraptObjectProxy_getattro, /*tp_getattro*/ (setattrofunc)WraptObjectProxy_setattro, /*tp_setattro*/ 0, /*tp_as_buffer*/ #if PY_MAJOR_VERSION < 3 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ #else Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ #endif 0, /*tp_doc*/ (traverseproc)WraptObjectProxy_traverse, /*tp_traverse*/ (inquiry)WraptObjectProxy_clear, /*tp_clear*/ (richcmpfunc)WraptObjectProxy_richcompare, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ (getiterfunc)WraptObjectProxy_iter, /*tp_iter*/ 0, /*tp_iternext*/ WraptObjectProxy_methods, /*tp_methods*/ 0, /*tp_members*/ WraptObjectProxy_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ offsetof(WraptObjectProxyObject, dict), /*tp_dictoffset*/ (initproc)WraptObjectProxy_init, /*tp_init*/ 0, /*tp_alloc*/ WraptObjectProxy_new, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { WraptFunctionWrapperObject *self; self = (WraptFunctionWrapperObject *)WraptObjectProxy_new(type, args, kwds); if (!self) return NULL; self->instance = NULL; self->wrapper = NULL; self->adapter = NULL; self->bound_type = NULL; return (PyObject *)self; } /* ------------------------------------------------------------------------- */ static int WraptFunctionWrapperBase_raw_init(WraptFunctionWrapperObject *self, PyObject *wrapped, PyObject *instance, PyObject *wrapper, PyObject *adapter, PyObject *bound_type) { int result = 0; result = WraptObjectProxy_raw_init((WraptObjectProxyObject *)self, wrapped); if (result == 0) { Py_INCREF(instance); Py_XDECREF(self->instance); self->instance = instance; Py_INCREF(wrapper); Py_XDECREF(self->wrapper); self->wrapper = wrapper; Py_INCREF(adapter); Py_XDECREF(self->adapter); self->adapter = adapter; Py_INCREF(bound_type); Py_XDECREF(self->bound_type); self->bound_type = bound_type; } return result; } /* ------------------------------------------------------------------------- */ static int WraptFunctionWrapperBase_init(WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds) { PyObject *wrapped = NULL; PyObject *instance = NULL; PyObject *wrapper = NULL; PyObject *adapter = Py_None; PyObject *bound_type = Py_None; static char *kwlist[] = { "wrapped", "instance", "wrapper", "adapter", "bound_type", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOO|OO:FunctionWrapperBase", kwlist, &wrapped, &instance, &wrapper, &adapter, &bound_type)) { return -1; } return WraptFunctionWrapperBase_raw_init(self, wrapped, instance, wrapper, adapter, bound_type); } /* ------------------------------------------------------------------------- */ static int WraptFunctionWrapperBase_traverse(WraptFunctionWrapperObject *self, visitproc visit, void *arg) { WraptObjectProxy_traverse((WraptObjectProxyObject *)self, visit, arg); Py_VISIT(self->instance); Py_VISIT(self->wrapper); Py_VISIT(self->adapter); Py_VISIT(self->bound_type); return 0; } /* ------------------------------------------------------------------------- */ static int WraptFunctionWrapperBase_clear(WraptFunctionWrapperObject *self) { WraptObjectProxy_clear((WraptObjectProxyObject *)self); Py_CLEAR(self->instance); Py_CLEAR(self->wrapper); Py_CLEAR(self->adapter); Py_CLEAR(self->bound_type); return 0; } /* ------------------------------------------------------------------------- */ static void WraptFunctionWrapperBase_dealloc(WraptFunctionWrapperObject *self) { WraptFunctionWrapperBase_clear(self); WraptObjectProxy_dealloc((WraptObjectProxyObject *)self); } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_call( WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds) { PyObject *call_args = NULL; PyObject *param_kwds = NULL; PyObject *result = NULL; if (!kwds) { param_kwds = PyDict_New(); kwds = param_kwds; } call_args = PyTuple_Pack(4, self->object_proxy.wrapped, Py_None, args, kwds); result = PyEval_CallObject(self->wrapper, call_args); Py_DECREF(call_args); Py_XDECREF(param_kwds); return result; } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_descr_get( WraptFunctionWrapperObject *self, PyObject *obj, PyObject *type) { PyObject *descriptor = NULL; PyObject *result = NULL; if (self->bound_type == Py_None) { Py_INCREF(self); return (PyObject *)self; } descriptor = (Py_TYPE(self->object_proxy.wrapped)->tp_descr_get)( self->object_proxy.wrapped, obj, type); if (!obj) obj = Py_None; if (!type) type = Py_None; if (descriptor) { result = PyObject_CallFunction(self->bound_type, "(OOO)", descriptor, obj, self->wrapper); } Py_XDECREF(descriptor); return result; } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_code( WraptFunctionWrapperObject *self) { if (!self->object_proxy.wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (self->adapter != Py_None) return PyObject_GetAttrString(self->adapter, "__code__"); return PyObject_GetAttrString(self->object_proxy.wrapped, "__code__"); } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_defaults( WraptFunctionWrapperObject *self) { if (!self->object_proxy.wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (self->adapter != Py_None) return PyObject_GetAttrString(self->adapter, "__defaults__"); return PyObject_GetAttrString(self->object_proxy.wrapped, "__defaults__"); } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_kwdefaults( WraptFunctionWrapperObject *self) { if (!self->object_proxy.wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (self->adapter != Py_None) return PyObject_GetAttrString(self->adapter, "__kwdefaults__"); return PyObject_GetAttrString(self->object_proxy.wrapped, "__kwdefaults__"); } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_signature( WraptFunctionWrapperObject *self) { if (!self->object_proxy.wrapped) { PyErr_SetString(PyExc_ValueError, "wrapper has not been initialised"); return NULL; } if (self->adapter != Py_None) return PyObject_GetAttrString(self->adapter, "__signature__"); return PyObject_GetAttrString(self->object_proxy.wrapped, "__signature__"); } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_self_instance( WraptFunctionWrapperObject *self, void *closure) { if (!self->instance) { Py_INCREF(Py_None); return Py_None; } Py_INCREF(self->instance); return self->instance; } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_self_wrapper( WraptFunctionWrapperObject *self, void *closure) { if (!self->wrapper) { Py_INCREF(Py_None); return Py_None; } Py_INCREF(self->wrapper); return self->wrapper; } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_self_adapter( WraptFunctionWrapperObject *self, void *closure) { if (!self->adapter) { Py_INCREF(Py_None); return Py_None; } Py_INCREF(self->adapter); return self->adapter; } /* ------------------------------------------------------------------------- */ static PyObject *WraptFunctionWrapperBase_get_self_bound_type( WraptFunctionWrapperObject *self, void *closure) { if (!self->bound_type) { Py_INCREF(Py_None); return Py_None; } Py_INCREF(self->bound_type); return self->bound_type; } /* ------------------------------------------------------------------------- */; static PyGetSetDef WraptFunctionWrapperBase_getset[] = { { "__module__", (getter)WraptObjectProxy_get_module, (setter)WraptObjectProxy_set_module, 0 }, { "__doc__", (getter)WraptObjectProxy_get_doc, (setter)WraptObjectProxy_set_doc, 0 }, { "__code__", (getter)WraptFunctionWrapperBase_get_code, NULL, 0 }, { "__defaults__", (getter)WraptFunctionWrapperBase_get_defaults, NULL, 0 }, { "__kwdefaults__", (getter)WraptFunctionWrapperBase_get_kwdefaults, NULL, 0 }, { "__signature__", (getter)WraptFunctionWrapperBase_get_signature, NULL, 0 }, #if PY_MAJOR_VERSION < 3 { "func_code", (getter)WraptFunctionWrapperBase_get_code, NULL, 0 }, { "func_defaults", (getter)WraptFunctionWrapperBase_get_defaults, NULL, 0 }, #endif { "_self_instance", (getter)WraptFunctionWrapperBase_get_self_instance, NULL, 0 }, { "_self_wrapper", (getter)WraptFunctionWrapperBase_get_self_wrapper, NULL, 0 }, { "_self_adapter", (getter)WraptFunctionWrapperBase_get_self_adapter, NULL, 0 }, { "_self_bound_type", (getter)WraptFunctionWrapperBase_get_self_bound_type, NULL, 0 }, { NULL }, }; PyTypeObject WraptFunctionWrapperBase_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_FunctionWrapperBase", /*tp_name*/ sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)WraptFunctionWrapperBase_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ (ternaryfunc)WraptFunctionWrapperBase_call, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ #if PY_MAJOR_VERSION < 3 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ #else Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ #endif 0, /*tp_doc*/ (traverseproc)WraptFunctionWrapperBase_traverse, /*tp_traverse*/ (inquiry)WraptFunctionWrapperBase_clear, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ WraptFunctionWrapperBase_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ (descrgetfunc)WraptFunctionWrapperBase_descr_get, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ (initproc)WraptFunctionWrapperBase_init, /*tp_init*/ 0, /*tp_alloc*/ WraptFunctionWrapperBase_new, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* ------------------------------------------------------------------------- */ static PyObject *WraptBoundFunctionWrapper_call( WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds) { PyObject *call_args = NULL; PyObject *param_kwds = NULL; PyObject *instance = NULL; PyObject *result = NULL; if (!kwds) { param_kwds = PyDict_New(); kwds = param_kwds; } /* * We actually ignore the instance supplied when the function was * bound and use that saved against __self__ of the bound function. * This will be the class type for a class method and None for the * case of a static method. */ instance = PyObject_GetAttrString(self->object_proxy.wrapped, "__self__"); if (!instance) { PyErr_Clear(); Py_INCREF(Py_None); instance = Py_None; } call_args = PyTuple_Pack(4, self->object_proxy.wrapped, instance, args, kwds); result = PyEval_CallObject(self->wrapper, call_args); Py_DECREF(call_args); Py_XDECREF(param_kwds); Py_DECREF(instance); return result; } /* ------------------------------------------------------------------------- */ static PyGetSetDef WraptBoundFunctionWrapper_getset[] = { { "__module__", (getter)WraptObjectProxy_get_module, (setter)WraptObjectProxy_set_module, 0 }, { "__doc__", (getter)WraptObjectProxy_get_doc, (setter)WraptObjectProxy_set_doc, 0 }, { NULL }, }; PyTypeObject WraptBoundFunctionWrapper_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_BoundFunctionWrapper", /*tp_name*/ sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ (ternaryfunc)WraptBoundFunctionWrapper_call, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ #if PY_MAJOR_VERSION < 3 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ #else Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ #endif 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ WraptBoundFunctionWrapper_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* ------------------------------------------------------------------------- */ static PyObject *WraptBoundMethodWrapper_call( WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds) { PyObject *call_args = NULL; PyObject *param_args = NULL; PyObject *param_kwds = NULL; PyObject *wrapped = NULL; PyObject *instance = NULL; PyObject *result = NULL; if (self->instance == Py_None) { PyObject *module = NULL; PyObject *partial = NULL; PyObject *object = NULL; module = PyImport_ImportModule("functools"); if (module) { PyObject *dict = NULL; dict = PyModule_GetDict(module); partial = PyDict_GetItemString(dict, "partial"); Py_DECREF(module); } if (!partial) return NULL; instance = PyTuple_GetItem(args, 0); if (!instance) return NULL; object = PyObject_CallFunction(partial, "(OO)", self->object_proxy.wrapped, instance); if (!object) return NULL; wrapped = object; param_args = PyTuple_GetSlice(args, 1, PyTuple_Size(args)); if (!param_args) return NULL; args = param_args; } else instance = self->instance; if (!kwds) { param_kwds = PyDict_New(); kwds = param_kwds; } if (!wrapped) { Py_INCREF(self->object_proxy.wrapped); wrapped = self->object_proxy.wrapped; } call_args = PyTuple_Pack(4, wrapped, instance, args, kwds); result = PyEval_CallObject(self->wrapper, call_args); Py_DECREF(call_args); Py_XDECREF(param_args); Py_XDECREF(param_kwds); Py_DECREF(wrapped); return result; } /* ------------------------------------------------------------------------- */ static PyGetSetDef WraptBoundMethodWrapper_getset[] = { { "__module__", (getter)WraptObjectProxy_get_module, (setter)WraptObjectProxy_set_module, 0 }, { "__doc__", (getter)WraptObjectProxy_get_doc, (setter)WraptObjectProxy_set_doc, 0 }, { NULL }, }; PyTypeObject WraptBoundMethodWrapper_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_BoundMethodWrapper", /*tp_name*/ sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ (ternaryfunc)WraptBoundMethodWrapper_call, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ #if PY_MAJOR_VERSION < 3 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ #else Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ #endif 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ WraptBoundMethodWrapper_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* ------------------------------------------------------------------------- */ static int WraptFunctionWrapper_init(WraptFunctionWrapperObject *self, PyObject *args, PyObject *kwds) { PyObject *wrapped = NULL; PyObject *wrapper = NULL; PyObject *adapter = Py_None; PyObject *bound_type = NULL; int result = 0; static char *kwlist[] = { "wrapped", "wrapper", "adapter", NULL }; if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|O:FunctionWrapper", kwlist, &wrapped, &wrapper, &adapter)) { return -1; } if (PyObject_IsInstance(wrapped, (PyObject *)&PyClassMethod_Type) || PyObject_IsInstance( wrapped, (PyObject *)&PyStaticMethod_Type)) { bound_type = (PyObject *)&WraptBoundFunctionWrapper_Type; } else bound_type = (PyObject *)&WraptBoundMethodWrapper_Type; result = WraptFunctionWrapperBase_raw_init(self, wrapped, Py_None, wrapper, adapter, bound_type); return result; } /* ------------------------------------------------------------------------- */; static PyGetSetDef WraptFunctionWrapper_getset[] = { { "__module__", (getter)WraptObjectProxy_get_module, (setter)WraptObjectProxy_set_module, 0 }, { "__doc__", (getter)WraptObjectProxy_get_doc, (setter)WraptObjectProxy_set_doc, 0 }, { NULL }, }; PyTypeObject WraptFunctionWrapper_Type = { PyVarObject_HEAD_INIT(NULL, 0) "FunctionWrapper", /*tp_name*/ sizeof(WraptFunctionWrapperObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ #if PY_MAJOR_VERSION < 3 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ #else Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ #endif 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ 0, /*tp_methods*/ 0, /*tp_members*/ WraptFunctionWrapper_getset, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ (initproc)WraptFunctionWrapper_init, /*tp_init*/ 0, /*tp_alloc*/ 0, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ }; /* ------------------------------------------------------------------------- */; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_wrappers", /* m_name */ NULL, /* m_doc */ -1, /* m_size */ NULL, /* m_methods */ NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL, /* m_free */ }; #endif static PyObject * moduleinit(void) { PyObject *module; #if PY_MAJOR_VERSION >= 3 module = PyModule_Create(&moduledef); #else module = Py_InitModule3("_wrappers", NULL, NULL); #endif if (module == NULL) return NULL; if (PyType_Ready(&WraptObjectProxy_Type) < 0) return NULL; /* Ensure that inheritence relationships specified. */ WraptFunctionWrapperBase_Type.tp_base = &WraptObjectProxy_Type; WraptBoundFunctionWrapper_Type.tp_base = &WraptFunctionWrapperBase_Type; WraptBoundMethodWrapper_Type.tp_base = &WraptFunctionWrapperBase_Type; WraptFunctionWrapper_Type.tp_base = &WraptFunctionWrapperBase_Type; if (PyType_Ready(&WraptFunctionWrapperBase_Type) < 0) return NULL; if (PyType_Ready(&WraptBoundFunctionWrapper_Type) < 0) return NULL; if (PyType_Ready(&WraptBoundMethodWrapper_Type) < 0) return NULL; if (PyType_Ready(&WraptFunctionWrapper_Type) < 0) return NULL; Py_INCREF(&WraptObjectProxy_Type); PyModule_AddObject(module, "ObjectProxy", (PyObject *)&WraptObjectProxy_Type); Py_INCREF(&WraptFunctionWrapper_Type); PyModule_AddObject(module, "FunctionWrapper", (PyObject *)&WraptFunctionWrapper_Type); Py_INCREF(&WraptFunctionWrapperBase_Type); PyModule_AddObject(module, "_FunctionWrapperBase", (PyObject *)&WraptFunctionWrapperBase_Type); Py_INCREF(&WraptBoundFunctionWrapper_Type); PyModule_AddObject(module, "_BoundFunctionWrapper", (PyObject *)&WraptBoundFunctionWrapper_Type); Py_INCREF(&WraptBoundMethodWrapper_Type); PyModule_AddObject(module, "_BoundMethodWrapper", (PyObject *)&WraptBoundMethodWrapper_Type); return module; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_wrappers(void) { moduleinit(); } #else PyMODINIT_FUNC PyInit__wrappers(void) { return moduleinit(); } #endif /* ------------------------------------------------------------------------- */