[runtime] Change the semantics of mono_error_set_type_load_name to acquire alloc...
[mono.git] / mono / metadata / mono-endian.h
index 08075b406ce881bb0ddf414e09b5a1b6552ceba8..343b97194a2144e4bb4104c6cc07f03014af20ab 100644 (file)
@@ -3,8 +3,6 @@
 
 #include <glib.h>
 
-/* FIXME: implement support for misaligned reads */
-
 typedef union {
        guint32 ival;
        float fval;
@@ -13,11 +11,26 @@ typedef union {
 typedef union {
        guint64 ival;
        double fval;
+       unsigned char cval [8];
 } mono_rdouble;
 
-#define read16(x) GUINT16_FROM_LE (*((guint16 *) (x)))
-#define read32(x) GUINT32_FROM_LE (*((guint32 *) (x)))
-#define read64(x) GUINT64_FROM_LE (*((guint64 *) (x)))
+#if NO_UNALIGNED_ACCESS
+
+guint16 mono_read16 (const unsigned char *x);
+guint32 mono_read32 (const unsigned char *x);
+guint64 mono_read64 (const unsigned char *x);
+
+#define read16(x) (mono_read16 ((const unsigned char *)(x)))
+#define read32(x) (mono_read32 ((const unsigned char *)(x)))
+#define read64(x) (mono_read64 ((const unsigned char *)(x)))
+
+#else
+
+#define read16(x) GUINT16_FROM_LE (*((const guint16 *) (x)))
+#define read32(x) GUINT32_FROM_LE (*((const guint32 *) (x)))
+#define read64(x) GUINT64_FROM_LE (*((const guint64 *) (x)))
+
+#endif
 
 #define readr4(x,dest) \
        do {    \