[coop] Add more handle utility functions
authorAleksey Kliger <aleksey@xamarin.com>
Thu, 17 Nov 2016 20:19:19 +0000 (15:19 -0500)
committerAleksey Kliger <aleksey@xamarin.com>
Fri, 18 Nov 2016 15:08:36 +0000 (10:08 -0500)
- MONO_HANDLE_ARRAY_GETREF
- HANDLE_FUNCTION_RETURN_OBJ
- mono_array_handle_memcpy_refs

mono/metadata/handle.c
mono/metadata/handle.h

index 2465527e158e846009daa0ded3890858e2b6e908..f5c10f92bf8380290ad6ec9206eb852341fa24aa 100644 (file)
@@ -252,3 +252,9 @@ mono_array_handle_pin_with_size (MonoArrayHandle handle, int size, uintptr_t idx
        MonoArray *raw = MONO_HANDLE_RAW (handle);
        return mono_array_addr_with_size (raw, size, idx);
 }
+
+void
+mono_array_handle_memcpy_refs (MonoArrayHandle dest, uintptr_t dest_idx, MonoArrayHandle src, uintptr_t src_idx, uintptr_t len)
+{
+       mono_array_memcpy_refs (MONO_HANDLE_RAW (dest), dest_idx, MONO_HANDLE_RAW (src), src_idx, len);
+}
index 612dc4046ecd28cd3cfced0a570cbedac54d26cb..181cc0e8fee9ab4ee178b14d6cc0b30ce2c9689c 100644 (file)
@@ -130,6 +130,13 @@ Icall macros
        return (VAL);                           \
        } while (0)
 
+#define HANDLE_FUNCTION_RETURN_OBJ(HANDLE)                     \
+       do {                                                    \
+               void* __result = (MONO_HANDLE_RAW (HANDLE));    \
+               CLEAR_ICALL_FRAME;                              \
+               return __result;                                \
+       } while (0); } while (0);
+
 #ifdef MONO_NEEDS_STACK_WATERMARK
 
 static void
@@ -297,6 +304,10 @@ This is why we evaluate index and value before any call to MONO_HANDLE_RAW or ot
                (DEST) =  __result;                                     \
        } while (0)
 
+#define MONO_HANDLE_ARRAY_GETREF(DEST, HANDLE, IDX) do {               \
+               mono_handle_array_getref (MONO_HANDLE_CAST(MonoObject, (DEST)), (HANDLE), (IDX)); \
+       } while (0)
+
 #define MONO_HANDLE_ASSIGN(DESTH, SRCH)                                \
        mono_handle_assign (MONO_HANDLE_CAST (MonoObject, (DESTH)), MONO_HANDLE_CAST(MonoObject, (SRCH)))
 
@@ -317,7 +328,7 @@ Init values to it.
 extern const MonoObjectHandle mono_null_value_handle;
 
 static inline void
-mono_handle_assign (MonoObjectHandle dest, MonoObjectHandle src)
+mono_handle_assign (MonoObjectHandleOut dest, MonoObjectHandle src)
 {
        mono_gc_wbarrier_generic_store (&dest->__obj, MONO_HANDLE_RAW(src));
 }
@@ -328,6 +339,12 @@ MonoArrayHandle mono_array_new_handle (MonoDomain *domain, MonoClass *eclass, ui
 
 uintptr_t mono_array_handle_length (MonoArrayHandle arr);
 
+static inline void
+mono_handle_array_getref (MonoObjectHandleOut dest, MonoArrayHandle array, uintptr_t index)
+{
+       mono_gc_wbarrier_generic_store (&dest->__obj, mono_array_get (MONO_HANDLE_RAW (array),gpointer, index));
+}
+
 #define mono_handle_class(o) mono_object_class (MONO_HANDLE_RAW (o))
 
 /* Local handles to global GC handles and back */
@@ -338,7 +355,8 @@ mono_gchandle_from_handle (MonoObjectHandle handle, mono_bool pinned);
 MonoObjectHandle
 mono_gchandle_get_target_handle (uint32_t gchandle);
 
-
+void
+mono_array_handle_memcpy_refs (MonoArrayHandle dest, uintptr_t dest_idx, MonoArrayHandle src, uintptr_t src_idx, uintptr_t len);
 
 /* Pins the MonoArray using a gchandle and returns a pointer to the
  * element with the given index (where each element is of the given