diff options
author | Kristján Valur <kristjan@rvx.is> | 2019-03-06 13:46:32 +0000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2019-03-26 03:03:23 +0000 |
commit | 417a359b33a21d74cb3f45dd1958e39794a65b85 (patch) | |
tree | 23c731413b2ac047311477a85fc5b1761aa73b2c /lib/talloc | |
parent | 9ac45960fead8723740adad4fab676b56cf95cc8 (diff) | |
download | samba-417a359b33a21d74cb3f45dd1958e39794a65b85.tar.gz |
pytalloc: Further refactoring to eliminate duplicate code.
Signed-off-by: Kristján Valur <kristjan@rvx.is>
Reviewed-by: Noel Power <npower@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib/talloc')
-rw-r--r-- | lib/talloc/pytalloc_util.c | 70 |
1 files changed, 34 insertions, 36 deletions
diff --git a/lib/talloc/pytalloc_util.c b/lib/talloc/pytalloc_util.c index af835e437c5..69f64a7dff5 100644 --- a/lib/talloc/pytalloc_util.c +++ b/lib/talloc/pytalloc_util.c @@ -131,6 +131,9 @@ static PyObject *pytalloc_steal_or_reference(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, void *ptr, bool steal) { bool ok = false; + TALLOC_CTX *talloc_ctx = NULL; + bool is_baseobject = false; + PyObject *obj = NULL; PyTypeObject *BaseObjectType = pytalloc_GetBaseObjectType(); PyTypeObject *ObjectType = pytalloc_GetObjectType(); @@ -138,48 +141,43 @@ static PyObject *pytalloc_steal_or_reference(PyTypeObject *py_type, return PyErr_NoMemory(); } - if (PyType_IsSubtype(py_type, BaseObjectType)) { - pytalloc_BaseObject *ret - = (pytalloc_BaseObject *)py_type->tp_alloc(py_type, 0); - ret->talloc_ctx = talloc_new(NULL); - if (ret->talloc_ctx == NULL) { - return NULL; - } - if (steal) { - ok = (talloc_steal(ret->talloc_ctx, mem_ctx) != NULL); - } else { - ok = (talloc_reference(ret->talloc_ctx, mem_ctx) != NULL); - } - if (!ok) { + is_baseobject = PyType_IsSubtype(py_type, BaseObjectType); + if (!is_baseobject) { + if (!PyType_IsSubtype(py_type, ObjectType)) { + PyErr_SetString(PyExc_RuntimeError, + "Expected type based on talloc"); return NULL; } - talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); + } + + obj = py_type->tp_alloc(py_type, 0); + + talloc_ctx = talloc_new(NULL); + if (talloc_ctx == NULL) { + return NULL; + } + + if (steal) { + ok = (talloc_steal(talloc_ctx, mem_ctx) != NULL); + } else { + ok = (talloc_reference(talloc_ctx, mem_ctx) != NULL); + } + if (!ok) { + return NULL; + } + talloc_set_name_const(talloc_ctx, py_type->tp_name); + + if (is_baseobject) { + pytalloc_BaseObject *ret = (pytalloc_BaseObject*)obj; + ret->talloc_ctx = talloc_ctx; ret->talloc_ptr_ctx = mem_ctx; ret->ptr = ptr; - return (PyObject *)ret; - } else if (PyType_IsSubtype(py_type, ObjectType)) { - pytalloc_Object *ret - = (pytalloc_Object *)py_type->tp_alloc(py_type, 0); - ret->talloc_ctx = talloc_new(NULL); - if (ret->talloc_ctx == NULL) { - return NULL; - } - if (steal) { - ok = (talloc_steal(ret->talloc_ctx, mem_ctx) != NULL); - } else { - ok = (talloc_reference(ret->talloc_ctx, mem_ctx) != NULL); - } - if (!ok) { - return NULL; - } - talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); - ret->ptr = ptr; - return (PyObject *)ret; } else { - PyErr_SetString(PyExc_RuntimeError, - "Expected type based on talloc"); - return NULL; + pytalloc_Object *ret = (pytalloc_Object*)obj; + ret->talloc_ctx = talloc_ctx; + ret->ptr = ptr; } + return obj; } /* |