From fc0e7b4c90ceaea2b0838d07b8cd0231b64b59f0 Mon Sep 17 00:00:00 2001 From: Luqun Lou Date: Fri, 28 Sep 2018 10:15:12 -0700 Subject: [PATCH] Enable BSTR Marshaling Support for x-plat PInvoke (dotnet/coreclr#19766) Commit migrated from https://github.com/dotnet/coreclr/commit/f90b65858d7ca0604e7aa1a1d04e9e5261e7f7af --- .../System.Private.CoreLib/src/Microsoft/Win32/Win32Native.cs | 5 +---- .../src/System.Private.CoreLib/src/System/String.CoreCLR.cs | 2 -- src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs | 5 ----- src/coreclr/src/classlibnative/bcltype/stringnative.cpp | 4 ---- src/coreclr/src/classlibnative/bcltype/stringnative.h | 2 -- src/coreclr/src/dlls/mscoree/mscorwks_unixexports.src | 2 ++ src/coreclr/src/vm/ecalllist.h | 2 -- src/coreclr/src/vm/ilmarshalers.cpp | 3 ++- src/coreclr/src/vm/ilmarshalers.h | 3 +-- src/coreclr/src/vm/mlinfo.cpp | 9 ++------- src/coreclr/src/vm/mscorlib.h | 2 +- src/coreclr/src/vm/mtypes.h | 2 +- 12 files changed, 10 insertions(+), 31 deletions(-) diff --git a/src/coreclr/src/System.Private.CoreLib/src/Microsoft/Win32/Win32Native.cs b/src/coreclr/src/System.Private.CoreLib/src/Microsoft/Win32/Win32Native.cs index 393d563..0e18b6d 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/Microsoft/Win32/Win32Native.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/Microsoft/Win32/Win32Native.cs @@ -203,14 +203,11 @@ namespace Microsoft.Win32 [DllImport(Interop.Libraries.OleAut32)] internal static extern void SysFreeString(IntPtr bstr); -#if FEATURE_COMINTEROP [DllImport(Interop.Libraries.OleAut32)] internal static extern IntPtr SysAllocStringByteLen(byte[] str, uint len); // BSTR [DllImport(Interop.Libraries.OleAut32)] - internal static extern uint SysStringByteLen(IntPtr bstr); - -#endif + internal static extern uint SysStringByteLen(IntPtr bstr); // BSTR [DllImport(Interop.Libraries.Kernel32, SetLastError = true)] internal static extern unsafe int WriteFile(SafeFileHandle handle, byte* bytes, int numBytesToWrite, out int numBytesWritten, IntPtr mustBeZero); diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs index 40a37c1..318aa75 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs @@ -64,14 +64,12 @@ namespace System [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern bool IsAscii(); -#if FEATURE_COMINTEROP // Set extra byte for odd-sized strings that came from interop as BSTR. [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern void SetTrailByte(byte data); // Try to retrieve the extra byte - returns false if not present. [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern bool TryGetTrailByte(out byte data); -#endif public static string Intern(string str) { diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs index b8e34e0..ef2a952 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs @@ -208,8 +208,6 @@ namespace System.StubHelpers } } -#if FEATURE_COMINTEROP - internal static class BSTRMarshaler { internal static unsafe IntPtr ConvertToNative(string strManaged, IntPtr pNativeBuffer) @@ -334,9 +332,6 @@ namespace System.StubHelpers } } // class BSTRMarshaler -#endif // FEATURE_COMINTEROP - - internal static class VBByValStrMarshaler { internal static unsafe IntPtr ConvertToNative(string strManaged, bool fBestFit, bool fThrowOnUnmappableChar, ref int cch) diff --git a/src/coreclr/src/classlibnative/bcltype/stringnative.cpp b/src/coreclr/src/classlibnative/bcltype/stringnative.cpp index 1a05ffb..f93c813 100644 --- a/src/coreclr/src/classlibnative/bcltype/stringnative.cpp +++ b/src/coreclr/src/classlibnative/bcltype/stringnative.cpp @@ -149,8 +149,6 @@ FCIMPL1(INT32, COMString::Length, StringObject* str) { FCIMPLEND -#ifdef FEATURE_COMINTEROP - FCIMPL2(FC_BOOL_RET, COMString::FCTryGetTrailByte, StringObject* thisRefUNSAFE, UINT8 *pbData) { FCALL_CONTRACT; @@ -173,8 +171,6 @@ FCIMPL2(VOID, COMString::FCSetTrailByte, StringObject* thisRefUNSAFE, UINT8 bDat } FCIMPLEND -#endif // FEATURE_COMINTEROP - // Revert to command line compilation flags #if defined(_MSC_VER) && defined(_TARGET_X86_) #pragma optimize ("", on) diff --git a/src/coreclr/src/classlibnative/bcltype/stringnative.h b/src/coreclr/src/classlibnative/bcltype/stringnative.h index 1f3970b..8639743 100644 --- a/src/coreclr/src/classlibnative/bcltype/stringnative.h +++ b/src/coreclr/src/classlibnative/bcltype/stringnative.h @@ -57,10 +57,8 @@ public: // // Interop // -#ifdef FEATURE_COMINTEROP static FCDECL2(FC_BOOL_RET, FCTryGetTrailByte, StringObject* thisRefUNSAFE, UINT8 *pbData); static FCDECL2(VOID, FCSetTrailByte, StringObject* thisRefUNSAFE, UINT8 bData); -#endif // FEATURE_COMINTEROP }; // Revert to command line compilation flags diff --git a/src/coreclr/src/dlls/mscoree/mscorwks_unixexports.src b/src/coreclr/src/dlls/mscoree/mscorwks_unixexports.src index a3b00d0..3743d58 100644 --- a/src/coreclr/src/dlls/mscoree/mscorwks_unixexports.src +++ b/src/coreclr/src/dlls/mscoree/mscorwks_unixexports.src @@ -61,8 +61,10 @@ ReleaseSemaphore ResetEvent SetEnvironmentVariableW SetEvent +SysAllocStringByteLen SysAllocStringLen SysFreeString +SysStringByteLen SysStringLen VirtualAlloc VirtualFree diff --git a/src/coreclr/src/vm/ecalllist.h b/src/coreclr/src/vm/ecalllist.h index cd9638a..ac5794e 100644 --- a/src/coreclr/src/vm/ecalllist.h +++ b/src/coreclr/src/vm/ecalllist.h @@ -110,10 +110,8 @@ FCFuncStart(gStringFuncs) FCIntrinsic("get_Length", COMString::Length, CORINFO_INTRINSIC_StringLength) FCIntrinsic("get_Chars", COMString::GetCharAt, CORINFO_INTRINSIC_StringGetChar) FCFuncElement("IsAscii", COMString::IsAscii) -#ifdef FEATURE_COMINTEROP FCFuncElement("SetTrailByte", COMString::FCSetTrailByte) FCFuncElement("TryGetTrailByte", COMString::FCTryGetTrailByte) -#endif // FEATURE_COMINTEROP FCFuncEnd() FCFuncStart(gValueTypeFuncs) diff --git a/src/coreclr/src/vm/ilmarshalers.cpp b/src/coreclr/src/vm/ilmarshalers.cpp index 11b3e0b..feb2030 100644 --- a/src/coreclr/src/vm/ilmarshalers.cpp +++ b/src/coreclr/src/vm/ilmarshalers.cpp @@ -1801,6 +1801,7 @@ void ILVBByValStrMarshaler::EmitClearNative(ILCodeStream* pslILEmit) // static void ClearNative(IntPtr pNative); pslILEmit->EmitCALL(METHOD__VBBYVALSTRMARSHALER__CLEAR_NATIVE, 1, 0); } +#endif // FEATURE_COMINTEROP LocalDesc ILBSTRMarshaler::GetManagedType() { @@ -1887,7 +1888,7 @@ void ILBSTRMarshaler::EmitConvertContentsNativeToCLR(ILCodeStream* pslILEmit) EmitStoreManagedValue(pslILEmit); } - +#ifdef FEATURE_COMINTEROP LocalDesc ILAnsiBSTRMarshaler::GetNativeType() { LIMITED_METHOD_CONTRACT; diff --git a/src/coreclr/src/vm/ilmarshalers.h b/src/coreclr/src/vm/ilmarshalers.h index 5ac5e41..0767fb8 100644 --- a/src/coreclr/src/vm/ilmarshalers.h +++ b/src/coreclr/src/vm/ilmarshalers.h @@ -2619,7 +2619,6 @@ protected: virtual void EmitConvertContentsNativeToCLR(ILCodeStream* pslILEmit); }; -#ifdef FEATURE_COMINTEROP class ILBSTRMarshaler : public ILOptimizedAllocMarshaler { public: @@ -2648,7 +2647,7 @@ protected: virtual void EmitConvertContentsNativeToCLR(ILCodeStream* pslILEmit); }; - +#ifdef FEATURE_COMINTEROP class ILAnsiBSTRMarshaler : public ILMarshaler { public: diff --git a/src/coreclr/src/vm/mlinfo.cpp b/src/coreclr/src/vm/mlinfo.cpp index ad7093f..f7fc265 100644 --- a/src/coreclr/src/vm/mlinfo.cpp +++ b/src/coreclr/src/vm/mlinfo.cpp @@ -2125,7 +2125,6 @@ MarshalInfo::MarshalInfo(Module* pModule, break; } -#ifdef FEATURE_COMINTEROP case NATIVE_TYPE_BSTR: if (builder) { @@ -2134,7 +2133,7 @@ MarshalInfo::MarshalInfo(Module* pModule, } m_type = MARSHAL_TYPE_BSTR; break; - +#ifdef FEATURE_COMINTEROP case NATIVE_TYPE_ANSIBSTR: if (builder) { @@ -3911,8 +3910,8 @@ VOID MarshalInfo::DumpMarshalInfo(Module* pModule, SigPointer sig, const SigType XXXXX(NATIVE_TYPE_IUNKNOWN) -#ifdef FEATURE_COMINTEROP XXXXX(NATIVE_TYPE_BSTR) +#ifdef FEATURE_COMINTEROP XXXXX(NATIVE_TYPE_TBSTR) XXXXX(NATIVE_TYPE_ANSIBSTR) XXXXX(NATIVE_TYPE_HSTRING) @@ -4359,11 +4358,9 @@ VOID MarshalInfo::MarshalTypeToString(SString& strMarshalType, BOOL fSizeIsSpeci case MARSHAL_TYPE_DATE: strRetVal = W("DATE"); break; -#ifdef FEATURE_COMINTEROP case MARSHAL_TYPE_BSTR: strRetVal = W("BSTR"); break; -#endif // FEATURE_COMINTEROP case MARSHAL_TYPE_LPWSTR: strRetVal = W("LPWSTR"); break; @@ -5014,11 +5011,9 @@ void ArrayMarshalInfo::InitElementInfo(CorNativeType arrayNativeType, MarshalInf m_vtElement = static_cast(isAnsi ? VT_LPSTR : VT_LPWSTR); } break; -#ifdef FEATURE_COMINTEROP case NATIVE_TYPE_BSTR: m_vtElement = VT_BSTR; break; -#endif // FEATURE_COMINTEROP case NATIVE_TYPE_LPSTR: m_vtElement = VT_LPSTR; break; diff --git a/src/coreclr/src/vm/mscorlib.h b/src/coreclr/src/vm/mscorlib.h index 0115683..2813fc6 100644 --- a/src/coreclr/src/vm/mscorlib.h +++ b/src/coreclr/src/vm/mscorlib.h @@ -1091,12 +1091,12 @@ DEFINE_METHOD(WSTRBUFFERMARSHALER, CONVERT_TO_NATIVE, ConvertToNative, DEFINE_METHOD(WSTRBUFFERMARSHALER, CONVERT_TO_MANAGED, ConvertToManaged, SM_IntPtr_RetStr) DEFINE_METHOD(WSTRBUFFERMARSHALER, CLEAR_NATIVE, ClearNative, SM_IntPtr_RetVoid) -#ifdef FEATURE_COMINTEROP DEFINE_CLASS(BSTRMARSHALER, StubHelpers, BSTRMarshaler) DEFINE_METHOD(BSTRMARSHALER, CONVERT_TO_NATIVE, ConvertToNative, SM_Str_IntPtr_RetIntPtr) DEFINE_METHOD(BSTRMARSHALER, CONVERT_TO_MANAGED, ConvertToManaged, SM_IntPtr_RetStr) DEFINE_METHOD(BSTRMARSHALER, CLEAR_NATIVE, ClearNative, SM_IntPtr_RetVoid) +#ifdef FEATURE_COMINTEROP DEFINE_CLASS(ANSIBSTRMARSHALER, StubHelpers, AnsiBSTRMarshaler) DEFINE_METHOD(ANSIBSTRMARSHALER, CONVERT_TO_NATIVE, ConvertToNative, SM_Int_Str_RetIntPtr) DEFINE_METHOD(ANSIBSTRMARSHALER, CONVERT_TO_MANAGED, ConvertToManaged, SM_IntPtr_RetStr) diff --git a/src/coreclr/src/vm/mtypes.h b/src/coreclr/src/vm/mtypes.h index 1a14760..f31ba1f 100644 --- a/src/coreclr/src/vm/mtypes.h +++ b/src/coreclr/src/vm/mtypes.h @@ -42,8 +42,8 @@ DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_DATE, DateMarshaler, DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_LPWSTR, WSTRMarshaler, false) DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_LPSTR, CSTRMarshaler, false) DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_LPUTF8STR, CUTF8Marshaler, false) -#ifdef FEATURE_COMINTEROP DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_BSTR, BSTRMarshaler, false) +#ifdef FEATURE_COMINTEROP DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_ANSIBSTR, AnsiBSTRMarshaler, false) DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_HSTRING, HSTRINGMarshaler, true) DEFINE_MARSHALER_TYPE(MARSHAL_TYPE_DATETIME, DateTimeMarshaler, true) -- 2.7.4