summaryrefslogtreecommitdiffstats
path: root/lasso/utils.h
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-01-24 09:33:20 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-01-24 09:33:20 +0000
commitcfc64aac4cfb9644babffd9498dd35d0f21c2900 (patch)
tree7d9674757f86b21deb61093380f55280c6350d87 /lasso/utils.h
parent03c6d3ba25f7a61f3ac35561b887dddf84d7f289 (diff)
downloadlasso-cfc64aac4cfb9644babffd9498dd35d0f21c2900.tar.gz
lasso-cfc64aac4cfb9644babffd9498dd35d0f21c2900.tar.xz
lasso-cfc64aac4cfb9644babffd9498dd35d0f21c2900.zip
Core: add references handling macros
* lasso/utils.h: - add macro lasso_transfer_string and lasso_transfer_gobject, to transfer ownership of such objects without copying or their changing reference count. The old containing variable is NULLed. - lasso_list_add_gobject,lasso_list_add_new_gobject: test if the added object is a GObject, if not do not add it and print a warning. - lasso_check_type_equality: this macro use special builtin functions only with GCC (typeof and __builtin_types_compatible_p) and do metaprogramming using anonymous enumeration type to make compile time assertions. It is used - add macros to release XPathObject XPathContext, macro constructor to make reference transfert macros (free dest, nullify dest, copy src to dest without increasing refcount, nullify src), add a macro to transfert xpath objects.
Diffstat (limited to 'lasso/utils.h')
-rw-r--r--lasso/utils.h119
1 files changed, 102 insertions, 17 deletions
diff --git a/lasso/utils.h b/lasso/utils.h
index 2d9d6382..8a58f95e 100644
--- a/lasso/utils.h
+++ b/lasso/utils.h
@@ -27,6 +27,19 @@
#include <glib.h>
+#ifdef LASSO_DEBUG
+#ifdef __GNUC__
+#define lasso_check_type_equality(a,b) \
+ { \
+ enum { TYPE_MISMATCH = (1 / __builtin_types_compatible_p(typeof(a), typeof(b))) }; \
+ }
+#else
+#define lasso_check_type_equality(a,b)
+#endif
+#else
+#define lasso_check_type_equality(a,b)
+#endif
+
/* Assignment and list appending */
#define lasso_assign_string(dest,src) \
{ \
@@ -43,6 +56,7 @@
#define lasso_assign_gobject(dest,src) \
{ \
+ lasso_check_type_equality(dest, src); \
if (src) \
g_object_ref(src); \
if (dest) \
@@ -52,6 +66,7 @@
#define lasso_assign_new_gobject(dest,src) \
{ \
+ lasso_check_type_equality(dest, src); \
if (dest) \
g_object_unref(dest); \
dest = (void*)(src); \
@@ -59,29 +74,58 @@
#define lasso_assign_node(dest,src) \
{ \
+ lasso_check_type_equality(dest, src); \
if (dest) \
xmlFreeNode(dest); \
dest = xmlCopyNode(src, 1); \
}
+#define lasso_list_add(dest, src) \
+ { \
+ lasso_check_type_equality(src, void*); \
+ dest = g_list_append(dest, src); \
+ }
+
+#define lasso_list_add_non_null(dest, src) \
+ { \
+ lasso_check_type_equality(src, void*); \
+ if (src != NULL) { \
+ dest = g_list_append(dest, src); \
+ } else { \
+ g_critical("Adding a NULL value to a non-NULL content list: dest=%s src=%s", #dest, #src); \
+ } \
+ }
+
#define lasso_list_add_string(dest, src) \
{ \
+ lasso_check_type_equality(dest, GList*); \
+ lasso_check_type_equality(src, gchar*); \
(dest) = g_list_append((dest), g_strdup(src));\
}
-#define lasso_list_add_gobject(dest, src) \
+#define lasso_list_add_xml_string(dest, src) \
{ \
- dest = g_list_append(dest, g_object_ref(src)); \
+ lasso_check_type_equality(dest, GList*); \
+ lasso_check_type_equality(src, xmlChar*); \
+ (dest) = g_list_append((dest), g_strdup((char*)src));\
}
-#define lasso_list_add_new_gobject(dest, src) \
+#define lasso_list_add_gobject(dest, src) \
{ \
- dest = g_list_append(dest, src); \
+ if (G_IS_OBJECT(src)) { \
+ dest = g_list_append(dest, g_object_ref(src)); \
+ } else { \
+ g_critical("Trying to add to a GList* a non GObject pointer dest=%s src=%s", #dest, #src); \
+ } \
}
-#define lasso_list_add(dest, src) \
+#define lasso_list_add_new_gobject(dest, src) \
{ \
- dest = g_list_append(dest, src); \
+ if (G_IS_OBJECT(src)) { \
+ dest = g_list_append(dest, src); \
+ } else { \
+ g_critical("Trying to add to a GList* a non GObject pointer dest=%s src=%s", #dest, #src); \
+ } \
}
/* Freeing */
@@ -99,21 +143,34 @@
} \
}
+#define lasso_release_full2(dest, free_function, type) \
+ { \
+ lasso_check_type_equality(dest, type); \
+ if (dest) { \
+ free_function(dest); dest = NULL; \
+ } \
+ }
+
#define lasso_release_gobject(dest) \
- lasso_release_full(dest, g_object_unref)
+ { \
+ if (G_IS_OBJECT(dest) || dest == NULL) { \
+ lasso_release_full(dest, g_object_unref); \
+ } else { \
+ g_critical("Trying to unref a non GObject pointer dest=%s", #dest); \
+ } \
+ }
#define lasso_release_string(dest) \
lasso_release_full(dest, g_free)
#define lasso_release_list(dest) \
- lasso_release_full(dest, g_list_free)
+ lasso_release_full2(dest, g_list_free, GList*)
#define lasso_release_list_of_full(dest, free_function) \
{ \
if (dest) { \
g_list_foreach(dest, (GFunc)free_function, NULL); \
- g_list_free(dest); \
- dest = NULL; \
+ lasso_release_list(dest); \
} \
}
@@ -127,25 +184,53 @@
lasso_release_list_of_full(dest, xmlFreeNode)
#define lasso_release_node(node) \
- lasso_release_full(node, xmlFreeNode)
+ lasso_release_full2(node, xmlFreeNode, xmlNodePtr)
#define lasso_release_doc(doc) \
- lasso_release_full(doc, xmlFreeDoc)
+ lasso_release_full2(doc, xmlFreeDoc, xmlDocPtr)
#define lasso_release_xmlchar(dest) \
- lasso_release_full(dest, xmlFree)
+ lasso_release_full2(dest, xmlFree, xmlChar*)
#define lasso_release_encrypt_context(dest) \
- lasso_release_full(dest, xmlSecEncCtxDestroy)
+ lasso_release_full2(dest, xmlSecEncCtxDestroy, xmlSecEncCtxPtr)
#define lasso_release_signature_context(dest) \
- lasso_release_full(dest, xmlSecDSigCtxDestroy)
+ lasso_release_full2(dest, xmlSecDSigCtxDestroy,xmlSecDSigCtxPtr)
#define lasso_release_key_manager(dest) \
- lasso_release_full(dest, xmlSecKeysMngrDestroy)
+ lasso_release_full2(dest, xmlSecKeysMngrDestroy, xmlSecKeysMngrPtr)
#define lasso_release_output_buffer(dest) \
- lasso_release_full(dest, xmlOutputBufferClose)
+ lasso_release_full2(dest, xmlOutputBufferClose, xmlOutputBufferPtr)
+
+#define lasso_release_xpath_object(dest) \
+ lasso_release_full2(dest, xmlXPathFreeObject, xmlXPathObjectPtr)
+
+#define lasso_release_xpath_context(dest) \
+ lasso_release_full2(dest, xmlXPathFreeContext, xmlXPathContextPtr)
+
+#define lasso_release_xpath_job(xpathObject, xpathContext, xmlDocument) \
+ lasso_release_xpath_object(xpathObject); \
+ lasso_release_xpath_context(xpathContext); \
+ lasso_release_doc(xmlDocument)
+
+#define lasso_transfer_full(dest, src, kind) \
+ {\
+ lasso_release_##kind((dest)); \
+ lasso_check_type_equality(dest, src); \
+ (dest) = (void*)(src); \
+ (src) = NULL; \
+ }
+
+#define lasso_transfer_xpath_object(dest, src) \
+ lasso_transfer_full(dest, src, xpath_object)
+
+#define lasso_transfer_string(dest, src) \
+ lasso_transfer_full(dest, src, string)
+
+#define lasso_transfer_gobject(dest, src) \
+ lasso_transfer_full(dest, src, gobject)
/* Bad param handling */
#define lasso_return_val_if_invalid_param(kind, name, val) \