summaryrefslogtreecommitdiff
path: root/lib/talloc
diff options
context:
space:
mode:
authorKristján Valur <kristjan@rvx.is>2019-03-06 13:46:32 +0000
committerAndrew Bartlett <abartlet@samba.org>2019-03-26 03:03:23 +0000
commit417a359b33a21d74cb3f45dd1958e39794a65b85 (patch)
tree23c731413b2ac047311477a85fc5b1761aa73b2c /lib/talloc
parent9ac45960fead8723740adad4fab676b56cf95cc8 (diff)
downloadsamba-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.c70
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;
}
/*