From f1f81ca7c9ada6a135b4efd30fbf5c6292ec6b32 Mon Sep 17 00:00:00 2001 From: Lucas De Marchi Date: Wed, 2 Jan 2013 20:55:57 +0000 Subject: [PATCH] efl: stop depending on va_list type va_list may be typedef'ed not only to array and pointer but also to a plain struct. It could be made to work this way, but it's a lot simpler a safer to not depend on it. To deal with the array corner case we copy the va_list from the function arguments to the stack and call the "real" function passing it. SVN revision: 82017 --- configure.ac | 2 - m4/ac_valist.m4 | 39 ---------------- src/lib/edbus/edbus_message.c | 88 ++++++++++++++++++++++++----------- src/lib/edbus/edbus_private.h | 6 --- 4 files changed, 61 insertions(+), 74 deletions(-) delete mode 100644 m4/ac_valist.m4 diff --git a/configure.ac b/configure.ac index e3e1e1261b..27ba2b06e1 100644 --- a/configure.ac +++ b/configure.ac @@ -291,8 +291,6 @@ AC_LANG(C) AC_PROG_CC_C99 AM_PROG_CC_C_O -AC_C_VA_LIST_AS_ARRAY - if test "x${ac_cv_prog_cc_c99}" = "xno" ; then AC_MSG_ERROR([ecore requires a c99-capable compiler]) fi diff --git a/m4/ac_valist.m4 b/m4/ac_valist.m4 deleted file mode 100644 index 8016a060b7..0000000000 --- a/m4/ac_valist.m4 +++ /dev/null @@ -1,39 +0,0 @@ -dnl Copyright (C) 2013 ProFUSION embedded systems -dnl This code is public domain and can be freely used or copied. - -dnl Macro for checking if va_list is an array - -dnl Usage: AC_C_VA_LIST_AS_ARRAY -dnl call AC_DEFINE for HAVE_VA_LIST_AS_ARRAY if for this architecture -dnl va_list is defined as an array - -AC_DEFUN([AC_C_VA_LIST_AS_ARRAY], -[ -AC_MSG_CHECKING([whether va_list is defined as an array]) -AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[ -#include -#include - -#define BUILD_ASSERT(cond) \ - do { (void) sizeof(char [1 - 2*!(cond)]); } while(0) - ]], - [[ -va_list ap; -BUILD_ASSERT(__builtin_types_compatible_p(typeof(ap), - typeof(&(ap)[0]))); -return 0; - ]])], - [have_va_list_as_array="no"], - [have_va_list_as_array="yes"]) - -AC_MSG_RESULT([${have_va_list_as_array}]) - -if test "x${have_va_list_as_array}" = "xyes" ; then - AC_DEFINE([HAVE_VA_LIST_AS_ARRAY], [1], [Define to 1 if va_list is an array]) -fi - -]) - -dnl End of ac_valist.m4 diff --git a/src/lib/edbus/edbus_message.c b/src/lib/edbus/edbus_message.c index 2b58ca678e..d6694e94ba 100644 --- a/src/lib/edbus/edbus_message.c +++ b/src/lib/edbus/edbus_message.c @@ -273,8 +273,8 @@ edbus_message_arguments_vget(const EDBus_Message *msg, const char *signature, va return _edbus_message_arguments_vget((EDBus_Message *)msg, signature, ap); } -EAPI Eina_Bool -edbus_message_iter_arguments_vappend(EDBus_Message_Iter *iter, const char *signature, va_list ap) +static Eina_Bool +_edbus_message_iter_arguments_vappend(EDBus_Message_Iter *iter, const char *signature, va_list *aq) { DBusSignatureIter signature_iter; Eina_Bool r = EINA_TRUE; @@ -288,14 +288,13 @@ edbus_message_iter_arguments_vappend(EDBus_Message_Iter *iter, const char *signa while ((type = dbus_signature_iter_get_signature(&signature_iter))) { if (type[0] != DBUS_TYPE_VARIANT && !type[1]) - r = append_basic(type[0], MAKE_PTR_FROM_VA_LIST(ap), - &iter->dbus_iterator); + r = append_basic(type[0], aq, &iter->dbus_iterator); else { EDBus_Message_Iter **user_itr; EDBus_Message_Iter *sub; - user_itr = va_arg(ap, EDBus_Message_Iter **); + user_itr = va_arg(*aq, EDBus_Message_Iter **); sub = _message_iterator_new(EINA_TRUE); if (!sub) { @@ -340,6 +339,20 @@ next: } return r; + +} + +EAPI Eina_Bool +edbus_message_iter_arguments_vappend(EDBus_Message_Iter *iter, const char *signature, va_list ap) +{ + va_list aq; + Eina_Bool ret; + + va_copy(aq, ap); + ret = _edbus_message_iter_arguments_vappend(iter, signature, &aq); + va_end(aq); + + return ret; } EAPI Eina_Bool @@ -422,7 +435,7 @@ append_basic(char type, va_list *vl, DBusMessageIter *iter) } static Eina_Bool -_edbus_message_arguments_vappend(EDBus_Message *msg, const char *signature, va_list ap) +_edbus_message_arguments_vappend(EDBus_Message *msg, const char *signature, va_list *aq) { DBusSignatureIter signature_iter; EDBus_Message_Iter *iter; @@ -440,8 +453,7 @@ _edbus_message_arguments_vappend(EDBus_Message *msg, const char *signature, va_l while ((type = dbus_signature_iter_get_current_type(&signature_iter))) { if (dbus_type_is_basic(type)) - r = append_basic(type, MAKE_PTR_FROM_VA_LIST(ap), - &iter->dbus_iterator); + r = append_basic(type, aq, &iter->dbus_iterator); else { ERR("sig = %s | edbus_message_arguments_append() and \ @@ -468,7 +480,7 @@ edbus_message_arguments_append(EDBus_Message *msg, const char *signature, ...) EINA_SAFETY_ON_NULL_RETURN_VAL(signature, EINA_FALSE); va_start(ap, signature); - ret = _edbus_message_arguments_vappend(msg, signature, ap); + ret = _edbus_message_arguments_vappend(msg, signature, &ap); va_end(ap); return ret; } @@ -476,9 +488,17 @@ edbus_message_arguments_append(EDBus_Message *msg, const char *signature, ...) EAPI Eina_Bool edbus_message_arguments_vappend(EDBus_Message *msg, const char *signature, va_list ap) { + va_list aq; + Eina_Bool ret; + EDBUS_MESSAGE_CHECK_RETVAL(msg, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(signature, EINA_FALSE); - return _edbus_message_arguments_vappend(msg, signature, ap); + + va_copy(aq, ap); + ret = _edbus_message_arguments_vappend(msg, signature, &aq); + va_end(aq); + + return ret; } EAPI EDBus_Message_Iter * @@ -701,21 +721,8 @@ edbus_message_iter_get_and_next(EDBus_Message_Iter *iter, char signature, ...) return EINA_TRUE; } -EAPI Eina_Bool -edbus_message_iter_arguments_get(EDBus_Message_Iter *iter, const char *signature, ...) -{ - va_list ap; - Eina_Bool ret; - - va_start(ap, signature); - ret = edbus_message_iter_arguments_vget(iter, signature, ap); - va_end(ap); - - return ret; -} - -EAPI Eina_Bool -edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signature, va_list ap) +static Eina_Bool +_edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signature, va_list *aq) { int iter_type; DBusSignatureIter sig_iter; @@ -739,10 +746,10 @@ edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signatur } if (dbus_type_is_basic(iter_type)) - get_basic(iter_type, &iter->dbus_iterator, MAKE_PTR_FROM_VA_LIST(ap)); + get_basic(iter_type, &iter->dbus_iterator, aq); else { - EDBus_Message_Iter **user_itr = va_arg(ap, EDBus_Message_Iter **); + EDBus_Message_Iter **user_itr = va_arg(*aq, EDBus_Message_Iter **); EDBus_Message_Iter *sub_itr; sub_itr = _message_iterator_new(EINA_FALSE); @@ -760,6 +767,33 @@ edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signatur } return dbus_signature_iter_get_current_type(&sig_iter) == DBUS_TYPE_INVALID; + +} + +EAPI Eina_Bool +edbus_message_iter_arguments_get(EDBus_Message_Iter *iter, const char *signature, ...) +{ + va_list ap; + Eina_Bool ret; + + va_start(ap, signature); + ret = _edbus_message_iter_arguments_vget(iter, signature, &ap); + va_end(ap); + + return ret; +} + +EAPI Eina_Bool +edbus_message_iter_arguments_vget(EDBus_Message_Iter *iter, const char *signature, va_list ap) +{ + va_list aq; + Eina_Bool ret; + + va_copy(aq, ap); + ret = _edbus_message_iter_arguments_vget(iter, signature, &aq); + va_end(aq); + + return ret; } EAPI void diff --git a/src/lib/edbus/edbus_private.h b/src/lib/edbus/edbus_private.h index 6b2f7785f1..1a69c9f813 100644 --- a/src/lib/edbus/edbus_private.h +++ b/src/lib/edbus/edbus_private.h @@ -82,10 +82,4 @@ EDBus_Signal_Handler *_edbus_signal_handler_add(EDBus_Connection *conn, const c EDBus_Message *edbus_message_signal_new(const char *path, const char *interface, const char *name) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -#ifdef HAVE_VA_LIST_AS_ARRAY -#define MAKE_PTR_FROM_VA_LIST(arg) ((va_list *)(arg)) -#else -#define MAKE_PTR_FROM_VA_LIST(arg) (&(arg)) -#endif - #endif