[libpeas] Inline read_next_argument() into peas_method_apply_valist()
- From: Steve Frécinaux <sfre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libpeas] Inline read_next_argument() into peas_method_apply_valist()
- Date: Thu, 29 Jul 2010 09:18:35 +0000 (UTC)
commit 2c1d17b0262303340eae3613fe5114a74f9b45b5
Author: Steve Frécinaux <code istique net>
Date: Thu Jul 29 11:17:03 2010 +0200
Inline read_next_argument() into peas_method_apply_valist()
The reason is that va_list* passing is not supported and doesn't work
on some platforms (most notably x86-64). So we basically need to do all
the va_arg() calls from the same function.
libpeas/peas-introspection.c | 137 ++++++++++++++++++++---------------------
1 files changed, 67 insertions(+), 70 deletions(-)
---
diff --git a/libpeas/peas-introspection.c b/libpeas/peas-introspection.c
index ec1ee0f..ea26dad 100644
--- a/libpeas/peas-introspection.c
+++ b/libpeas/peas-introspection.c
@@ -26,74 +26,6 @@
#include "peas-introspection.h"
static gboolean
-read_next_argument (GArgument *cur_arg,
- va_list args,
- GITypeInfo *arg_type_info)
-{
- /* Notes: According to GCC 4.4,
- * - int8, uint8, int16, uint16, short and ushort are promoted to int when passed through '...'
- * - float is promoted to double when passed through '...'
- */
- switch (g_type_info_get_tag (arg_type_info))
- {
- case GI_TYPE_TAG_VOID:
- case GI_TYPE_TAG_BOOLEAN:
- cur_arg->v_boolean = va_arg (args, gboolean);
- break;
- case GI_TYPE_TAG_INT8:
- cur_arg->v_int8 = va_arg (args, gint);
- break;
- case GI_TYPE_TAG_UINT8:
- cur_arg->v_uint8 = va_arg (args, gint);
- break;
- case GI_TYPE_TAG_INT16:
- cur_arg->v_int16 = va_arg (args, gint);
- break;
- case GI_TYPE_TAG_UINT16:
- cur_arg->v_uint16 = va_arg (args, gint);
- break;
- case GI_TYPE_TAG_INT32:
- cur_arg->v_int32 = va_arg (args, gint32);
- break;
- case GI_TYPE_TAG_UINT32:
- cur_arg->v_uint32 = va_arg (args, guint32);
- break;
- case GI_TYPE_TAG_INT64:
- cur_arg->v_int64 = va_arg (args, gint64);
- break;
- case GI_TYPE_TAG_UINT64:
- cur_arg->v_uint64 = va_arg (args, guint64);
- break;
- case GI_TYPE_TAG_FLOAT:
- cur_arg->v_float = va_arg (args, gdouble);
- break;
- case GI_TYPE_TAG_DOUBLE:
- cur_arg->v_double = va_arg (args, gdouble);
- break;
- case GI_TYPE_TAG_GTYPE:
- /* apparently, GType is meant to be a gsize, from gobject/gtype.h in glib */
- cur_arg->v_size = va_arg (args, GType);
- break;
- case GI_TYPE_TAG_UTF8:
- case GI_TYPE_TAG_FILENAME:
- cur_arg->v_string = va_arg (args, gchar *);
- break;
- case GI_TYPE_TAG_ARRAY:
- case GI_TYPE_TAG_INTERFACE:
- case GI_TYPE_TAG_GLIST:
- case GI_TYPE_TAG_GSLIST:
- case GI_TYPE_TAG_GHASH:
- case GI_TYPE_TAG_ERROR:
- cur_arg->v_pointer = va_arg (args, gpointer);
- break;
- default:
- g_return_val_if_reached (FALSE);
- }
-
- return TRUE;
-}
-
-static gboolean
set_return_value (gpointer in_retval,
GArgument *out_retval,
GITypeInfo *retval_type_info)
@@ -233,6 +165,7 @@ peas_method_apply_valist (GObject *instance,
/* Set the object as the first argument for the method. */
in_args[n_in_args++].v_pointer = instance;
+ ret = TRUE;
for (i = 0; ret && i < n_args; i++)
{
GIArgInfo *arg_info;
@@ -244,8 +177,72 @@ peas_method_apply_valist (GObject *instance,
switch (g_arg_info_get_direction (arg_info))
{
case GI_DIRECTION_IN:
- ret = read_next_argument (&in_args[n_in_args++], args, arg_type_info);
- break;
+ {
+ GArgument *cur_arg = &in_args[n_in_args++];
+
+ /* Notes: According to GCC 4.4,
+ * - int8, uint8, int16, uint16, short and ushort are promoted to int when passed through '...'
+ * - float is promoted to double when passed through '...'
+ */
+ switch (g_type_info_get_tag (arg_type_info))
+ {
+ case GI_TYPE_TAG_VOID:
+ case GI_TYPE_TAG_BOOLEAN:
+ cur_arg->v_boolean = va_arg (args, gboolean);
+ break;
+ case GI_TYPE_TAG_INT8:
+ cur_arg->v_int8 = va_arg (args, gint);
+ break;
+ case GI_TYPE_TAG_UINT8:
+ cur_arg->v_uint8 = va_arg (args, gint);
+ break;
+ case GI_TYPE_TAG_INT16:
+ cur_arg->v_int16 = va_arg (args, gint);
+ break;
+ case GI_TYPE_TAG_UINT16:
+ cur_arg->v_uint16 = va_arg (args, gint);
+ break;
+ case GI_TYPE_TAG_INT32:
+ cur_arg->v_int32 = va_arg (args, gint32);
+ break;
+ case GI_TYPE_TAG_UINT32:
+ cur_arg->v_uint32 = va_arg (args, guint32);
+ break;
+ case GI_TYPE_TAG_INT64:
+ cur_arg->v_int64 = va_arg (args, gint64);
+ break;
+ case GI_TYPE_TAG_UINT64:
+ cur_arg->v_uint64 = va_arg (args, guint64);
+ break;
+ case GI_TYPE_TAG_FLOAT:
+ cur_arg->v_float = va_arg (args, gdouble);
+ break;
+ case GI_TYPE_TAG_DOUBLE:
+ cur_arg->v_double = va_arg (args, gdouble);
+ break;
+ case GI_TYPE_TAG_GTYPE:
+ /* apparently, GType is meant to be a gsize, from gobject/gtype.h in glib */
+ cur_arg->v_size = va_arg (args, GType);
+ break;
+ case GI_TYPE_TAG_UTF8:
+ case GI_TYPE_TAG_FILENAME:
+ cur_arg->v_string = va_arg (args, gchar *);
+ break;
+ case GI_TYPE_TAG_ARRAY:
+ case GI_TYPE_TAG_INTERFACE:
+ case GI_TYPE_TAG_GLIST:
+ case GI_TYPE_TAG_GSLIST:
+ case GI_TYPE_TAG_GHASH:
+ case GI_TYPE_TAG_ERROR:
+ cur_arg->v_pointer = va_arg (args, gpointer);
+ break;
+ default:
+ g_warn_if_reached ();
+ ret = FALSE;
+ break;
+ }
+ break;
+ }
/* In the other cases, we expect we will always have a pointer. */
case GI_DIRECTION_INOUT:
in_args[n_in_args++].v_pointer = out_args[n_out_args++].v_pointer = va_arg (args, gpointer);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]