-#define MONO_HANDLE_ARRAY_SETREF_NULL(handle,index) \
- do { \
- MONO_PREPARE_GC_CRITICAL_REGION; \
- mono_array_setref (mono_handle_obj ((handle)), (index), NULL); \
- MONO_FINISH_GC_CRITICAL_REGION; \
+/*
+WARNING WARNING WARNING
+
+The following functions require a particular evaluation ordering to ensure correctness.
+We must not have exposed handles while any sort of evaluation is happening as that very evaluation might trigger
+a safepoint and break us.
+
+This is why we evaluate index and value before any call to MONO_HANDLE_RAW or other functions that deal with naked objects.
+*/
+#define MONO_HANDLE_SETRAW(HANDLE, FIELD, VALUE) do { \
+ MonoObject *__val = (MonoObject*)(VALUE); \
+ MONO_OBJECT_SETREF (MONO_HANDLE_RAW (HANDLE), FIELD, __val); \
+ } while (0);
+
+#define MONO_HANDLE_SET(HANDLE, FIELD, VALUE) do { \
+ MonoObjectHandle __val = MONO_HANDLE_CAST (MonoObject, VALUE); \
+ MONO_OBJECT_SETREF (MONO_HANDLE_RAW (HANDLE), FIELD, MONO_HANDLE_RAW (__val)); \
+ } while (0);
+
+/* VS doesn't support typeof :( :( :( */
+#define MONO_HANDLE_SETVAL(HANDLE, FIELD, TYPE, VALUE) do { \
+ TYPE __val = (VALUE); \
+ MONO_HANDLE_RAW (HANDLE)->FIELD = __val; \
+ } while (0)
+
+#define MONO_HANDLE_ARRAY_SETREF(HANDLE, IDX, VALUE) do { \
+ int __idx = (IDX); \
+ MonoObjectHandle __val = MONO_HANDLE_CAST (MonoObject, VALUE); \
+ mono_array_setref_fast (MONO_HANDLE_RAW (HANDLE), __idx, MONO_HANDLE_RAW (__val)); \