Use new atomis with allocated_heap.
[mono.git] / mono / metadata / cominterop.c
index c43283055f0d0a6bcdd63a2fd25dd653e0e64781..f6adfcd1ce07c3ca3923a3a0db0de8237d5a4fa4 100644 (file)
@@ -392,7 +392,7 @@ cominterop_com_visible (MonoClass* klass)
        MonoError error;
        MonoCustomAttrInfo *cinfo;
        GPtrArray *ifaces;
-       MonoBoolean visible = 0;
+       MonoBoolean visible = 1;
 
        /* Handle the ComVisibleAttribute */
        if (!ComVisibleAttribute)
@@ -831,7 +831,7 @@ cominterop_get_native_wrapper_adjusted (MonoMethod *method)
                }
        }
 
-       mono_marshal_emit_native_wrapper (method->klass->image, mb_native, sig_native, piinfo, mspecs, piinfo->addr, FALSE, TRUE);
+       mono_marshal_emit_native_wrapper (method->klass->image, mb_native, sig_native, piinfo, mspecs, piinfo->addr, FALSE, TRUE, FALSE);
 
        res = mono_mb_create_method (mb_native, sig_native, sig_native->param_count + 16);      
 
@@ -1739,30 +1739,6 @@ ves_icall_Mono_Interop_ComInteropProxy_FindProxy (gpointer pUnk)
 #endif
 }
 
-MonoString *
-ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR (gpointer ptr)
-{
-       MONO_ARCH_SAVE_REGS;
-
-       return mono_string_from_bstr(ptr);
-}
-
-gpointer
-ves_icall_System_Runtime_InteropServices_Marshal_StringToBSTR (MonoString* ptr)
-{
-       MONO_ARCH_SAVE_REGS;
-
-       return mono_string_to_bstr(ptr);
-}
-
-void
-ves_icall_System_Runtime_InteropServices_Marshal_FreeBSTR (gpointer ptr)
-{
-       MONO_ARCH_SAVE_REGS;
-
-       mono_free_bstr (ptr);
-}
-
 /**
  * cominterop_get_ccw_object:
  * @ccw_entry: a pointer to the CCWEntry
@@ -3187,21 +3163,94 @@ mono_marshal_free_ccw (MonoObject* object)
 gpointer
 mono_string_to_bstr (MonoString *string_obj)
 {
-       g_assert_not_reached ();
-       return NULL;
+       if (!string_obj)
+               return NULL;
+#ifdef HOST_WIN32
+       return SysAllocStringLen (mono_string_chars (string_obj), mono_string_length (string_obj));
+#else
+       {
+               int slen = mono_string_length (string_obj);
+               /* allocate len + 1 utf16 characters plus 4 byte integer for length*/
+               char *ret = g_malloc ((slen + 1) * sizeof(gunichar2) + sizeof(guint32));
+               if (ret == NULL)
+                       return NULL;
+               memcpy (ret + sizeof(guint32), mono_string_chars (string_obj), slen * sizeof(gunichar2));
+               * ((guint32 *) ret) = slen * sizeof(gunichar2);
+               ret [4 + slen * sizeof(gunichar2)] = 0;
+               ret [5 + slen * sizeof(gunichar2)] = 0;
+
+               return ret + 4;
+       }
+#endif
 }
 
 MonoString *
 mono_string_from_bstr (gpointer bstr)
 {
-       g_assert_not_reached ();
-       return NULL;
+       if (!bstr)
+               return NULL;
+#ifdef HOST_WIN32
+       return mono_string_new_utf16 (mono_domain_get (), bstr, SysStringLen (bstr));
+#else
+       return mono_string_new_utf16 (mono_domain_get (), bstr, *((guint32 *)bstr - 1) / sizeof(gunichar2));
+#endif
 }
 
 void
 mono_free_bstr (gpointer bstr)
+{
+       if (!bstr)
+               return;
+#ifdef HOST_WIN32
+       SysFreeString ((BSTR)bstr);
+#else
+       g_free (((char *)bstr) - 4);
+#endif
+}
+
+int
+ves_icall_System_Runtime_InteropServices_Marshal_AddRefInternal (gpointer pUnk)
+{
+       g_assert_not_reached ();
+       return 0;
+}
+
+int
+ves_icall_System_Runtime_InteropServices_Marshal_ReleaseInternal (gpointer pUnk)
+{
+       g_assert_not_reached ();
+       return 0;
+}
+
+int
+ves_icall_System_Runtime_InteropServices_Marshal_QueryInterfaceInternal (gpointer pUnk, gpointer riid, gpointer* ppv)
 {
        g_assert_not_reached ();
+       return 0;
 }
 
 #endif /* DISABLE_COM */
+
+MonoString *
+ves_icall_System_Runtime_InteropServices_Marshal_PtrToStringBSTR (gpointer ptr)
+{
+       MONO_ARCH_SAVE_REGS;
+
+       return mono_string_from_bstr(ptr);
+}
+
+gpointer
+ves_icall_System_Runtime_InteropServices_Marshal_StringToBSTR (MonoString* ptr)
+{
+       MONO_ARCH_SAVE_REGS;
+
+       return mono_string_to_bstr(ptr);
+}
+
+void
+ves_icall_System_Runtime_InteropServices_Marshal_FreeBSTR (gpointer ptr)
+{
+       MONO_ARCH_SAVE_REGS;
+
+       mono_free_bstr (ptr);
+}