forked from enlightenment/efl
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
This commit is contained in:
parent
81cf390f17
commit
f1f81ca7c9
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue