diff options
author | Ahson Khan <ahkha@microsoft.com> | 2017-12-14 14:34:42 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-14 14:34:42 -0800 |
commit | 0af608123cfe6cedf4e38d14792f620ba5de4faf (patch) | |
tree | 68b4a8e267817fcd630f03f3f3fc6c28d0fb5705 /src | |
parent | 5d91c4d2cc8fe60bad20cdfdf2e5f239bc024061 (diff) | |
download | coreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.tar.gz coreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.tar.bz2 coreclr-0af608123cfe6cedf4e38d14792f620ba5de4faf.zip |
Adding Unsafe API Add nuint that is used by SpanHelpers (#15527)
* Adding Unsafe API Add nuint that is used by SpanHelpers
* Change elementOffset to IntPtr in method signature.
Diffstat (limited to 'src')
-rw-r--r-- | src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs | 16 | ||||
-rw-r--r-- | src/vm/jitinterface.cpp | 23 | ||||
-rw-r--r-- | src/vm/metasig.h | 1 | ||||
-rw-r--r-- | src/vm/mscorlib.h | 1 |
4 files changed, 41 insertions, 0 deletions
diff --git a/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs b/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs index 8e6c5da47b..1aae1627e5 100644 --- a/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs +++ b/src/mscorlib/shared/Internal/Runtime/CompilerServices/Unsafe.cs @@ -110,6 +110,22 @@ namespace Internal.Runtime.CompilerServices } /// <summary> + /// Adds an element offset to the given reference. + /// </summary> + [Intrinsic] + [NonVersionable] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref T Add<T>(ref T source, IntPtr elementOffset) + { +#if CORECLR + typeof(T).ToString(); // Type token used by the actual method body + throw new PlatformNotSupportedException(); +#else + return ref AddByteOffset(ref source, (IntPtr)(elementOffset * (nint)SizeOf<T>())); +#endif + } + + /// <summary> /// Adds an element offset to the given pointer. /// </summary> [Intrinsic] diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index 9bd710fb0b..d584f213af 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -7166,6 +7166,29 @@ bool getILIntrinsicImplementationForUnsafe(MethodDesc * ftn, methInfo->options = (CorInfoOptions)0; return true; } + else if (tk == MscorlibBinder::GetMethod(METHOD__UNSAFE__BYREF_INTPTR_ADD)->GetMemberDef()) + { + mdToken tokGenericArg = FindGenericMethodArgTypeSpec(MscorlibBinder::GetModule()->GetMDImport()); + + static BYTE ilcode[] = { CEE_LDARG_1, + CEE_PREFIX1, (CEE_SIZEOF & 0xFF), 0,0,0,0, + CEE_MUL, + CEE_LDARG_0, + CEE_ADD, + CEE_RET }; + + ilcode[3] = (BYTE)(tokGenericArg); + ilcode[4] = (BYTE)(tokGenericArg >> 8); + ilcode[5] = (BYTE)(tokGenericArg >> 16); + ilcode[6] = (BYTE)(tokGenericArg >> 24); + + methInfo->ILCode = const_cast<BYTE*>(ilcode); + methInfo->ILCodeSize = sizeof(ilcode); + methInfo->maxStack = 2; + methInfo->EHcount = 0; + methInfo->options = (CorInfoOptions)0; + return true; + } else if (tk == MscorlibBinder::GetMethod(METHOD__UNSAFE__BYREF_ADD_BYTE_OFFSET)->GetMemberDef()) { static BYTE ilcode[] = { CEE_LDARG_0, CEE_LDARG_1, CEE_ADD, CEE_RET }; diff --git a/src/vm/metasig.h b/src/vm/metasig.h index bbd326ebe3..9976ed12f2 100644 --- a/src/vm/metasig.h +++ b/src/vm/metasig.h @@ -293,6 +293,7 @@ DEFINE_METASIG(GM(PtrVoid_T_RetVoid, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, P(v) M(0) DEFINE_METASIG(GM(RefTFrom_RetRefTTo, IMAGE_CEE_CS_CALLCONV_DEFAULT, 2, r(M(0)), r(M(1)))) DEFINE_METASIG(GM(Obj_RetT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, j, M(0))) DEFINE_METASIG(GM(RefT_Int_RetRefT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, r(M(0)) i, r(M(0)))) +DEFINE_METASIG(GM(RefT_IntPtr_RetRefT, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, r(M(0)) I, r(M(0)))) DEFINE_METASIG(GM(PtrVoid_Int_RetPtrVoid, IMAGE_CEE_CS_CALLCONV_DEFAULT, 1, P(v) i, P(v))) DEFINE_METASIG_T(SM(SafeHandle_RefBool_RetIntPtr, C(SAFE_HANDLE) r(F), I )) diff --git a/src/vm/mscorlib.h b/src/vm/mscorlib.h index 39038415aa..511271d074 100644 --- a/src/vm/mscorlib.h +++ b/src/vm/mscorlib.h @@ -775,6 +775,7 @@ DEFINE_METHOD(UNSAFE, SIZEOF, SizeOf, NoSig) DEFINE_METHOD(UNSAFE, BYREF_AS, As, GM_RefTFrom_RetRefTTo) DEFINE_METHOD(UNSAFE, OBJECT_AS, As, GM_Obj_RetT) DEFINE_METHOD(UNSAFE, BYREF_ADD, Add, GM_RefT_Int_RetRefT) +DEFINE_METHOD(UNSAFE, BYREF_INTPTR_ADD, Add, GM_RefT_IntPtr_RetRefT) DEFINE_METHOD(UNSAFE, PTR_ADD, Add, GM_PtrVoid_Int_RetPtrVoid) DEFINE_METHOD(UNSAFE, BYREF_BYTE_OFFSET, ByteOffset, NoSig) DEFINE_METHOD(UNSAFE, BYREF_ADD_BYTE_OFFSET, AddByteOffset, NoSig) |