Changeset 988 for vendor/current/lib/talloc/pytalloc.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/lib/talloc/pytalloc.c
r740 r988 2 2 Unix SMB/CIFS implementation. 3 3 Python Talloc Module 4 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2010 4 Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2010-2011 5 5 6 6 This program is free software; you can redistribute it and/or modify … … 21 21 #include <talloc.h> 22 22 #include <pytalloc.h> 23 24 void inittalloc(void); 23 #include "pytalloc_private.h" 24 25 static PyTypeObject TallocObject_Type; 26 27 #if PY_MAJOR_VERSION >= 3 28 #define PyStr_FromFormat PyUnicode_FromFormat 29 #else 30 #define PyStr_FromFormat PyString_FromFormat 31 #endif 25 32 26 33 /* print a talloc tree report for a talloc python object */ 27 static PyObject *py _talloc_report_full(PyObject *self, PyObject *args)34 static PyObject *pytalloc_report_full(PyObject *self, PyObject *args) 28 35 { 29 36 PyObject *py_obj = Py_None; 30 PyTypeObject *type;31 37 32 38 if (!PyArg_ParseTuple(args, "|O", &py_obj)) … … 36 42 talloc_report_full(NULL, stdout); 37 43 } else { 38 type = (PyTypeObject*)PyObject_Type(py_obj); 39 talloc_report_full(py_talloc_get_mem_ctx(py_obj), stdout); 44 talloc_report_full(pytalloc_get_mem_ctx(py_obj), stdout); 40 45 } 41 46 return Py_None; … … 43 48 44 49 /* enable null tracking */ 45 static PyObject *py _talloc_enable_null_tracking(PyObject *self)50 static PyObject *pytalloc_enable_null_tracking(PyObject *self) 46 51 { 47 52 talloc_enable_null_tracking(); … … 50 55 51 56 /* return the number of talloc blocks */ 52 static PyObject *py _talloc_total_blocks(PyObject *self, PyObject *args)57 static PyObject *pytalloc_total_blocks(PyObject *self, PyObject *args) 53 58 { 54 59 PyObject *py_obj = Py_None; 55 PyTypeObject *type;56 60 57 61 if (!PyArg_ParseTuple(args, "|O", &py_obj)) … … 62 66 } 63 67 64 type = (PyTypeObject*)PyObject_Type(py_obj); 65 66 return PyLong_FromLong(talloc_total_blocks(py_talloc_get_mem_ctx(py_obj))); 68 return PyLong_FromLong(talloc_total_blocks(pytalloc_get_mem_ctx(py_obj))); 67 69 } 68 70 69 71 static PyMethodDef talloc_methods[] = { 70 { "report_full", (PyCFunction)py _talloc_report_full, METH_VARARGS,72 { "report_full", (PyCFunction)pytalloc_report_full, METH_VARARGS, 71 73 "show a talloc tree for an object"}, 72 { "enable_null_tracking", (PyCFunction)py _talloc_enable_null_tracking, METH_NOARGS,74 { "enable_null_tracking", (PyCFunction)pytalloc_enable_null_tracking, METH_NOARGS, 73 75 "enable tracking of the NULL object"}, 74 { "total_blocks", (PyCFunction)py _talloc_total_blocks, METH_VARARGS,76 { "total_blocks", (PyCFunction)pytalloc_total_blocks, METH_VARARGS, 75 77 "return talloc block count"}, 76 78 { NULL } … … 80 82 * Default (but only slightly more useful than the default) implementation of Repr(). 81 83 */ 82 static PyObject *py _talloc_default_repr(PyObject *obj)83 { 84 py _talloc_Object *talloc_obj = (py_talloc_Object *)obj;84 static PyObject *pytalloc_default_repr(PyObject *obj) 85 { 86 pytalloc_Object *talloc_obj = (pytalloc_Object *)obj; 85 87 PyTypeObject *type = (PyTypeObject*)PyObject_Type(obj); 86 88 87 return PyStr ing_FromFormat("<%s talloc object at 0x%p>",88 89 return PyStr_FromFormat("<%s talloc object at 0x%p>", 90 type->tp_name, talloc_obj->ptr); 89 91 } 90 92 … … 92 94 * Simple dealloc for talloc-wrapping PyObjects 93 95 */ 94 static void py _talloc_dealloc(PyObject* self)95 { 96 py _talloc_Object *obj = (py_talloc_Object *)self;96 static void pytalloc_dealloc(PyObject* self) 97 { 98 pytalloc_Object *obj = (pytalloc_Object *)self; 97 99 assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); 98 100 obj->talloc_ctx = NULL; … … 103 105 * Default (but only slightly more useful than the default) implementation of cmp. 104 106 */ 105 static int py_talloc_default_cmp(PyObject *_obj1, PyObject *_obj2) 106 { 107 py_talloc_Object *obj1 = (py_talloc_Object *)_obj1, 108 *obj2 = (py_talloc_Object *)_obj2; 107 #if PY_MAJOR_VERSION >= 3 108 static PyObject *pytalloc_default_richcmp(PyObject *obj1, PyObject *obj2, int op) 109 { 110 void *ptr1; 111 void *ptr2; 112 if (Py_TYPE(obj1) == Py_TYPE(obj2)) { 113 /* When types match, compare pointers */ 114 ptr1 = pytalloc_get_ptr(obj1); 115 ptr2 = pytalloc_get_ptr(obj2); 116 } else if (PyObject_TypeCheck(obj2, &TallocObject_Type)) { 117 /* Otherwise, compare types */ 118 ptr1 = Py_TYPE(obj1); 119 ptr2 = Py_TYPE(obj2); 120 } else { 121 Py_INCREF(Py_NotImplemented); 122 return Py_NotImplemented; 123 } 124 switch (op) { 125 case Py_EQ: return PyBool_FromLong(ptr1 == ptr2); 126 case Py_NE: return PyBool_FromLong(ptr1 != ptr2); 127 case Py_LT: return PyBool_FromLong(ptr1 < ptr2); 128 case Py_GT: return PyBool_FromLong(ptr1 > ptr2); 129 case Py_LE: return PyBool_FromLong(ptr1 <= ptr2); 130 case Py_GE: return PyBool_FromLong(ptr1 >= ptr2); 131 } 132 Py_INCREF(Py_NotImplemented); 133 return Py_NotImplemented; 134 } 135 #else 136 static int pytalloc_default_cmp(PyObject *_obj1, PyObject *_obj2) 137 { 138 pytalloc_Object *obj1 = (pytalloc_Object *)_obj1, 139 *obj2 = (pytalloc_Object *)_obj2; 109 140 if (obj1->ob_type != obj2->ob_type) 110 return (obj1->ob_type - obj2->ob_type); 111 112 return ((char *)py_talloc_get_ptr(obj1) - (char *)py_talloc_get_ptr(obj2)); 113 } 141 return ((char *)obj1->ob_type - (char *)obj2->ob_type); 142 143 return ((char *)pytalloc_get_ptr(obj1) - (char *)pytalloc_get_ptr(obj2)); 144 } 145 #endif 114 146 115 147 static PyTypeObject TallocObject_Type = { 116 148 .tp_name = "talloc.Object", 117 149 .tp_doc = "Python wrapper for a talloc-maintained object.", 118 .tp_basicsize = sizeof(py _talloc_Object),119 .tp_dealloc = (destructor)py _talloc_dealloc,150 .tp_basicsize = sizeof(pytalloc_Object), 151 .tp_dealloc = (destructor)pytalloc_dealloc, 120 152 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, 121 .tp_repr = py_talloc_default_repr, 122 .tp_compare = py_talloc_default_cmp, 123 }; 124 125 void inittalloc(void) 153 .tp_repr = pytalloc_default_repr, 154 #if PY_MAJOR_VERSION >= 3 155 .tp_richcompare = pytalloc_default_richcmp, 156 #else 157 .tp_compare = pytalloc_default_cmp, 158 #endif 159 }; 160 161 /** 162 * Default (but only slightly more useful than the default) implementation of Repr(). 163 */ 164 static PyObject *pytalloc_base_default_repr(PyObject *obj) 165 { 166 pytalloc_BaseObject *talloc_obj = (pytalloc_BaseObject *)obj; 167 PyTypeObject *type = (PyTypeObject*)PyObject_Type(obj); 168 169 return PyStr_FromFormat("<%s talloc based object at 0x%p>", 170 type->tp_name, talloc_obj->ptr); 171 } 172 173 /** 174 * Simple dealloc for talloc-wrapping PyObjects 175 */ 176 static void pytalloc_base_dealloc(PyObject* self) 177 { 178 pytalloc_BaseObject *obj = (pytalloc_BaseObject *)self; 179 assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); 180 obj->talloc_ctx = NULL; 181 self->ob_type->tp_free(self); 182 } 183 184 /** 185 * Default (but only slightly more useful than the default) implementation of cmp. 186 */ 187 #if PY_MAJOR_VERSION >= 3 188 static PyObject *pytalloc_base_default_richcmp(PyObject *obj1, PyObject *obj2, int op) 189 { 190 void *ptr1; 191 void *ptr2; 192 if (Py_TYPE(obj1) == Py_TYPE(obj2)) { 193 /* When types match, compare pointers */ 194 ptr1 = pytalloc_get_ptr(obj1); 195 ptr2 = pytalloc_get_ptr(obj2); 196 } else if (PyObject_TypeCheck(obj2, &TallocObject_Type)) { 197 /* Otherwise, compare types */ 198 ptr1 = Py_TYPE(obj1); 199 ptr2 = Py_TYPE(obj2); 200 } else { 201 Py_INCREF(Py_NotImplemented); 202 return Py_NotImplemented; 203 } 204 switch (op) { 205 case Py_EQ: return PyBool_FromLong(ptr1 == ptr2); 206 case Py_NE: return PyBool_FromLong(ptr1 != ptr2); 207 case Py_LT: return PyBool_FromLong(ptr1 < ptr2); 208 case Py_GT: return PyBool_FromLong(ptr1 > ptr2); 209 case Py_LE: return PyBool_FromLong(ptr1 <= ptr2); 210 case Py_GE: return PyBool_FromLong(ptr1 >= ptr2); 211 } 212 Py_INCREF(Py_NotImplemented); 213 return Py_NotImplemented; 214 } 215 #else 216 static int pytalloc_base_default_cmp(PyObject *_obj1, PyObject *_obj2) 217 { 218 pytalloc_BaseObject *obj1 = (pytalloc_BaseObject *)_obj1, 219 *obj2 = (pytalloc_BaseObject *)_obj2; 220 if (obj1->ob_type != obj2->ob_type) 221 return ((char *)obj1->ob_type - (char *)obj2->ob_type); 222 223 return ((char *)pytalloc_get_ptr(obj1) - (char *)pytalloc_get_ptr(obj2)); 224 } 225 #endif 226 227 static PyTypeObject TallocBaseObject_Type = { 228 .tp_name = "talloc.BaseObject", 229 .tp_doc = "Python wrapper for a talloc-maintained object.", 230 .tp_basicsize = sizeof(pytalloc_BaseObject), 231 .tp_dealloc = (destructor)pytalloc_base_dealloc, 232 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, 233 .tp_repr = pytalloc_base_default_repr, 234 #if PY_MAJOR_VERSION >= 3 235 .tp_richcompare = pytalloc_base_default_richcmp, 236 #else 237 .tp_compare = pytalloc_base_default_cmp, 238 #endif 239 }; 240 241 #define MODULE_DOC PyDoc_STR("Python wrapping of talloc-maintained objects.") 242 243 #if PY_MAJOR_VERSION >= 3 244 static struct PyModuleDef moduledef = { 245 PyModuleDef_HEAD_INIT, 246 .m_name = "talloc", 247 .m_doc = MODULE_DOC, 248 .m_size = -1, 249 .m_methods = talloc_methods, 250 }; 251 #endif 252 253 static PyObject *module_init(void); 254 static PyObject *module_init(void) 126 255 { 127 256 PyObject *m; 128 257 129 258 if (PyType_Ready(&TallocObject_Type) < 0) 130 return; 131 132 m = Py_InitModule3("talloc", talloc_methods, 133 "Python wrapping of talloc-maintained objects."); 259 return NULL; 260 261 if (PyType_Ready(&TallocBaseObject_Type) < 0) 262 return NULL; 263 264 #if PY_MAJOR_VERSION >= 3 265 m = PyModule_Create(&moduledef); 266 #else 267 m = Py_InitModule3("talloc", talloc_methods, MODULE_DOC); 268 #endif 134 269 if (m == NULL) 135 return ;270 return NULL; 136 271 137 272 Py_INCREF(&TallocObject_Type); 138 273 PyModule_AddObject(m, "Object", (PyObject *)&TallocObject_Type); 139 } 274 Py_INCREF(&TallocBaseObject_Type); 275 PyModule_AddObject(m, "BaseObject", (PyObject *)&TallocBaseObject_Type); 276 return m; 277 } 278 279 #if PY_MAJOR_VERSION >= 3 280 PyMODINIT_FUNC PyInit_talloc(void); 281 PyMODINIT_FUNC PyInit_talloc(void) 282 { 283 return module_init(); 284 } 285 #else 286 void inittalloc(void); 287 void inittalloc(void) 288 { 289 module_init(); 290 } 291 #endif
Note:
See TracChangeset
for help on using the changeset viewer.