summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKedar Sovani <kedars@marvell.com>2009-10-21 13:28:12 +0200
committerColin Walters <walters@verbum.org>2010-02-11 17:31:01 -0500
commit0fb726196aeed6c4f29aa0dc4d2d6031fae3c985 (patch)
tree591c3f5c77ea8dca10d8e809b3b0d297eb92e3a7
parenta9e6ae83ffa54194adc01e84c85ac336c59fd520 (diff)
downloadgobject-introspection-0fb726196aeed6c4f29aa0dc4d2d6031fae3c985.tar.gz
Fix Alignment Errors.
Signed-off-by: Kedar Sovani <kedars@marvell.com> https://bugzilla.gnome.org/show_bug.cgi?id=606139
-rw-r--r--girepository/girnode.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/girepository/girnode.c b/girepository/girnode.c
index 2523ee1f..ede6d3b7 100644
--- a/girepository/girnode.c
+++ b/girepository/girnode.c
@@ -53,6 +53,13 @@ _g_irnode_dump_stats (void)
g_message ("%lu types (%lu before sharing)", unique_types_count, types_count);
}
+#define DO_ALIGNED_COPY(dest_addr, value, type) \
+do { \
+ type tmp_var; \
+ tmp_var = value; \
+ memcpy(dest_addr, &tmp_var, sizeof(type)); \
+} while(0)
+
#define ALIGN_VALUE(this, boundary) \
(( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1)))
@@ -2271,11 +2278,11 @@ g_ir_node_build_typelib (GIrNode *node,
break;
case GI_TYPE_TAG_INT64:
blob->size = 8;
- *(gint64*)&data[blob->offset] = (gint64) parse_int_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_int_value (constant->value), gint64);
break;
case GI_TYPE_TAG_UINT64:
blob->size = 8;
- *(guint64*)&data[blob->offset] = (guint64) parse_uint_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_uint_value (constant->value), guint64);
break;
case GI_TYPE_TAG_SHORT:
blob->size = sizeof (gshort);
@@ -2296,21 +2303,21 @@ g_ir_node_build_typelib (GIrNode *node,
case GI_TYPE_TAG_SSIZE: /* FIXME */
case GI_TYPE_TAG_LONG:
blob->size = sizeof (glong);
- *(glong*)&data[blob->offset] = (glong) parse_int_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_int_value (constant->value), glong);
break;
case GI_TYPE_TAG_SIZE: /* FIXME */
case GI_TYPE_TAG_TIME_T:
case GI_TYPE_TAG_ULONG:
blob->size = sizeof (gulong);
- *(gulong*)&data[blob->offset] = (gulong) parse_uint_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_uint_value (constant->value), gulong);
break;
case GI_TYPE_TAG_FLOAT:
blob->size = sizeof (gfloat);
- *(gfloat*)&data[blob->offset] = (gfloat) parse_float_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_float_value (constant->value), gfloat);
break;
case GI_TYPE_TAG_DOUBLE:
blob->size = sizeof (gdouble);
- *(gdouble*)&data[blob->offset] = (gdouble) parse_float_value (constant->value);
+ DO_ALIGNED_COPY(&data[blob->offset], parse_float_value (constant->value), gdouble);
break;
case GI_TYPE_TAG_UTF8:
case GI_TYPE_TAG_FILENAME: