efl: stop depending on va_list type
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 2 Jan 2013 20:55:57 +0000 (20:55 +0000)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 2 Jan 2013 20:55:57 +0000 (20:55 +0000)
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
m4/ac_valist.m4 [deleted file]
src/lib/edbus/edbus_message.c
src/lib/edbus/edbus_private.h

index e3e1e12..27ba2b0 100644 (file)
@@ -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 (file)
index 8016a06..0000000
+++ /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 <stdlib.h>
-#include <stdarg.h>
-
-#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
index 2b58ca6..d6694e9 100644 (file)
@@ -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
index 6b2f778..1a69c9f 100644 (file)
@@ -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