After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 145015 - glib-genmarshal generates broken code on 64-bit architectures
glib-genmarshal generates broken code on 64-bit architectures
Status: RESOLVED FIXED
Product: glib
Classification: Platform
Component: general
2.4.x
Other Linux
: High normal
: ---
Assigned To: gtkdev
gtkdev
Depends on:
Blocks:
 
 
Reported: 2004-06-26 12:35 UTC by Tommi Komulainen
Modified: 2011-02-18 16:07 UTC
See Also:
GNOME target: ---
GNOME version: 2.5/2.6


Attachments
Change #defines to use longs as well (1.08 KB, patch)
2004-07-15 05:55 UTC, Tommi Komulainen
none Details | Review

Description Tommi Komulainen 2004-06-26 12:35:59 UTC
g_value_set_{enum,flags}() always assigns value to v_(u)long but if
G_ENABLE_DEBUG is not set, the value is read from v_(u)int instead.  This
apparently breaks on 64-bit architectures.  See bug 144370 for symptoms.

I'm not exactly sure if genums.c is equally broken (int vs. long) but somethings
clearly not right here.

#ifdef G_ENABLE_DEBUG
...
#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
...
#else
...
#define g_marshal_value_peek_enum(v)     (v)->data[0].v_int
#define g_marshal_value_peek_flags(v)    (v)->data[0].v_uint
...
#endif

and in gobject/genums.c:

gint
g_value_get_enum (const GValue *value)
{
  g_return_val_if_fail (G_VALUE_HOLDS_ENUM (value), 0);

  return value->data[0].v_long;
}

guint
g_value_get_flags (const GValue *value)
{
  g_return_val_if_fail (G_VALUE_HOLDS_FLAGS (value), 0);

  return value->data[0].v_ulong;
}
Comment 1 Tommi Komulainen 2004-07-15 05:55:35 UTC
Created attachment 29543 [details] [review]
Change #defines to use longs as well

This patch should make the #defines and functions more consistent with each
other.