[coop handles] Add MONO_HANDLE_SET_FIELD_REF macro
authorAleksey Kliger <aleksey@xamarin.com>
Wed, 14 Jun 2017 21:14:29 +0000 (17:14 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Tue, 20 Jun 2017 15:29:43 +0000 (11:29 -0400)
Set a field in an object when you have a MonoClassField*

mono/metadata/handle.h

index e0bf25281c58746e008076e0717e0f077ba94cdc..5de55eebc824540879dedab9bb5e555c99fc3276 100644 (file)
@@ -423,6 +423,13 @@ This is why we evaluate index and value before any call to MONO_HANDLE_RAW or ot
                *(TYPE*)(mono_handle_unsafe_field_addr (__obj, __field)) = __value; \
        } while (0)
 
+#define MONO_HANDLE_SET_FIELD_REF(HANDLE,FIELD,VALH) do {              \
+               MonoObjectHandle __obj = MONO_HANDLE_CAST (MonoObject, (HANDLE)); \
+               MonoClassField *__field = (FIELD);                      \
+               MonoObjectHandle __value = MONO_HANDLE_CAST (MonoObject, (VALH)); \
+               mono_gc_wbarrier_generic_store (mono_handle_unsafe_field_addr (__obj, __field), MONO_HANDLE_RAW (__value)); \
+       } while (0)
+
 /* Baked typed handles we all want */
 TYPED_HANDLE_DECL (MonoString);
 TYPED_HANDLE_DECL (MonoArray);