GNOME Bugzilla – Bug 145015
glib-genmarshal generates broken code on 64-bit architectures
Last modified: 2011-02-18 16:07:52 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; }
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.