All the g_return_if_fail() statements tend to increase the size of Glib, GTK+, etc, quite a bit. The attached patch, changes the GCC branch of of the g_return_if_fail() definition to: - Removes the file/line information when we have __PRETTY_FUNC__; it's really just useless clutter for the common use of g_return_if_fail() to check assertions on entry - Uses a helper function to avoid hardcoding the format string into every function As an example of the how this helps: libgobject gets 10% smaller (saves 20k out of 210k) libgtk gets 4% smaller (saves 80k of 2.4M) Which is a significant saving for such a tiny patch... Regards, Owen
Index: glib/gmessages.c
===================================================================
RCS file: /cvs/gnome/glib/glib/gmessages.c,v
retrieving revision 1.59
diff -u -p -r1.59 gmessages.c
--- glib/gmessages.c 14 Mar 2004 18:59:33 -0000 1.59
+++ glib/gmessages.c 12 Apr 2004 16:08:03 -0000
@@ -542,6 +542,18 @@ g_log (const gchar *log_domain,
va_end (args);
}
+void
+g_return_failed_internal (const char *log_domain,
+ const char *pretty_function,
+ const char *expression)
+{
+ g_log (log_domain,
+ G_LOG_LEVEL_CRITICAL,
+ "%s: assertion `%s' failed",
+ pretty_function,
+ expression);
+}
+
#define CHAR_IS_SAFE(wc) (!((wc < 0x20 && wc != '\t' && wc != '\n' && wc != '\r') || \
(wc == 0x7f) || \
(wc >= 0x80 && wc < 0xa0)))
Index: glib/gmessages.h
===================================================================
RCS file: /cvs/gnome/glib/glib/gmessages.h,v
retrieving revision 1.21
diff -u -p -r1.21 gmessages.h
--- glib/gmessages.h 6 Feb 2003 19:57:14 -0000 1.21
+++ glib/gmessages.h 12 Apr 2004 16:08:03 -0000
@@ -252,29 +252,25 @@ GPrintFunc g_set_printerr_handler
#ifdef __GNUC__
+void g_return_failed_internal (const char *log_domain,
+ const char *pretty_function,
+ const char *expression);
+
#define g_return_if_fail(expr) G_STMT_START{ \
if G_LIKELY(expr) { } else \
{ \
- g_log (G_LOG_DOMAIN, \
- G_LOG_LEVEL_CRITICAL, \
- "file %s: line %d (%s): assertion `%s' failed", \
- __FILE__, \
- __LINE__, \
- __PRETTY_FUNCTION__, \
- #expr); \
+ g_return_failed_internal (G_LOG_DOMAIN, \
+ __PRETTY_FUNCTION__, \
+ #expr); \
return; \
}; }G_STMT_END
#define g_return_val_if_fail(expr,val) G_STMT_START{ \
if G_LIKELY(expr) { } else \
{ \
- g_log (G_LOG_DOMAIN, \
- G_LOG_LEVEL_CRITICAL, \
- "file %s: line %d (%s): assertion `%s' failed", \
- __FILE__, \
- __LINE__, \
- __PRETTY_FUNCTION__, \
- #expr); \
+ g_return_failed_internal (G_LOG_DOMAIN, \
+ __PRETTY_FUNCTION__, \
+ #expr); \
return (val); \
}; }G_STMT_END
Attachment:
signature.asc
Description: This is a digitally signed message part