diff options
author | Jeremy Koritzinsky <jkoritzinsky@gmail.com> | 2019-03-19 16:22:47 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-19 16:22:47 -0700 |
commit | 4bca72836811aa1b82389c50dc4f2bcae222bdc0 (patch) | |
tree | 6852f8c74ddd435a7ebc59867b00ca310a5c0c06 /src/dlls | |
parent | accc6eb0f0f669494bee0788884b5a10101f1243 (diff) | |
download | coreclr-4bca72836811aa1b82389c50dc4f2bcae222bdc0.tar.gz coreclr-4bca72836811aa1b82389c50dc4f2bcae222bdc0.tar.bz2 coreclr-4bca72836811aa1b82389c50dc4f2bcae222bdc0.zip |
Implement support for copy constructors when marshalling in IJW (#22805)
Fixes #22219.
I decided to try simplifying the code when bringing this feature over from .NET Framework. The .NETFX x86 implementation of this marshaler adds a lot of extra code-paths, and intercepts the calling stub to enable it to exactly replicate the behavior of what would be the native code by copy-constructing an object in-place where it goes on the stack for the native call.
Instead of adding all of that extra goo, I decided to keep the implementation much more similar to the non-x86 implementation from .NETFX. Instead of intercepting the call and adding bookkeeping helper stubs, the marshaler just copies to a local in the IL stub, just like non-x86. When calling the native function, it just loads the local onto the IL stack and calls the native function as a normal function. There is a difference there, but I cannot think of a way that the difference is observable to the user.
The non-x86 implementation is identical to the .NETFX implementation.
Diffstat (limited to 'src/dlls')
-rw-r--r-- | src/dlls/mscorrc/mscorrc.rc | 2 | ||||
-rw-r--r-- | src/dlls/mscorrc/resource.h | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/src/dlls/mscorrc/mscorrc.rc b/src/dlls/mscorrc/mscorrc.rc index 517c548bd7..8e272ad2af 100644 --- a/src/dlls/mscorrc/mscorrc.rc +++ b/src/dlls/mscorrc/mscorrc.rc @@ -557,6 +557,7 @@ BEGIN IDS_EE_BADMARSHAL_DECIMALARRAY "Invalid managed/unmanaged type combination (Decimal[] must be paired with an ArraySubType of Struct or Currency)." IDS_EE_BADMARSHAL_WINRT_MARSHAL_AS "Invalid managed/unmanaged type combination (Windows Runtime parameters and fields must not have a MarshalAs attribute set)." IDS_EE_BADMARSHAL_WINRT_MISSING_GUID "Invalid managed/unmanaged type combination (Windows Runtime interfaces, classes and delegates must have a Guid or a default interface)." + IDS_EE_BADMARSHAL_WINRT_COPYCTOR "Windows Runtime marshaler does not support types with copy constructor." IDS_EE_BADMARSHAL_WINRT_DELEGATE "Invalid managed/unmanaged type combination (Delegates must be Windows Runtime delegates)." IDS_EE_BADMARSHAL_DEFAULTIFACE_NOT_WINRT_IFACE "The default interface must refer to a Windows Runtime interface with a GUID." IDS_EE_BADMARSHAL_DEFAULTIFACE_NOT_SUBTYPE "The default interface must refer to an interface that is implemented by the type." @@ -611,6 +612,7 @@ BEGIN IDS_EE_BADMARSHAL_ASANYRESTRICTION "AsAny cannot be used on return types, ByRef parameters, ArrayWithOffset, or parameters passed from unmanaged to managed." IDS_EE_BADMARSHAL_VBBYVALSTRRESTRICTION "VBByRefStr can only be used in combination with in/out, ByRef managed-to-unmanaged strings." IDS_EE_BADMARSHAL_AWORESTRICTION "ArrayWithOffsets can only be marshaled as inout, non-ByRef, managed-to-unmanaged parameters." + IDS_EE_BADMARSHAL_COPYCTORRESTRICTION "Classes with copy-ctors can only be marshaled by value." IDS_EE_BADMARSHAL_ARGITERATORRESTRICTION "ArgIterators cannot be marshaled ByRef." IDS_EE_BADMARSHAL_HANDLEREFRESTRICTION "HandleRefs cannot be marshaled ByRef or from unmanaged to managed." IDS_EE_BADMARSHAL_SAFEHANDLENATIVETOCOM "SafeHandles cannot be marshaled from unmanaged to managed." diff --git a/src/dlls/mscorrc/resource.h b/src/dlls/mscorrc/resource.h index cec39bbb30..a7d94874f4 100644 --- a/src/dlls/mscorrc/resource.h +++ b/src/dlls/mscorrc/resource.h @@ -718,3 +718,5 @@ #define IDS_EE_NDIRECT_GETPROCADDR_WIN_DLL 0x2644 #define IDS_EE_NDIRECT_GETPROCADDR_UNIX_SO 0x2645 #define IDS_EE_BADMARSHAL_STRING_OUT 0x2646 +#define IDS_EE_BADMARSHAL_COPYCTORRESTRICTION 0x2647 +#define IDS_EE_BADMARSHAL_WINRT_COPYCTOR 0x2648 |