[coop] Fix MONO_HANDLE_PAYLOAD_OFFSET() for cross-compilation
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 10 Aug 2016 20:27:09 +0000 (16:27 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Wed, 10 Aug 2016 20:28:59 +0000 (16:28 -0400)
- fix MONO_HANDLE_PAYLOAD_OFFSET when MONO_STRUCT_OFFSET expands to
 token-pasting
- add MonoObjectPayloadHandle decl to object-offset.h machinery.

mono/metadata/handle.h
mono/metadata/metadata-cross-helpers.c
mono/metadata/object-offsets.h

index aa4c324372e7aa9c9f0a2e52e9f1394c8a7aff65..f5e8d29ba3088aa08a9acf3f2e4686ab5e9965db 100644 (file)
@@ -189,6 +189,11 @@ void mono_handle_verify (MonoRawHandle handle);
 #define TYPED_HANDLE_NAME(TYPE) TYPE ## Handle
 
 /*
+ * TYPED_HANDLE_DECL(SomeType):
+ *   Expands to a decl for handles to SomeType and to an internal payload struct.
+ *
+ * For example, TYPED_HANDLE_DECL(MonoObject) (see below) expands to:
+ *
  * typedef struct {
  *   MonoObject *__obj;
  * } MonoObjectHandlePayload;
@@ -196,7 +201,9 @@ void mono_handle_verify (MonoRawHandle handle);
  * typedef MonoObjectHandlePayload* MonoObjectHandle;
  */
 #define TYPED_HANDLE_DECL(TYPE) typedef struct { TYPE *__obj; } TYPED_HANDLE_PAYLOAD_NAME (TYPE) ; typedef TYPED_HANDLE_PAYLOAD_NAME (TYPE) * TYPED_HANDLE_NAME (TYPE)
-#define MONO_HANDLE_PAYLOAD_OFFSET(TYPE) MONO_STRUCT_OFFSET(TYPED_HANDLE_PAYLOAD_NAME (TYPE), __obj)
+/* Have to double expand because MONO_STRUCT_OFFSET is doing token pasting on cross-compilers. */
+#define MONO_HANDLE_PAYLOAD_OFFSET_(PayloadType) MONO_STRUCT_OFFSET(PayloadType, __obj)
+#define MONO_HANDLE_PAYLOAD_OFFSET(TYPE) MONO_HANDLE_PAYLOAD_OFFSET_(TYPED_HANDLE_PAYLOAD_NAME (TYPE))
 
 #define MONO_HANDLE_INIT ((void*) mono_null_value_handle)
 #define NULL_HANDLE mono_null_value_handle
index 90a4d332bd129c818bebd54cb74b4e90ddd481f6..561e9968838f4a69d24e7c6eb77e273118386a88 100644 (file)
@@ -6,6 +6,7 @@
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/object-internals.h>
 #include <mono/metadata/monitor.h>
+#include <mono/metadata/handle.h>
 #ifdef HAVE_SGEN_GC
 #include <mono/sgen/sgen-gc.h>
 #endif
index 34d9ffc1df1dcc9f41f066323529c6666403981b..67da8451d17030e15f33c538ce08eefe1afbbd6a 100644 (file)
@@ -56,6 +56,8 @@ DECL_SIZE(gpointer)
 DECL_OFFSET(MonoObject, vtable)
 DECL_OFFSET(MonoObject, synchronisation)
 
+DECL_OFFSET(MonoObjectHandlePayload, __obj)
+
 DECL_OFFSET(MonoClass, interface_bitmap)
 DECL_OFFSET(MonoClass, byval_arg)
 DECL_OFFSET(MonoClass, cast_class)