Mono friendly TypedReference
authorMarek Safar <marek.safar@gmail.com>
Thu, 19 Mar 2015 20:56:52 +0000 (21:56 +0100)
committerMarek Safar <marek.safar@gmail.com>
Mon, 2 May 2016 22:08:03 +0000 (00:08 +0200)
mcs/class/referencesource/mscorlib/system/typedreference.cs

index a20f71a3877c65202a0bcfbdea831fd68f2ea7b7..a8c2ada7f3847a9e19dc0f80eba36cffe3eee27d 100644 (file)
@@ -20,6 +20,9 @@ namespace System {
 [System.Runtime.InteropServices.ComVisible(true)]
     public struct TypedReference
     {
+#if MONO
+        RuntimeTypeHandle type;
+#endif
         private IntPtr Value;
         private IntPtr Type;
 
@@ -61,6 +64,9 @@ namespace System {
                 targetType = fieldType;
             }
 
+#if MONO
+            return MakeTypedReferenceInternal (target, flds);
+#else
             TypedReference result = new TypedReference ();
 
             // reference to TypedReference is banned, so have to pass result as pointer
@@ -69,14 +75,18 @@ namespace System {
                 InternalMakeTypedReference(&result, target, fields, targetType);
             }
             return result;
+#endif
         }
 
         [System.Security.SecurityCritical]  // auto-generated
         [ResourceExposure(ResourceScope.None)]
         [MethodImplAttribute(MethodImplOptions.InternalCall)]
+#if MONO
+        extern static TypedReference MakeTypedReferenceInternal (object target, FieldInfo[] fields);
+#else
         // reference to TypedReference is banned, so have to pass result as pointer
         private unsafe static extern void InternalMakeTypedReference(void* result, Object target, IntPtr[] flds, RuntimeType lastFieldType);
-
+#endif
         public override int GetHashCode()
         {
             if (Type == IntPtr.Zero)